Преобразование PDF в PNG
Я пытаюсь преобразовать 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 напрямую?
Ответы
Ответ 1
Вы можете использовать одну командную строку с двумя командами (gs
, convert
), подключенными через канал, если первая команда может записать свой вывод в stdout, а второй - прочитать его ввод из stdin.
- К счастью, gs может писать в stdout (
... -o %stdout ...
).
- К счастью, convert может читать из stdin (
convert -background transparent - output.png
).
Проблема решена:
- GS используется для обработки альфа-канала специальным изображением,
- convert, используемый для создания прозрачного фона,
- чтобы избежать записи временного файла на диск.
Полное решение:
gs -sDEVICE=pngalpha \
-o %stdout \
-r144 cover.pdf \
| \
convert \
-background transparent \
- \
cover.png
Update
Если вы хотите иметь отдельную 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
Ответ 2
Из всех доступных альтернатив я нашел Inkscape для получения наиболее точных результатов при конвертации PDF файлов в PNG. Особенно, когда исходный файл имел прозрачные слои, Inkscape преуспел там, где Imagemagick и другие инструменты потерпели неудачу.
Это команда, которую я использую:
inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"
И здесь он реализован в script:
#!/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."
Ответ 3
Для преобразования файлов 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...} - filetype
- -o - выходной файл (% stdout to stdout)
- -dTextAlphaBits = 4 - сглаживание шрифтов.
- -r300 - 300 dpi
Ответ 4
Можно также использовать утилиты командной строки, включенные в пакет poppler-utils
:
sudo apt-get install poppler-utils
pdftoppm --help
pdftocairo --help
Пример:
pdftocairo -png mypage.pdf mypage.png
Ответ 5
Не удалось получить принятый ответ на работу. Затем выяснилось, что на самом деле решение намного проще, так как Ghostscript не только поддерживает PNG, но даже несколько разных "кодировок" :
-
png256
-
png16
-
pnggray
-
pngmono
- ...
Команда shell, которая работает для меня, это:
gs -dNOPAUSE -q -sDEVICE=pnggray -r500 -dBATCH -dFirstPage=2 -dLastPage=2 -sOutputFile=test.png test.pdf
Он сохранит страницу 2 test.pdf для test.png, используя кодировку pnggray
и 500 DPI.
Ответ 6
Вот обсуждение в Германии о проблеме, подобной этой для SVG файлов, где она разрешена с помощью
convert -background transparent
Возможно, это тоже работает для вас.
Ответ 7
Я добавлю свое решение, даже подумал, что его нить устарела. Может быть, это все равно поможет кому-то.
Во-первых, мне нужно сгенерировать PDF файл. Я использую XeLaTeX для этого:
xelatex test.tex
Теперь ImageMagick и GraphicMagic оба разбора параметры слева направо, поэтому самый левый параметр будет выполнен первым. В итоге я использовал эту последовательность для оптимальной обработки:
gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png
Он дает приятную графику на прозрачном фоне, обрезанный тем, что на самом деле находится на странице. Параметры -density
и -resize
дают лучшую гранулярность и увеличивают общее разрешение.
Я предлагаю проверить, можно ли уменьшить плотность для вас. Это сократит время преобразования.
Ответ 8
Для PDF файла, который ImageMagick давал неточные цвета, я обнаружил, что GraphicsMagick сделал лучшую работу:
$ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg
Ответ 9
Мое решение намного проще и более прямо. По крайней мере, это работает на моем ПК (со следующими спецификациями):
[email protected]: 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
с
[email protected]: 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
:
[email protected]: my.folder$ convert -density 300 -quality 100 file.pdf file.png
Ответ 10
Поскольку на этой странице также перечислены альтернативные инструменты, я упомяну xpdf, в котором есть готовые инструменты командной строки для Linux/Windows/Mac. Поддерживает прозрачность. Является бесплатным для коммерческого использования - в отличие от Ghostscript, который имеет действительно возмутительные цены.
В тесте на огромном файле PDF он был на 7,5% быстрее, чем Ghostscript.
(Он также имеет конвертеры PDF в текст и HTML)
Ответ 11
Вы можете использовать ImageMagick без разделения первой страницы PDF с другими инструментами. Просто делать
convert cover.pdf[0] cover.png
Однако, если PDF - CMYK, PNG не поддерживает это. Его необходимо будет преобразовать в sRGB, особенно если он имеет прозрачность, поскольку Ghostscript не может обрабатывать CMYK с альфа-каналом.
convert -colorspace sRGB cover.pdf[0] cover.png