Преобразование PDF в PNG

83

Я пытаюсь преобразовать PDF в изображение PNG (по крайней мере, его обложку). Я успешно извлекаю первую страницу PDF с помощью pdftk. Я использую imagemagick для преобразования:

convert cover.pdf cover.png

Это работает, но, к сожалению, файл cover.png отображается неправильно (некоторые альфа-объекты в PDF-файле не отображаются должным образом). Я знаю, что ImageMagick использует GhostScript для преобразования, и если я сделаю это напрямую с помощью gs, я смогу получить желаемые результаты, но я бы предпочел использовать библиотеку преобразования, поскольку в ней есть другие инструменты, которые я хотел бы использовать.

Эта команда в GhostScript выполняет желаемое изображение:

gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf

Мне интересно, есть ли способ передать аргументы через преобразование в GhostScript, или я застрял в прямом вызове GhostScript?

Адам
источник
2
Почему прямой вызов GhostScript является проблемой?
kquinn
Это действительно не так уж важно. Я хотел бы запустить несколько других параметров через convert одновременно, и было бы неплохо, если бы я мог сохранить все это в одной команде. Сохраняет мой код более чистым и последовательным. Это также означает, что на один временный файл меньше.
Adam
В чем разница между тем, как вы вызываете gs, и тем, как ImageMagick называет это? Возможно, стоит сообщить что-то апстрим в ImageMagick (примечание для подписчиков, обновление ghostscript тоже может помочь ...)
rogerdpack

Ответы:

71

Вы можете использовать одну командную строку с двумя командами ( gs, convert), подключенными через конвейер, если первая команда может записывать свой вывод в стандартный вывод, а вторая может читать свои входные данные из стандартного ввода.

  1. К счастью, gs может писать в stdout ( ... -o %stdout ...).
  2. К счастью, convert может читать из stdin ( convert -background transparent - output.png).

Задача решена:

  • GS используется для альфа-канала обработки специального изображения,
  • convert используется для создания прозрачного фона,
  • канал, используемый для предотвращения записи временного файла на диск.

Полное решение:

gs -sDEVICE=pngalpha       \
   -o %stdout              \
   -r144 cover.pdf         \
   |                       \
convert                    \
   -background transparent \
   -                       \
    cover.png

Обновить

Если вы хотите иметь отдельный PNG для каждой страницы PDF, вы можете использовать %dсинтаксис:

gs -sDEVICE=pngalpha -o file-%03d.png -r144 cover.pdf

Это будет создавать PNG файлы с именами page-000.png, page-001.png... (Обратите внимание , что %d-counting с нуля - file-000.pngсоответствует странице 1 PDF, 001на странице 2 ...

Или, если вы хотите сохранить прозрачный фон, для 100-страничного PDF-файла выполните

for i in {1..100}; do        \
                             \
  gs -sDEVICE=pngalpha       \
     -dFirstPage="${i}"      \
     -dLastPage="${i}"       \
     -o %stdout              \
     -r144 input.pdf         \
     |                       \
  convert                    \
     -background transparent \
     -                       \
      page-${i}.png ;        \
                             \
done
Курт Пфайфле
источник
7
У меня это работает, только если я добавлю -dBATCH -dNOPAUSE -dQUIETв опции gs.
Ford
@ford: Значит, у вас старая версия Ghostscript. Последние версии могут это делать, -o output.fileи это автоматически и незаметно также устанавливается -dBATCH -dNOPAUSE -dQUIETодновременно.
Kurt Pfeifle
@ford: Однако в приведенном выше ответе я допустил серьезную опечатку. Интересно, почему, несмотря на это, он получил 22 голоса за :-)
Курт Пфайфл
Для меня рабочий поиск, но я бы хотел автоматически преобразовать многостраничный pdf в image_1.png, image_2.png ... Это так просто с помощью одной команды, нужно ли мне сначала извлечь каждую страницу из файла pdf?
Tarass
Хорошо, я разделил изображения. Но я хочу "-transparence white" в качестве параметра "convert" во время преобразования. Я смог это сделать с трубкой, а без?
Tarass
29

Из всех доступных альтернатив я обнаружил, что Inkscape дает наиболее точные результаты при преобразовании PDF-файлов в PNG. Особенно, когда исходный файл имел прозрачные слои, Inkscape преуспел там, где Imagemagick и другие инструменты не смогли.

Я использую эту команду:

inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"

И здесь это реализовано в скрипте:

#!/bin/bash

