|
Supporto compressione JBIG2
Panoramica
HotPDF include compressione e decodifica JBIG2 per immagini bi-livello usate da testo scansionato, moduli e line art
Caratteristiche principali
- Compressione ad alta efficienza per immagini bilevel
- Supporto sia delle modalità di compressione con perdita sia senza perdita
- Ottimizzato per la compressione di testo e line art
- Riduzione significativa delle dimensioni del file rispetto ai metodi di compressione tradizionali
- Codifica multipagina con un dizionario di simboli addestrato condiviso da ogni Image XObject
- Rilevamento esatto di pagine duplicate prima della classificazione e riuso degli XObject codificati durante l'assemblaggio del PDF
- Budget di pagina e pixel limitati con fallback Pascal nativo opzionale
Vantaggi della compressione
- Riuso tra pagine: I simboli ripetuti vengono classificati una volta e memorizzati in dati globali condivisi
- Symbol matching: Con
UseSymbolDictionary, le componenti nere connesse ripetute vengono memorizzate una volta come simboli, e LossyLevel consente a componenti quasi identiche di condividere uno stesso simbolo
- Efficiente in memoria: Ottimizzato per elaborare grandi documenti scansionati
Casi d'uso tipici
- Documenti di testo scansionati
- Disegni tecnici e blueprint
- Moduli e fatture
- Mappe e diagrammi
- Documenti a contenuto misto con testo e grafica
Implementazione tecnica
L'implementazione JBIG2 fornisce percorsi Pascal nativi e un backend esterno statico opzionale tramite queste API
- THPDFJBIG2Decoder: Classe decoder principale per dati compressi JBIG2
- Copertura del coding nativo: regioni generiche MMR, regioni generiche MQ, dizionari di simboli e regioni testo aritmetici e Huffman standard, simboli di raffinamento, simboli aggregati, istanze di testo raffinate, contesti aritmetici trattenuti e tabelle di riferimento long-form limitate
- Riuso del contesto limitato: Le banche di probabilità generiche e di raffinamento sono trattenute con dimensioni consapevoli del template, isolate tra dipendenze di fan-out e rifiutate quando la loro sorgente o il template è incompatibile
- Elaborazione degli stream: Gestione efficiente degli stream di dati JBIG2
- Supporto del dizionario globale: Dizionari di simboli condivisi e concatenati multi-livello con identificatori di segmento a uno, due o quattro byte
- Encoder batch cross-page:
THPDFJBIG2Encoder.EncodePagesToByteArrays addestra su tutto il batch e restituisce uno stream di pagina per input più dati globali condivisi
- Contratto dei batch:
TJBIG2BatchPage descrive una pagina compressa, TJBIG2BatchEncodeBackend identifica l'implementazione selezionata, e TJBIG2BatchEncodeCallback definisce le integrazioni batch esterne
- Integrazione nel documento:
THotPDF.AddJBIG2ImageBatch e THotPDF.AddJBIG2BitmapBatch prima di modificare il grafo PDF, collega un condiviso /JBIG2Globals e restituiscono gli indici immagine nell'ordine di input
- Telemetria dei batch:
TJBIG2BatchEncodeStatistics riporta backend selezionato, dimensioni di input e output, numero di simboli nativi e rifiuti per budget
- Recupero del backend:
HPDFJBIG2EncRegisterBackends ripristina entrambe le callback dell'encoder integrate dopo che gli override temporanei dell'applicazione sono stati ripuliti
- HPDFJBIG2SplitSymbolDictionaryGlobals: Separa uno stream incorporato sequenziale in dizionari globali e segmenti di immagine di pagina preservando gli header di dipendenza long-form
- Decodifica della regione visibile:
THPDFJBIG2Decoder.LoadRegionFromByteArray alloca solo la finestra richiesta, risolve le sue dipendenze transitive dei dizionari, compone le regioni di pagina intersecanti con clipping e salta le regioni indipendenti fuori finestra prima della decodifica entropica
- Telemetria di decodifica per regione:
LastRegionDecodeStats riporta i conteggi delle regioni decodificate e saltate più i pixel sorgente decodificati, mentre UsedIncrementalRegionDecode distingue il percorso della finestra nativa dal fallback di decodifica completa
- Accesso alle scanline: Accesso ai dati riga per riga per un'elaborazione efficiente in memoria
Esempio d'uso
// 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;
Opzioni encoder e backend
- THotPDF.JBIG2Options: Le
THPDFJBIG2Options del documento, che AddImage(..., icJBIG2) converte in TJBIG2EncodeOptions. I default sono pensati per le scansioni: Lossless=True, LossyLevel=5, RemoveIsolatedBlackPixels=True e BlackDotSize=3
- Rimozione delle macchie: Finché
RemoveIsolatedBlackPixels è True, le componenti nere connesse la cui larghezza e altezza sono entrambe minori di BlackDotSize vengono cancellate prima della codifica, quindi i default rimuovono punti di 2 x 2 pixel e più piccoli. Impostala a False quando l'output deve coincidere pixel per pixel con la bitmap
- Scelta dell'encoder:
UseExternalEncoder (default True) usa l'encoder aritmetico ad alte prestazioni registrato; quando è off, manca o fallisce, viene scritta la regione generica MMR lossless incorporata. UseNativeArithmeticFallback=True prova prima il coder aritmetico Pascal incorporato e poi MMR, e con UseSymbolDictionary=True prova prima un dizionario di simboli con regioni testo
- DefaultJBIG2EncodeOptions: Le opzioni che usa un
THPDFJBIG2Encoder autonomo: lossless, con LossyLevel=0 e senza rimozione delle macchie
- Scelta del decoder:
THotPDF.UseExternalJBIG2Decoder (default True) decodifica le immagini /JBIG2Decode caricate con il backend ad alte prestazioni quando è disponibile; False usa il decoder Pascal incorporato
- Backend personalizzati:
RegisterJBIG2EncoderBackend e RegisterJBIG2DecoderBackend installano callback dell'applicazione, IsJBIG2EncoderBackendAvailable e IsJBIG2DecoderBackendAvailable le segnalano, e ClearJBIG2Backends le rimuove
Class Reference
THPDFJBIG2Decoder
- LoadFromByteArray: Carica dati JBIG2 da un array di byte; restituisce False quando i dati sono incompleti o non supportati
- GetScanline: Recupera dati di scanline specifici
- Width/Height: Proprietà delle dimensioni immagine
Ottimizzazione delle prestazioni
- Un corpus di scansione fisso di 100 pagine si comprime da 158.300 byte con regioni generiche separate a 33.600 byte con addestramento esterno cross-page, una riduzione del 78,8%
- Lo stesso corpus completa in 11 ms invece di 53 ms su Win64 e 16 ms invece di 77 ms su Win32 nel benchmark di regressione
- Il lookup pagina→simbolo è indicizzato e gli stream di pagina codificati ripetuti sono messi in cache per estrazione batch a tempo costante
- Elaborazione scanline efficiente in memoria
- Ottimizzato per la gestione di documenti grandi
- Footprint di memoria minimo durante la decompressione
Conformità agli standard
- conformità allo standard ITU-T T.88
- supporto dello standard ISO/IEC 14492
- XObject immagine PDF 1.4 o successivi con
/JBIG2Decode e /JBIG2Globals
- HotPDF non scrive JBIG2 mentre l'output PDF/A è attivo:
AddImage(..., icJBIG2) scrive icCCITT42 al suo posto e l'inserimento batch restituisce False
- Coerenza cross-platform
Vedi anche:
|