Поддержка сжатия 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
  • Кроссплатформенная согласованность

См. также