Требуется быстрое преобразование PDF в JPG на Linux

В настоящее время я использую ImageMagick для преобразования PDF-файлов в растровые изображения JPEG. Это мучительно медленно и занимает много памяти.

Команда, которую я использовал, была:

convert -geometry 1024x768 -density 200 -colorspace RGB foo.pdf bar%02d.jpg

Я думаю, что это медленно, потому что он использует Ghostscript. Но должен быть более быстрый способ сделать это на компьютере с Linux.

Кто-нибудь нашел лучшее решение?

4 ответа

Решение

Использование Ghostscript напрямую (вместо использования ImageMagick's convert Команда, которая вызывает Ghostscript косвенно) действительно быстрее. И это дает вам больше контроля над параметрами преобразования. Пытаться

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d.jpg \
   -dJPEGQ=95      \
   -r600x600       \
   -g4960x7016     \
   foo.pdf

где

  • -o: определяет выходной путь + имя файла (и сохраняет использование -dBATCH -dNOPAUSE)
  • -dJPEGQ: устанавливает качество JPEG на 95%
  • -r: устанавливает разрешение 600 точек на дюйм
  • -g: устанавливает размер изображения 4960x7016px
  • -sDEVICE: устанавливает вывод в формате JPEG

Эта команда, вероятно, все еще будет замедляться для вас и создавать файлы больше ожидаемого. Для файлов меньшего размера и более быстрого выполнения попробуйте это (что, вероятно, близко к качеству вывода вашего convert командная строка):

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d_200dpi_q80.jpg \
   -dJPEGQ=80      \
   -r200x200       \
   -g1653x2339     \
   foo.pdf

или даже

gs \
   -sDEVICE=jpeg   \
   -o bar_%03d_default_a4.jpg \
   -sPAPERSIZE=a4 \
   foo.pdf

(что дает разрешение 72 точек на дюйм, что часто достаточно для большинства экранов и большинства веб-приложений).

Кстати, одна из причин, по которой ImageMagick работает намного медленнее, заключается в том, что он дважды вызывает Ghostscript. Он не конвертирует PDF => PNG за один раз, но использует 2 разных шага:

  • сначала он использует Ghostscript для PDF => PostScript преобразование;
  • Затем он использует Ghostscript для PostScript => PNG преобразование.

Вы можете узнать подробные настройки "делегатов" ImageMagick (внешние программы, которые использует ImageMagick, такие как Ghostscript), набрав

convert -list delegate

(В моей системе это список из 32 различных команд.) Теперь, чтобы увидеть, какие команды используются для преобразования в PNG, используйте это:

convert -list delegate | grep -i png

Хорошо, это было для Linux. Если вы используете Windows, попробуйте это:

convert -list delegate | findstr /i png

Вы обнаружите, что IM генерирует PNG только из PS или EPS. Итак, как IM получает (E)PS из вашего PDF? Легко:

convert -list delegate | findstr /i PDF
convert -list delegate | grep -i PDF

Ах! Он использует Ghostscript для преобразования PDF => PS, а затем снова использует Ghostscript для преобразования PS => PNG. Works, but isn't the most efficient way if you know that Ghostscript can do PDF => PNG in one go. And faster. And in much better quality.

About IM's handling of PDF conversion to images via the Ghostscript delegate you should know two things first and foremost:

  1. By default, if you don't give an extra parameter, Ghostscript will output images with a 72dpi resolution. That's why sometimes people here suggest to add -density 600 как convert parameter which tells Ghostscript to use a 600 dpi resolution for its image output.
  2. The detour of IM to call Ghostscript twice to convert first PDF => PS а потом PS => PNG is a real blunder. Because you never win and harldy keep quality in the first step, but very often loose some. Причины:
    • PDF can handle transparencies, which PostScript can not.
    • PDF can embed TrueType fonts, which PostScript can not. etc.pp.
      (Conversion in the opposite direction, PS => PDF, therefor is not that critical....)

That's why I'd suggested you convert your PDFs in one go to PNG (or JPEG) using Ghostscript directly. And use the most recent version 8.71 (soon to be released: 9.00) of Ghostscript...

Программа pdftoppm из пакета poppler также может создавать JPEG, и для меня это примерно в два раза быстрее, чем при использовании gs как описано выше:

pdftoppm -jpeg -r 300 foo.pdf foo.jpg

По моему опыту, MuPDF намного быстрее, чем Ghostscript. Это гораздо более новый проект без большой доли в GS. Попробуйте, если он подходит для вашего использования!

mudraw -w 1024 -h 768 -r 200 -c rgb -o bar%d.png foo.pdf

Если у вас более старый дистрибутив Linux и установлены mupdf-инструменты из репозитория, mudraw еще можно назвать pdfdraw

Затем вам нужно конвертировать PNG в JPEG, используя, например, imagemagick. Но это все равно будет быстрее, чем Ghostscript.

Другие вопросы по тегам