MyTetra Share
Делитесь знаниями!
Как в Linux создать PDF-файл из картинок с помощью convert, mogrify, pdftk, qpdf
28.12.2019
14:06
Текстовые метки: linux, pdf, создать, из картинок, convert, mogrify, pdftk, imagemagick
Раздел: Компьютер - Linux - ImageMagic

В ОС Linux, в составе пакета imagemagick, поставляется программа convert.


Чаще всего, создать PDF-файл в консоли можно с помощью одной простой команды:



convert *.png output.pdf



Данная команда возьмет в текущей директории все *.png-файлы и создаст из них один PDF-файл. Проблема в том, что команда convert даже в 2019 году не может нормально работать с файлами в хорошем разрешении. Например если исходные файлы будут иметь размер около 3200 x 2400 pix, то существует большая вероятность, что convert вывалится в середине создания PDF-файла с ошибками:



convert-im6.q16: DistributedPixelCache '127.0.0.1' @ error/distribute-cache.c/ConnectPixelCacheServer/244.
convert-im6.q16: cache resources exhausted `/tmp/magick-16385LJRuV0C4tBkl1' @ error/cache.c/OpenPixelCache/3945.
convert-im6.q16: DistributedPixelCache '127.0.0.1' @ error/distribute-cache.c/ConnectPixelCacheServer/244.
convert-im6.q16: cache resources exhausted `/tmp/magick-16385sVqjhxhs16qG1' @ error/cache.c/OpenPixelCache/3945.



Как можно обойти эти ошибки? Для этого можно воспользоваться альтернативным путем.


В составе imagemagick есть еще программа mogrify. Она позиционируется как полная альтернатива convert, но которая молча переписывает исходные файлы, если опции команды предполагают перезапись файла. На деле mogrify иногда срабатывает лучше convert, например она может переконвертировать те отдельные файлы, которые не смог обработать convert.



Внимание! Mogrify - это очень неоднозначная утилита! Ее синтаксис во многих моментах отличается от convert, но эти особенности не отражены в документации. Например, нельзя давать такую команду:


mogrify *.png outputfile.pdf


Вместо генерации pdf-файла, данная команда будет перегенерировать *.png-файлы, и в конце никакого outputfile.pdf не создаст!



Поэтому шаг №1: надо создать одностраничные PDF-файлы из PNG-файлов с помощью mogrify:



mogrify -format pdf *.png



Далее, надо создать многостраничный PDF-файл из одностраничных PDF-файлов. Это можно сделать с помощью команды pdftk (она находится в LInux-пакете pdftk, и этот пакет должен быть установлен в систему).


Таким образом, шаг №2:



pdftk *.pdf cat output myOutput.pdf



В результате будет создан правильный PDF-файл с исходным разрешением картинок. Кстати, pdftk при склейке PDF-файлов работает в разы быстрее, чем convert. Так что в Linux для создания PDF-файлов через консоль, можно и нужно использовать pdftk, это очень хорошая утилита.


Недостаток подхода "сделать одностраничные pdf-документы и собрать из них книгу" в том, что каждый pdf-документ больше чем исходная картинка, часто на 10-20кб. А pdftk просто "склеивает" такие документы. ДЛя книг на 1000 страниц это может быть большим бессмысленным расходованием размера файла.


Вместо pdftk можно попробовать утилиту qpdf. И сравнить полученный размер. Вроде как утлита qpdf не просто склеивает pdf-файл, а делает многостраничный pdf-файл, корректно вытягивая картинку страницы из каждого входного pdf-файла. Используется данная команда так:



qpdf --empty --pages *.pdf -- myOutput.pdf



Однако, это не всегда верно, иногда pdftk может генерить более компактные файлы. Поэтому и нужно проверять конечные размеры.


Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования