Главное > Pdf
Утилита fi2pdf
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).
Навигация
Перейти к полной версии