while [ $# -gt 0 ]; do

pdf=$1
echo "Converting "$pdf" ..."
pngfile=`echo "$pdf" | sed 's/\.\w*$/.png/'`
inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"
echo "Converted to "$pngfile""
shift

done

echo "All jobs done. Exiting."
Глутанимат
источник
21

Чтобы преобразовать PDF в файлы изображений, используйте следующие команды:

Для PNG gs -sDEVICE=png16m -dTextAlphaBits=4 -r300 -o a.png a.pdf

Для JPG gs -sDEVICE=jpeg -dTextAlphaBits=4 -r300 -o a.jpg a.pdf

Если у вас несколько страниц, добавьте к имени % 03d gs -o a%03d.jpg a.pdf

Что означает каждый вариант:

  • sDEVICE = {jpeg, pngalpha, png16m ...} - тип файла
  • -o - выходной файл (% stdout в stdout)
  • -dTextAlphaBits = 4 - сглаживание шрифтов.
  • -r300 - 300 точек на дюйм
Янпа
источник
9

Также можно использовать входящие в poppler-utilsпакет утилиты командной строки :

sudo apt-get install poppler-utils
pdftoppm --help
pdftocairo --help

Пример:

pdftocairo -png mypage.pdf mypage.png
Turdus-Merula
источник
1
Это очень хорошо. Если PDF-файл является многостраничным, будет несколько файлов PNG.
Tomasz Gandor
5

Не удалось заставить принятый ответ работать. Затем выяснилось, что на самом деле решение намного проще, поскольку Ghostscript не только изначально поддерживает PNG, но даже несколько разных «кодировок» :

  • png256
  • png16
  • pnggray
  • pngmono
  • ...

У меня работает следующая команда оболочки:

gs -dNOPAUSE -q -sDEVICE=pnggray -r500 -dBATCH -dFirstPage=2 -dLastPage=2 -sOutputFile=test.png test.pdf

Он сохранит страницу 2 файла test.pdf в test.png с использованием pnggrayкодировки и 500 точек на дюйм.

Рафаэль
источник
2

Вот обсуждение на немецком языке такой проблемы для файлов SVG, где она решается с помощью

convert -background transparent

Возможно, это сработает и для вас.

шнаадер
источник
К сожалению, это не решает мою проблему. На самом деле это изображение в PDF-файле, у которого есть альфа-канал, который находится поверх всего.
Adam
2

Добавлю свое решение, хоть нить его старая. Может быть, это все равно кому-то поможет.

Во-первых, мне нужно создать PDF-файл. Для этого я использую XeLaTeX :

xelatex test.tex

Теперь ImageMagick и GraphicMagic анализируют параметры слева направо, поэтому первым будет выполнен самый левый параметр. В итоге я использовал эту последовательность для оптимальной обработки:

gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png

Он дает красивую графику на прозрачном фоне, обрезанную до того, что на самом деле находится на странице. Параметры -densityи -resizeобеспечивают лучшую детализацию и увеличивают общее разрешение.

Предлагаю проверить, можно ли для вас уменьшить плотность. Это сократит время конвертации.

полемон
источник
2

Для PDF-файла, в котором ImageMagick давал неточные цвета, я обнаружил, что GraphicsMagick справился лучше:

$ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg
северный
источник
Недостаточно информации, чтобы быть уверенным, но это могло быть потому, что цветовые пространства были определены неправильно. Обратите внимание на опцию -colorspace IM.
rivimey
2

Поскольку на этой странице также перечислены альтернативные инструменты, я упомяну xpdf, в котором есть инструменты командной строки, готовые для Linux / Windows / Mac. Поддерживает прозрачность. Бесплатно для коммерческого использования - в отличие от Ghostscript, у которого поистине возмутительные цены.

В тесте с огромным файлом PDF он был на 7,5% быстрее, чем Ghostscript.

(Также есть конвертеры PDF в текст и HTML)

TheStoryCoder
источник
Я использовал это некоторое время, и он отлично работает. В целом он немного медленнее, чем Ghostscript, хотя и с более высоким разрешением. Но изображения выглядят намного лучше (хотя и немного темнее), а сглаживание, которое я мог заставить работать в Ghostscript, отлично работает в xpdf!
TheStoryCoder 06
2

Попробуйте извлечь одну страницу.

$ page = 4

gs -sDEVICE=pngalpha -dFirstPage="$page" -dLastPage="$page" -o thumb.png -r144 input.pdf
Эсекьель Фернандес
источник
1

Мое решение намного проще и прямолинейнее. По крайней мере, это работает на моем ПК (со следующими характеристиками):

me@home: my.folder$ uname -a
Linux home 3.2.0-54-generic-pae #82-Ubuntu SMP Tue Sep 10 20:29:22 UTC 2013 i686 i686 i386 GNU/Linux

с участием

me@home: my.folder$ convert --version
Version: ImageMagick 6.6.9-7 2012-08-17 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features: OpenMP

Итак, вот что я использую на своем file.pdf:

me@home: my.folder$ convert -density 300 -quality 100 file.pdf file.png
поляризовать
источник
Да, это то, что OP пытался изначально, но не смог заставить что-то ошибочное работать под ним, когда ImageMagick вызывает ghostscript ... но если он работает,
сделайте
0

Вы можете использовать ImageMagick, не разделяя первую страницу PDF-файла другими инструментами. Просто делать

convert -density 288 cover.pdf[0] -resize 25% cover.png


Здесь я увеличиваю номинальную плотность на 400% (72 * 4 = 288), а затем изменяю размер на 1/4 (25%). Это дает гораздо лучшее качество результирующего png.

Однако, если PDF-файл имеет формат CMYK, PNG его не поддерживает. Его необходимо преобразовать в sRGB, особенно если он имеет прозрачность, поскольку Ghostscript не может обрабатывать CMYK с альфа-каналом.

convert -density 288 -colorspace sRGB -resize 25% cover.pdf[0] cover.png
fmw42
источник