Вернуться к разделу "Материалы по сканированию и оцифровке бумажных книг".


Сведения о MuPDF

Введение

Формат PDF - это формат № 2 (после формата DjVu), который имеет отношение к электронным книгам. Он достаточно широко применяется в этом качестве.

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

Иногда его по незнанию применяют и для растровых электронных книг (создаваемых путём сканирования бумажных книг) - в виде разновидности "растровый PDF" (хотя для этой цели следует использовать формат DjVu).

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

Как видно, большинство этих задач имеет общую направленность "из PDF в DjVu".

Для выполнения этих задач применяется множество самых разнообразных готовых PDF-программ - как коммерческих, так и бесплатных.

Но готовыми PDF-программами можно обойтись не всегда (когда речь идёт об электронных книгах). Для этого существует несколько причин:

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

2. Коммерческий статус большинства качественных PDF-программ.

3. Неоправданно большой файлоразмер многих PDF-программ (например, полный Adobe Acrobat).

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

Отсюда сама собой возникает мысль об использовании некоммерческих программных PDF-библиотек (с открытыми исходниками и под лицензией "GPL 2 и выше") в качестве наиболее универсального средства для работы с электронными книгами в формате PDF (дополнительно ко всем существующим PDF-программам).

На сегодняшний день существует несколько популярных программных библиотек для работы с PDF - как коммерческих, так и некоммерческих. Список можно посмотреть тут:  http://en.wikipedia.org/wiki/List_of_PDF_software.

Из некоммерческих полноценных PDF-библиотек (на языке С и с лицензией GPL) наиболее известны следующие:

1. GhostScript

2. XPDF и Poppler

3. MuPDF

4. GNUpdf

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

Некоторые программные библиотеки внутренне используют для работы с PDF вышеуказанные библиотеки. Например, GIMP и ImageMagick внутренне используют GhostScript для работы с PDF-файлами.

Все эти 4 основные PDF-библиотеки имеют свои преимущества и недостатки. GhostScript - наиболее развитая, но излишне сложная, излишне функциональная и тяжеловесная библиотека. XPDF и Poppler - неплохая и достаточно развитая библиотека. XPDF - это независимый PDF-движок, а Poppler - это программная PDF-библиотека на его базе. MuPDF рассмотрим отдельно. GNUpdf - пока что находится в стадии разработки и ни один её релиз ещё не был выпущен.

В программной работе с форматом PDF встречаются такие понятия, как парсинг и рендеринг.

