Главное > Pdf

Утилита fi2pdf

(1/279) > >>

monday2000:
Я сделал небольшую консольную утилиту:

fi2pdf

Это примитивная консольная программка, которая конвертирует 1 одностраничный растровый графический файл в 1 одностраничный растровый PDF-файл.

Размер создаваемого PDF - А4. При этом, если линейные размеры конвертируемого файла (пиксели/dpi) меньше/больше А4 - то он перемасштабируется под размер А4.

Утилита сделана на базе FreeImage. Утилита представляет из себя кусок кода, выдернутый из проекта PosteRazor http://posterazor.sourceforge.net/ , при этом и немного упрощённый.

Лицензия - "GPL 3 и позже". У FreeImage лицензия - "GPL 2 и позже", так что совместная компиляция не представляет проблемы.

Для работы утилиты требуется файл FreeImage.dll.

Скачать здесь:

http://www.djvu-soft.narod.ru/soft/fi2pdf.rar  (635 КБ)

Внутри - сама утилита, её исходники, хелп к ней и FreeImage.dll.

К сожалению, мне пока не удалось сделать так, чтобы эта утилита могла кодировать в многостраничный PDF хотя бы несколько графических файлов (а не один) за один присест. PDF оказался гораздо сложнее для понимания, чем простые графические файлы. Здесь так просто, как в обычных файлах, многостраничный PDF не сделаешь. :(

Пока что этот недостаток можно преодолеть за счёт склейки получаемых одностраничных PDF консольной утилитой http://www.accesspdf.com/pdftk/ .

Правда, pdftk весит аж 2,2 МБ - что весьма немало. Т.е. интегрировать fi2pdf в собственные программы пока преждевременно (т.к. туда потребуется добавить и pdftk ради склейки многостраничного PDF).

Я написал письмо автору программы PosteRazor. Вот его ответ:

--- Цитировать ---PosteRazor uses 'relatively' little
features from FreeImage in order to generate the PDFs.
Possibly, I could have used available PDF libraries like
http://libharu.org or http://www.foolabs.com/xpdf/ . But since the
PDFs generated by PosteRazor are on one hand very simple and on the
other hand I wanted very specific image embedding features, I went for
self gereating PDFs.

I used the PDF reference
http://www.adobe.com/devnet/pdf/pdf_reference.html to get the minimal
document structure going. Then I embedded either a plain Jpeg file
(for lossy compression) or 'deflated'/gzipped data for lossless
compression. In order to verify if the PDF is valid, I used
http://www.accesspdf.com/pdftk/

If you need some inspiration, you could aslo have a look at the very
great tool http://libtiff.maptools.org/man/tiff2pdf.1.html which is
part of libtiff, available as source.

Alessandro Portale
--- Конец цитаты ---

Eugeen1948:
А чем это лучше Adobe Acrobat? Там и многостраничные файлы  легко собирать и много других граффайлов поддерживается.

monday2000:
Да я искал вариант как создавать PDF в своей программе на движке FreeImage. Причём мне хотелось бы что-нибудь попроще и поменьше весом.

monday2000:
Я сделал новую версию консольной утилиты:

fi2pdf v2.0

Скачать:

http://www.djvu-soft.narod.ru/soft/fi2pdf_v2_0.rar  (610 КБ)

Внутри - сама консольная утилита, её исходники, хелп к ней и FreeImage.dll.

В этой версии сделан важный шаг на пути развития:

fi2pdf научилась создавать многостраничные PDF-файлы.

Мне удалось достичь такого результата благодаря тому, что мне повезло найти удачный прототип для версии 2.0. Вот он:

Simplest PDF Generating API for JPEG Image Content
jpeg2pdf
by Hao Hu [ihaohu@gmail.com]
http://www.codeproject.com/KB/library/jpeg2pdf.aspx

Это - простейшая консольная программа с исходниками, которая умеет кодировать JPG-файлы в PDF.

Я взял эту программу, и добавил туда функционал из программы PosteRazor (на базе которой была сделана первая версия fi2pdf).

В результате получилась комбинированная программа:

JPG-файлы она кодирует в PDF напрямую - без использования FreeImage (как это и было изначально в jpeg2pdf).

А все остальные растровые форматы она кодирует в PDF так же, как это делает PosteRazor - с ZLib-сжатием (только PosteRazor не умеет создавать многостраничные PDF-файлы - а fi2pdf v2.0 - умеет - за счёт использования кода jpeg2pdf).

fi2pdf v2.0 пока что имеет некоторые ограничения:

- Использование только формата листа А4.
- Жёстко заданный DPI - 72 (игнорирование реального DPI).
- Ограничение максимального количества файлов, одновременно кодируемых в PDF - 256 штук.
- Кодируемый файл, независимо от его размера, растягивается (сжимается) так, чтобы полностью заполнить собою соотв. страницу PDF-файла. При этом даже пропорции сторон нарушаются.

Но эти ограничения - милый пустячок, вполне преодолимые в будущем - по сравнению с тем, что уже достигнуто. Формат PDF - очень непрост для программной работы. Самому делать программу по работе с PDF весьма затруднительно, потому что для этого пришлость бы прочесть и освоить спецификацию формата PDF - а это более тысячи страниц (хотя некоторые индивидуумы так и поступают).

Можно, конечно, использовать готовые программные библиотеки. Но это слишком сложно, и они все слишком избыточны - мне-то нужно все-навсего создание растрового PDF - а все PDF-библиотеки (на С++, другие я не рассматриваю) поддерживают в т.ч. и векторный PDF - что мне в данном случае совершенно не нужно и даёт избыточную сложность и вес программы.

Я сумел найти компромиссный вариант - 2 чужие программы,  в которые их авторы уже вложили свой труд по чтению/пониманию/самостоятельной реализации спецификации PDF, и которые (эти программы) получились при этом достаточно простыми, чтобы я смог использовать их код в самостоятельной программной работе с PDF.

В общем, имея теперь такую базу, как fi2pdf v2.0, можно дальше её развивать и совершенствовать.

Использование утилиты:

Положите в папку с fi2pdf.exe любое (но меньшее 256) количество файлов форматов:

bmp, jpeg, jpg, gif, tiff, tif, png, pnm, ppm, pgm, pbm.

И запустите fi2pdf.exe.

Через некоторое время создастся файл output.pdf - в той же папке.

Детали:

fi2pdf v2.0 имеет лицензию GPL 2 and later - соответствующие  разрешения мне дали авторы jpeg2pdf и PosteRazor.

В jpeg2pdf я исправил один глючок, без исправления которого всё не работало в определённых условиях.

fi2pdf v2.0 хорош тем, что имеет крайне простой исходный код и крайне малый размер  - всего лишь 56 КБ (без FreeImage.dll)! Это очень мало - если сравнить с другими программными PDF-библиотеками.

Другое важное достоинство fi2pdf v2.0 - она сделана на чистом языке СИ (даже не на С++) - что очень облегчает её понимание сторонними людьми. А также она не зависит ни от Java, ни от .NET (ни от тому подобной гадости).

Самое забавное, что я как не умел программно работать с форматом PDF, так и не умею и сейчас - разве что получил некое общее представление об общем внутреннем устройстве PDF. fi2pdf v2.0 я сделал практически "вслепую", методом тыка, не понимая на каждом шаге, что я делаю - и мне повезло, что случайно всё получилось. :)

monday2000:
Есть ещё аналогичная программная библиотека LibHaru:

http://libharu.org/

Она используется для генерации PDF и имеет лицензию ZLIB/LIBPNG. Это совместимо с GPL: http://ru.wikipedia.org/wiki/Zlib-libpng_license . LibHaru написана на языке СИ.

Вот чья-то характеристика LibHaru: http://www.it-ru.de/forum/viewtopic.php?t=157873 .

Другие PDF-библиотеки перечислены тут: http://en.wikipedia.org/wiki/List_of_PDF_software

Я не знаю, как скомпилировать LibHaru под мой компилятор (MS VC++ 6.0), да и вес полученной программы будет явно больше, чем у fi2pdf.

fi2pdf настолько мал, что сгодился бы чуть ли не роль гипотетического PDF-плагина к FreeImage (!).

Впрочем, LibHaru имеет то преимущество, что умеет работать с фонтами (шрифтами) - что может быть весьма полезно (при генерации PDF).

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии