Нотатки на коліні, лікнеп по djvu

Нині в мережі повно матеріалу про цей вже не новий формат електронних документів. І все ж я не знайшов статті, в якій ясно, стисло і доступно було б все розказано. Листи читачів тільки підтверджують те, що велика кількість матеріалу не сприяє розумінню ідеї. Я в міру своїх скромних сил постараюся це виправити.

DjVu (вимовляється "дежавю") як формат зберігання даних був розроблений компанією ATT в середині 90х. Мабуть, гідного застосування всього цього не знайшлося тоді, тому як незабаром все права на використання були продані маловідомої Lizardtech. Вона, в свою чергу, причесала набір програм для роботи з цим форматом і виставила все на продаж. Оскільки ціна була просто захмарною, продажу, по всій видимості, просто знатно обломилися. Зрештою частина початкових кодів була відкрита разом з описом самого формату. В даний час Lizardtech займається географічними картами, форматом зберігання і програмами для маніпуляцій з ними, але це вже трохи інша тема.

Ще один велосипед?

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

Запаковування в DjVu

Думаю що для більшості технічні подробиці будуть нецікаві і їм впору буде натиснути кнопочку 'Back'. Для решти розповім трохи про нутрощі формату.

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

Що ж нового придумано в форматі DjVu?
На відміну від GIF / JPEF / PDF і інших сторінка документа може розбиватися на кілька шарів. У найзагальнішому випадку це foreground, backgroung, маска поділу цих двох шарів і додаткова текстова інформація. Процес кодування це свого роду мистецтво розділити відсканований документ на шари і визначити що потрапить в foreground, що в background в результаті стиснення. І найскладніша частина алгоритмів - саме в цьому. Тому, як я вже говорив, комерційні кодери зазвичай працюють краще DjVuLibre, тому як алгоритми там більш відточені.

Z-coder.
Арифметичний кодер / декодер який є основою всіх перетворень в DjVu. Принцип дії схожий на той, що застосовується в алгоритмі BZIP2. Подробиці можна почитати в [4]. Цей кодек застосовується як фільтр - вихідний при створенні чанкі і вхідний перед рендерингом шарів.

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

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

Всі такі чанкі потиснуто Z-coder'ом.

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

Знову ж таки, все такі чанкі потиснуто Z-coder'ом.

Інша інформація.
Текстовий шар - 'TXTz'. Розпізнаний текст спільно з його розташуванням на сторінці. Інформація про розташування може бути деталізована до слів або до рядків. Цей шар дозволяє використовувати пошук з підсвічуванням знайденого на сторінці і індексувати DjVu документи.
Анотації - 'ANTz'. Посилання та інформація про те, які верстви виводити за замовчуванням при відкритті файлу.

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

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

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

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

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