|
Vue d’ensemble
HotPDF inclut désormais une prise en charge complète de la compression JBIG2 (Joint Bi-level Image Experts Group 2), une norme de compression avec ou sans perte conçue spécialement pour les images bichromes (monochromes), souvent utilisée dans les documents PDF pour les pages de texte numérisé et les tracés au trait
Implémentation technique
La prise en charge JBIG2 est implémentée dans l'unité HPDFJBIG2.pas, qui fournit :
- THPDFJBIG2Decoder: Core decoder class for JBIG2 compressed data
- Stream Processing : Traitement efficace des flux de données JBIG2
- Global Dictionary Support: Shared symbol dictionaries for multi-page documents
- Scanline Access: Row-by-row data access for memory-efficient processing
- Encodage multipages avec un dictionnaire de symboles entraîné unique partagé par chaque XObject image
- Détection exacte des pages dupliquées avant classification et réutilisation des XObjects encodés pendant l’assemblage PDF
- Budgets de pages et de pixels bornés, avec repli natif Pascal optionnel
Avantages de compression
- Réutilisation inter-pages : les symboles répétés sont classés une seule fois et stockés dans des données globales partagées
- Correspondance de symboles : avec
UseSymbolDictionary, les composantes noires connexes répétées sont stockées une seule fois comme symboles, et LossyLevel permet aux composantes quasi identiques de partager un même symbole
- Efficace en mémoire : optimisé pour le traitement de documents numérisés volumineux
Exemple d'utilisation
- Documents de texte numérisés
- Plans techniques et blueprints
- Formulaires et factures
- Cartes et schémas
- Documents mixtes associant texte et graphismes
Implémentation technique
L’implémentation JBIG2 fournit des chemins Pascal natifs et un backend externe statique optionnel via ces API
- THPDFJBIG2Decoder : classe de décodage cœur pour les données JBIG2 compressées
- Couverture du codage natif : régions génériques MMR, régions génériques MQ, dictionnaires de symboles et régions de texte arithmétiques et à Huffman standard, symboles de raffinement, symboles agrégés, instances de texte raffinées, contextes arithmétiques retenus et tables de références en forme longue bornées
- Réutilisation de contextes bornée : les banques de probabilités génériques et de raffinement sont retenues avec des tailles conscientes du template, isolées entre dépendances de fan-out, et rejetées lorsque leur source ou leur template est incompatible
- Traitement de flux : gestion efficace des flux de données JBIG2
- Support des dictionnaires globaux : dictionnaires de symboles partagés et chaînés multi-niveaux avec identifiants de segments d’un, deux ou quatre octets
- Encodeur de lots inter-pages :
THPDFJBIG2Encoder.EncodePagesToByteArrays entraîne sur le lot complet et renvoie un flux par page d’entrée plus les données globales partagées
- Contrat de lot :
TJBIG2BatchPage décrit une page compactée, TJBIG2BatchEncodeBackend identifie l’implémentation sélectionnée, et TJBIG2BatchEncodeCallback définit les intégrations de lots externes
- Intégration documentaire :
THotPDF.AddJBIG2ImageBatch et THotPDF.AddJBIG2BitmapBatch encodent avant de muter le graphe PDF, attachent un flux /JBIG2Globals partagé et renvoient les index d’images dans l’ordre d’entrée
- Télémétrie de lot :
TJBIG2BatchEncodeStatistics rapporte le backend sélectionné, les tailles d’entrée et de sortie, le nombre de symboles natifs et les rejets de budget
- Récupération de backend :
HPDFJBIG2EncRegisterBackends restaure les deux callbacks d’encodage intégrés après effacement des dérogations applicatives temporaires
- HPDFJBIG2SplitSymbolDictionaryGlobals : sépare un flux embarqué séquentiel en dictionnaires globaux et segments d’images de page tout en préservant les en-têtes de dépendances en forme longue
- Décodage de région visible :
THPDFJBIG2Decoder.LoadRegionFromByteArray n’alloue que la fenêtre demandée, résout ses dépendances transitives de dictionnaires, compose les régions de page intersectées avec rognage, et saute les régions indépendantes hors fenêtre avant le décodage entropique
- Télémétrie de décodage de région :
LastRegionDecodeStats rapporte les nombres de régions décodées et sautées plus les pixels sources décodés, tandis que UsedIncrementalRegionDecode distingue le chemin de fenêtre native du repli de décodage complet
- Accès par lignes balayées : accès aux données ligne par ligne pour un traitement économe en mémoire
Usage Example
// 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;
Options d’encodage et backends
- THotPDF.JBIG2Options : le
THPDFJBIG2Options du document, que AddImage(..., icJBIG2) transforme en TJBIG2EncodeOptions. Ses défauts conviennent aux numérisations : Lossless=True, LossyLevel=5, RemoveIsolatedBlackPixels=True et BlackDotSize=3
- Suppression des poussières : tant que
RemoveIsolatedBlackPixels vaut True, les composantes noires connexes dont la largeur et la hauteur sont toutes deux inférieures à BlackDotSize sont effacées avant l’encodage ; les défauts éliminent donc les points de 2 x 2 pixels et plus petits. Passez-le à False quand la sortie doit correspondre au bitmap pixel pour pixel
- Choix de l’encodeur :
UseExternalEncoder (True par défaut) utilise l’encodeur arithmétique haute performance enregistré ; s’il est désactivé, absent ou en échec, c’est la région générique MMR sans perte intégrée qui est écrite. UseNativeArithmeticFallback=True essaie le codeur arithmétique Pascal intégré avant MMR, et avec UseSymbolDictionary=True il tente d’abord un dictionnaire de symboles avec régions de texte
- DefaultJBIG2EncodeOptions : les options qu’un
THPDFJBIG2Encoder autonome utilise : sans perte, avec LossyLevel=0 et sans suppression des poussières
- Choix du décodeur :
THotPDF.UseExternalJBIG2Decoder (True par défaut) décode les images /JBIG2Decode chargées avec le backend haute performance quand il est disponible ; False utilise le décodeur Pascal intégré
- Backends personnalisés :
RegisterJBIG2EncoderBackend et RegisterJBIG2DecoderBackend installent des callbacks applicatifs, IsJBIG2EncoderBackendAvailable et IsJBIG2DecoderBackendAvailable les signalent, et ClearJBIG2Backends les retire
Référence de classe
THPDFJBIG2Decoder
- LoadFromByteArray: charge des données JBIG2 depuis un tableau d’octets ; renvoie False lorsque les données sont incomplètes ou non prises en charge
- GetScanline: récupère les données d’une ligne balayée donnée
- Width/Height: propriétés de dimensions de l’image
Optimisation des performances
- Un corpus de numérisations fixe de 100 pages passe de 158 300 octets avec des régions génériques séparées à 33 600 octets avec l’entraînement inter-pages externe, soit une réduction de 78,8 %
- Le même corpus se termine en 11 ms au lieu de 53 ms sur Win64 et en 16 ms au lieu de 77 ms sur Win32 dans le benchmark de régression
- La recherche page-vers-symbole est indexée et les flux de pages encodés répétés sont mis en cache pour une extraction par lots en temps constant
- Traitement des lignes balayées économe en mémoire
- Optimisé pour le traitement de documents volumineux
- Empreinte mémoire minimale pendant la décompression
Conformité aux normes
- ITU-T T.88 standard compliance
- ISO/IEC 14492 standard support
- XObjects image PDF 1.4 ou ultérieur avec
/JBIG2Decode et /JBIG2Globals
- HotPDF n’écrit pas de JBIG2 tant que la sortie PDF/A est active :
AddImage(..., icJBIG2) écrit icCCITT42 à la place et l’insertion par lots renvoie False
- Cross-platform consistency
Voir aussi
|