|
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
|