|
Поддержка сжатия JBIG2
Обзор
HotPDF включает сжатие и декодирование JBIG2 для двухуровневых изображений, используемых сканированным текстом, формами и line art
Ключевые возможности
- Высокоэффективное сжатие двухуровневых изображений
- Поддержка режимов сжатия с потерями и без потерь
- Оптимизация под сжатие текста и line art
- Существенное уменьшение размера файла по сравнению с традиционными методами сжатия
- Многостраничное кодирование с одним обученным словарём символов, разделяемым всеми image XObject
- Точное обнаружение дубликатов страниц до классификации и переиспользование закодированных XObject при сборке PDF
- Ограниченные бюджеты страниц и пикселей с опциональным нативным Pascal fallback
Преимущества сжатия
- Межстраничное переиспользование: Повторяющиеся символы классифицируются один раз и хранятся в разделяемых глобальных данных
- Сопоставление символов: С
UseSymbolDictionary повторяющиеся чёрные связные компоненты сохраняются один раз как символы, а LossyLevel позволяет почти идентичным компонентам делить один символ
- Экономия памяти: Оптимизация под обработку больших сканированных документов
Типичные сценарии использования
- Сканированные текстовые документы
- Технические чертежи и планы
- Формы и счета
- Карты и диаграммы
- Документы со смешанным содержимым: текст и графика
Техническая реализация
Реализация JBIG2 даёт нативные Pascal-пути и опциональный статический внешний бэкенд через эти API
- THPDFJBIG2Decoder: Основной класс декодера сжатых данных JBIG2
- Покрытие нативного кодирования: _generic-регионы MMR, generic-регионы MQ, арифметические и standard-Huffman словари символов и текстовые регионы, refinement-символы, агрегатные символы, уточнённые текстовые инстансы, удерживаемые арифметические контексты и ограниченные long-form таблицы ссылок
- Ограниченное переиспользование контекстов: Банки вероятностей generic и refinement удерживаются с размерами, учитывающими шаблон, изолируются между fan-out зависимостями и отвергаются, когда их источник или шаблон несовместимы
- Потоковая обработка: Эффективная обработка потоков данных JBIG2
- Поддержка глобальных словарей: Разделяемые и многоуровневые цепочечные словари символов с сегментными идентификаторами в один, два или четыре байта
- Межстраничный пакетный энкодер:
THPDFJBIG2Encoder.EncodePagesToByteArrays обучается на всём пакете целиком и возвращает один поток страницы на вход плюс разделяемые глобальные данные
- Контракт пакета:
TJBIG2BatchPage описывает одну упакованную страницу, TJBIG2BatchEncodeBackend идентифицирует выбранную реализацию, а TJBIG2BatchEncodeCallback определяет внешние пакетные интеграции
- Интеграция в документ:
THotPDF.AddJBIG2ImageBatch и THotPDF.AddJBIG2BitmapBatch кодируют до мутации графа PDF, присоединяют общий поток /JBIG2Globals и возвращают индексы изображений в порядке входа
- Пакетная телеметрия:
TJBIG2BatchEncodeStatistics сообщает выбранный бэкенд, размеры входа и выхода, число нативных символов и отказы по бюджету
- Восстановление бэкенда:
HPDFJBIG2EncRegisterBackends восстанавливает оба встроенных callback-а энкодера после сброса временных переопределений приложения
- HPDFJBIG2SplitSymbolDictionaryGlobals: Разделяет последовательный встроенный поток на глобальные словари и сегменты изображений страниц, сохраняя long-form заголовки зависимостей
- Декодирование видимой области:
THPDFJBIG2Decoder.LoadRegionFromByteArray выделяет только запрошенное окно, разрешает его транзитивные словарные зависимости, компонует пересекающиеся регионы страницы с клиппингом и пропускает независимые внеоконные регионы до энтропийного декодирования
- Телеметрия декодирования регионов:
LastRegionDecodeStats сообщает числа декодированных и пропущенных регионов плюс декодированные исходные пиксели, а UsedIncrementalRegionDecode отличает нативный оконный путь от fallback-а полного декодирования
- Построчный доступ: Построчный доступ к данным для экономной по памяти обработки
Пример использования
// Delphi example - Processing JBIG2 compressed data
procedure ProcessJBIG2Data;
var
PDF: THotPDF;
Decoder: THPDFJBIG2Decoder;
ImageData: TBytesArray;
ScanlineData: TBytesArray;
Row: Integer;
begin
PDF := THotPDF.Create(nil);
Decoder := THPDFJBIG2Decoder.Create;
try
PDF.BeginDoc;
PDF.AddPage;
// Load JBIG2 compressed image data
if Decoder.LoadFromByteArray(ImageData) then
begin
// Process scanline by scanline for memory efficiency
for Row := 0 to Decoder.Height - 1 do
begin
if Decoder.GetScanline(Row, ScanlineData) then
begin
// Process scanline data as needed
// Add to PDF page
end;
end;
end;
PDF.EndDoc;
finally
Decoder.Free;
PDF.Free;
end;
end;
Опции и бэкенды энкодера
- THotPDF.JBIG2Options: Документный
THPDFJBIG2Options, который AddImage(..., icJBIG2) превращает в TJBIG2EncodeOptions. Его значения по умолчанию рассчитаны на сканы: Lossless=True, LossyLevel=5, RemoveIsolatedBlackPixels=True и BlackDotSize=3
- Удаление мусорных точек: Пока
RemoveIsolatedBlackPixels равен True, чёрные связные компоненты, у которых и ширина, и высота меньше BlackDotSize, вычищаются перед кодированием, так что значения по умолчанию убирают точки 2 x 2 пикселя и мельче. Выключите его (False), когда вывод должен пиксель в пиксель совпадать с битмапом
- Выбор энкодера:
UseExternalEncoder (по умолчанию True) использует зарегистрированный высокопроизводительный арифметический энкодер; когда он выключен, отсутствует или падает, записывается встроенный без потерь generic-регион MMR. UseNativeArithmeticFallback=True перед MMR пробует встроенный Pascal-арифметический кодер, а при UseSymbolDictionary=True сначала пробует словарь символов с текстовыми регионами
- DefaultJBIG2EncodeOptions: Опции, которые использует автономный
THPDFJBIG2Encoder: без потерь, с LossyLevel=0 и без удаления мусорных точек
- Выбор декодера:
THotPDF.UseExternalJBIG2Decoder (по умолчанию True) декодирует загруженные изображения /JBIG2Decode высокопроизводительным бэкендом, когда он доступен; False использует встроенный Pascal-декодер
- Свои бэкенды:
RegisterJBIG2EncoderBackend и RegisterJBIG2DecoderBackend устанавливают callback-и приложения, IsJBIG2EncoderBackendAvailable и IsJBIG2DecoderBackendAvailable сообщают об их наличии, а ClearJBIG2Backends удаляет их
Справочник классов
THPDFJBIG2Decoder
- LoadFromByteArray: Загружает данные JBIG2 из массива байтов; возвращает False, когда данные неполны или не поддерживаются
- GetScanline: Возвращает данные конкретной строки развёртки
- Width/Height: Свойства размеров изображения
Оптимизация производительности
- Фиксированный корпус из 100 отсканированных страниц сжимается со 158 300 байтов при отдельных generic-регионах до 33 600 байтов при внешнем межстраничном обучении — сокращение на 78,8 процента
- Тот же корпус в регрессионном бенчмарке проходит за 11 ms вместо 53 ms на Win64 и за 16 ms вместо 77 ms на Win32
- Поиск страница-символ индексирован, а повторяющиеся закодированные потоки страниц кэшируются для пакетного извлечения за константное время
- Экономная по памяти построчная обработка
- Оптимизация под обработку больших документов
- Минимальный след памяти при декомпрессии
Соответствие стандартам
- Соответствие стандарту ITU-T T.88
- Поддержка стандарта ISO/IEC 14492
- Image XObject в PDF 1.4 и новее с
/JBIG2Decode и /JBIG2Globals
- HotPDF не пишет JBIG2, пока активен вывод PDF/A:
AddImage(..., icJBIG2) вместо этого пишет icCCITT42, а пакетная вставка возвращает False
- Кроссплатформенная согласованность
См. также
|