Ликбез по DjVu


Intro

Ныне в сети полно материала про этот уже не новый формат электронных документов. И все же я не нашел статьи, в которой ясно, сжато и доступно было бы все рассказано. Письма читателей только подтверждают то, что обилие материала не способствует пониманию идеи. Я в меру своих скромных сил постараюсь это исправить.

Чуток истории

DjVu (произносится "дежавю") как формат хранения данных был разработан компанией AT&T в середине 90х. Видимо, достойного применения всему этому не нашлось тогда, потому как вскоре все права на использование были проданы малоизвестной Lizardtech. Она, в свою очередь, причесала набор программ для работы с этим форматом и выставила все на продажу. Поскольку цена была просто заоблачной, продажи, по всей видимости, просто знатно обломились. В конце концов часть исходников была открыта вместе с описанием самого формата. В настоящее время Lizardtech занимается географическими картами, форматом хранения и программами для манипуляций с ними, но это уже немного другая тема.

Еще один велосипед?

"А нафига еще какой-то DjVu, есть же PDF, который везде и всегда можно прочитать?" - вот вопрос, который задают чаще всего. Попробуем разобраться.
Прежде всего я считаю в принципе некорректными такие попытки сравнения.
"Кто сильнее, кит или слон?", "Что лучше, обычный текстовый файл или HTML?" - так примерно это звучит. PDF - отличная штука для документов, изначально набранных на компьютере, которые нужно кому-то отправить или опубликовать и при этом стоит задача сохранить вид такого документа, иными словами, чтобы шрифты, картинки, сноски, разбивка на страницы и все прочее выглядели точно так же вне зависимости от того, где и под какой OС он открыт.
DjVu же, в свою очередь, был разработан специально для отсканированных документов, а возможность запаковать сканы страниц в PDF всего лишь фича, которая изначально не была предусмотрена. То есть такой PDF, конечно, можно сделать, но это будет скорее криворукая поделка, чем полноценный документ. Судите сами:

  • Размер PDF файла получается в 3-10 раз больше при том же разрешении
  • Совсем не факт, что PDF легко и просто откроется на любом компьютере, Adobe постоянно обновляет формат и вероятнее всего придется постоянно обновлять Acrobat Reader для просмотра
  • Горе умельцам приходится уменьшать сканы чтобы размер PDF файлов не был большим. При этом о нормальной печати или OCR говорить просто не приходится. Да и на экране все выглядит малочитабельно
  • Отсутствие возможности нормального поиска в таких PDF (существующие костыли не рассматриваю)
  • Глупые ограничения на PDF файлы типа 'нельзя печатать' etc

DjVu свободен от всех перечисленных недостатков. Размер документов получается небольшим, с прекрасным разрешением (большинство книг отсканированы в 300 или даже 600dpi). Нужно распечатать - пожалуйста. Хочется от'OCR'ить - легко. Поиск - работает, если при создании добавлен текстовый слой (легко добавить и потом без перепаковки всех страниц). Причем для хранения текстовой информации всегда и везде используется utf8, никакой чехарды с кодировками устраивать не нужно.

Чем читать DjVu файлы?

Куча ссылок на софт находится на http://djvu.org/. Можно сразу заглянуть сюда и сюда.
Мои рекомендации:

  • Unix. В DjVuLibre есть plug-in для browser'а и самостоятельная программа для промотра DjVu файлов - djview. Компилится и ставится как обычно. Работает вполне себе нормально. В комплекте ставится набор утилит для кодирования/декодирования DjVu файлов, печати и прочих вещей
  • Windows. Для browser'а есть отличный plug-in от Lizardtech, находится тут. Из самостоятельных просмотрщиков можно попробовать WinDjView
Но, повторюсь, выбрать есть из чего. Ставим что больше приглянулось и пользуемся.

Запаковка в DjVu

  • Unix. Особого выбора для создания DjVu файлов нет, только DjVuLibre. Да, в ее составе есть кодеры и причем несколько разных, все в принципе работает без глюков, но a) размер файлов получается больше чем мог бы быть, б) нет нормального OCR софта, и, как следствие, невозможно добавить OCR слой в DjVu файл.
    Для быстрой перегонки PDF в DjVu в DjVuLibre есть отличная утилита djvudigital.
  • Windows. Нормальные результаты получаются при использовании DjVu Solo 3.1 или, если удастся найти, DjVu Pro 4.x. Если есть ABBYY FineReader (вполне подойдет и evaluation версия, у которой закончилось время демо-работы), можно легко добавить OCR слой, который позволит использовать поиск и индексацию в DjVu документах. Я пользуюсь DjVu Tools для этого.
Не разжевываю как пользоваться DjVuLibre или DjVu Solo 3.1, в сети есть много информации на эту тему. Скажу только, что сканировать нужно с разрешением 300 или (что лучше) 600dpi. Сканы обрезать любым редактором. Есть смысл сконвертить все в GIF для уменьшения количества цветов и облегчения последующей задачи кодеру.

Технические аспекты

Думаю что для большинства технические подробности будут неинтересны и им впору будет нажать кнопочку 'Back'. Для оставшихся расскажу чуть про внутренности формата.

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

Что же нового придумано в формате DjVu?
В отличие от GIF/JPEF/PDF и прочих страница документа может разбиваться на несколько слоев. В самом общем случае это foreground, backgroung, маска разделения этих двух слоев и дополнительная текстовая информация. Процесс кодирования это своего рода искусство разделить отсканированный документ на слои и определить что попадет в foreground, что в background в результате сжатия. И самая сложная часть алгоритмов - именно в этом. Поэтому, как я уже говорил, коммерческие кодеры обычно работают лучше DjVuLibre, потому как алгоритмы там более отточенные.

Что такое разделение на слои и зачем такие сложности? Дело в том, что книги (и соответственно их сканы) содержат информацию, которую нужно обрабатывать совершенно по-разному. Например, для текста важно сохранить максимальное разрешение буковок, при минимальной информации о цвете, для фотографий же такой подход неприемлем ввиду большого объема в результате такого подхода и так далее. DjVu же разделяет сканы на слои, к которым применяются принципиально разные методы сжатия. При просмотре слои последовательно рендерятся и объединяются в конечной картинке.

Z-coder.
Арифметический кодер/декодер который является основой всех преобразований в DjVu. Принцип действия похож на тот, что применяется в алгоритме BZIP2. Подробности можно почитать в [4]. Этот кодек применяется как фильтр - выходной при создании чанков и входной перед рендерингом слоев.

JB2 encoder.
Применяется для упаковки bitonal данных, таких как текст, черно-белые рисунки и пр. Может хранить маску, т.е. информацию о том, что попадает в background, а что в foreground. Вся информация хранится в виде библиотеки (dictionary) форм (shape) плюс положение каждого объекта на плоскости страницы. Сами библиотеки могут быть общими для нескольких страниц. Легче всего это представить таким образом. К примеру есть отсканированный текст, кодировщик определяет похожие буковки, скажем все 'а', 'б' etc и создает библиотеку, в которой находится информация о каждой букве (форме), а потом просто информация, что 'a' находится в таком-то и таком-то месте, 'б' в таком-то и так далее. Поскольку, как я говорил, словарь может быть расшарен между страницами, упаковка получается зверская. В дополнение к всему этому может быть сохранена информация о цвете форм, то есть если есть, скажем, красная 'а' и синяя 'a' в скане, то в библиотеку попадет только одна 'а', будет записана информация о местоположении двух форм 'а' и о их цвете. Цвет хранится в индексированном виде, точно так же, как и в GIF файлах.

Сигнатура чанка для JB2 слоя - 'Sjbz', может ссылаться на внешнюю библиотеку форм - 'Djbz' чанк. Информация о цветах форм находится в чанках 'FGbz'.

Все такие чанки пожаты Z-coder'ом.

IW44 encoder.
Wavelet кодер. Применяется для упаковки фотографий, backgroung. Foreground цвета тоже могут быть упакованы таким же образом. Принцип упаковки такой же как, в формате JPEG 2000. Подробности в [3]. Может быть упакована как цветная, так и b/w информация. Информация о background обычно сохраняется с меньшим (как правило в 3 раза) разрешении, чем JB2. Если foreground упакован таким способом, то 'Sjbz' маска определяет, что попадает в foreground, а что нет. Информация и цвете кодируется не в RGB, а YCbCr (яркость плюс разностные каналы, как в телевидении).

Сигнатура чанка для background слоя - 'BG44', foreground - 'FG44'.

Опять же, все такие чанки пожаты Z-coder'ом.

Прочая информация.
Текстовый слой - 'TXTz'. Распознанный текст совместно с его расположением на странице. Информация о расположении может быть детализована до слов или до строчек. Этот слой позволяет использовать поиск с подсветкой найденного на странице и индексировать DjVu документы.
Аннотации - 'ANTz'. Ссылки и информация о том, какие слои выводить по умолчанию при открытии файла.

'TXTz' и 'ANTz' пропущены через Z-coder.

Кроме того может быть закодирована информация о кодере (чанк 'CIDa') и прочее. Четкого стандарта нет, но эта информация в принципе не нужна для нормального декодирования.

Ограничения формата.

  • Максимальный размер страницы 65535x65535px
  • Отсутствие контрольных сумм внутри формата и чанков (битый файл все равно распакуется, но в непотребную кашу). На практике - лучше заархивировать DjVu файлы, что гарантирует их целостность
  • Отсутствие криптования и ограничений на использование информации (поборники DRM тихо курят в сторонке). Ну это скорее не ограничение, а плюс. Насколько мне известно, были попытки сделать некий Secure DjVu на базе обычного, но ничего путного не получилось

Вот вкратце и все. Особо интересующихся отсылаю к исходникам DjVuLibre. Буду рад, если представленная информация помогла ответить на вопросы и разобраться в предмете.

Благодарности

Leon Bottou за ценную информацию о потрохах DjVu.

Литература

  • 1. "Specification of DjVu Image Compression Format." AT&T 1999.
  • 2. "Lizardtech DjVu Reference. DjVu v3." 2005.
  • 3. С. Уэлстид. "Фракталы и вейвлеты для сжатия изображений в действии."
  • 4. Ватолин Д., Ратушняк А., Смирнов М., Юкин В. "Методы сжатия данных. Устройство архиваторов, сжатие изображений и видео."

Tags: djvu viewers


Назад в оглавление



[Home] [TTL] [Unix] [Sdictionary] [ROW Programmer] [Symbian] [Misc] [News] [Search] [Contacts] [Guestbook]


Copyright (c) 1999-2017 Alexey Semenoff