Преобразование 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.

  1. к счастью, gs может писать в stdout (... -o %stdout ...).
  2. к счастью, 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