Trois bibliothèques. Trois tâches distinctes. Choisir la mauvaise vous coûte des semaines de solutions de contournement (workarounds), et choisir les trois alors que vous n'en avez besoin que d'une vous coûte des frais de maintenance que vous n'aviez pas budgétés. Voici un compte rendu direct de ce que fait réellement chaque bibliothèque PDF losLab, où elle s'intègre et où elle passe le relais à ses frères et sœurs
HotPDF : écrire un PDF de zéro (from scratch) dans Delphi
HotPDF est un composant VCL natif pour la génération de documents PDF. Son modèle est impératif et centré sur la page : vous construisez une instance THotPDF, définissez les propriétés du document, appelez BeginDoc, dessinez sur CurrentPage, ajoutez des pages selon les besoins, et terminez avec EndDoc. L'ordre compte car BeginDoc valide (commits) le dictionnaire de chiffrement et les paramètres de compression au moment où il s'exécute ; tout ce qui est attribué après ce point est ignoré silencieusement plutôt qu'appliqué rétroactivement
La surface de dessin couvre l'ensemble complet des opérateurs PDF au niveau Delphi : TextOut pour le texte Unicode positionné, SetFont avec l'intégration TrueType, les primitives vectorielles (lignes, courbes de Bézier, ellipses, rectangles), le placement d'images à partir d'un fichier ou de la mémoire, et la génération de codes-barres. Les coordonnées sont en points à partir du coin inférieur gauche avec Y augmentant vers le haut, ce qui surprend tout le monde une fois. L'état de la police ne survit pas à AddPage, un appel à SetFont est donc requis après chaque saut de page
Les champs AcroForm sont des citoyens de première classe. Vous pouvez ajouter des champs de texte, des cases à cocher, des boutons radio, des zones de liste déroulante (combo boxes), des zones de liste et des boutons poussoirs (push buttons) directement à un objet de page avec un seul appel chacun. HotPDF peut également charger un PDF existant via LoadFromFile et remplir ou lire les valeurs des champs, ce qui le rend utile dans deux flux de travail distincts : la création de formulaires et l'automatisation de leur remplissage (population)
Le chiffrement est également géré au niveau du document. CryptKeyLength sélectionne le schéma (RC4 40 bits jusqu'à AES-256), ActivateProtection l'arme (arms it), et ProtectOptions définit les drapeaux d'autorisation (permission flags) ISO. Les deux modes de révision AES-256 (R5 et R6, contrôlés par UseAES256R6) existent car la révision 6 corrige une faiblesse connue de la révision 5 mais nécessite une visionneuse compatible PDF 2.0 ; choisir entre eux est une décision de compatibilité, pas une décision de commodité
La prise en charge de la signature numérique dans HotPDF couvre les profils de base (baseline profiles) PAdES, elle est donc adaptée aux flux de travail où la signature doit répondre aux exigences de la norme ETSI EN 319 142. Si votre besoin consiste uniquement à générer des sorties, HotPDF est la bibliothèque vers laquelle se tourner en premier
PDFium Component : rendu (rendering), visualisation et lecture de PDF existants
Le composant PDFium enveloppe le moteur PDFium de Google en tant que composant VCL, ce qui lui confère un rôle fondamentalement différent de celui de HotPDF. Là où HotPDF écrit, le composant PDFium lit et effectue le rendu (renders). L'objet principal est TPdf, un gestionnaire de documents qui ouvre un fichier en définissant FileName puis Active := True. Les échecs de chargement ne sont pas soulevés (raised) comme des exceptions ; Active reste simplement False, sa vérification après l'affectation n'est donc pas facultative
Le rendu s'exécute via TPdfView, un composant visuel que vous déposez sur un formulaire et que vous liez à une instance TPdf via PdfView.Pdf := Pdf. Le zoom et le mode d'ajustement (fit mode) se trouvent sur la vue, pas sur le document. Une subtilité qui fait trébucher (trips up) les gens : Pdf.PageNumber et PdfView.PageNumber sont des propriétés indépendantes. La définition de l'une ne met pas à jour l'autre, et les API d'extraction basées sur la vue (boîtes de mots, unités de lecture) utilisent la page actuelle de la vue, et non celle du document
L'extraction de texte est le domaine dans lequel le composant PDFium n'a pas de concurrent direct dans la gamme losLab. ReadablePageContent renvoie un texte structuré prenant en compte l'ordre de lecture, PageWordBoxes donne des rectangles de délimitation (bounding rectangles) au niveau des mots, et DocumentReadingUnits parcourt l'ensemble du document. Pour le travail d'accessibilité, IsTagged vous indique si une arborescence de structure est présente et ValidatePdfUa exécute une vérification de conformité UA. Ces API font du composant PDFium le choix naturel pour tout flux de travail qui a besoin de comprendre ce qui se trouve à l'intérieur d'un PDF existant plutôt que d'en produire un nouveau
Le remplissage de formulaire fonctionne également du côté de PDFium, via la même couche AcroForm que le moteur sous-jacent expose. Cela est approprié lorsque le document source existe déjà et que vous automatisez son remplissage plutôt que de construire vous-même les champs du formulaire
PDFlibPas : manipulation, signature de conformité (compliance signing) et accès direct aux fichiers
PDFlibPas (version 3.73.0) se situe à l'autre extrémité du spectre de complexité. Il expose trois couches API au-dessus du même modèle de document : une façade plate basée sur des poignées (TPDFlib) compatible avec la convention d'appel Quick-PDF, une couche d'arborescence d'objets complète (TPDFDocument) et un analyseur de flux (streaming parser) (TSmartPDFReader / TSmartPDFWriter) qui opère directement sur les octets du fichier sans charger le graphe d'objets complet
La couche de diffusion en continu (streaming layer) est ce qui fait de PDFlibPas le bon choix pour les grands documents. TSmartPDFWriter peut ajouter (append) une mise à jour incrémentielle à un fichier sur le disque sans reconstruire l'intégralité de la table de références croisées (cross-reference table), ce qui est le mécanisme sous-jacent à la fois à un réenregistrement (resaving) efficace et aux tampons de validation à long terme PAdES. Pour les flux de travail de signature de niveau de conformité (compliance-grade) où le hachage (hash) signé doit couvrir une plage d'octets spécifique et où la signature est appliquée sans réécrire le document, cette couche est la seule voie viable
La manipulation de documents au niveau TPDFDocument comprend la fusion avec Merge, la copie de pages sélective via CopyPagesFromDoc avec une chaîne de plage (range string), et la gouvernance de version via SetMinimumVersion et LockSaveVersion. Le verrouillage de version (version lock) génère (raises) l'erreur 602 si vous tentez d'enregistrer une fonctionnalité qui pousserait la sortie au-dessus de la version verrouillée, ce qui est utile lorsque vous devez garantir que la sortie reste dans une révision PDF spécifique pour la conformité d'archivage (archival compliance)
La prise en charge de PDF/A (ISO 19005) se trouve dans l'établi (workbench) de conformité de PDFlibPas. Notez que le chiffrement et le PDF/A s'excluent mutuellement par spécification : vous ne pouvez pas avoir les deux dans un seul fichier. Les flux de travail qui nécessitent une copie de distribution chiffrée et une copie d'archive PDF/A doivent produire deux artefacts distincts
Choisir entre eux
L'arbre de décision type est court. Si vous générez un nouveau document à partir de données, utilisez HotPDF. Si vous effectuez le rendu ou extrayez du texte d'un document existant dans une application Delphi VCL, utilisez le composant PDFium. Si vous manipulez, fusionnez ou signez par conformité des PDF existants à grande échelle ou avec une sémantique de sauvegarde incrémentielle, utilisez PDFlibPas. De nombreux systèmes de production utilisent deux des trois : HotPDF pour générer une sortie et PDFlibPas pour y appliquer un tampon de validation à long terme avant l'archivage, par exemple, ou le composant PDFium pour prévisualiser ce que HotPDF a produit avant de l'envoyer en aval
Les trois sont livrés sous forme de code source natif Pascal pour Delphi et C++Builder, sans dépendances d'exécution (runtime dependencies) au-delà de la VCL. Le composant PDFium intègre en outre (additionally bundles) la DLL PDFium, qui couvre le travail de rendu et d'analyse du moteur. La page produit de chaque bibliothèque contient sa référence API complète et l'historique de sa version actuelle
Détails sur les bibliothèques individuelles : Composant HotPDF, Composant PDFium, et PDFlibPas