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

11

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

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

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

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

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

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

Ответы:

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
user177876
источник
Какое отличное предложение. Только что исправил серьезную ошибку, приводившую к сбою приложения. Я переключился на 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