Преобразование PDF в PNG
Я пытаюсь преобразовать PDF в PNG-изображение (по крайней мере, обложку одного). Я успешно извлекаю первую страницу PDF с помощью pdftk. Я использую imagemagick для преобразования:
convert cover.pdf cover.png
это работает, но, к сожалению, чехол.png проходит через неверную визуализацию (некоторые Альфа-объекты в PDF не отображаются должным образом). Я знаю, что ImageMagick использует GhostScript для преобразования, и если я сделаю это непосредственно с gs, я могу получить желаемые результаты, но я бы предпочел используйте библиотеку convert, поскольку у нее есть другие инструменты, которые я хотел бы использовать.
эта команда в GhostScript выполняет желаемое изображение:
gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf
мне интересно, есть ли способ передать аргументы через convert to GhostScript или я застрял с вызовом GhostScript напрямую?
9 ответов:
вы можете использовать командную строку с двумя командами (
gs
,convert
) соединенный через трубу, если первая команда может записать свой выход к stdout, и если второе одно может прочитать свой входной сигнал от stdin.
- к счастью, gs может писать в stdout (
... -o %stdout ...
).- к счастью, convert может читать из stdin (
convert -background transparent - output.png
).проблема решена:
- GS используется для альфа-канала обработки специального изображения,
- преобразование используется для создания прозрачного фона,
- труба используется, чтобы избежать записи временного файла на диск.
комплексное решение:
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
-подсчет на основе нуля --file-000.png
соответствует Страница 1 из документа в формате PDF001
на странице 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
из всех доступных альтернатив я нашел Inkscape для получения наиболее точных результатов при преобразовании PDF-файлов в PNG. Особенно когда исходный файл имел прозрачные слои, Inkscape преуспел там, где Imagemagick и другие инструменты потерпели неудачу.
это команда, которую я использую:
inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"
а вот это реализовано в скрипте:
#!/bin/bash while [ $# -gt 0 ]; do pdf= 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."
для преобразования 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 to stdout)
- - dTextAlphaBits=4-шрифт сглаживание.
- -R300 с разрешением 300 dpi
можно также использовать утилиты командной строки, включенные в
poppler-utils
пакет:sudo apt-get install poppler-utils pdftoppm --help pdftocairo --help
пример:
pdftocairo -png mypage.pdf mypage.png
здесь немецкий дискуссии о такой проблеме, как это для файлов SVG, где она решена с помощью
convert -background transparent
возможно, это работает для вас тоже.
Я добавлю свое решение, даже думал, что его нить старая. Может быть, это поможет кому-то в любом случае.
во-первых, мне нужно сгенерировать PDF-файл. Я использую XeLaTeX для этого:
xelatex test.tex
теперь ImageMagick и GraphicMagic оба параметра разбора слева направо, поэтому самый левый параметр будет выполнен первым. В итоге я использовал эту последовательность для оптимальной обработки:
gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png
это дает хорошую графику на прозрачный фон, обрезанный до того, что на самом деле находится на странице. Элемент
-density
и-resize
параметры, дают лучшую детализацию, и увеличить общее разрешение.Я предлагаю проверить, если плотность может быть снижена для вас. Это сократит время преобразования.
не удалось получить принятый ответ на работу. Затем выяснилось, что на самом деле решение намного проще, так как Ghostscript не только поддерживает PNG, но даже несколько разных "кодировках":
png256
png16
pnggray
pngmono
- ...
команда оболочки, которая работает для меня:
gs -dNOPAUSE -q -sDEVICE=pnggray -r500 -dBATCH -dFirstPage=2 -dLastPage=2 -sOutputFile=test.png test.pdf
он сохранит страницу 2 теста.pdf для тестирования.формат PNG используя
pnggray
кодировка и 500 точек на дюйм.
для PDF, который ImageMagick давал неточные цвета, я обнаружил, что GraphicsMagick сделал лучшую работу:
$ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg
мое решение гораздо проще и более прямым. По крайней мере, это работает таким образом на моем ПК (со следующими спецификациями):
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