Перетворення PDF у PNG


83

Я намагаюся перетворити 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?


2
Чому виклик GhostScript безпосередньо є проблемою?
kquinn

Це насправді не така велика угода. Я хотів би одночасно запустити деякі параметри через convert, і було б непогано, якби я міг зберегти все це в одній команді. Зберігає мій код чистішим і більш послідовним. Це також означає один тимчасовий файл менше.
Адам


Яка різниця між тим, як ви називаєте gs і як ImageMagick називає це? Можливо, варто повідомити щось угору за темою ImageMagick (примітка для послідовників, оновлення ghostscript також може допомогти ...)
rogerdpack

Відповіді:


70

Ви можете використовувати один командний рядок з двома командами ( 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

7
Це працює для мене, лише якщо я додаю -dBATCH -dNOPAUSE -dQUIETдо опцій gs.
брод

@ford: Це означає, що у вас є стара версія Ghostscript. Останні версії можуть робити, -o output.fileі це автоматично і безшумно також встановлюється -dBATCH -dNOPAUSE -dQUIETодночасно.
Курт Пфайфле,

@ford: Однак, я мав серйозну помилку в інших місцях у наведеній вище відповіді. Цікаво, чому, незважаючи на це, він отримав 22 голоси :-)
Курт Пфайфле,

Знайдіть мені роботу, але я хотів би автоматично перетворити багатосторінковий pdf на image_1.png, image_2.png ... Чи легко це в одній команді, чи слід спочатку витягати кожну сторінку з pdf-файлу?
Тарас

Гаразд, я розділив зображення. Але я хочу "-прозорість білого" як параметр 'convert' під час перетворення. Я зміг це зробити з трубою, але без?
Тарас

29

З усіх доступних альтернатив я знайшов 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."

21

Для перетворення 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 dpi

9

Можна також використовувати утиліти командного рядка, що входять до poppler-utilsпакету:

sudo apt-get install poppler-utils
pdftoppm --help
pdftocairo --help

Приклад:

pdftocairo -png mypage.pdf mypage.png

1
Це дуже добре. Якщо PDF багатосторінковий, буде розміщено кілька файлів PNG.
Томаш Гандор,

5

Не вдалося отримати прийняту відповідь. Тоді з’ясувалося, що насправді рішення набагато простіше, оскільки 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.


2

Ось німецька дискусія про подібну проблему для файлів SVG, де вона вирішується за допомогою

convert -background transparent

Можливо, це працює і для вас.


На жаль, ні, це не вирішує мою проблему. Це насправді зображення в PDF-файлі, яке має альфа-канал, який сидить поверх усього.
Адам

2

Додам своє рішення, навіть думаючи, що його нитка стара. Можливо, це все одно комусь допоможе.

По-перше, мені потрібно сформувати PDF. Я використовую XeLaTeX для цього:

xelatex test.tex

Тепер ImageMagick і GraphicMagic обидва параметри синтаксичного аналізу зліва направо, тож найлівіший параметр, буде виконаний спочатку. У підсумку я використав цю послідовність для оптимальної обробки:

gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png

Це дає приємну графіку на прозорому фоні, оброблену тим, що є насправді на сторінці. Параметри -densityand -resizeзабезпечують кращу деталізацію та збільшують загальну роздільну здатність.

Я пропоную перевірити, чи можна для вас зменшити щільність. Це скоротить час перетворення.


2

Для PDF-файлу, який ImageMagick надавав неточні кольори, я виявив, що GraphicsMagick зробив кращу роботу:

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

Недостатньо інформації, щоб бути впевненим, але це може бути тому, що кольорові простори були визначені неправильно. Перевірте опцію -colorspace IM.
rivimey

2

Оскільки на цій сторінці також перелічені альтернативні інструменти, я згадаю xpdf, який має інструменти командного рядка, готові для Linux / Windows / Mac. Підтримує прозорість. Безкоштовно для комерційного використання - на відміну від Ghostscript, який має справді обурливі ціни.

У тесті на величезний файл PDF він був на 7,5% швидшим, ніж Ghostscript.

(Він також має конвертери PDF у текст та HTML)


Зараз я цим користувався деякий час, і це працює чудово. Загалом це трохи повільніше, ніж Ghostscript, хоча і з більш високою роздільною здатністю. Але зображення виглядають набагато приємнішими (хоч і трохи темнішими), і згладжування, до яких я міг би працювати в Ghostscript, чудово працює в xpdf!
TheStoryCoder


1

Моє рішення набагато простіше і пряміше. Принаймні це працює так на моєму ПК (з наступними характеристиками):

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

Так, це те, що OP спробував спочатку, але не зміг змусити щось помилитися, щоб інше працювало внизу, коли ImageMagick закликає до ghostscript ... але якщо це спрацьовує, переходьте до цього :)
rogerdpack

0

Ви можете використовувати 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.