JBIG2 Compression Support

Overview

HotPDF는 스캔한 텍스트, 양식, 선화에 쓰이는 bi-level 이미지를 위한 JBIG2 압축과 디코딩을 제공합니다

Key Features

  • High-efficiency compression for bilevel images
  • 손실 압축과 무손실 압축 모드를 모두 지원
  • 텍스트와 선화 압축에 최적화
  • Significant file size reduction compared to traditional compression methods
  • 학습된 심볼 사전 하나를 모든 이미지 XObject가 공유하는 다중 페이지 인코딩
  • Exact duplicate page detection before classification and encoded XObject reuse during PDF assembly
  • 제한된 페이지 및 픽셀 예산, 선택적 네이티브 Pascal fallback

Compression Benefits

  • 페이지 간 재사용: 반복되는 심볼은 한 번만 분류되어 공유 전역 데이터에 저장됩니다
  • 심볼 매칭: UseSymbolDictionary를 쓰면 반복되는 검은 연결 성분이 심볼 하나로 한 번만 저장되고, LossyLevel로 거의 같은 성분이 심볼 하나를 공유합니다
  • Memory Efficient: Optimized for processing large scanned documents

Typical Use Cases

  • Scanned text documents
  • Technical drawings and blueprints
  • Forms and invoices
  • Maps and diagrams
  • 텍스트와 그래픽이 섞인 문서

Technical Implementation

JBIG2 구현은 네이티브 Pascal 경로와, 다음 API를 통한 선택적 정적 외부 백엔드를 제공합니다

  • THPDFJBIG2Decoder: Core decoder class for JBIG2 compressed data
  • 네이티브 코딩 지원 범위: MMR generic region, MQ generic region, 산술 및 표준 Huffman 심볼 사전과 텍스트 region, refinement 심볼, aggregate 심볼, refined 텍스트 인스턴스, 유지되는 산술 컨텍스트, 제한된 long-form 참조 테이블
  • 제한된 컨텍스트 재사용: Generic 및 refinement 확률 뱅크는 템플릿에 맞는 크기로 유지되고, fan-out 의존 관계 사이에서 격리되며, 원본이나 템플릿이 호환되지 않으면 거부됩니다
  • Stream Processing: Efficient handling of JBIG2 data streams
  • 전역 사전 지원: 1, 2, 4바이트 세그먼트 식별자를 사용하는 공유 및 다단계 체인 심볼 사전
  • 페이지 간 배치 인코더: THPDFJBIG2Encoder.EncodePagesToByteArrays는 배치 전체에 걸쳐 학습하고, 입력마다 페이지 스트림 하나와 공유 전역 데이터를 반환합니다
  • 배치 계약: TJBIG2BatchPage는 packed 페이지 하나를 기술하고, TJBIG2BatchEncodeBackend는 선택된 구현을 식별하며, TJBIG2BatchEncodeCallback은 외부 배치 연동을 정의합니다
  • 문서 연동: THotPDF.AddJBIG2ImageBatch와 THotPDF.AddJBIG2BitmapBatch는 PDF 그래프를 변경하기 전에 인코딩하고, 공유 /JBIG2Globals 스트림을 연결하며, 입력 순서대로 이미지 인덱스를 반환합니다
  • 배치 텔레메트리: TJBIG2BatchEncodeStatistics는 선택된 백엔드, 입력 및 출력 크기, 네이티브 심볼 수, 예산 초과에 의한 거부를 보고합니다
  • 백엔드 복구: HPDFJBIG2EncRegisterBackends는 애플리케이션이 임시로 지정한 오버라이드를 해제한 뒤 두 가지 내장 인코더 콜백을 모두 복원합니다
  • HPDFJBIG2SplitSymbolDictionaryGlobals: 순차 임베드 스트림을 전역 사전과 페이지 이미지 세그먼트로 분리하며, long-form 의존성 헤더는 그대로 보존합니다
  • 보이는 영역 디코딩: THPDFJBIG2Decoder.LoadRegionFromByteArray는 요청한 윈도우만 할당하고, 그에 걸친 전이적 사전 의존성을 해석하며, 교차하는 페이지 region을 클리핑하여 합성하고, 엔트로피 디코딩 전에 윈도우 밖의 독립 region을 건너뜁니다
  • 영역 디코딩 텔레메트리: LastRegionDecodeStats는 디코딩한 region 수와 건너뛴 region 수, 디코딩된 원본 픽셀 수를 보고하고, UsedIncrementalRegionDecode는 네이티브 윈도우 경로와 전체 디코딩 fallback을 구분합니다
  • 스캔라인 접근: 메모리 효율적인 처리를 위한 행 단위 데이터 접근

Usage Example


// 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)는 등록된 고성능 산술 인코더를 사용합니다. 꺼져 있거나 없거나 실패하면 내장 무손실 MMR generic region이 기록됩니다. UseNativeArithmeticFallback=True는 MMR 전에 내장 Pascal 산술 코더를 시도하고, UseSymbolDictionary=True이면 텍스트 region이 있는 심볼 사전을 먼저 시도합니다
  • DefaultJBIG2EncodeOptions: 단독 THPDFJBIG2Encoder가 쓰는 옵션입니다. 무손실, LossyLevel=0, 스펙클 제거 없음
  • 디코더 선택: THotPDF.UseExternalJBIG2Decoder(기본 True)는 사용 가능할 때 고성능 백엔드로 로드된 /JBIG2Decode 이미지를 디코딩합니다. False면 내장 Pascal 디코더를 사용합니다
  • 커스텀 백엔드: RegisterJBIG2EncoderBackend와 RegisterJBIG2DecoderBackend는 애플리케이션 콜백을 등록하고, IsJBIG2EncoderBackendAvailable과 IsJBIG2DecoderBackendAvailable은 등록 여부를 알려 주며, ClearJBIG2Backends는 제거합니다

Class Reference

THPDFJBIG2Decoder

  • LoadFromByteArray: byte 배열에서 JBIG2 데이터를 로드합니다. 데이터가 불완전하거나 지원하지 않는 형태면 False를 반환합니다
  • GetScanline: Retrieve specific scanline data
  • Width/Height: Image dimensions properties

Performance Optimization

  • 고정된 100페이지 스캔 코퍼스는 개별 generic region으로 158,300바이트였던 것이 외부 페이지 간 학습을 적용하면 33,600바이트로 압축되어, 78.8% 줄어듭니다
  • 회귀 벤치마크에서 같은 코퍼스는 Win64에서 53ms 대신 11ms, Win32에서 77ms 대신 16ms에 완료됩니다
  • 페이지-심볼 조회는 인덱싱되어 있고, 반복되는 인코딩된 페이지 스트림은 캐시되므로 배치 추출이 상수 시간에 이루어집니다
  • Memory-efficient scanline processing
  • Optimized for large document handling
  • Minimal memory footprint during decompression

Standards Compliance

  • ITU-T T.88 standard compliance
  • ISO/IEC 14492 standard support
  • /JBIG2Decode와 /JBIG2Globals를 사용하는 PDF 1.4 이상 이미지 XObject
  • HotPDF는 PDF/A 출력이 활성화된 동안 JBIG2를 기록하지 않습니다. AddImage(..., icJBIG2)는 대신 icCCITT42를 기록하고 배치 삽입은 False를 반환합니다
  • Cross-platform consistency

See Also