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

9 ответов:

вы можете использовать командную строку с двумя командами (gs,convert) соединенный через трубу, если первая команда может записать свой выход к stdout, и если второе одно может прочитать свой входной сигнал от stdin.

  1. к счастью, gs может писать в stdout (... -o %stdout ...).
  2. к счастью, 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 из документа в формате 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 в файлы изображений используйте следующие команды:

для PNGgs -sDEVICE=png16m -dTextAlphaBits=4 -r300 -o a.png a.pdf

для JPGgs -sDEVICE=jpeg -dTextAlphaBits=4 -r300 -o a.jpg a.pdf

Если у вас есть несколько страниц добавить в название %03dgs -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