Преобразование PDF в PNG
-
19-08-2019 - |
Вопрос
Я пытаюсь преобразовать 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?
Решение
Вы можете использовать одну командную строку с двумя командами (gs
, convert
), подключенный через канал, если первая команда может записывать свои выходные данные на стандартный вывод, а вторая может читать свои входные данные со стандартного ввода.
- К счастью, gs может писать в стандартный вывод (
... -o %stdout ...
). - К счастью, Convert может читать со стандартного ввода (
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
-счет ведется с нуля -- file-000.png
соответствует первой странице 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=$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."
Чтобы преобразовать 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 т/д
Также можно использовать утилиты командной строки, включенные в poppler-utils
упаковка:
sudo apt-get install poppler-utils
pdftoppm --help
pdftocairo --help
Пример:
pdftocairo -png mypage.pdf mypage.png
Не удалось заставить принятый ответ работать.Затем выяснилось, что на самом деле решение в любом случае намного проще, поскольку 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 DPI.
Вот обсуждение на немецком языке такой проблемы для файлов 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
повышают степень детализации и увеличивают общее разрешение.
Я предлагаю проверить, может ли плотность быть уменьшена для вас. Это сократит время конвертации.
Для 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
Поскольку на этой странице также перечислены альтернативные инструменты, я упомяну xpdf , который имеет готовые инструменты командной строки для Linux / Windows / Mac. Поддерживает прозрачность. Бесплатен для коммерческого использования - в отличие от Ghostscript, цена которого действительно возмутительна .
При тестировании огромного PDF-файла он был на 7,5% быстрее, чем Ghostscript.
(также есть конвертеры PDF в текст и HTML)
Попробуйте извлечь одну страницу. Р>
$ page = 4
gs -sDEVICE=pngalpha -dFirstPage="$page" -dLastPage="$page" -o thumb.png -r144 input.pdf
Вы можете использовать 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