Парсинг - это процесс чтения и разбора внутренних структур данных PDF-файла (вводное описание внутренней структуры PDF-файла можно почитать здесь: http://gnupdf.org/Introduction_to_PDF). Это наиболее простая часть функциональности PDF-библиотек. Парсинг достаточен для выполнения таких задач, как вставка-удаление страниц, работа с метаданными, оптимизация контента.

Рендеринг - это процесс растеризации векторного контента PDF-файла. Это уже гораздо более сложная функциональность по сравнению с парсингом. Не все PDF-библиотеки поддерживают рендеринг. Рендеринг необходим для отображения PDF-файла на экране любого PDF-просмотрщика, при печати и декодировании PDF->TIF.


Описание MuPDF

На мой взгляд, из всех вышеуказаных основных 4 PDF-библиотек наиболее перспективной на данный момент является MuPDF. MuPDF - это разработка фирмы Artifex, являющейся также автором и владельцем GhostScript.

MuPDF в настоящее время оформлен в виде пакета консольных утилит для работы с форматом PDF.

MuPDF работает в паре с графической библиотекой Fitz. MuPDF осуществляет парсинг, а Fitz - рендеринг.

MuPDF имеет полностью открытые исходные коды и лицензию "GPL 2 или выше". Он может компилироваться под Linux и Windows.

Официальная страница проекта - http://ccxvii.net/mupdf/.

Там можно скачать исходники пакета и простейшие демонстрационные MuPDF-просмотрщики под Windows и Linux.

Как я понимаю, MuPDF - это новая разработка Artifex'а, которую начали создавать на замену GhostScript. Цель этого начинания наиболее полно обозначена тут: http://ghostpdf.com/new.html: "воспользоваться преимуществами современной компьютерной архитектуры". Ведь GhostScript был создан в 1986 году и не исключено, что его архитектура устарела настолько, что в Artifex решили начать создавать "с нуля" совершенно новую PDF-библиотеку (чтобы заменить ею GhostScript со временем).

Также заявлено, что MuPDF в 5 раз быстрее, чем GhostScript, и использует для рендеринга революционную графическую библиотеку Fitz (быструю, качественную и с древовидным представлением данных), а также поддерживает самый современный стандарт PDF - версии 1.7 (правда, в слегка урезанном виде - без поддержки интерактивных форм - но это практически не важно для целей книгосканирования). Кроме того, MuPDF очень компактен по размеру (особенно по сравнению с GhostScript).

Однако, нынешняя ситуация с развитием MuPDF выглядит далеко не лучшим образом. Общее впечатление таково, что фирма Artifex по непонятным причинам практически забросила развитие этой библиотеки. Её поддержку официально осуществляет некто Tor Andersson (предположительно сотрудник Artifex). Его деятельность (насколько можно судить) сводится исключительно к устранению найденных багов и тому подобной мелочёвке. Крайне странным выглядит полное отсутствие хоть какой-либо документации к библиотеке. Есть лишь скудное, мало о чём говорящее, описание синтаксиса командной строки для каждой консольной утилиты. Сам Tor Andersson не отвечает на электронные письма.

Подобная "внешняя неразвитость" привела к тому, что статью о MuPDF удалили из Википедии с формулировкой "незначительная библиотека": http://en.wikipedia.org/wiki/MuPDF. Копия этой удалённой страницы доступна здесь: http://deletionpedia.dbatley.com/w/index.php?title=MuPDF.

Перспективность MuPDF смог уловить автор PDF-просмотрщика SumatraPDF (Кшиштоф Ковальчик) - применив его в своей программе. Крайне интересен тот факт, что раньше SumatraPDF использовал только Poppler в качестве своего PDF-движка, затем Кшиштоф добавил MuPDF как опциональный PDF-движок (там была галочка вроде "Использовать MuPDF") и, наконец, SumatraPDF окончательно отказался от Poppler и полностью перешёл на MuPDF.

Я думаю, что переход SumatraPDF с Poppler на MuPDF не случаен - вряд ли Кшиштоф стал бы это делать "просто так" - скорее всего, это подтверждает стратегическое преимущество MuPDF по сравнению с Poppler. На мой взгляд, здесь существенным моментом является тот факт, что создатель MuPDF - это та же самая фирма, которая создавала GhostScript - популярнейший и наиболее развитый свободно-бесплатный PDF-движок современности, причём создавала она его с учётом всех недостатков GhostScript и на его замену.

Впрочем, не всё так идеально: сам Кшиштоф сделал специальную страницу недостатков MuPDF, где он подробно рассматривает конкретные примеры некорректной работы MuPDF.

На мой вопрос, почему он перешёл на MuPDF, Кшиштоф ответил, что "MuPDF быстрее и имеет значительно более быстрый код". На вопрос, рассматривал ли он какие-либо иные варианты, кроме Poppler и MuPDF, Кшиштоф ответил, что "нет никаких больше вариантов, которые были бы под С/С++ и делали бы одновременно парсинг и рендеринг", и ещё он сказал, что "поскольку соревнование идёт между только лишь Poppler и MuPDF, я предпочитаю MuPDF".

Как уже говорилось выше, MuPDF вообще не имеет какой-либо документации. Кшиштоф посоветовал читать исходники MuPDF, чтобы понять, как она работает.


Продукты, использующие MuPDF

MuPDF используется достаточно мало и редко. Я постарался составить наиболее полный (на сегодняшний день) список продуктов, использующих MuPDF. Давайте рассмотрим его подробнее.

1. Sumatra PDF

Sumatra PDF - это просмотрщик PDF-файлов под Windows. Он является самым известным продуктом, в котором используется MuPDF.

Домашняя страница Sumatra PDF

Sumatra PDF в Википедии

2. Bookr v8.1

Bookr - это программа для просмотра PDF, TXT, PalmDoc, DJVU, CHM/HTML файлов на Sony PSP.

Домашняя страница Bookr

Существует неофициальная версия 8.1 этой программы - с поддержкой DjVu (автор - Nguyen Chi Tam nguyenchitam [at] gmail [dot] com). К сожалению, авторы официальной версии Bookr не откликаются и не размещают Bookr 8.1 на своём сайте.

Кроме того, существуют Bookr'ы российской модификации:

Вариант 1:  Mod Bookr

Вариант 2:  OZ Bookr

3. soPdf

Программа для преобразования PDF файлов в вид, подходящий для Sony PSP.

Описание soPDF

Домашняя страница soPDF

4. GL PDF Render

Программа для преобразования PDF файлов в OpenGL-текстуры.

Домашняя страница GL PDF Render

5. MiPDF v1.0 (RC 1)

Программа-просмотрщик PDF файлов для GP2X.

Описание MiPDF


Дистрибутивы MuPDF

Исходные коды библиотеки MuPDF доступны здесь: http://ccxvii.net/mupdf/. Впрочем, с ними не слишком удобно работать - они рассчитаны на компиляцию утилитами сборки Jam или FTJam, а также там отсутствуют необходимые для компиляции файлы графических и пр. библиотек - freetype, libjpeg, zlib, jasper, jbig2dec (их предполагается скачивать отдельно на соответствующих сайтах, добавлять к исходникам MuPDF, и компилировать всё это вместе).

Всё это не очень удобно. Автор Sumatra PDF - Кшиштоф Ковальчик - сделал свою модифицированную версию MuPDF, которая включает в себя makefile'ы для Mingw и для MS Visual C++ 2005 или 2008, а также исходники всех нужных графических и т.п. библиотек. Исходники его версии MuPDF входят в состав исходников Sumatra PDF, которые можно скачать здесь: http://sumatrapdf.googlecode.com/svn/trunk/.

Исходники лежат там россыпью в SVN-хранилище. Это не очень удобно для целей компиляции - приходится сначала их оттуда выкачивать каким-нибудь SVN-клиентом. Более удобно было бы, если бы эти исходники были выложены там также и в виде единого архива под скачивание. К сожалению, Кшиштоф проигнорировал все мои просьбы выложить исходники Sumatra PDF также и в виде единого архива.

Для выкачивания исходников я использовал популярную программу TortoiseSVN. К сожалению, выкачать эти исходники оказалось крайне непросто: всякий раз при попытке скачивания по команде Export где-то на середине процесса выскакивала ошибка:

Error    REPORT of '/svn/!svn/vcc/default': Could not read response body: connection was
Error    closed by proxy server (http://sumatrapdf.googlecode.com)
Finished!

Эту проблему удалось обойти путём применения другой команды - SVN Checkout... . После очередного обрыва соединения достаточно было лишь запускать команду Update - и процесс скачивания возобновлялся уже не с начала, а с места обрыва коннекта. По окончании скачивания я также применил команду Export (и экспортировал скаченные исходники в новую папку) - т.к. в папке со скаченными исходниками оказалось множество служебных файлов, сгенерированных TortoiseSVN.

Но при следующем скачивании исходников стала появляться иная ошибка:

Error    PROPFIND of '/svn/!svn/bc/343/COPYING': 200 OK (http://sumatrapdf.googlecode.com)
Finished!

Поэтому мне пришлось скачивать эти исходники папку за папкой, тщательно проверяя при этом комплектность скаченных файлов. Изрядно намучавшись с этим занятием и израсходовав немалое количество трафика, мне всё же удалось полностью выкачать исходники Sumatra PDF с http://sumatrapdf.googlecode.com/svn/trunk/. Я выкладываю их здесь в виде единого архива (чтобы другие не мучались с подобным выкачиванием):

SumatraPDF sourcecodes (4,19 МБ) (16.07.09, r1309)

Там внутри находится папка mupdf с исходниками MuPDF. Также в этой папке находится файл buildwin.bat, который запускает процесс автоматической компиляции консольных утилит MuPDF.

Для начала я попытался запустить buildwin.bat под MS Visual C++ 6.0. Ничего не получилось - посыпались какие-то многочисленные ошибки.

Затем попробовал запустить buildwin.bat под MS Visual C++ 2008 Express Edition (это бесплатный С++-компилятор от Microsoft, который можно скачать здесь). Ничего не получилось тоже - выскочило сообщение о каком-то ненайденном пути.

Оказалось, что нужно немного подправить файл buildwin.bat: вместо EXTLIBSDIR=..\sumatrapdf\ я просто указал EXTLIBSDIR=C:\sumatrapdf\ (где sumatrapdf - имя папки с исходниками Sumatra PDF). Запустил buildwin.bat снова. После нескольких минут работы и вороха некритических предупреждений благополучно скомпилировались 5 консольных MuPDF-утилит (в MS Visual C++ 2008 Express Edition).


Вариативный макрос

Как выяснилось позже, исходники MuPDF не смогли скомпилироваться под MS Visual C++ 6.0 из-за того, что они используют некое нововведение языка Си - т.н. "Вариативный макрос".

Что это такое, можно прочитать в соответствующей статье в Википедии. Пример использования вариативного макроса можно увидеть здесь:

Обратите внимание на строку:

#define fz_throw(...) fz_throw0(__FUNCTION__, __FILE__, __LINE__, __VA_ARGS__)

Это и есть пример использования вариативного макроса. Более подробно о вариативных макросах можно посмотреть здесь:

Variadic Macros (C++)  (MSDN)

Как мне передать переменное число параметров в макрос (С++)

MS Visual C++ 2008 Express Edition поддерживает вариативные макросы, а MS Visual C++ 6.0 - нет. Из-за этого полученные консольные MuPDF-утилиты не могут работать под Windows 98 (т.к. MS Visual C++ 2008 Express Edition вообще не поддерживает Windows 98). Однако, если заменить вариативные макросы обычными, скорее всего эта проблема может быть решена.


Консольные утилиты

В этом разделе находятся дистрибутив и описание скомпилированных мною консольных MuPDF-утилит (наиболее вероятно, что Вы не найдёте эти утилиты в готовом виде нигде больше в Интернете - это абсолютно уникальный продукт на данный момент).


Скачать 6 готовых консольных MuPDF-утилит (1,45 МБ) (не работают под Win 98).

 

pdfbench

Benchmarking of loading and drawing pdf pages.

usage: pdfbench [-loadonly] [-page N] <pdffile>

pdfclean

PDF cleaning tool: general purpose pdf syntax washer.

Rewrite PDF with pretty printed objects.
Garbage collect unreachable objects.
Inflate compressed streams.
Encrypt output.

usage: pdfclean [options] input.pdf [outfile.pdf]-d - password for decryption

-g garbage collect unused objects
-x expand compressed streams
-e encrypt output
-u - set user password for encryption
-o - set owner password
-p - set permissions (combine letters 'pmca')
-n - key length in bits: 40 <= n <= 128

pdfdraw

Draw pages to PPM bitmaps.
Dump parsed display list as XML.
Dump text content as UTF-8.
Benchmark rendering speed.

usage: pdfdraw [options] [file.pdf pages ... ]

-b - draw page in N bands
-d - password for decryption
-o - pattern (%d for page number) for output file
-r - resolution in dpi
-t utf-8 text output instead of graphics
-x xml dump of display tree
-m print benchmark results

example:

pdfdraw -o output%03d.pnm input.pdf 1-3,5,9-

pdfextract

The ultimate way to extract images and fonts from pdfs.

usage: pdfextract [-d password] <file> [object numbers]

-d decrypt password

Примечание: Эта утилита изначально не компилировалась - т.к. она появилась позже всех, и она не была упомянута в makefile. Я подкорректировал нужным образом makefile, и эти изменения внесли в исходники SumatraPDF.

pdfinfo

Information tool.

Print information about the input pdf.

usage: mupdftool info [options] [file.pdf ... ]

-d - password for decryption
-f - list fonts
-i - list images
-m - list dimensions
-p - list pattners
-s - list shadings
-x - list form and postscript xobjects

example:

mupdftool info -p mypassword a.pdf

pdfshow

The ultimate pdf debugging tool

usage: pdfshow [-bd] [-p password] <file> [xref] [trailer] [object numbers]

-b print streams as raw binary data
-x decompress streams
-d decrypt password


Заключение

Библиотека MuPDF - это наиболее перспективное на сегодняшний день свободно-бесплатное средство для программной работы с PDF-файлами (для случая языка С и лицензии "GPL 2 и выше").

MuPDF, к сожалению, пока что неразвит в плане его практического использования. В числе возможных задач его развития можно указать следующие:

1. Создание полноценной документации  к консольным MuPDF-утилитам.

2. Создание документации к функциям библиотеки MuPDF.

3. Восстановление в Википедии страницы о MuPDF (только после выполнения пп. 1 и 2).

4. Создание полноценных компиляционных проектов MuPDF для MS Visual C++ 6.0 и последующих версий (на базе существуюшего makefile).

5. Интеграция MuPDF в самодельные книгосканировочные программы.

6. Создание SDK на базе MuPDF.

7. Интеграция MuPDF с DjVuLibre.


Полезные ссылки:

Фирменное описание MuPDF

http://www.ghostscript.com/MuPDF.html

http://ghostpdf.com/

http://ghostpdf.com/new.html

http://deletionpedia.dbatley.com/w/index.php?title=MuPDF - описание удалённой  из Википедии статьи о MuPDF

http://www.murga-linux.com/puppy/viewtopic.php?t=26762 Обсуждение MuPDF на каком-то форуме

http://blog.kowalczyk.info/article/Mupdf-notes.html заметка Кшиштофа Ковальчика о MuPDF

http://mupdf.pbwiki.com/mupdf+bugs Список проблем MuPDF, замеченных Кшиштофом

http://www.gnupdf.org/Introduction_to_PDF Introduction to PDF - GNUpdf

http://sigmax.no-ip.org/blog/?p=686 описание попытки скомпилировать MuPDF


Автор: monday2000.

25 июня 2009 г.

E-Mail  (monday2000 [at] yandex.ru)

Hosted by uCoz