Преобразование 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 -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 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
из всех доступных альтернатив я нашел 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
Если у вас есть несколько страниц добавить к name %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
это дает хорошую графику на прозрачный фон, обрезанный до того, что на самом деле находится на странице. The -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 DPI.
для 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