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


11

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

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

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

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

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


Сколько времени, сколько памяти?
— Зоредаче

Ответы:


18

Использование Ghostscript напрямую (вместо использования команды ImageMagick 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 точек на дюйм, что часто достаточно для большинства экранов и большинства веб-приложений).


1
Ты прав. Я действительно не думал, что Imagemagick станет узким местом. Но я, наверное, должен был попробовать. Спасибо также за отличные примеры!
— mat3001

10

Кстати, одна из причин, по которой 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. Работает, но не самый эффективный способ, если вы знаете, что Ghostscript может сделать PDF => PNG за один раз. И быстрее. И в гораздо лучшем качестве.

Об обработке IM преобразования PDF в изображения через делегата Ghostscript вы должны знать две вещи, прежде всего:

  1. По умолчанию, если вы не укажете дополнительный параметр, Ghostscript будет выводить изображения с разрешением 72 точек на дюйм. Вот почему иногда люди здесь предлагают добавить -density 600в качестве convertпараметра, который говорит Ghostscript, использовать разрешение 600 точек на дюйм для вывода изображения.
  2. Обход IM для вызова Ghostscript дважды, чтобы сначала конвертировать, PDF => PSа затем PS => PNG- настоящая ошибка. Потому что вы никогда не выигрываете и не теряете качество на первом этапе, но очень часто теряете его. Причины:
    • PDF может обрабатывать прозрачные пленки, а PostScript - нет.
    • PDF может встраивать шрифты TrueType, чего не может PostScript. etc.pp.
      (Преобразование в обратном направлении PS => PDF, поэтому не так критично ....)

Вот почему я предложил вам конвертировать PDF-файлы за один раз в PNG (или JPEG), используя Ghostscript напрямую. И использовать самую последнюю версию 8.71 (скоро будет выпущена: 9.00) Ghostscript ...


6

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

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

Какое отличное предложение. Только что исправил серьезную ошибку, приводившую к сбою приложения. Я переключился на pdftoppm благодаря этому ответу - никогда не знал об этом раньше!
— Данмэктоу

Вы, сэр, заслуживаете медали за это :)
— Милан Тодорович

2
это не быстрее, чем GS
— Ghilas BELHADJ

6

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

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

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

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


2
В моем тесте конвертация PDF в PNG в MuPDF примерно в 5-6 раз быстрее, чем в Ghostscript. Спасибо за решение!
— Дмитрий Акинин

1
Это невероятно полезно. Это займет несколько секунд, когда Ghostscript займет несколько минут, плюс командная строка на одном дыхании! Большое спасибо за то, что вы обратили на это мое внимание!
— likeitlikeit
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.