Автор Тема: Утилита fi2pdf  (Прочитано 5566 раз)

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Утилита fi2pdf
« : 09 ёоЭм 2010, 09:07:24 »
Я сделал небольшую консольную утилиту:

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

  • Пользователь
  • **
  • Сообщений: 59
    • Просмотр профиля
    • E-mail
Re: Утилита fi2pdf
« Ответ #1 : 10 ёоЭм 2010, 12:57:36 »
А чем это лучше Adobe Acrobat? Там и многостраничные файлы  легко собирать и много других граффайлов поддерживается.

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Утилита fi2pdf
« Ответ #2 : 10 ёоЭм 2010, 17:34:32 »
Да я искал вариант как создавать PDF в своей программе на движке FreeImage. Причём мне хотелось бы что-нибудь попроще и поменьше весом.

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Утилита fi2pdf
« Ответ #3 : 13 °ТУгбв 2010, 14:46:41 »
Я сделал новую версию консольной утилиты:

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 я сделал практически "вслепую", методом тыка, не понимая на каждом шаге, что я делаю - и мне повезло, что случайно всё получилось. :)
« Последнее редактирование: 13 °ТУгбв 2010, 15:47:38 от monday2000 »

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Утилита fi2pdf
« Ответ #4 : 13 °ТУгбв 2010, 16:47:09 »
Есть ещё аналогичная программная библиотека 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).
« Последнее редактирование: 13 °ТУгбв 2010, 16:50:25 от monday2000 »

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Утилита fi2pdf
« Ответ #5 : 16 јРав 2011, 18:54:06 »
Я сделал новую подверсию консольной утилиты:

fi2pdf v2.1

Скачать:

http://www.djvu-soft.narod.ru/soft/fi2pdf_v2_1.rar  (609 КБ)

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

Что нового:

1. Изменено максимальное количество файлов, которые можно одномоментно закодировать в PDF - с 256 до 10240. Надеюсь, этого количества будет достаточно практически для любой бумажной книги - вряд ли найдётся такая книга, где есть больше 10 тысяч страниц.

Для того, чтобы поднять это ограничение с 256 до 10240, я слегка перестроил модель использования оперативной памяти программой: теперь программа уже не загружает в память тело очередного кодируемого файла - а загружает только его характеристики (размер, dpi, цветность и пр.). Тело файла теперь считывается в самый последний момент - прямо из файла оно напрямую записывается в нужное место формируемого PDF-файла.

Такой подход радикально снижает затраты оперативной памяти, что и позволило поднять лимит одновременного кодирования.

2. Изменен способ масштабирования кодируемых файлов. Теперь стало учитываться индивидуальное DPI каждого кодируемого файла (если оно равно нулю, то оно принимается как 72 dpi).

Это позволило делать страницы PDF в натуральном соотношении сторон скана. Ранее нередко бывало так, что одни страницы безобразно вытягивались, скажем, по ширине - чтобы подогнать их под размер других страниц. Теперь это варварство в прошлом.

3. Теперь я не использую исходный код с http://www.codeproject.com/KB/library/jpeg2pdf.aspx для определения данных JPEG (размер, dpi, цветность и пр.) - он мне стал просто не нужен - а взамен я теперь использую единый аналогичный код из FreeImage.

Эта версия программы - первая, которую можно назвать по-настоящему серьёзным PDF-кодировщиком. Ею можно реально всерьёз пользоваться. Она предполагает 2 типа PDF-сжатия:

- JPEG
- ZLib (наверное, это LZW, но точно пока не знаю).

В JPEG-сжатие программа кодирует все JPEG-файлы, что ей подаются на вход, файлы же с любыми иными расширениями кодируются как ZLib.

Пользоваться программой просто: достаточно положить в папку со сканами файл "fi2pdf.exe" и файл "FreeImage.dll". Обратите внимание - этот файл "FreeImage.dll" - он не простой, а с поддержкой частичной загрузки http://www.djvu-scan.ru/forum/index.php?topic=56.0 . Обычный простой файл "FreeImage.dll" не подойдёт для "fi2pdf.exe"!

Конечно, эту утилиту ещё нужно будет потестить на самых разных сканах - на предмет глюков. Я хотел вообще убрать лимит одновременного кодирования - но пока не смог, т.к. от его значения там в коде зависят статические размеры некоторых буферов. Если лимит убрать, то нужно будет и буферы эти делать динамического размера - что значительно усложнит код. Я пока не определился, нужно ли это сделать. Вроде бы 10240 страниц должно хватить на все случаи жизни.
« Последнее редактирование: 16 јРав 2011, 18:56:49 от monday2000 »

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Утилита fi2pdf
« Ответ #6 : 17 јРав 2011, 11:26:55 »
Вот здесь https://sourceforge.net/projects/freeimage/forums/forum/36111/topic/3721193/index/page/1 на форуме FreeImage я сделал описание своей новой утилиты.

Я также предложил сделать PDF-плагин для FreeImage "только на запись" на базе fi2pdf v2.1.

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Утилита fi2pdf
« Ответ #7 : 17 јРав 2011, 17:19:06 »
Судя по этому топику https://sourceforge.net/projects/freeimage/forums/forum/36110/topic/1304423 , алгоритм PDF-сжатия "ZLib" - это беспотерьное сжатие Deflate:

http://en.wikipedia.org/wiki/DEFLATE

http://ru.wikipedia.org/wiki/DEFLATE

Цитата оттуда:
Цитировать
Deflate — это алгоритм сжатия без потерь, который использует комбинацию алгоритма LZ77 и алгоритма Хаффмана. Изначально он был описан Филом Кацом для 2-й версии своей утилиты для создания архивов PKZIP, который впоследствии был определён в RFC 1951.

Deflate считается свободным от всех существующих патентов, и пока патент на LZW (который используется в формате GIF) оставался в силе, это привело к использованию deflate в файлах, сжимаемых gzip, и изображениях в формате PNG вдобавок к формату ZIP, для которого Кац изначально его спроектировал.

Mcpiter

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
    • E-mail
Re: Утилита fi2pdf
« Ответ #8 : 23 јРав 2013, 19:26:52 »
Я хотел бы уточнить, я стаю перед выбором что купить ваш продукт или http://www.ronyasoft.com/products/proposter/, на форумах мне сказали, что ваша программа хорошая, но также перечислили ряд преимуществ Poster Printer, и теперь вообще не понять, что мне делать((

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: Утилита fi2pdf
« Ответ #9 : 23 јРав 2013, 22:19:28 »
Mcpiter
Что значит "купить"? :) Я ничего не продаю. Что касается http://www.ronyasoft.com/products/proposter/ , я не знаю эту программу и ничего не могу о ней сказать. Но она явно умеет гораздо больше, чем fi2pdf.