Преобразование 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 напрямую?

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

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

Из всех доступных альтернатив я нашел 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 -oa%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

Команда 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.

Для PDF, который ImageMagick давал неточные цвета, я обнаружил, что GraphicsMagick сделал лучшую работу:

 $ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg 

Мое решение намного проще и более прямолинейно. По крайней мере, это работает на моем ПК (со следующими спецификациями):

 [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 
  • Как нарисовать наложение на SurfaceView, используемое камерой на Android?
  • Почему Firefox так плохо при изменении размеров изображений?
  • Java: заполнение BufferedImage прозрачными пикселями
  • Проблемы с перезаписью (повторным сохранением) изображения, когда он был установлен как источник изображения
  • Маскирование (обрезка) изображения в кадре
  • Как масштабировать BufferedImage
  • Объединение двух изображений в C # /. NET
  • Получить содержание uri из пути к файлу в android
  • Преобразование растрового изображения в GrayScale в Android
  • Доступ к изображениям из приложения «Картинки» в приложении для Android
  • Выбрать несколько изображений из галереи Android
  • Давайте будем гением компьютера.