В настоящее время я использую ImageMagick для преобразования PDF-файлов в растровые изображения JPEG. Это мучительно медленно и занимает много памяти.
Я использовал следующую команду:
convert -geometry 1024x768 -density 200 -colorspace RGB foo.pdf bar%02d.jpg
Я предполагаю, что он медленный, потому что использует Ghostscript. Но должен быть более быстрый способ сделать это на Linux.
Кто-нибудь нашел лучшее решение?
Использование 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
: устанавливает размер изображения 4960x7016 пикселей-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 разных шага:
PDF => PostScript
конверсия;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, вы должны знать прежде всего две вещи:
-density 600
как convert
параметр, который указывает Ghostscript использовать разрешение 600 dpi для вывода изображения.PDF => PS
а потом PS => PNG
это настоящая ошибка. Потому что ты никогда win и harldy сохраняют качество на первом этапе, но очень часто кое-что теряют. Причины: PS => PDF
, поэтому не так критично ....)Вот почему я предложил вам конвертировать ваши PDF-файлы в PNG (или JPEG) напрямую с помощью Ghostscript. И используйте самая последняя версия 8.71 (скоро будет выпущено: 9.00) 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-tools из репозитория, mudraw
все еще можно назвать pdfdraw
Затем вам нужно преобразовать png в jpeg, используя, например, imagemagick. Но все равно будет быстрее, чем Ghostscript.