Journal des modifications
Historique des versions
« Retour à l’index de la documentation
Historique des versions de la bibliothèque PDFlibPas. Les entrées sont listées de la plus récente à la plus ancienne ; chaque version suit le versionnage sémantique conformément à la politique de publication du projet.
Dernière version publiée
- Dernière version: v3.75.6; Date de publication: 2026-06-23
Version 3.333.0
Added
- Inspection des révisions incrémentales. Une signature couvre les octets de la révision dans laquelle elle a été écrite, et tout ce qui est ajouté ensuite est une mise à jour distincte dont le contenu détermine si la signature vaut encore pour le document tel qu'il est maintenant.
GetDocumentRevisionCount,GetDocumentRevisionStartetGetDocumentRevisionEnddisposent ces révisions, etGetSignatureRevisionIndexindique à laquelle une signature se termine GetDocumentRevisionKindrapporte ce qu'une mise à jour a fait, comme le plus engageant des objets qu'elle a touchés : comptabilité, matériel de validation, horodatage de document, signature, champ de formulaire, annotation ou contenu de document. Ajouter du matériel de validation pour la validation à long terme ne ressemble donc plus à une édition du documentGetDocumentRevisionChangesliste chaque objet qu'une mise à jour a ajouté, modifié ou supprimé, avec ce qu'il est et, pour un dictionnaire modifié, quelles clés diffèrent réellementGetDocumentRevisionsCompleterapporte si toute l'historique était récupérable. Une chaîne rompue, cyclique ou plus longue que ce que le lecteur suivra laisse les mises à jour les plus anciennes invisibles, et les comptes sont alors une borne inférieure plutôt qu'une réponse- Un objet dont la version antérieure ne peut être lue, ou dont le corps de flux n'a jamais été comparé, est signalé comme indéterminé plutôt que comme inoffensif : une mise à jour qui réécrit une page en laissant son dictionnaire intact n'est pas confondue avec un reconditionnement
Version 3.332.0
Added
ApplyPAdESLongTermValidationpromeut un PDF déjà signé vers PAdES-B-LT en un seul appel. Il construit le chemin de certificats du signataire depuis la signature elle-même, rassemble le matériel OCSP et CRL pour chaque maillon via les adresses nommées par les certificats, et écrit les certificats et données de révocation dans le document security store avec une entrée VRI pour la signature, en une seule mise à jour incrémentale.ApplyPAdESLongTermValidationToStreamécrit le résultat dans un flux au lieu d'un fichier- Le comportement est configurable via un masque d'options
PADES_LTV_*: écrire ou non l'entrée VRI, interroger ou non les répondeurs OCSP, revenir ou non aux CRL, suivre ou non les adresses d'émetteur pour compléter le chemin, et ignorer ou non la révocation pour une racine auto-émise - Un nom de champ vide traite chaque signature en une seule révision ; un champ nommé ne traite que celui-là
GetPAdESLTVCertificateCount,GetPAdESLTVCRLCount,GetPAdESLTVOCSPCountetGetPAdESLTVErrorrapportent ce que le dernier appel a rassemblé et pourquoi il s'est arrêté prématurément, afin qu'un résultat partiel sur un répondeur injoignable soit visible plutôt que silencieux- Le matériel identique à un élément déjà préparé est écrit une seule fois et référencé par chaque signature qui en a besoin, et une signature ne portant aucun certificat lisible est signalée plutôt que présentée comme une promotion réussie
Version 3.331.0
Added
- Une signature porte son propre chemin de certification, si bien que le matériel dont un profil de validation à long terme a besoin peut être lu depuis le seul fichier signé.
GetSignatureSignerCertificateDER,GetSignatureEmbeddedCertificateCountetGetSignatureEmbeddedCertificateDERrenvoient les certificats qu'une signature intègre, etGetSignatureCertificateChainLengthainsi queGetSignatureCertificateChainDERles ordonnent en un chemin partant du signataire vers l'extérieur GetSignatureContentsHashHexrenvoie la clé sous laquelle une entréeAddPAdESDSSVRIest adressée, calculée à partir de la signature elle-même- Le certificat du signataire est identifié que la signature le désigne par émetteur et numéro de série ou par identifiant de clé de sujet, et un chemin s'arrête au dernier émetteur que la signature porte réellement plutôt que de prétendre être complet
Fixed
- Le lecteur DER rejette une longueur d'élément déclarée supérieure aux données au lieu de laisser une valeur quasi maximale faire déborder son contrôle de bornes, et le parcours des extensions de certificat ne lit plus au-delà de la fin d'un certificat tronqué ou trop long. Les deux sont atteignables depuis un document forgé, donc les accesseurs ci-dessus restent sûrs sur une entrée non fiable
- Les accesseurs de signature lisent le document avec un handle partagé, donc ils répondent pendant qu'un vérificateur ou une visionneuse a déjà le fichier ouvert, au lieu d'échouer comme si la signature était absente
Version 3.330.0
Added
- OCSP status requests.
BuildOCSPRequestencodes an RFC 6960 request for a certificate and its issuer,FetchOCSPResponseposts it to the responder and returns the reply, andAddPAdESDSSOCSPFromCertificatesdoes both and files the result in the document security store - The responder address is optional: when it is omitted, the one the certificate itself names is used, so a caller that has the certificate chain needs no further configuration
- A certificate pair that does not actually belong together is refused before anything is sent, instead of producing the "unknown" answer such a request earns from the responder and which reads like a revocation problem
- Only a successful response is stored; a responder that answered
tryLaterorunauthorizedis reported throughGetTimeStampErrorrather than filed as if it were a status answer
Version 3.329.0
Fixed
- Reusing one result array across successive enumeration calls no longer leaks the strings held in the array slots that a later call does not fill. This affected the documented "call once for the count, resize, call again" pattern whenever a later call returned fewer items than the array could hold, and the stranded text accumulated for the lifetime of the process
- Affected entry points include
EnumPageContentStates,EnumPageContentStatesEx,EnumAttachments,EnumDocumentFonts,EnumPageElements,EnumNamedDestinations,EnumSignatures,EnumFormFields,GetFormValues,GetTextInAreaEx, and the text-search, form-field-action and certificate enumeration calls
Changed
- The result-array parameter of those calls is now passed as
varrather thanout. Existing Delphi and C++Builder code compiles and links unchanged; the only visible difference is that array slots past the returned count keep whatever they held before instead of being silently blanked
Version 3.328.0
Added
- Certificates now tell the library where their status can be checked:
GetCertificateOCSPURLs,GetCertificateIssuerURLsandGetCertificateCRLURLsread the responder, issuing-certificate and CRL addresses out of a certificate, so assembling long-term validation material no longer requires knowing where a given authority publishes FetchRevocationMaterialdownloads material from those addresses, andAddPAdESDSSCRLFromURLandAddPAdESDSSCertificateFromURLdownload and file it in the document security store in one step- Addresses that name no fetchable resource, such as a directory name or a mail address, are skipped rather than reported as something that can be downloaded
Version 3.327.0
Added
- A built-in RFC 3161 time-stamp client.
SetTimeStampServerandSetTimeStampOptionsconfigure the authority, hash algorithm, requested policy, nonce use and timeout;FetchTimeStampTokenreturns a TimeStampToken for any digest ApplyPAdESSignatureTimeStampcompletes a PAdES-B-T signature in one call: it hashes the signature value, obtains the token from the configured authority and attaches it as the signature time-stamp attribute, replacing the previous three-step exchange the caller had to wire up itself- When a nonce is used the token is checked to carry the same value back, so a replayed or substituted response is rejected instead of being embedded in the document
GetTimeStampStatusandGetTimeStampErrorreport the authority's own status and failure text, so a refused request explains itself
Version 3.326.0
Added
- The PDFium renderer now writes the same image formats the GDI+ and Cairo renderers write.
RenderPageToFile,RenderPageToStreamandRenderPagesToFilesaccept BMP (option 0), JPEG (1), PNG (5), GIF (6), TIFF (7) and G4 TIFF (10) afterSelectRenderer(3), instead of accepting BMP alone - The JPEG quality set through
SetJPEGQualityand the active TIFF compression settings now apply to PDFium output as well, so switching renderers no longer changes the encoding of the file that is produced
Fixed
- Requesting PNG or any other non-BMP format from the PDFium renderer used to return 0 and leave an empty file behind. Applications that offered a renderer choice silently produced unreadable output whenever PDFium was the selected engine
- Asking the PDFium renderer for a metafile format it cannot produce (WMF, EMF, EPS, EMF+, HTML5) now reports which formats are available through
LastRenderErrorinstead of naming BMP as the only option
Version 3.324.0
Changed
- The PDFium renderer now feeds the document to the engine through a streaming data source instead of one resident buffer. Rendering and printing previously serialised the document and then copied it again into a string, so every page cost twice the document size in memory; the copy is gone and PDFium reads only the blocks it needs
- Rendering a page range to files parses the document once for the whole batch instead of once per page, so a long range no longer re-reads the entire file for every image it writes
- Older PDFium builds that do not export the streaming entry point keep working unchanged through the in-memory path
Fixed
- The renderer smoke test located the optional PDFium and Cairo libraries one directory too high and silently skipped both engines; it now finds them and exercises the real rendering paths
Version 3.323.0
Added
CreateValidationReportetSaveValidationReportproduisent un rapport de validation PDF/A et PDF/UA-1 structuré en XML ou JSON. Chaque constatation comporte l'identifiant de règle, la norme qui la possède, un nom de règle court, la clause ISO qu'elle applique, une sévérité et le nombre d'objets affectés, et le rapport se termine par des statistiques de réussite/échec par norme et au niveau du document- Une norme qui n'a pas été demandée est signalée comme
not-checkedplutôt que comme une réussite silencieuse, de sorte qu'une exécution partielle ne peut pas être confondue avec un bulletin de santé vierge - Les pipelines de génération peuvent désormais filtrer sur un identifiant de règle ou une clause ISO au lieu de faire correspondre des sous-chaînes dans le texte : la famille de rapports preflight produit d'abord un rapport humain et convertit ce texte en JSON, HTML ou CSV, tandis que le rapport de validation est assemblé à partir de la sortie de contrôle brute et conserve les champs lisibles par machine intacts
Version 3.322.0
Added
- La référence documente désormais les quatre types publics déclarés à l'externe utilisés sur la surface
TPDFlibqui n'avaient auparavant pas de page dédiée :TPDFlibProgressEvent,TPDFlibLogger,TPDFlibCertificateInfoetTPDFlibWatermarkBase, complétant la couverture des types publics d'événement, de journalisation, de résultat d'énumération et de filigrane
Version 3.321.0
Added
CheckDocumentPolicyévalue des règles maison déclaratives telles queFonts.NotEmbedded = 0,Security.Encrypted = noouDocument.Pages <= 500par rapport au document et signale chaque règle comme réussie ou échouée avec la valeur réelle, transformant une porte d'ingestion pour les éditeurs, archives et imprimeries en configuration plutôt qu'en code d'inspection écrit à la main
Version 3.320.1
Fixed
- Dessiner du texte dans un mode PDF/A sans charger au préalable une police ne provoque plus d'erreur : PDF/A exige que chaque programme de police soit intégré, le raccourci implicite vers une police intégrée a donc été refusé et aucune police n'était sélectionnée, et
DrawTextet les autres appels de texte plantaient au lieu de dessiner - Le chemin de police implicite résout désormais une police réelle intégrable pendant qu'un mode PDF/A est actif, de sorte que le texte dessiné sans appel
AddTrueTypeFontexplicite est intégré et reste conforme ; un appel direct àAddStandardFontreste refusé sous PDF/A - Sur les hôtes où aucune police intégrable ne peut être résolue, le dessin revient aux mesures intégrées au lieu de planter et signale le manquement de conformité via
LastErrorCode605, de sorte que le fichier peut être intercepté avant d'être publié comme conforme
Version 3.320.0
Added
GetDocumentFeatureReportrenvoie un rapport de fonctionnalités structuré en un seul appel — métadonnées du document, décomptes de pages et d'objets, état du chiffrement, inventaires des polices et des images, balisage et signets, champs de formulaire, signatures, pièces jointes et la répartition en octets par catégorie — remplaçant la bonne douzaine de requêtes séparées qu'un pipeline de catalogage ou d'ingestion devait auparavant assembler
Version 3.319.0
Added
SetCollectionView,AddCollectionField,SetCollectionSortetSetCollectionItemValueconstruisent des portefeuilles PDF par-dessus les pièces jointes existantes, de sorte qu'un ensemble de fichiers intégrés est présenté comme un paquet navigable avec ses propres colonnes, ordre de tri et valeurs par fichier au lieu d'une simple liste de pièces jointesGetCollectionViewetGetCollectionFieldCountsignalent le mode de présentation et le nombre de colonnes déclarées d'un portefeuille chargé
Version 3.318.1
Fixed
- L'option d'extraction de texte 12 (ignorer le texte pivoté) supprime désormais les séquences pivotées quelle que soit leur orientation : un quart de tour dans le sens horaire et un quart de tour dans le sens inverse étaient traités différemment, de sorte que les notes de marge latérales étaient écartées dans une direction et renvoyées dans l'autre
- La même option conserve le texte incliné qui est seulement cisaillé, comme une italique synthétique, et la tolérance évolue désormais avec la taille du texte et la transformation de page, de sorte que les grands titres inclinés ne sont plus écartés comme s'ils étaient pivotés
Version 3.318.0
Added
DecodeAllStreamsdéveloppe les flux compressés d'un document sur place, de sorte que l'enregistrer produit une copie dont les flux de contenu, les métadonnées et la structure peuvent être lus directement par les outils de diff, l'examen médico-légal et les flux de travail de support ; les images, les flux de prédiction et les flux de référence croisée conservent leur encodage, et les flux d'objets sont d'abord matérialisés pour que rien ne soit perdu
Version 3.317.0
Added
SetTrappedetGetTrappeddéclarent et lisent l'état de trapping du document que PDF/X exige, écrit comme le nom/Trappedque la spécification appelle plutôt que comme une chaîne de texteSetOutputIntentSubtypeetGetOutputIntentSubtyperé-étiquettent l'intent de sortie, de sorte qu'un profil couleur chargé peut décrire une condition d'impressionGTS_PDFXau lieu de la condition d'archivageGTS_PDFA1que les modes PDF/A créent
Version 3.316.0
Added
SetEncryptEmbeddedFilesOnlyetGetEncryptEmbeddedFilesOnlyrestreignent le chiffrement AES aux fichiers intégrés : le document s'ouvre et se rend dans n'importe quel lecteur sans invite de mot de passe tandis que ses pièces jointes restent chiffrées, l'arrangement standard pour les factures, dossiers médicaux et dossiers d'affaires dont les pages de garde sont publiques mais dont la charge utile ne l'est pas
Version 3.315.0
Added
- L'option d'extraction de texte 18 pivote les séquences peintes à 90, 180 ou 270 degrés dans le cadre de lecture horizontal et regroupe chaque quart de tour séparément, de sorte que les notes de marge pivotées, les en-têtes de tableau et les étiquettes d'axe de graphique s'extraient en lignes lisibles au lieu de s'entremêler avec le texte droit ou d'être écartées
Fixed
DASetTextExtractionOptionsaccepte l'option 16 (désuffixage) et l'option 17 (séparation de mots par écart de caractères) au lieu de les rejeter, et le chemin d'extraction à accès direct transmet désormais les options 15, 16 et 17 à l'extracteur, de sorte que la suppression des règles de soulignement, le désuffixage et la séparation par écart de caractères s'appliquent aux descripteurs de fichier de la même manière qu'à un document chargé
Version 3.314.0
Added
GetFontHasToUnicodesignale si la police sélectionnée porte une correspondance Unicode, et l'inventaire des polices gagne un champHasToUnicodecorrespondant par police plus un résuméNoToUnicodeCount, de sorte que les documents peuvent être vérifiés pour des polices sûres pour l'extraction et convertibles en PDF/A-*u ou PDF/UA avant le traitement
Version 3.313.0
Added
SetPDFAModegagne le mode 8 pour PDF/A-2u (ISO 19005-2 Level U), le niveau de conformité qui déclare des correspondances de texte Unicode sans autoriser les fichiers intégrés, complétant la famille PDF/A-2 aux côtés des modes 2b et 2a existants
Version 3.312.0
Added
GetObjectByPathetGetObjectByPathCountlisent n'importe quel nœud de l'arbre d'objets via des expressions de chemin telles queRoot/Pages/Kids[0]/MediaBox[2]oupages[0]/Type— types, valeurs scalaires, formes sérialisées et décomptes d'éléments en un appel, remplaçant le parcours d'objet écrit à la main pour les sondes de métadonnées, les vérifications de conformité ponctuelles et les diagnostics de support
Version 3.311.0
Added
SetBlackPointCompensationdéclare la compensation du point noir (ON, OFF ou Default) pour le dessin ultérieur via l'état graphique/UseBlackPtCompde PDF 2.0, permettant aux sorties de prépresse et de preuve de fixer les conversions ICC de tons foncés qui étaient auparavant privées à la visionneuse ; la version du document est élevée automatiquement et les modes PDF/A rejettent l'état
Version 3.310.0
Added
SetCompressionLeveletGetCompressionLevelexposent le niveau deflate pour chaque compression que la bibliothèque effectue : 0 conserve le moteur accéléré SIMD par défaut, 1 privilégie le débit et 9 comprime les archives au minimumRecompressStreamsre-deflate chaque flux FlateDecode simple du document sélectionné au niveau courant et conserve l'encodage le plus petit par flux, réduisant les documents qui ont été écrits à l'origine avec un réglage de compression rapide sans toucher à leur contenu
Version 3.309.0
Added
SetObjectStreamModeetGetObjectStreamModeajoutent un contrôle de flux d'objet à trois états : désactiver, générer (par défaut) ou préserver, où préserver conserve le regroupement compressé original du fichier chargé's et écrit les conteneurs à l'identique, rendant les conversions des fichiers PDF 1.5+ existants moins coûteuses parce que rien n'est dépaqueté ni regroupé
Changed
- En mode préserver, les membres modifiés depuis le chargement sont promus en objets de niveau supérieur afin que leurs changements soient enregistrés, et tout membre compressé restant sélectionne automatiquement la forme de flux de référence croisée binaire
Version 3.308.0
Added
CheckDocumentStructureexécute une vérification d'intégrité structurelle en un appel : chaque objet et flux est forcé à travers son décodeur, les flux Flate simples sont strictement vérifiés contre le marqueur de fin zlib afin que les données tronquées soient interceptées, et le rapport signale les trailers manquants, les catalogues et pages non résolvables, les gestionnaires de chiffrement non pris en charge et les fichiers réparés par balayage d'octets avec des constatations par objet et une ligne de synthèse
Version 3.307.0
Fixed
- Les documents endommagés qui utilisent des flux de référence croisée se réparent désormais avec succès : la reconstruction brute récupère les membres des flux d'objets compressés et, lorsqu'aucun mot-clé de trailer n'existe nulle part dans le fichier, synthétise le trailer à partir du catalogue de document joignable le plus récent, de sorte qu'un décalage startxref cassé ne rend plus ces fichiers inouvraibles
Version 3.306.0
Added
ExportDocumentDataécrit les clés d'information du document, tout l'arbre des signets et les plages d'étiquettes de page en texte brut modifiable au format de ligne dump_data classiqueImportDocumentDataapplique le même format en retour — les clés d'information sont mises à jour, l'arbre des signets est reconstruit avec les niveaux d'imbrication et les pages de destination, et les plages d'étiquettes de page sont remplacées — permettant l'édition de signets en masse et la migration des métadonnées entre documents en un appel dans chaque sens
Version 3.305.0
Added
AuditDocumentSpacedécompose l'utilisation en octets du document's par catégorie — images, programmes de police et dictionnaires, flux de contenu, Form XObjects, flux d'objets, fichiers intégrés, métadonnées, arbre de structure, annotations, arbre de pages et autre — avec des décomptes d'objets, des totaux en octets et des pourcentages, répondant à la question de savoir pourquoi un fichier est aussi grand qu'il est et quelle optimisation paie le mieux
Version 3.304.0
Added
StructTreeItemCount,GetStructTreeItemTextetGetStructTreeItemIntPropertylisent l'arbre de structure d'un document balisé sous forme de liste d'éléments aplatie en parcours en profondeur — types d'éléments (bruts et mappés par rôle), texte alternatif et réel, langue, titres, identifiants de contenu marqué, numéros de page et relations parent/enfant
Changed
- Le lecteur d'arbre de structure se protège contre les documents endommagés : les cycles de référence, les numéros d'objet hors plage et les arbres imbriqués au-delà de 64 niveaux sont coupés au lieu de boucler
Version 3.303.1
Fixed
- Les tampons de sous-couche translucides créés par
StampTextetStampImagene laissent plus transparaître leur opacité dans le contenu de page original — l'état de transparence est désormais confiné au tampon lui-même, de sorte que la page conserve son opacité complète
Version 3.303.0
Added
OverlayDocumentPagestamponne les pages d'un autre document ouvert sur les pages du document sélectionné, une page source par page cible, au-dessus ou en dess du contenu existant — papier à en-tête, arrière-plans de page continus et modèles de formulaire numérisés en un appel- L'épuisement de la source est configurable : arrêter, parcourir en boucle les pages source, ou continuer à répéter la dernière page source ; une option supplémentaire empêche le tampon d'être agrandi au-delà de sa taille naturelle
Changed
- Les tampons de document sont ajustés au CropBox de la page cible's et placés à l'endroit sur les pages portant une entrée
/Rotate, et chaque page source est importée une fois comme Form XObject partagé afin que les modèles répétés ne dupliquent jamais leurs ressources
Version 3.302.0
Fixed
- Les mots de passe AES-256 sont désormais traités avec SASLprep (RFC 4013) avant le hachage, de sorte que les mots de passe contenant des espaces non ASCII, des traits d'union conditionnels, des caractères de compatibilité ou des séquences de combinaison s'ouvrent correctement dans Acrobat et les autres lecteurs conformes
- L'ouverture de documents AES-256 essaie d'abord le mot de passe préparé standard et revient à la forme héritée en octets, de sorte que les fichiers écrits par des versions antérieures avec des mots de passe non ASCII continuent de s'ouvrir
Added
- Le code d'erreur 604 signale un mot de passe AES-256 rejeté par SASLprep parce qu'il contient des points de code interdits ou enfreint les règles bidirectionnelles
Version 3.301.0
Added
SplitDocumentToFileséclate le document sélectionné en un lot de fichiers de sortie avec un nombre fixe de pages chacun, en utilisant un emplacement%pde nom de fichier
Changed
- Le fractionnement par lots analyse le document source une fois et copie chaque morceau depuis la même structure en mémoire, remplaçant la ré-analyse complète répétée qu'une boucle sur
ExtractFilePageseffectue pour chaque plage
Version 3.300.0
Added
CollateDocumentsfusionne les pages de plusieurs documents ouverts dans le document sélectionné en rotation, prenant un nombre configurable de pages de chaque source par tour (A1, B1, A2, B2, …)CollateDocumentsExaccepte une liste de plages de pages par source où les plages descendantes telles que3-1inversent une source, de sorte que les passages recto et verso inversé du scanner fusionnent en ordre de lecture en un appel
Changed
- Les fusions collationnées importent chaque source via une seule carte d'objets et entrelacent par réordonnancement des pages, de sorte que les polices et images partagées au sein d'une source ne sont écrites qu'une seule fois quelle que soit la taille du groupe
Version 3.299.0
Added
SetDeterministicDocumentIDetGetDeterministicDocumentIDbasculent l'identifiant de fichier du trailer vers une valeur reproductible afin que des entrées identiques produisent des octets de sortie identiques pour la mise en cache de génération, le stockage adressable par contenu et la comparaison de régression au niveau des octetsSetDocumentIDSeedfournit une graine explicite pour l'identifiant de fichier reproductible ; sans graine l'identifiant est dérivé des métadonnées du document, de l'en-tête de version et du nombre de pages
Changed
- Les identifiants de fichier reproductibles sont rafraîchis uniquement lors des enregistrements complets ; les mises à jour incrémentielles et les documents chiffrés conservent leur identifiant existant afin que les signatures et les fichiers protégés par mot de passe continuent de s'ouvrir correctement
Version 3.298.0
Added
AddLinkToArticleThreadetSetOutlineArticleThreadconnectent les points chauds de page et les signets à un fil d'article ou à un perle via des actions Thread standardAddActionNextArticleThreadetPDF_ACTION_BUILDER_THREADajoutent des actions Thread aux flux de travail d'actions chaînées, de formulaire, de page et de document
Changed
- Les cibles d'action Thread utilisent des références indirectes stables de fil et de perle et rejettent les index invalides sans modifier le conteneur de destination
- Les constructeurs d'actions de champ de formulaire rejettent les actions supplémentaires lorsque le mode PDF/A est actif, préservant l'interdiction PDF/A des dictionnaires
/AAde champ et de widget
Version 3.297.0
Added
- La référence de la DLL plate
DLdocumente désormais tous les points d’entrée ANSI à suffixeA(char), ajoutant 353 pages de référence qui reflètent leurs équivalents Unicode avec des signaturesPAnsiCharDelphi etconst char *C exactes BufferUtilities,DirectAccessFunctionalityetMiscellaneousFunctionsont été reconstruits en tant que pages d’index de groupes de fonctions propres, pilotées par le schéma de catégories commun, en corrigeant les balisages défectueux, les sections mal étiquetées et les puces manquantes- L’index de navigation et l’index de recherche partagé couvrent désormais l’ensemble de la surface DLL pour les appelants Unicode et ANSI
Fixed
- Suppression de l’entrée obsolète
SetLogger, qui n’avait aucun symbole correspondant dans le code source ; la propriété documentée estLogger
Version 3.296.0
Added
AddAlternateImage,AlternateImageCount,GetAlternateImageInfoetRemoveAlternateImagefournissent une création et une inspection typées des variantes d’image d’affichage et d’impression- Les images alternatives peuvent être associées à un groupe de contenu optionnel ou à un dictionnaire d’appartenance, tandis qu’une variante par image de base peut être sélectionnée comme valeur d’impression par défaut
Changed
- Le moteur de rendu intégré sélectionne désormais les images alternatives de contenu optionnel lorsqu’une image de base est masquée et respecte la valeur d’impression par défaut sur les destinations d’impression
FindImagesenregistre désormais les XObjects d’image alternatifs accessibles depuis les ressources de page afin que les variantes importées reçoivent des handles d’image utilisables
Version 3.295.0
Added
AddArticleThreadcrée une navigation d’article conforme aux normes avec des métadonnées typées, des rectangles de page ordonnés, des liens de perle circulaires et des tableaux de perles par pageArticleThreadCount,GetArticleThreadInfoetGetArticleThreadBeadinspectent les fils d’article créés ou importés avec un parcours borné des cycles de liens endommagés
Changed
DeletePagessupprime désormais les fils d’article qui perdent toutes leurs perles et répare les liens circulaires des fils survivants- Le suivi des pages supprimées conserve désormais des références de page indirectes stables afin que le nettoyage du plan et des articles ne puisse pas dériver lorsque le curseur de l’arbre des pages se déplace
Version 3.294.0
Added
SearchTextBatcheffectue des recherches sur plusieurs requêtes de texte pendant que chaque extraction de page est résidente et renvoie l’index de requête d’origine en base zéro avec chaque occurrenceSearchTextBatchEachfournit la même recherche en passe unique via un rappel de streaming avec signalement de progression et annulation
Changed
- La recherche de texte à requête unique et par lot partage désormais un même cœur de correspondance, préservant la sémantique de casse, de mot entier et de plage de pages tout en évitant l’extraction répétée de pages, le pliage de texte et le travail de géométrie des occurrences
Version 3.293.1
Fixed
- La rastérisation du dégradé maillé ne échoue plus à compiler sur aucune version de Delphi, résolvant
E2089 Invalid typecastsur les conversions réel vers flottant dans le painter GDI+ - Le rendu parallèle de pages par lot compile désormais sur Delphi XE5 et XE6, où
System.Threadingn’est pas disponible ; les chaînes d’outils plus anciennes reviennent au chemin de rendu série comme sur les environnements non Windows - La détection des capacités d’impression ne déclenche plus d’erreur de types incompatibles sur les versions héritées de Delphi en alignant l’appel
SetPrinteravec le reste du code d’impression - L’énumération du magasin de certificats se compile désormais sur RAD Studio 10.3 Rio, qui abandonnait auparavant avec une erreur interne du compilateur lors de l’optimisation de la routine d’énumération
Version 3.293.0
Added
- Les dictionnaires d’appartenance de contenu optionnel peuvent désormais être créés, mis à jour et énumérés avec les politiques de compatibilité
AnyOn,AllOn,AnyOffetAllOff - Les expressions de visibilité
/VEimbriquées de PDF 1.6 prennent en chargeAnd,OretNotvia une représentation préfixée compacte partagée par Delphi et C++Builder
Changed
- Les portées de contenu optionnel, les flux de contenu, les pages capturées, les images, les champs de formulaire et les annotations acceptent désormais soit un handle de groupe, soit un handle d’appartenance
- Le rendu évalue d’abord les expressions
/VEvalides et revient à/OCGsplus/Ppour les expressions mal formées ou non prises en charge
Fixed
- Le contenu optionnel imbriqué ne peut plus rendre un contenu visible lorsqu’un groupe ou une appartenance englobant est masqué
- Les dictionnaires d’appartenance sans groupes de contenu optionnel effectifs laissent désormais la visibilité inchangée comme l’exige la spécification PDF
Version 3.292.0
Added
EnumAttachmentssignale désormais les dates de création et de modification, les sommes de contrôle hexadécimales, les relations de fichiers associés et les numéros d’objet de spécification de fichier pour les pièces jointes de document et d’annotationValidateAttachmentChecksumvérifie à la demande une charge utile de pièce jointe par rapport à sa somme de contrôle stockée, tandis que les fichiers nouvellement intégrés reçoivent désormais automatiquement des métadonnées de somme de contrôle
Fixed
SetEmbeddedFileAFRelationshipaccepte désormais les mêmes index de fichiers intégrés en base 1 que le reste de l’API de pièces jointes, y compris les documents à pièce jointe unique
Version 3.291.0
Added
DeduplicateResourcesconsolide désormais les flux d’image, de formulaire, de motif, de dégradé, de fonction, de profil ICC, de programme de police, de CMap, de CharProc Type 3, de fichier intégré, de métadonnées et de PostScript en doublons exacts sur l’ensemble d’un document chargé- La déduplication des ressources fournit des indicateurs de type indépendants, une analyse à sec, une collecte orpheline facultative et des statistiques détaillées de hachage, de comparaison, de charge utile, de référence et par catégorie
Changed
- La détection des doublons canonise les dictionnaires de flux complets indépendamment de l’ordre des clés, hache chaque charge utile candidate une fois avec SHA-256 et confirme les compartiments correspondants octet par octet avant de rediriger les références
- Les groupes d’équivalence exacte conservent le numéro et la génération d’objet les plus bas pour une sortie déterministe, tandis que les cycles d’objet direct mal formés et les différences sémantiques de dictionnaire restent non fusionnés
Version 3.290.0
Changed
PurgeUnusedResourcescalcule désormais une fermeture de dépendance transitive sur les motifs de tuilage, les glyphes Type 3, les états d’apparence d’annotation, les groupes de masque doux ExtGState, les images, les dégradés et les espaces colorimétriques imbriqués- Les options de nettoyage par défaut activent désormais l’analyse des dépendances de motif, Type 3, apparence, masque doux et image, avec des indicateurs indépendants pour les appelants nécessitant un balayage plus restreint
- Les programmes de contenu imbriqués et les entrées de dépendance sont mis en cache, les portées de ressources partagées sont privatisées avant l’élagage et les cycles mal formés sont bornés par des gardes de flux actif et de profondeur
Fixed
- Les ressources de page utilisées uniquement via les espaces colorimétriques d’image, les bases Indexed, les alternatives Separation ou DeviceN, les espaces sous-jacents de motif, les alternatives ICCBased ou les dictionnaires de dégradé ne sont plus supprimées comme inutilisées
- Les ressources utilisées uniquement par les CharProcs Type 3, les cellules de motif de tuilage, les apparences d’annotation ou les groupes de masque doux de transparence ne sont plus supprimées de leur propre portée ou héritée
Version 3.289.0
Added
PurgeUnusedResourcessupprime désormais les ressources de page nommées qui ne sont pas référencées par les calques de contenu sélectionnés et peut renvoyer des statistiques détaillées par catégorie- Le nettoyage des ressources prend désormais en charge les plages de pages, le signalement à sec, la progression et l’annulation, l’analyse récursive des Form XObjects, la suppression des ProcSets obsolètes et la collecte facultative d’objets orphelins
Changed
- L’analyse des ressources suit désormais la sensibilité à la casse des noms PDF, les ressources de formulaire héritées, les espaces colorimétriques d’image en ligne personnalisés et les sept catégories de ressources standard
- Les programmes de formulaire répétés sont mis en cache, les ensembles de ressources utilisées utilisent une recherche triée et les entrées de dictionnaire sont supprimées par ordre décroissant pour des performances prévisibles sur les grands documents
Fixed
- La suppression des entrées de dictionnaire invalide désormais les index de clés des grands dictionnaires afin que les recherches ultérieures ne puissent pas renvoyer d’entrées obsolètes
- Les flux mal formés et les opérateurs inconnus préservent par défaut l’ensemble de leur portée de ressources, tandis que les dictionnaires de ressources partagés ou hérités sont clonés avant mutation
Version 3.288.0
Added
- Les signatures numériques peuvent désormais émettre des structures complètes de certification DocMDP et de verrouillage de champ FieldMDP, avec des rapports d’autorisation structurelle pour chaque signature sélectionnée
- Les horodatages de document RFC 3161, les horodatages de signature, l’injection de jetons PAdES-B-T, la validation de chaîne de certificats, les preuves OCSP et le matériel de validation DSS ou VRI disposent désormais de workflows complets de création et de vérification
- Les annotations RichMedia prennent désormais en charge les ressources intégrées, les paramètres d’activation et de désactivation, les apparences d’affiche, l’énumération, l’extraction et la suppression
- L’impression en poster prend désormais en charge l’imposition vectorielle des pages, les repères de chevauchement et de coupe, le placement sensible aux marges matérielles et les plans de tuilage réutilisables
- Les tableaux balisés émettent désormais une structure sémantique Table, TR, TH et TD avec des identifiants stables, des associations d’en-tête, des portées, des en-têtes répétés et une décoration artifactisée
- La visionneuse fournit désormais une édition AcroForm accessible au clavier pour les champs de texte, de choix, de case à cocher, de radio et de bouton-poussoir tout en distribuant les actions à l’application hôte
Changed
- Les dégradés maillés basés sur fonction Type 1 et de Type 4 à 7 sont désormais rendus via l’évaluation de fonction native et la tessellation maillée bornée
- Le rendu couleur ICCBased partage désormais les transformations mises en cache entre les images et les dégradés tout en préservant le comportement d’espace colorimétrique calibré
- Les sauvegardes incrémentielles reconstruisent désormais les flux d’objets et les flux de références croisées de manière cohérente, et les signatures sélectionnées sont vérifiées par rapport à leur propre révision signée
Fixed
- Les demandes d’horodatage de signature SHA-1 hachent désormais la valeur de signature du signataire avec SHA-1 au lieu de revenir à SHA-256
- Les remplacements de verrouillage de champ rejetés ne suppriment plus une configuration de verrouillage de champ précédemment valide
- Les widgets radio avec des noms d’état d’apparence en double préservent désormais le widget sélectionné et maintiennent les widgets frères éteints
Version 3.287.0
Changed
- Les dictionnaires d’image en ligne suivent désormais les limites de commentaire, de délimiteur, de littéral, d’hexadécimal, de tableau et de dictionnaire PDF avec une imbrication bornée
- Les charges utiles d’image en ligne utilisent désormais une terminaison sensible au format pour les données raw, DCT, ASCII85, ASCIIHex, RunLength et Flate
- La découverte de charge utile Flate effectue désormais une décompression bornée depuis l’offset de flux de contenu avec une comptabilité exacte des octets compressés, tandis que les filtres sans perte chaînés partagent un plafond de sortie de bout en bout
- Les flux ASCII85, ASCIIHex, LZW, de prédicteur, de profil colorimétrique et d’image auxiliaire appliquent désormais une sortie intermédiaire bornée sans allocations temporaires surdimensionnées
Fixed
- Les images en ligne mal formées ou tronquées ne lisent plus au-delà des données source, ne bouclent plus sur des valeurs non terminées et ne conservent plus d’état obsolète lors de la réutilisation du décodeur
- Les lignes d’image compactées calculent désormais les bits de composant avant l’arrondi d’octet, empêchant les longueurs incorrectes pour les images RGB à faible nombre de bits et multi-lignes
- Les espaces colorimétriques de ressources préservent désormais leurs noms d’origine tout en dérivant les nombres de composants Lab, ICCBased indirects et DeviceN et en décodant les flux de palette Indexed sous des limites strictes
- Les limites d’image en ligne rejettent désormais de manière cohérente les dimensions invalides, les profondeurs de bit, les filtres non pris en charge, les chaînes de filtres non sûres, les flux compressés et les marqueurs de fin ambigus
- Le rendu couleur Indexed valide désormais chaque accès à la palette et rejette les données de recherche tronquées au lieu de lire au-delà de la table décodée
- Les prédicteurs PNG 10 à 15 se décodent désormais correctement pour les flux Flate et LZW, rejettent les filtres de ligne invalides et valident toutes les tailles de ligne et d’état avant l’allocation
- Les charges utiles JPEG et JPEG 2000 vérifient désormais leurs dimensions encodées, composants, précision, structure de marqueur, longueurs de boîte et empreinte de stockage décodé avant l’allocation d’image
- La validation d’image en ligne limite désormais le stockage bitmap compacté et étendu et borne les profils ICC, les globals JBIG2 et les paramètres de filtre terminal
- Les charges utiles de filtre binaire contenant du texte de marqueur de fin intégré continuent désormais jusqu’au premier candidat qui passe la validation de format bornée
Version 3.286.0
Changed
- Content stream tokenization now follows PDF whitespace, comment, delimiter, literal string, hexadecimal string, and name boundaries
- Text splitting and resource replacement now use geometrically grown output buffers for linear processing of large content streams
- Reusable content stream processors now reset derived output and parser state before every
Processcall
Fixed
- Malformed or truncated literal and hexadecimal strings no longer read beyond the source buffer or emit an extra empty token
- Resource replacement now preserves case-sensitive PDF name semantics, accepts optional leading slashes, and updates duplicate mappings deterministically
- XObject and shading operands at the beginning of a stream are now excluded from text output, while unmatched restore operators no longer cancel later saved graphics states
Version 3.285.0
Changed
- LZW encoding now uses constant-time dictionary lookup and buffered stream writes, while decoding uses compact prefix and suffix tables with geometric output growth
- Flate predictor decoding now processes rows directly in the output buffer and supports packed, 8-bit, and 16-bit TIFF samples with arbitrary colour counts
- Stored Deflate streams now write into an exact pre-sized result, and zlib wrappers release temporary buffers safely when compression or decompression fails
Fixed
- LZW code-width changes now follow PDF
EarlyChangesemantics across 9-bit through 12-bit codes, including dictionary resets andEarlyChange=0 - LZW decoding now rejects invalid future codes and truncated bit streams without reading beyond the source buffer
- PNG predictors now use the ceiling byte width of a pixel, preserve previous decoded rows, and safely pad a partial final row
- TIFF predictor decoding now handles 1-bit, 2-bit, 4-bit, 8-bit, and 16-bit components consistently in both LZW and Flate paths
Version 3.284.0
Changed
- Buffer searches now scan fixed 64 KiB blocks, use byte lookup tables for set membership, and preserve the caller's position across every search path
- Unicode, Latin-1, hexadecimal digest, and ARC4 conversions now reserve bounded output once instead of repeatedly growing strings or temporary arrays
- ASCII85 encoding now reads input streams in 32 KiB blocks, while decoding uses exact integer arithmetic and writes directly into a pre-sized output buffer
- MD5 string hashing now avoids a temporary memory stream, digest comparison examines every byte, and ARC4 key scheduling no longer allocates an expanded key array
Fixed
DistanceToAnyBytenow returns the correct offset beyond its first block instead of rereading the same prefix and overcounting skipped bytes- Stream-backed buffer reads now honour the actual byte count returned by custom streams, shrinking results and advancing positions only by bytes received
- Buffer length reductions now clamp the current position, and nil pointer or stream sources behave as empty inputs instead of exposing invalid memory
- Latin-1 decoding now maps the complete byte range 0x00-0xFF instead of replacing bytes 0x7F-0xFF
- ASCII85 decoding now preserves the valid maximum 32-bit group
s8W-!and stops at the first end marker without floating-point boundary loss
Version 3.283.0
Added
TPDFlibSignatureVerifiercan now enumerate signature fields and CMS signers, open files, streams, or strings, and verify a selected field and signer by index or field name- Detailed verification reports now separate cryptographic integrity from signed-revision coverage, current-file coverage, later revisions, strict Contents-gap validation, and native crypto errors
Changed
- Detached CMS validation now streams both ByteRange segments through Windows CryptoAPI in bounded chunks instead of materialising the complete PDF in memory
- Signature fields under nested AcroForm Kids arrays and inherited
/FT /Sigentries are now enumerated with fully qualified names, and direct signature value dictionaries are supported
Fixed
- ByteRange validation now rejects overflow, overlap, truncation, a gap that is not exactly the selected hexadecimal
/Contentstoken, and a signed revision that does not end at its own%%EOF - Certificate lookup no longer falls back to an unrelated embedded certificate when the selected CMS signer identifier has no exact issuer-and-serial match
- Incremental updates that use cross-reference streams now include the cross-reference stream object's own type 1 entry, preventing strict PDF validators from reporting a missing self entry after signing
Version 3.282.1
Changed
- Full saves now rebuild imported object streams from the live object graph, preserve private trailer roots, and retain free-object generations without reusing structural object numbers
- Cross-reference streams now size their offset fields for large files, preallocate their payload, include their own entry, and preserve trailer extension keys
Fixed
- Object-stream packing now writes real
/ObjStmcontainers and type 2 member entries instead of only switching to an xref stream - Garbage collection no longer writes missing object numbers as in-use entries at offset zero and now emits a linked free-object chain in both plaintext and stream cross-references
- Loaded packed PDFs can now be saved repeatedly with packing enabled or disabled without retaining stale object streams, losing live members, or requiring cross-reference repair
Version 3.282.0
Added
- Imported ICCBased colours now use the embedded ICC profile across vector painting, function and mesh shadings, indexed palettes, raw bitmap, CCITT and JBIG2 images, CMYK JPEG images, and JPEG 2000 images
Changed
- ICC transforms now use a bounded Windows Color System lookup table with multilinear interpolation, replacing the temporary PNG round trip used during image rendering
- The renderer now honours content-stream and graphics-state rendering intents, ICCBased
/Range, image/Decode, and original-domain colour-key masks while validating profile channel counts against the PDF colour-space dictionary - Repeated uses of the same profile and rendering intent now share one lookup table across vector colours, patterns, shadings, and images
Fixed
- Encrypted ICC profile streams are now decrypted only while decoded and restored afterward, and embedded profiles are no longer compressed twice while writing image output
Version 3.281.0
Added
- The built-in GDI+ renderer now paints imported PDF function-based shadings and free-form, lattice, Coons, and tensor mesh shadings (types 1 and 4-7), including transparency and clipping
- Shading dictionaries now support component Function arrays, calibrated Lab, CalGray, and CalRGB spaces, Separation and DeviceN tint transforms, PatternType 2 Background fills, and BBox clipping across the GDI+ and Cairo renderers
Changed
- Type 1 shading functions now use bounded adaptive colour sampling with additional quarter-cell probes for higher narrow-feature accuracy and lower work on constant or smooth regions
- PatternType 2 matrices around mesh shadings are now composed exactly once in both GDI+ and Cairo, preserving translated, scaled, and rotated pattern placement
- Mesh colour components are now interpolated in their source colour space before Function evaluation and conversion to RGB, preserving nonlinear functions, DeviceCMYK gradients, and the correct ordering for managed colour transforms
- Coons and tensor surfaces now use bounded device-pixel error subdivision for smoother high-curvature output at large render sizes
- Encrypted shading and Function streams are decoded through the document crypt callbacks, and Type 5 vertex records honour their required byte alignment
Version 3.280.1
Fixed
MergeFileList/MergeFileListFast/MergeFileListStrictleaked aTSmartPDFReader/TSmartPDFDocumentpair (and everything they own) when a non-PDF file appeared in the merge list: the reader and document were constructed before thetryblock that frees them, so a parse failure on the malformed file's content orphaned the already-constructed reader instead of being cleaned up by the surrounding exception handler; construction now happens inside the protectingtryin both the single-file and multi-file prescan paths- Mesh shading parsing (
TPLMeshShading.Parse, shading types 1 and 4-7) leaked the decoded/Functionobject on every parse - every early-exit path and the normal completion skipped freeing it; the function is now released in afinallyblock regardless of howParseexits TPDFlibSignDoc.Closenow nils its smart-reader/document/info fields after freeing them, and the exception paths inOpen,OpenStreamandOpenStringnow release any partially-constructed smart objects instead of only clearing the stream reference, preventing a leak when opening a signing target fails partway through
Version 3.280.0
Added
- Error category enumeration
TPDFlibErrorCategory(ecSuccess/ecStructure/ecSave/ecCrypto/ecGeneric/ecCompliance/ecAcroForm) layered on top of the existing numericLastErrorCodetaxonomy, so callers can classify failures without memorising code ranges; exposed viaTPDFlib.LastErrorCategory,TPDFlib.ErrorCategory(Code)andTPDFlib.ErrorMessage(Code) - Form-field error codes 701-704 (field not found, field read-only, no AcroForm, invalid value) with human-readable messages, letting callers distinguish "field is locked" from "no such field" instead of receiving a single generic failure
SetFormFieldValueForcedforce-write variant that bypasses the read-only guard, used internally bySetFormValues(SkipReadOnly=False)so bulk imports can still overwrite locked fields when the caller explicitly opts out
Changed
SetFormFieldValuenow setsLastErrorCodeto 701/702/703 on failure (field not found / read-only / no AcroForm) instead of returning 0 silently;LastErrorCategoryis a non-consuming read so callers can inspect the category before retrieving the numeric code
Version 3.279.0
Added
ReplacePageRangesreplaces visual page content from another open document without changing the target page count or target page object identities, preserving bookmarks, links, annotations, and form widgets already attached to those pages
Changed
- Cross-document page copying no longer creates and removes an extra placeholder page before importing the requested range
Version 3.278.0
Added
PrintPagesAdvancedapplies copies, collation, duplex, orientation, color, quality, paper-size and input-bin settings to arbitraryPrintPagesrange expressions while retaining one printer profile and one print job
Changed
- Advanced print settings are validated before the job starts, positive print-quality values above the four named presets are applied as DPI, and paper or input-bin identifiers may use the full positive range supported by the corresponding
DEVMODEfields
Fixed
- Damaged cross-reference recovery now dispatches its bounded block reads through the traditional
TStream.Readoverride on Win64, preserving instrumentation and custom-stream behavior while retaining 64 KiB sequential I/O
Version 3.277.0
Changed
- Damaged cross-reference recovery now scans source data in 64 KiB sequential blocks instead of seeking once for every matching character, keeping auxiliary memory bounded while scaling to large PDF files and non-memory streams
- Recovery validates complete indirect-object tokens, skips object-like data inside comments, strings, and streams, confirms stream endings with a following
endobjtoken, preserves headers split across read boundaries, and selects the last valid trailer dictionary
Fixed
- Trailer reconstruction now supports nested dictionaries and delimiter text inside literal strings and is no longer truncated to the first 2048 bytes or the first apparent
>>pair
Version 3.276.0
Added
ActivateWebLinksandActivateWebLinksExscan existing page text once per page and create non-duplicate URI link annotations for HTTP, HTTPS,www., FTP,mailto:, and bare email targets with selectable detection and border options- Generated links use matched-character geometry, precise quadrilaterals for rotated or skewed text when permitted, PDF/A print flags, progress and cancellation support, and selected-page restoration; tagged PDF and PDF/UA documents are protected from incomplete structure-tree updates
Changed
SetAutoCreateWebLinksnow uses the same boundary-aware detector and target normalization when creating links for newly drawn text, addingwww., FTP, and bare email support
Fixed
- Updating annotation
/Contents, name, date, title, or subject properties no longer overwrites the subtype of an existing action dictionary, so URI and other actions remain valid after annotation metadata changes
Version 3.275.0
Added
ExtractPageRangeText,SavePageRangeTextToStream, andSavePageRangeTextToFileextract a parsed page range in one traversal with caller-defined page separators; stream and file output writes UTF-8 data incrementally so large documents do not require a complete document-sized text bufferSetPageBoxRangeandRemovePageBoxRangeapply page-boundary changes across the standard page-range syntax while preserving the caller's selected pageSetPageTransitionRangeandSetPageTransitionRangeExapply legacy or extended presentation transitions to page ranges with per-page progress and cancellation supportGeneratePageThumbnailsrenders requested pages directly into reusable memory and attaches their/Thumbimages without intermediate files or nested progress operations
Version 3.274.0
Fixed
- GDI+ rendering of axial shading patterns now honours the PDF
/Extendarray:SetupGDIPlusPatternpassesWrapModeClampwhen either end is extended (matching the Cairo backend) instead of always usingWrapModeTile, so end colours paint the area outside the gradient axis correctly
Added
- The scroll-hint bubble (
"Page N / M") shown while dragging the vertical scrollbar now auto-hides after 3 seconds of inactivity via aWM_TIMERhandler, so it no longer lingers until a separate scroll event dismisses it ZoomInStep/ZoomOutStepnow snap ontoActualSize(100%),FitWidthandFitPagepercentages when they fall between the current zoom and the next preset on the 14-step ladder, matching the behaviour of professional PDF viewers- The viewer disk page cache writes a build-version marker (
cache.version) and wipes the whole cache root when the library version changes, so a build upgrade never reuses stale bitmaps rendered by an older code path
Version 3.273.1
Fixed
- Object-stream container and xref-stream objects created during save were leaked because they bypassed
TPDFStructure.AddObjectregistration; both call sites now use theNewStreamWithDictownership-tracking factory, eliminating theTPDFStreamleak reported by the test runner underReportMemoryLeaksOnShutdown - Cross-reference stream
/Sizewas off by one: it must be one past the highest object number in the whole file, and the xref stream is itself an indirect object numberedMaxObj+1, so/Sizeis nowMaxObj+2
Changed
- Peephole content-stream optimiser now also removes identity text-matrix operators (
1 0 0 1 0 0 Tm), covering bothcmandTmwith the same six-operand identity check - Mark-sweep GC preserves object 1 (the
/Linearizedparameter dictionary) when the source document was loaded linearized, since that dictionary is never referenced from/Rootbut must survive
Version 3.273.0
Added
- Object-stream packing on save (
TPDFDocument.PackObjectsIntoStreams) collects eligible non-stream indirect objects, serialises them into PDF 1.5 object streams (/Type /ObjStm) with Flate compression, and emits a binary cross-reference stream (/Type /XRef) carrying type-0, type-1 and type-2 entries, reducing the size of saved files 10-40% on object-dense documents TPDFlibSaveOptions.PackObjectStreamsflag plusTPDFlib.SetPackObjectStreams/GetPackObjectStreamsAPI; defaults to enabled, auto-gated by PDF version (1.5+ activates packing and xref streams, 1.4 and below keep the traditional plaintext xref for compatibility), andTPDFlib.GetLastSaveUsedObjectStreamsreports whether the last save actually packed
Version 3.272.0
Added
- Mark-sweep garbage collection of unreferenced indirect objects (
TPDFDocument.GarbageCollectUnusedObjects) walks the object graph from the trailer roots (/Root,/Info,/Encrypt) and removes every indirect object that is not reachable, stopping the file-size growth that accumulates when pages are deleted and their font, content and XObject resources become orphans TPDFlibSaveOptions.GarbageCollectflag plusTPDFlib.SetGarbageCollect/GetGarbageCollectAPI let callers opt in to GC during a full save (defaults to off for backward compatibility), andTPDFlib.GarbageCollectObjectsruns GC immediately and returns the number of orphaned objects removed
Version 3.271.0
Added
- Peephole content-stream optimiser (
TPDFContentPeepholeOptimizer) rewrites a parsed page content stream before Flate compression, removing semantically redundant PDF operators: identitycmmatrices, emptyq/Qpairs, emptyBT/ETobjects, no-op paths terminated bynwith no clip, duplicate graphics-state setters (colour, line width, cap/join, dash, text state), and deadnafter a painting operator - all transforms are output-equivalent so visible page output is unchanged TPDFlibSaveOptions.OptimizeContentStreamsflag and matchingTPDFlib.SetOptimizeContentStreams/GetOptimizeContentStreamsAPI let callers opt in or out of the peephole rewrite duringCompressContent/CompressPage; enabled by default
Changed
TPDFDocument.CompressPagenow forwards the optimisation flag to the page tree so the peephole pass runs insideTPDFPageTree.Compressbefore the existing Flate compression, stacking operator-level reduction on top of byte-level compression
Version 3.270.0
Added
- New
PLParseDefaultAppearancedecodes a/DAdefault-appearance byte string (ISO 32000-2 12.7.4.3) into the font resource name, font size and fill colour, covering therg,kandGcolour operators so form-field and annotation appearance generators can paint text with the author-intended styling
Changed
- Page content-stream assembly (
TPDFRenderer.GetContents) now concatenates multi-part/Contentsarrays through aTStringBuilderinstead of repeatedResult := Result + chunk, removing the O(n^2) string growth that penalised pages with many content-stream parts
Version 3.269.0
Added
- New
BeginMarkedContent/EndMarkedContentwrite inline marked-content sequences with accessibility properties (/Alt,/ActualText,/Lang,/E) directly in the BDC property list per ISO 32000-2 14.9.2–14.9.5, so screen readers and accessibility tooling can read substitute text without a structure-tree entry - Annotation reader exposes
GetAnnotEffectiveBorderimplementing the Errata #287 precedence (border style dict/BSwins over the legacy/Borderarray) and resolving width, style and dash pattern into one call - Signature documents expose
GetSignatureSeedValueto read the seed-value dictionary (/SV, ISO 32000-2 12.7.5.5 Tables 236–237): required filter, allowed SubFilters and allowed digest methods, so a signer can honour the constraints the author embedded GetSignatureFieldLockreads the/LockFieldMDP seed dictionary (Table 238): action (/All,/Include,/Exclude) and the affected field names that must be locked at sign time
Version 3.268.0
Added
- New
PLParsePDFDateparses ISO 32000-2 7.9.4 date strings (D:YYYYMMDDHHmmSSOHH'mm') into a localTDateTime, honouring the mandatoryD:prefix, the field-dependency ladder (each field only when all preceding fields are present) and the UT offset (+/-/Zwith optional apostrophe-minute), returning the local equivalent of the documented instant - Text-string decoding (
PLDecodeTextString) now recognises the PDF 2.0 UTF-8 BOM (EF BB BF) per 7.9.2.2.1, so UTF-8-authored metadata decodes correctly instead of being misread as PDFDocEncoding - File specifications expose
GetFileNamehonouring the PDF 2.0 precedence (Path > UF > F) per Errata #444, plusGetEmbeddedFileStreamandGetRelatedFilesaccessors for the/EFand/RFdictionaries - Annotation readers expose appearance-precedence helpers
GetAnnotNormalAppearance,GetAnnotDefaultAppearanceandGetAnnotOffStateAppearanceimplementing the Errata #23/#34/#42/#170 rules (AP/N is authoritative; DA is the byte-string fallback; Off state lives under the nameOff) - PDF/UA validation reports a new code 10045 when a non-standard structure type fails to terminate at a standard type through the role-map chain (ISO 14289-1:2014 7.1), with cycle protection to a depth of 8
- PDF/A and PDF/UA font audits now validate that embedded CIDFontType2 fonts carry a
/CIDToGIDMapwhose value is either the nameIdentityor a stream, not merely present (ISO 32000-1 9.7.4)
Changed
- Name-tree lookup (
NameTreeLookup) now binary-searches the sortedNamesarray per ISO 32000-2 7.9.6 before falling back to a linear scan, turning large EmbeddedFiles/JavaScript/Dests lookups from O(n) into O(log n) on conformant files - PDF/UA standard-structure-type set expanded with PDF 2.0 additions (
Artifact,DocumentFragment,FENote,MarkedContent,Title) so the role-map no-remap and chain-termination checks recognise the full tag vocabulary
Version 3.267.0
Added
EnumPageContentStatesExcan recursively enumerate Form XObject instructions with configurable depth, cycle protection and depth-first execution ordering- Content snapshots now expose invocation-tree identity, containing stream and parent XObject information, resource-scope identity, Form traversal status and descendant counts
- Standalone content trackers can register scoped fonts and initialise isolated Form execution state with matrix concatenation and bounding-box clipping
Changed
- Recursive content tracing selects each Form resource dictionary independently, inherits invoking resources for compatible legacy Forms, preserves inherited font identity and caches decoded Form programs across repeated invocations
Version 3.266.0
Added
- Text runs returned by
GetTextRunsnow carry the glyph origin (OriginX/OriginY) and the full text matrix components (Tm11/Tm12/Tm21/Tm22/TmDX/TmDY) captured by replaying BT, Td, TD, Tm and T* alongside the show operators, so consumers can locate glyphs without a separate text-funnel pass - Mesh shading decoding now routes Lab, CalRGB and CalGray colour spaces through the colour manager instead of falling through to black, producing correct fills for non-DeviceRGB free-form and coons patches
- Redaction now emits a real
/Subtype /Redactannotation with/Rect,/ICinterior colour and optional overlay text alongside the existing content removal, so redaction-aware viewers mark the sanitized region - Library operations emit structured log records at load and save boundaries through the previously dormant
Logger, with ISO-8601 UTC timestamps and a cachedTStreamWriterfile sink that no longer reopens the log file on every line - New
Tests.Memoryfixture guards create/draw/save/free andNewDocumentcycles against heap regression, and the console test runner now enablesReportMemoryLeaksOnShutdown - EMF interpretation now counts unknown or private records via the
UnknownRecordCountproperty so silent metafile gaps are observable
Changed
- Dictionary key lookup (
TPDFDictionary.FindIndexByKeyName) builds a lazy open-addressing hash index for dictionaries with more than 16 entries, turning the linear scan that dominated renderer Resources/ColorSpace/Font/ExtGState lookups into an O(1) probe - sRGB gamma conversion (
XYZ2RGB) uses a shared 4096-entry lookup table instead of threePower(x, 1/2.4)calls per pixel, and Lab-to-XYZ cubing now uses direct multiplies; both are the dominant per-pixel cost when decoding Lab or ICC-based images - Page lookup (
TPDFPageTree.GetPage) returns the cached page dictionary on repeat access instead of re-walking the page tree every call - Content-stream operator dispatch (
ContentOperatorFromName) buckets the 73 operators by first byte, cutting the per-token linear scan to a short residual compare - PDF/A colour-space audit now recurses into the base or alternate space of Indexed, Separation, DeviceN and ICCBased up to a depth of 8, so a hidden DeviceCMYK tint transform or bare Lab name is flagged rather than passing silently
- Shaped-font finalize now walks the used-glyph set recorded at draw time instead of scanning all 65536 glyph slots four times per save
- String escape routines (literal-string, XFDF, stamp and variable token expansion) build output through
TStringBuilderor two-pass allocation, removing O(n^2) concatenation from save and form-export hot paths - AES stream encrypt/decrypt reuse their chunk buffer across loop iterations instead of reallocating per block
- Composite-glyph parsing in the TrueType parser grows the components array geometrically instead of one element at a time
- Mesh shading
ReadBitsreads the minimum covering bytes in one pass andWriteBitspre-sizes the output buffer, eliminating per-bit reallocation - Painter circle control point uses a precomputed kappa constant and arc squaring uses
Sqrinstead ofPower
Fixed
- Fixed a non-Windows compile break in
PDFlibParallelwhere the stub body signature forPDFlibRenderPagesParalleldid not match the interface declaration
Version 3.265.0
Added
- Added 59 C++Builder console demos to align the C++Builder demo suite with Delphi, bringing the total from 33 to 92 demos covering the same API surfaces
- Added Demo/C++Builder/index.html expansion from 35 to 92 entries with Navigation, Color & ICC, Barcode & media, and Structure & compliance sections
Fixed
- Fixed all 33 existing C++Builder cbproj files that were missing 20 library units (PDFlibMeshShading, PDFlibGraphics, PDFlibWindows, PDFlibParallel, PDFlibLogger, PDFlibMail, PDFlibViewer, etc) from their DelphiCompile list, which prevented every C++Builder demo from compiling
Version 3.264.0
Added
- Content graphics-state snapshots now resolve
Dooperands as image, form or PostScript XObjects and report their resource names, object numbers and transformed bounds - Form snapshots expose the original
/Matrixand/BBoxtogether with resource, group, transparency-group and reference-form indicators - Standalone content trackers can pre-register XObject streams through
RegisterXObject
Changed
- Page content-state enumeration now precompiles selected-page XObject resources and calculates invocation bounds from all four transformed corners
Version 3.263.0
Added
- Content graphics-state snapshots now expose current path bounds, current point, path complexity, pending clipping rules and effective clipping bounds
- Standalone content trackers can initialise an explicit clipping boundary through
SetInitialClipBounds
Changed
- Page content-state enumeration now follows delayed
WandW*clipping, exact transformed cubic extrema,q/Qclipping restoration and selected-pageCropBoxboundaries
Version 3.262.0
Added
- Content graphics-state snapshots now report font writing mode, exact per-instruction text displacement and whether font metrics were resolved
- Standalone content trackers can provide font measurements through
OnMeasureText
Changed
- Page content-state enumeration now advances text matrices for
Tj,TJ,'and"using simple or composite font metrics, horizontal scaling, spacing and vertical writing rules
Version 3.261.0
Added
- Content graphics-state tracing can now resolve page
ExtGStateresources, including transparency, blending, overprint, soft masks, device controls and embedded font references TPDFContentStateTrackercan pre-register external graphics-state dictionaries for standalone content-program analysis
Changed
- External graphics-state parameters now apply cumulatively and participate in complete
q/Qsave and restore snapshots
Version 3.260.0
Added
- Added single-pass effective graphics-state tracing for structured content programs and complete selected pages
- Snapshots expose CTM, text matrices, line style, dash pattern, colours, text state and graphics-state stack depth before or after each instruction
Changed
- Image placement enumeration now maps all four unit-square corners, producing correct bounds under rotation and shear
Version 3.259.0
Added
- Added typed time, special-pattern and arbitrary-mask helpers for interactive form fields
- Added range validation with independently optional zero-safe bounds
- Added sum, average, product, minimum and maximum field calculations with automatic calculation-order registration
Security
- Generated JavaScript string values now escape quotes, backslashes, control characters and JavaScript line separators
Version 3.258.0
Added
- Added typed
SetOCGStateaction creation for form-field events, existing actions and action chains - Optional-content actions preserve left-to-right state changes, repeated groups and the optional radio-button relationship preference
Changed
- Optional-content action enumeration now returns canonical group handles that round-trip through the writer APIs
Version 3.257.0
Added
- Added complete explicit remote-destination writing with zero-based pages, all standard fit types, nullable XYZ values and tri-state window preferences
- Added complete launch-action writing for portable files, Windows parameters, default directories and open or print operations
- Existing action handles can now update these payloads or append them to action chains without container-specific duplicate APIs
Security
- Remote go-to and launch action builders now reject PDF/A mode before modifying an action chain
Version 3.256.0
Added
- Remote go-to action inspection now reports named and explicit destinations, zero-based target pages, fit types, coordinates and zoom values
- Launch action inspection now reports Windows application parameters, default directories and open or print operations
- Action information distinguishes an absent
/NewWindowpreference from an explicit false value and identifies array-based targets
Version 3.255.0
Added
- Added typed builders for remote named-destination and external application launch actions
- URI action builders now support coordinate-map requests through the standard
/IsMapflag - The new action kinds work across lifecycle, form-field and chained-action APIs through the existing extended builder interface
Version 3.254.0
Added
- Added 14 Delphi API-coverage demos for library surfaces that had no dedicated demo: OutlineBuilder, NamedDestinations, DocumentActions, EmbeddedFiles, LinearizeDemo, BarcodeGallery, XfaFields, TaggedPDF, OutputIntent, HtmlTextFlow, RichMediaAnnotations, MailSendDemo, TextBlockExtraction, and PadesDssDemo
- Added a Navigation section, Color & ICC section, Barcode & media section, and Structure & compliance section to the Delphi demo index, bringing the total from 56 to 92 listed demos
- Added Readme.en-us.html guides for the 20 demos that previously shipped without one
Changed
- Applied the project Formatter.config across all Delphi demo sources so operator spacing, indentation, and keyword casing follow one style, and set NewLineBeforeThen to False so If...Then stays on a single line
- Hardened error handling across the classic GUI demos: SaveToFile return values are now consistently checked, TPDFlib and secondary object lifetimes are always protected by try/finally, and failure messages include LastErrorCode
Fixed
- Fixed inverted SaveToFile polarity in ImageToPdf that treated success as failure, and stopped AddTrueTypeSubsettedFont from opening a stale file when the save failed
- Fixed resource leaks in CreateWithImageToStream, DoInTheStream, CanvasText, ExtractText, ExtractImage, PdfDecrypt, PdfEncrypt, and PdfPermission where TPDFlib, TStream, TBitmap, TOpenDialog, or TStringList instances could escape on an exception path
- Removed dead code in AddFormattedTitle (unused RectParts allocation, redundant try/except around StrToFloatDef) and MultiFunction (overwritten SetTextSize call)
Version 3.253.0
Added
- Added typed action details for thread, sound, movie, optional-content, rendition, transition and 3D-view actions
- Added reusable action-handle lookup and ordered optional-content state enumeration
- Added complete PDF transition records covering replacement, Fly, Push, Cover, Uncover and Fade styles
Fixed
- Wipe and Glitter transitions now store their direction in
/Di, read page display duration from the page dictionary and clear both transition and timing entries - Standard pre-PDF-1.5 transition styles no longer force a PDF 1.5 output version
Version 3.252.0
Added
- Added single-pass form-field action discovery with typed action details across primary, widget and field triggers
- Added complete calculation-order enumeration, per-field lookup and removal for interactive forms
- Extended bulk form-field snapshots with calculation order and action count
Changed
- Widget lifecycle triggers now support page-open, page-close, page-visible and page-hidden actions with the required PDF 1.5 version handling
Version 3.251.0
Added
- Added single-pass named-destination enumeration across legacy catalog entries and modern name trees with resolved page and view parameters
- Added named-destination removal, complete push-button captions, button text positioning and form-field mapping names
- Extended bulk form-field snapshots with mapping names, button captions and button text position
Fixed
- Name-tree editing now supports direct destination values and uses unambiguous multi-node index encoding
Version 3.250.0
Added
- Added single-pass form field snapshots with field identity, type, page, flags, values and Choice state
- Added typed Choice-field flag queries plus validated selected-index and top-visible-index accessors
Fixed
- Single-selection Choice fields no longer retain a multi-selection
/Iarray, and switching from multi-select to single-select now replaces the old/Varray with a string value
Version 3.249.0
Added
- Added one-pass stateful text search traversal so applications can iterate cached hits without extracting pages twice
- Added bulk form value export and name-based application with optional read-only field protection
Version 3.248.0
Added
- Added retained Viewer selections with page-space geometry, extracted text, enumeration, clearing and a vetoable marquee event
- Added exact current-viewport bitmap capture and file output including persistent overlays
Version 3.247.0
Added
- Added independent Viewer controls for user form editing and annotation activation
- Added configurable foreground colour for text and choice form editors
Version 3.246.0
Added
- Added typed line ending styles, shape interior colours, link highlight modes, FreeText alignment, Text annotation open state and Caret symbols
- Annotation setters validate compatible subtypes and automatically raise the minimum PDF version where required
Version 3.245.1
Fixed
- Corrected FastReport export page sizing and memo layout so A4 reports retain their intended scale, text stays within memo bounds and unconfigured memo frames remain hidden
Version 3.245.0
Added
- Added
OnPasswordso applications can supply another password after an encrypted document rejects the initial credential - Password retries now work consistently for file, stream and string loads, expose the next attempt number and allow the handler to cancel
Security
- Password callbacks are limited to sixteen total attempts and every retry uses a fresh parser and decryption state
Version 3.244.0
Added
- Added
SetXMPPropertyExfor safely writing scalar properties in caller-defined XMP namespaces - Custom XMP values are escaped through the XML DOM, repeated writes replace the matching namespace property and invalid or reserved XML names are rejected
Version 3.243.0
Added
- Added typed document lifecycle actions for before close, before save, after save, before print and after print triggers
- Added typed page open and close actions with shared support for URI, named, JavaScript, form and destination action builders
- Added action inspection and removal methods for every document and page lifecycle trigger
Version 3.242.0
Added
- Added
SaveChangesto append changes to the originally loaded file and automatically reload the updated xref chain for repeated incremental saves SaveChangesvalidates the reload password before writing and preserves the selected public document handle after reload
Changed
AppendToFilenow rejects a target whose current length differs from the loaded source, preventing stale incremental offsets from being appended to an externally changed file
Version 3.241.0
Added
- Added
GetLastOutlineandGetLastChildOutlinefor direct access to the tail of a bookmark list - Added
GetOutlineChildCountandGetOutlineSiblingIndexfor lightweight bookmark tree inspection without allocating a full tree snapshot
Version 3.240.0
Added
- Added
SaveAllAttachmentsExwith overwrite, skip and automatic rename conflict policies plus a per-attachment naming callback - Attachment exports now reduce requested names to safe leaf names and protect Windows reserved device names
Fixed
- Fixed
SaveAllAttachmentsreturning without writing files because its attachment snapshot was counted but not allocated and populated
Version 3.239.0
Added
- Added
OnPageMouseDown,OnPageMouseMoveandOnPageMouseUpso Viewer hosts receive one-based page numbers and top-down PDF point coordinates independent of zoom, scrolling and view rotation - Added
RegionAtClientPoint,ActiveRegionandOnActiveRegionChangeto distinguish links, non-link annotations and form fields as the pointer enters or leaves them - Added
CreatePDFlibViewerDefaultPopupMenuandInstallPDFlibViewerDefaultPopupMenu, which compose the existing Viewer action classes into a ready context menu for copy, zoom, fit, rotate, navigation, save and print
Version 3.238.0
Added
- Added
OnOperationProgresswith typed operation kind, lifecycle phase, current and total units, percentage and detail text while preserving the classicOnProgresspercentage callback - Load, save, search, merge and page-render file, stream and string entry points now report starting and terminal phases; operations with intermediate progress also report
opRunning - Setting
CancelduringopStartingoropRunningactivates the existingAbortstate, providing one cancellation path for old and new callers
Fixed
LoadFromFilenow preserves error code 404 for a wrong password instead of overwriting it with the generic load error 401 after cleanup
Version 3.237.0
Added
- Added
SearchTextEachandTPDFlibSearchHitEventto emit every text hit immediately without allocating or sizing a result array SearchTextandSearchTextEachnow report page progress throughOnProgressand honour bothAbortand callback cancellation; callback cancellation uses the existing abort state untilResetAbort- The Viewer search panel and search-highlight layer now consume the streaming API in one pass, removing their former 256-row and 512-highlight limits
Fixed
- Whole-word search now continues past an earlier substring occurrence in the same text block to find a later correctly bounded match
Version 3.236.0
Added
- Added
GetPrinterCapabilitiesto capture a live printer-driver snapshot without starting a print job - The typed
TPDFlibPrinterCapabilitiesresult includes paper IDs, names and millimetre dimensions, input-bin IDs and names, duplex, colour, landscape and collation support, the printer port and the maximum driver-reported copy count - Drivers that omit paper or bin metadata still return the remaining capabilities with empty arrays, while invalid printer names return a fully cleared snapshot
Version 3.235.0
Added
- Added
SendDocumentByMailfor saving the loaded document to a temporary PDF and delivering it as an SMTP attachment through the built-in Windows CDO provider - Added the reference-counted
IPDFlibMailProviderextension point so applications can supply another transport, support non-Windows hosts and test mail workflows without network access - Each send uses an isolated temporary directory, sanitises the attachment display name and removes both the PDF and its directory after the provider returns;
GetLastMailErrorreports validation, save, transport and platform failures
Version 3.234.0
Added
- Added variable placeholders to stamp, header and footer text:
<%PageNo%>,<%TotalPages%>,<%ShortDate%>,<%LongDate%>,<%ShortTime%>and<%LongTime%>expand per page alongside the classic &-tokens - Any custom
<%name%>placeholder resolves through the newOnCalcVariableevent, which receives the name and the page number and supplies the replacement - running numbers, batch codes and client fields stamp without pre-processing the text; without a handler unknown placeholders stay verbatim
Version 3.233.0
Added
- Added superscript/subscript detection to text extraction: the new
GetTextBlockVAlignreports each extracted text block's baseline classification (0 = baseline, 1 = superscript, 2 = subscript) relative to its visual line, so chemical formulas, exponents and footnote markers can be recognised - A block classifies as super-/subscript when it is markedly smaller than the line's dominant text and its vertical centre sits above/below the dominant centre within one text height
Version 3.232.0
Added
- Added character-level word splitting to text extraction:
SetTextExtractionOptions(17, 1)re-splits show-text runs that carry no space characters into words wherever a per-character advance step is much wider than the run's median glyph advance - documents that paint whole lines as a single operator with kerning gaps standing in for spaces now extract as separate words inGetPageTextmodes 7 and 9-11 - The advance arrays stay aligned with the widened text, so block quads and per-character width outputs remain consistent
Version 3.231.0
Added
- Added layout-preserving fixed-grid text export:
GetPageText(11)maps the page geometry onto a monospace character grid - rows cluster by baseline, every block lands at its column computed from the average character width, and shorter cells pad with real spaces - so tables and forms keep their visual alignment in plain-text viewers, terminals and diffs without relying on tab stops - The reference page for
GetPageTextnow documents the reading-order (9), tab-separated table (10) and fixed-grid (11) modes
Version 3.230.0
Added
- Added dehyphenation to text extraction:
SetTextExtractionOptions(16, 1)re-joins words hyphenated across line breaks ("inter-" at a line end followed by "national" becomes "international") in the line-oriented outputs ofGetPageTextmodes 7 and 9 - The heuristic only merges when a letter precedes the hyphen and a lowercase letter starts the next line, so numeric ranges, proper nouns and sentence-initial capitals keep their hyphens
Version 3.229.0
Added
- Added the
OnBeforeSnapshotevent to theTPDFlibViewercontrol: it fires before a snapshot drag is captured with the dragged region, and setting Handled cancels the default clipboard capture so applications can process the region themselves - Exposed
PrefetchEnabled: the background pre-render worker can now be switched off and on at run time (the worker stops immediately and restarts on the open document) - Exposed
DiskCacheMaxDocuments: the number of documents the cross-session disk page cache keeps before pruning is now tunable (default 10)
Version 3.228.0
Added
- Added precise navigation to the
TPDFlibViewercontrol:GoToPagePointjumps to a page and scrolls a given page point to the top-left of the viewport, so link destinations and search hits land exactly in view - Added programmatic scroll control:
ScrollBypixel stepping, read/writeHScrollPos/VScrollPosproperties (ideal for synchronising two side-by-side viewers over the same document), andGetScrollPosForPagereporting each page's scroll anchor in continuous mode - Added public coordinate bridges
ClientPointToPageandPageRectToClientRectconverting between client pixels and page user space through zoom, rotation and scroll; the internal hit-testing now shares the exact geometry of the paint path and also works on unparented (headless) controls
Version 3.227.0
Added
- Added view-state events to the
TPDFlibViewercontrol:OnZoomChangefires on every effective-zoom move (explicit zoom, preset steps, fit-mode recomputation on resize, rotation or DPI change) andOnHScroll/OnVScrollfollow the scroll position, so toolbars and status displays stay in sync without polling - Dragging the vertical scrollbar thumb now shows a floating "Page N / M" bubble that previews the page the view will land on - a big help in long documents; the
ScrollHintEnabledproperty (on by default) turns it off
Version 3.226.0
Added
- Completed the fill-and-save loop in the
TPDFlibViewercontrol:SaveToFileandSaveToStreamwrite the displayed document - committed form edits included - back to disk or a stream (any open in-place editor commits first) - Multiline text fields now edit in a proper multi-line memo: Enter inserts a line break, Ctrl+Enter commits, Escape cancels; single-line fields keep the plain Enter-commits behaviour
- Tab and Shift+Tab cycle the in-place editor through the document's editable text and choice fields, following each field's page;
FocusNextFormFieldexposes the same navigation programmatically
Version 3.225.0
Added
- Added preset-ladder zooming to the
TPDFlibViewercontrol:ZoomInStepandZoomOutStepsnap the zoom to the standard preset sequence (1, 5, 10, 25, 50, 75, 100, 150, 200, 400, 800, 1600, 2400, 3200 percent), starting from the zoom currently in effect so fit modes step naturally; the toolbar zoom actions now use the same ladder - Ctrl+mouse wheel now zooms along the preset ladder while a plain wheel keeps scrolling
- Added keyboard shortcuts: Ctrl+'+'/'-' step the zoom, Ctrl+1/2/3 switch to actual size, fit width and fit page, and Shift+Up/Down jump to the first and last page
Version 3.224.0
Added
- Added
CreateSelfSignedCertificatewith Delphi, DLL and ActiveX entry points: generates a self-signed RSA certificate (SHA-256 signature, configurable subject, validity and key length) and exports it with its private key to a password-protected PFX file, ready forSignFileand the sign-process APIs - so signing workflows can be built and tested without an external certificate authority - The certificate is created in a throwaway key container that is deleted after the export; only the PFX keeps the key material. Self-signed certificates are meant for testing and internal documents - viewers flag them as untrusted unless installed explicitly
Version 3.223.0
Added
- Added
TPDFlibShapeWatermarkto the composable watermark layer: rectangles, circles, ellipses, polygons, Bezier curve chains and straight lines stamp onto a page range with fill and stroke colours, line width and opacity, through the sameApplyWatermarkentry point as text and image watermarks - Rectangle, circle and ellipse shapes size themselves from Width/Height; polygon, curve and line shapes take their geometry from
SetPoints(local X,Y pairs), so the nine-point Position grid and custom placement apply to every shape kind; degenerate geometry (too few points) is rejected
Version 3.222.0
Added
- Added
AddLinkToEmbeddedPDFwith Delphi, DLL and ActiveX entry points: a page hotspot that opens a PDF embedded in the current document (by its EmbeddedFiles name) and jumps to a chosen page there, using the standard embedded go-to (/GoToE) action of ISO 32000-1 §12.6.4.4 with an optional new-window request; the document version rises to PDF 1.6 automatically GetAnnotActionInfoand its outline/form-field siblings now recognise embedded go-to actions, reporting the newakGoToEkind together with the embedded target name, the parent/child target relationship, the optional file specification and the /NewWindow flag
Version 3.221.0
Added
- Added
SetSignProcessAppearanceTextwith Delphi, DLL and ActiveX entry points: digital signatures can now show an automatically generated visible text appearance composed of the signer name, reason, location and signing date, with optional descriptive labels ("Signed by:", "Reason:", ...) selected through a bit mask - The text block lays out inside the signature field rectangle in Helvetica with a configurable colour; font size 0 auto-fits the lines to the field. A field image set through
SetSignProcessFieldImageFromFilekeeps precedence, and document time-stamp processes ignore the text appearance
Version 3.220.0
Added
- Added interactive form filling to the
TPDFlibViewercontrol: clicking a checkbox or radio button toggles it, and clicking a text or choice field opens an in-place editor over the field (Enter commits, Escape cancels, leaving the editor commits); read-only fields are left alone and the changed page re-renders automatically - Every write fires the new
OnFormFieldValueChangedevent, andHighlightFormFieldswithFormHighlightColorpaints a translucent backdrop over each fillable area so users can spot form fields - Added the programmatic counterparts
FormFieldAtPagePoint,GetFormFieldPageRect,ToggleCheckBoxField,SetFormFieldValueAndRefresh,BeginEditFormFieldandCommitInplaceEditor, driving the same machinery without mouse input
Version 3.219.0
Added
- Added annotation interaction to the
TPDFlibViewercontrol: clicking a non-link annotation fires the newOnAnnotClickevent with the page, annotation index and subtype, andAnnotAtPagePointexposes the hit test programmatically (Popup companions are skipped) - Hovering an annotation now shows its Contents text as the control's hint (the
AnnotHintsswitch, on by default, works with the standardShowHintproperty) - Added
SaveAnnotAttachmentToFileto write a FileAttachment annotation's embedded file to disk, completing click-to-save attachment workflows in the viewer
Version 3.218.0
Added
- Added a cross-session disk page cache to the
TPDFlibViewercontrol: settingDiskCacheFolderpersists rendered pages on disk so a recently viewed document reopens instantly without re-rendering - Cached pages are keyed by a fingerprint of the document's path, size and last write time, so editing the file automatically invalidates its stale pages; the cache keeps up to ten documents and prunes the least recently used ones
- Added the
DiskCacheHitscounter reporting how many page renderings the disk cache saved
Version 3.217.0
Added
- Added the
PDFlibViewerActionsunit with twenty ready-madeTActiondescendants forTPDFlibViewer, so toolbars and menus work without glue code: page navigation (First/Prior/Next/Last), zoom (In/Out/FitWidth/FitPage/ActualSize), view rotation (clockwise/anticlockwise), printing, file open and save-as dialogs, copy selected text, and the five mouse-tool mode switches - Each action targets a viewer through its
Viewerproperty and keeps its enabled state (document open, page position, selection present) and checked state (active zoom fit or mouse tool) up to date automatically; all actions register in the losLab PDF category for the Action List editor - Added
TPDFlibViewer.EffectiveZoomPercentreporting the zoom actually in effect (including computed fit-width/fit-page factors) so zoom steps can build on it
Version 3.216.0
Added
- Added search-hit highlighting to the
TPDFlibViewercontrol:HighlightSearchHitssearches the whole document and paints a translucent bar over every match that stays in place while scrolling, zooming and rotating, withClearSearchHighlights,SearchHighlightCountand a configurableSearchHighlightColor TPDFlibSearchPanel.RunSearchnow also paints the hit bars in the attached viewer (the newHighlightInViewproperty, on by default, turns this off), so search results are visible on the pages, not just in the hit list
Version 3.215.0
Added
- Added mouse tool modes to the
TPDFlibViewercontrol through the newViewerModeproperty:vmSelecttext selection (default),vmHandpan-by-dragging with a grab cursor (a plain click still follows links),vmZoommarquee zoom that magnifies the dragged band to fill the viewport,vmSnapshotregion capture to the clipboard, andvmHighlightpersistent translucent region highlighting - Added
CaptureRegionto render any client region (pages plus highlights) into a caller-owned bitmap, theOnSnapshotevent andSnapshotToClipboardswitch for snapshot handling, andAddHighlightRegion/ClearHighlightRegions/HighlightRegionCountwith a configurableHighlightColorfor page-anchored highlights that survive zoom, rotation and navigation
Version 3.214.0
Added
- Added printing to the
TPDFlibViewercontrol:PrintDocshows the standard Windows print dialog (printer choice, page range, copies, collation) and hands the job to the library's printing engine, whilePrintDoc(False)prints the whole document to the default printer without any UI - Added
PrintDocRangefor fully programmatic viewer printing with an explicit printer name, page range, copy count and collation flag
Version 3.213.0
Added
- Added view rotation to the
TPDFlibViewercontrol:RotateClockwise90andRotateAntiClockwise90turn the displayed pages in 90-degree steps, and theViewRotationproperty reads or sets the angle directly (0, 90, 180 or 270) - Rotation is a pure view attribute: the document is never modified, link clicking and text selection keep working at every angle, fit-width and fit-page zoom modes adapt to the rotated page shape, and opening a new document resets the view to 0 degrees
- Rotated page bitmaps are cached per angle, so switching between angles reuses previous renderings instead of re-rendering
Version 3.212.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept simple FormCalc-style predicate selectors such as$data.Receipt.Detail.[Total_Price > 200].Descriptionand update every matching data node when a predicate selects a subset
Version 3.211.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept Data DOM class selectors#dataGroupand#dataValuewith numeric or wildcard occurrences, allowing class-based paths such as$data.Receipt.#dataGroup[0].#dataValue[0]
Version 3.210.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept the$recordroot in non-record-processing packets, so paths such as$record.Taxand$record/Detail[0]/Total_Priceresolve from the outer data record element
Version 3.209.0
Changed
- Improved XFDF annotation interchange: annotation exports now write standard border style attributes
width,style, anddashesfrom PDF annotation/BSvalues, and annotation imports restore those attributes on inserted annotations
Version 3.208.0
Changed
- Improved XFDF annotation interchange: annotation exports now write standard
creationdateandopacityattributes from PDF annotation/CreationDateand/CAvalues, and annotation imports restore those attributes on inserted annotations
Version 3.207.0
Changed
- Improved XFDF annotation interchange: annotation exports now write standard
flagsnames from PDF annotation/Fvalues, and annotation imports restore those names to the inserted annotation flags
Version 3.206.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept direct child wildcard selectors such as$data.Receipt.*.Total_Priceto read or update matching child branches without selecting same-name fields on the parent node
Version 3.205.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept descendant selectors such as$data..Total_Priceand$data.Receipt..Total_Priceto read or update the first matching descendant data node
Version 3.204.0
Changed
- Improved XFA datasets SOM path compatibility:
GetXFAFormFieldValueandSetXFAFormFieldValuenow accept theparentproperty in paths such as$data.Receipt.Detail[1].parent.Taxto read or update a selected node's parent sibling data
Version 3.203.0
Changed
- Improved XFA datasets SOM occurrence handling:
GetXFAFormFieldValueandSetXFAFormFieldValuenow support[*]selectors such as$data.Receipt.Detail[*].Total_Priceto read or update every matching repeated data node
Version 3.202.0
Changed
- Improved XFA SOM path compatibility: XFA datasets and template field APIs now preserve literal periods in slash-delimited field paths and accept escaped periods such as
Line\.Itemin dot-delimited SOM paths
Version 3.201.0
Changed
- Improved XFA datasets path compatibility: XFA field value APIs now accept slash-delimited paths after standard data SOM roots such as
$data/...,xfa.datasets.data/..., andxfa.datasets/...
Version 3.200.0
Changed
- Improved XFA datasets SOM compatibility: XFA field value APIs now accept the standard
!data...short form, including slash-delimited!data/...paths
Version 3.199.0
Changed
- Improved XFA template path compatibility: template editing APIs now accept slash-delimited field paths returned by XFA field-name enumeration, including
$template/...paths
Version 3.198.0
Changed
- Improved XFA datasets namespace compatibility: field value APIs now read and update data nodes by local XML name when the business data inside the datasets packet uses its own namespace prefix, and field-name enumeration returns prefix-free paths
Version 3.197.0
Changed
- Improved XFDF annotation interchange: annotation exports now include the common
nameanddateattributes from PDF/NMand/M, annotation imports restore those values on inserted annotations, andSetAnnotStrPropertynow accepts tag 104 for annotation modified dates
Version 3.196.0
Changed
- Improved XFA field-name enumeration: field list APIs now scan every top-level data record in the datasets packet and return leaf data fields without adding container groups as fields
Version 3.195.0
Changed
- Improved XFA datasets compatibility: XFA field value APIs now read and update complete XDP packets whose datasets packet uses an unprefixed
dataelement
Version 3.194.0
Fixed
- Improved XFA template field updates: XFA template field APIs now accept standard template SOM roots such as
$templateandxfa.template, and template-only changes in complete XDP streams are saved correctly
Version 3.193.0
Changed
- Improved XFA field addressing: XFA field value APIs now accept standard data SOM roots such as
$dataandxfa.datasets.datain addition to relative field paths
Version 3.192.0
Changed
- Improved XFA XML packet handling: XFA streams with UTF-16 byte order marks or UTF-16 XML byte patterns now decode before XML parsing, so UTF-16 encoded form values remain available through XFA field read/write APIs
Version 3.191.0
Changed
- Improved XFA packet authoring:
SetXFAFromStringnow creates the requiredAcroFormcontainer when a document does not already have form data, replaces stale parsed XFA state when a complete XFA packet is stored, and keeps the saved packet available through XFA field read/write APIs
Version 3.190.0
Changed
- Improved XFDF annotation interchange: annotation exports now write the common
colorattribute from the PDF/CRGB array, and annotation imports now restorecolor="#RRGGBB"values into the inserted annotation color array
Version 3.189.0
Added
- Added XFDF annotation interchange APIs:
ExportAnnotationsToXFDF,ExportAnnotationsToXFDFString,ImportAnnotationsFromXFDFandImportAnnotationsFromXFDFStringnow read and write ISO 19444<annots>data for text-style annotation comments, including page, rectangle, title, subject and plain contents data
Version 3.188.0
Changed
- Improved XFDF rich text field import: fields with
<value-richtext>now preserve the rich text XML in the fieldRVvalue while still applying the plain<value>fallback when present
Version 3.187.0
Changed
- Improved XFDF form-data interchange for multi-select choice fields: repeated
<value>elements now import into the selected-value array, and exporting a multi-select choice field now writes one<value>element per selected item instead of flattening them into one escaped text node
Version 3.186.0
Changed
- Improved XFDF form-data export for rich text fields: fields with an
RVrich text value now include a<value-richtext>element while preserving the plain<value>fallback
Version 3.185.0
Changed
- Improved XFDF form-data import for rich text fields: when a field provides
<value-richtext>without a plain<value>, the importer now extracts the XHTML text content and applies it to the matching AcroForm field instead of skipping the field
Version 3.184.0
Changed
- Improved XFDF form-data interchange: exports now use the standard XFDF namespace with
xml:space="preserve", emit nested<field>elements for hierarchical AcroForm names, skip non-terminal parent field values, write file exports as UTF-8, and import whitespace-flexible XFDF with nested fields, single-quoted attributes, CDATA, XML entities, and numeric character references
Version 3.183.0
Added
- Added
SanitizeDocument(Flags)which strips sensitive content in one call: removes all global JavaScript, removes the catalog OpenAction, strips /A actions from every annotation, blanks Author/Subject/Keywords/Creator/Producer metadata (both /Info and XMP), and optionally deletes all annotations. Flag bitsSANITIZE_JAVASCRIPT/SANITIZE_ACTIONS/SANITIZE_METADATA/SANITIZE_ANNOTATIONS/SANITIZE_OPEN_ACTIONcombine;SANITIZE_ALLapplies every strip. Closes the classic data-leak hole where redaction removes visible content but leaves metadata or hidden scripts recoverable - Added
TPDFAnnots.RemoveAnnotAction(Index)to strip the /A action dictionary from an individual annotation (used by SanitizeDocument, also useful standalone)
Version 3.182.0
Added
- Image elements returned by
EnumPageElementsnow carry their real placement rectangle (Left/Top/Right/Bottom) instead of zeros. Backed by a newTPDFContentProgram.EnumImagePlacementsmethod that walks the content stream tracking the CTM (cm/q/Q) and maps eachDooperator's 1x1 unit square into page coordinates - Added four showcase demos: DocumentProperties (DocInfo/page-box/rotation/transition/viewer-preferences/XMP round-trip), FormProperties (per-field property grid: type/value/readonly/MaxLength/MultiLine/description), SignatureValidator (enumerate signature fields + verify + signer certificate), Reader (VCL TPDFlibViewer with open/navigate/zoom/copy-text)
Version 3.181.0
Added
- Added
SetXMPPropertyexposing the existing schema-aware XMP engine (PDFlibXMP) through the public facade: set any Dublin Core (dc:), XMP Basic (xmp:), Adobe PDF (pdf:), PDF/A ID (pdfaid:), PDF/UA ID (pdfuaid:), or XMP Media Management (xmpMM:) property by namespace + key without hand-writing RDF XML - Added
ImportFormDataFromFDF/ImportFormDataFromFDFStringwhich parse an FDF /Fields array (each<< /T (name) /V (value) >>) and apply each value to the matching AcroForm field by title, inverting the EscapePDFText octal/paren escaping. Closes the asymmetric export-only gap - Added
ExportFormDataToXFDF/ExportFormDataToXFDFString/ImportFormDataFromXFDF/ImportFormDataFromXFDFStringfor XFDF (XML Forms Data Format) bidirectional interchange - the modern XML counterpart of FDF - Made the six namespace-scoped XMP setters (
SetDublinCore,SetXMPBasic,SetAdobePDF,SetPDFA,SetPDFUA,SetXMPMM) public onTPDFlibXMPso advanced callers can drive the engine directly
Version 3.180.0
Added
- Added
SearchAndReplaceTextInContentwhich performs TRUE content-stream text replacement (rewriting the Tj/TJ/'/" show-text operators in place viaTPDFContentProgram.ReplaceTextRun), unlike the existing mask-basedSearchAndReplaceTextthat only overlays a rectangle on top of the original glyphs. The original text is gone from the stream and cannot be recovered. Locates hits viaSearchText, maps each hit rect to its covering instruction viaFindInstructionsInRect, rewrites, and writes the layer back
Version 3.179.0
Added
- Added a structured internal logger (
TPDFlibLogger) in a newLib/PDFlibLogger.pasunit with four levels (Debug/Info/Warn/Error), a host callback (OnLog), an optional thread-safe file sink, and an error-code-to-message map (PDFlibErrorMessage) that finally gives the existing numeric codes (1xx/3xx/4xx/5xx) human text. Exposed onTPDFlibvia theLoggerproperty - Added
RenderPagesToFilesParallelwhich renders a page range to one file per page using aTTaskpool with oneTPDFlibinstance per worker (TPDFlib is not thread-safe) and per-threadCoInitializefor GDI+ apartment safety. Scales near-linearly with CPU cores for CPU-bound raster output
Version 3.178.0
Added
- Added
EnumCertificatesto enumerate every certificate in a Windows system store ("MY", "Root", ...) returning subject, issuer, serial number, validity window, HasPrivateKey, and Qualified (eIDAS QCStatements extension, OID 0.4.0.1862.1.7, detected via a new built-in DER decoder in PDFlibASN1) - replaces the previous single-cert-by-CNSetSignProcessCertFromStorelimitation - Added
SetSignProcessCertFromStoreByHandleto select a signing certificate by raw PCCERT_CONTEXT handle obtained from enumeration, letting callers pick by any criterion (qualified filter, validity, fingerprint) rather than only by Subject CN - Added
RedactRegionwhich truly removes text, vector paths, and image XObjects whose painted area intersects a rectangle (editing the content stream so removed content cannot be recovered, unlikeMaskRectwhich only covers it), with optional black fill and /Redact annotation. Backed by a CTM-tracking content-stream analyser in PDFlibContentModel (FindInstructionsInRect) - Added minimal DER decoder functions (
DERDecodeLength,DERFindExtensionByOID) to PDFlibASN1 for in-process certificate extension inspection without CryptDecodeObjectEx
Version 3.177.0
Added
- Added page stitching APIs that compose existing pages into new layouts via vector Form XObject capture (preserving full vector fidelity, unlike content-stream concatenation):
StitchPageOverlayoverlays one page onto another at a position with optional opacity,StitchPagesSideBySideplaces two pages left/right on a new wider page, andStitchPagesVerticallystacks a page range into a new tall poster-style page - Added a composable watermark template layer in a new
Lib/PDFlibWatermark.pasunit:TPDFlibWatermarkBasewith nine-point positioning (wpTopLeft..wpBottomRightpluswpCustom),TPDFlibTextWatermark,TPDFlibImageWatermark, andTPDFlibCompositeWatermarkwhich applies a list of sub-watermarks recursively across a shared page range - Added
TPDFlib.ApplyWatermarkas a convenience entry point that delegates to a watermark template's own page range and settings
Version 3.176.0
Added
- Added named render-output format constants (
PDF_RENDER_BMP,PDF_RENDER_EMF,PDF_RENDER_EMFPLUS,PDF_RENDER_EMF_DUAL, etc.) that map 1:1 to the integerOptionsvalues accepted byRenderPageToFile,RenderPageToStream,RenderPagesToFiles, andRenderDocumentToFile - Added
TPDFlibMetafileFormatenum and the convenience methodsRenderPageToMetafileStreamandRenderPageToMetafileFile, which accept a named metafile variant (mfEMF, mfEMFPlus, mfEMFDual, mfWMF) instead of a bare integer - Added EMF+ Dual output mode (Options value 11 / mfEMFDual), which records both GDI and GDI+ commands in the same metafile for compatibility with older GDI-only consumers
- Added
TPDFlibClipboardFormatenum andRenderPageToClipboard, which places a rendered page on the Windows clipboard as an enhanced metafile (CF_ENHMETAFILE), a DIB bitmap (CF_DIB), the page Unicode text (CF_UNICODETEXT), or all three at once - Added a new
Lib/PDFlibClipboard.pasunit with low-level Win32 clipboard placement helpers used byRenderPageToClipboard - Added full per-monitor DPI awareness to
TPDFlibViewer: a new publicScreenDPIproperty, aCreateWndoverride that auto-detects the host monitor DPI viaGetDpiForWindow(with aGetDeviceCapsfallback), and aWM_DPICHANGEDhandler that rebuilds the layout and clears the bitmap cache when the window moves between monitors - Added
TPDFRenderer.SetEMFPlusMetafileTypeto select between EMF+ Only and EMF+ Dual recording at the renderer level
Fixed
- Fixed the
RenderPageToFilereference page where the Options value list was misplaced in the Page row and the Options cell was empty
Version 3.175.3
Added
- Added a Lib/PDFlibTableExport.pas unit that renders any TDataSet (FireDAC, ClientDataSet, query result) into a paginated PDF table with styled header, zebra striping, right-aligned numeric columns, and automatic page continuation, plus a Demo/Delphi/DataSetExport console demo that loads the RAD Studio customer.FDS sample via FireDAC and exports it
Version 3.175.2
Added
- Added end-to-end Demo/ReportBridges projects that build a minimal report in FastReport, QuickReport, and ReportBuilder and export it to PDF through the matching Addons bridge, with a dedicated build-ReportBridges.cmd that supplies the engine source paths and gating symbols so the standard demo build still compiles the projects as stubs
Version 3.175.1
Added
- Added a Delphi JBIG2 options matrix demo that sweeps SymbolExtract, SkipBlackDots, BlackDotSize, and LossyLevel combinations against CCITT G4 and Flate baselines, with per-row PDF, CSV, and summary outputs
- Added a Delphi Pattern showcase demo covering axial and radial RGB shaders, a Coons-patch mesh shader, and a custom tiling pattern applied as fill, stroke, and text colour
- Added a Delphi CCITT fax matrix demo comparing Group 3 1-D, Group 3 2-D, and Group 4 compression with BlackIs1 and Interpolate option bits, reporting each output size and the resulting /Filter name
- Added FastReport, QuickReport, and ReportBuilder export bridges under Addons that render a prepared report into a PDFlibPas PDF via the engine's native object, metafile, and DrawCommand surfaces respectively
Version 3.175.0
Changed
- Expanded the WorkflowGallery demo with an annotation variant matrix that records text highlight fills, markup styles, note icons, free text, caret, and stamp annotations in companion CSV and HTML reports
Version 3.174.0
Changed
- Expanded the C++Builder AdvancedWorkflowMatrix demo to map action navigation, PDF/A and AcroForm workflows, font diagnostics, streaming delivery, and the latest scan-compression helpers into the generated matrix reports
Version 3.173.0
Added
- Added the DeliveryWorkflowMatrix Delphi demo for streamed Web and CGI PDF output, page-thumbnail validation, and watermark delivery workflows using one generated PDF byte buffer
Version 3.172.0
Added
- Added outline tree convenience APIs for ordered sibling insertion, child creation, subtree deletion, and preorder outline enumeration with parent, sibling, level, destination page, open-state, and title details
Version 3.171.0
Added
- Added the FontDiagnosticsMatrix Delphi console demo for CJK and Unicode font paths, TrueType subset updates, installed-font probes, document font enumeration, and font diagnostics reports
Version 3.170.0
Added
- Added the CanvasMigrationMatrix Delphi console demo for Canvas DC migration, raw content and path entry points, Delphi color helpers, pattern-filled text, watermarking, page thumbnail workflows, and rendered validation previews
Version 3.169.0
Added
- Added dedicated LayerCompositionMatrix, TransparencyMaskMatrix, and ComplianceFormWorkflowMatrix Delphi console demos for optional-content print/export policy, Pattern/Form XObject composition, transparency mask comparison, PDF/A-1b success and failure examples, AcroForm action workflows, appearance rebuilds, and visible signature templates
Version 3.168.0
Added
- Added dedicated ImageCompressionMatrix and SecurityPermissionMatrix Delphi console demos with generated PDF, CSV, and HTML reports for image compression strategy selection, scan compression, JPEG render quality, and encrypted permission profile auditing
Version 3.167.0
Added
- Added named helper APIs for JBIG2 bitmap encoding, EMF import options, AcroForm event actions, and chained actions so callers can use explicit option switches instead of composing integer bitmasks manually
Version 3.166.0
Added
- Added a runnable C++Builder AdvancedWorkflowMatrix console demo with PDF, CSV, and HTML outputs that map advanced canvas migration, EMF import, image compression, AcroForm, signature, security, PDF/A, optional-content, pattern, and Form XObject workflows to C++Builder project entry points
Version 3.165.0
Added
- Added a Delphi action navigation matrix demo that demonstrates open-document actions, document-level JavaScript, embedded-file links, remote GoTo links, AcroForm event actions, Submit/Reset/Hide link helpers, and chained Next actions with PDF, CSV, and HTML outputs
Fixed
- Fixed remote file link helpers so AddLinkToFile, AddLinkToFileEx, AddLinkToFileDest, and local file launch links create one annotation and return instead of looping indefinitely
Version 3.164.0
Added
- Ajout d'une démo de matrice de garde PDF/A pour Delphi qui vérifie les rejets précoces ou les décisions d'autorisation de chemin lors de la configuration du mode PDF/A, de la transparence, des modes de fusion, du chiffrement, de JavaScript, du multimédia, des fichiers incorporés et des workflows de fichiers associés PDF/A-3, avec des rapports PDF, CSV et HTML générés
Version 3.163.0
Added
- Ajout d'une matrice de liaison ReportAdapter explicite pour FastReport, QuickReport, ReportBuilder, DBGrid et les chemins d'export de canevas personnalisés, avec une sortie de cartographie CSV et HTML générée ainsi qu'une page PDF montrant la stratégie d'adaptateur réutilisable
Version 3.162.0
Added
- Ajout d'une matrice de démos de workflow avancé qui génère des sorties concrètes pour la migration de canevas, les options d'import EMF, les comparaisons de compression d'images, les workflows d'actions AcroForm, les signatures vides visibles, les permissions de sécurité, les vérifications PDF/A-1b, le contenu optionnel, les motifs de tuilage, les Form XObjects, l'export de tableaux de type DBGrid et le rapport de mémoire maximale pour les gros fichiers
Version 3.161.0
Added
- Ajout d'aides Delphi pour la construction compacte d'actions d'ouverture de document, les actions d'événement de visibilité des champs de formulaire, les sélecteurs de couleurs TColor et gris, et l'injection directe de flux de contenu brut, de chemin, de texte et de matrice
Version 3.160.0
Added
- Ajout d'aides Delphi pour la compression d'images scannées bitmap vers JBIG2, la configuration en un seul appel des masques d'image et de la transparence par couleur clé, le chaînage d'actions GoTo, et des noms d'événements AcroForm lisibles pour JavaScript ou l'affectation d'actions existantes
- Étend
ImportEMFFromFileExetImportEMFFromStreamExafin que leurs indicateursOptionspuissent forcer l'import bitmap, activer la recompression JPEG des images couleur EMF et demander les contrôles de traitement GDI+
Version 3.159.1
Changed
- Amélioration de
SaveToStreamet de l'enregistrement des flux de sortie liés, afin que les gros objets de flux PDF soient écrits en blocs bornés au lieu de copier chaque objet de flux dans une chaîne de sortie intermédiaire
Version 3.159.0
Added
- Ajout d'aides de placement d'image qui dessinent ou ajustent une image spécifiée et libèrent immédiatement son handle, avec des points d'entrée Delphi, DLL et ActiveX pour réduire le pic mémoire dans les workflows de génération d'images à usage unique
- Ajout de
RenderPageToMonochromeFileExpour le rendu BMP 1 bit avec conversion par seuil et nettoyage isolé des pixels noirs avant les workflows de compression d'images scannées
Version 3.158.1
Added
- Ajout de démos de workflow Delphi pour l'export réutilisable de type rapport, l'import de texte enrichi RichEdit vers EMF, et des scénarios combinés de vignette de page, annotation, Form XObject, tableau, compression, JavaScript et sortie sur flux lié
Version 3.158.0
Added
- Ajout d'API de contrôle du chiffrement des métadonnées avec points d'entrée Delphi, DLL et ActiveX : SetEncryptMetadata peut écrire des PDF de sécurité Standard avec des flux de métadonnées XMP non chiffrés, tandis que GetEncryptMetadata indique l'état /EncryptMetadata en attente ou chargé
Version 3.157.0
Added
- Ajout d'API de dessin direct de motifs de tuilage avec points d'entrée Delphi, DLL et ActiveX : BeginTilingPattern crée une surface de dessin temporaire pour cellule de motif, EndTilingPattern l'enregistre comme motif réutilisable, et CancelTilingPattern abandonne la construction sans laisser derrière un motif nommé
Version 3.156.0
Added
- Ajout d'aides Delphi pour les flux de sortie liés :
BeginOutputToStream,EndOutputStream,CancelOutputStreametOutputStreamActivepermettent au code de streaming, web et export de rapports de lier unTStreamcible, de le terminer via l'écrivain en blocs existant, ou d'annuler la cible en attente sans en prendre la propriété
Version 3.155.0
Added
- Ajout de
Abort,AbortedetResetAbortpour les appelants Delphi, DLL et ActiveX, afin que les applications puissent marquer une instance comme annulée et empêcher le démarrage des opérations de sauvegarde ou d'ajout à la sortie tant que le drapeau n'est pas réinitialisé
Version 3.154.0
Added
- Ajout d'aides pour les vignettes de page concernant les options d'import d'image et les sources en mémoire, la recherche de groupes de contenu optionnel et les définisseurs d'état par nom de groupe, ainsi que
SetOpenActionNamedDestinationpour les sauts à l'ouverture de document via des destinations nommées
Fixed
GetDestNamerésout désormais les handles de tableaux de destination explicites, y compris les tableaux renvoyés par une action d'ouverture de document nommée
Version 3.153.0
Added
- Ajout d'API de commodité pour les actions de formulaire chaînées, les déclencheurs de champ Hide et ImportData, les états initiaux de groupe de contenu optionnel, les imports EMF facultatifs et les imports d'image transparents par couleur clé
Version 3.152.0
Added
- Ajout de la création automatique de liens URL pour le dessin de texte, d'aides d'import d'image CCITT Group 3/4, d'aides d'image JBIG2 directes, de wrappers d'import EMF étendus, d'aides de pièces jointes de masque d'image, de la création de champs de signature visibles et d'aides d'événements/actions de champ de formulaire pour les workflows JavaScript, SubmitForm et ResetForm
Version 3.151.0
Added
- Ajout de
DrawPie,DrawChord,DrawEllipticPieetDrawEllipticChordpour le dessin explicite d'arcs circulaires et elliptiques fermés avec les modes contour, remplissage ou contour et remplissage
Version 3.150.0
Added
- Ajout de
NewGraphicsStateetSetGraphicsStatepour que les appelants puissent créer des ressources ExtGState réutilisables pour des réglages combinés de transparence de remplissage, transparence de contour, largeur de ligne, bout de ligne, jonction de ligne et limite de miter
Version 3.149.1
Fixed
- Correction des identifiants de dispatch ActiveX dupliqués pour les méthodes Form XObject et limite de miter, afin que les appelants COM à liaison tardive résolvent chaque méthode sans ambiguïté
Version 3.149.0
Added
- Ajout de
SetMiterLimitpour contrôler les rapports de limite de miter du contour pour les chemins qui utilisent des jonctions en miter - Exposition de
BeginFormXObject,EndFormXObjectetCancelFormXObjectvia les API DLL et ActiveX
Version 3.148.0
Added
- Ajout d'API de génération réutilisable de Form XObject :
BeginFormXObject,EndFormXObjectetCancelFormXObjectpermettent aux appelants de dessiner un modèle réutilisable avec les appels de dessin de page normaux et de le placer à plusieurs reprises via les API de dessin de page capturée
Version 3.147.0
Added
- Ajout de
SetTextTilingPatternetSetLineTilingPatternpour que les motifs de tuilage de page capturée puissent être réutilisés pour le texte, le soulignement et les graphiques tracés sans dupliquer les commandes de dessin
Fixed
- Les couleurs de shader tracé et de motif de tuilage écrivent désormais l'opérateur de couleur de motif de tracé au lieu de mettre à jour l'état de couleur non tracée
Version 3.146.0
Added
- Ajout de
BeginOptionalContentetEndOptionalContentpour que les appelants puissent marquer uniquement les commandes de dessin suivantes avec un groupe de contenu optionnel sans réécrire le flux de contenu existant
Fixed
- Les opérateurs de contenu balisé de fermeture de portée sont désormais vidés immédiatement lorsque les portées de contenu optionnel, de PDF balisé ou d'artefact sont fermées à la fin d'un flux de contenu
Version 3.145.0
Added
- Ajout de
SetTransparencyExpour que les appelants puissent définir des valeurs distinctes de transparence de remplissage et de contour pour le texte et les graphiques dessinés ensuite tout en conservant le comportement existant de mise à niveau automatique PDF 1.4
Version 3.144.0
Added
- Ajout de
AddLinkToNamedDestinationpour qu'une zone interactive de page puisse sauter vers une destination nommée du même document sans résoudre la page cible au moment de la création du lien
Fixed
- Les lecteurs d'actions d'annotation renvoient désormais aucune action pour les pages sans annotations au lieu de déréférencer un cache d'annotations vide
Version 3.143.0
Added
- Ajout d'API de gestion des actions de champ de formulaire pour que les appelants puissent lier une action existante à un déclencheur de champ, inspecter l'action de déclencheur typée et supprimer les actions de champ principales ou supplémentaires
Fixed
FormFieldJavaScriptActionrejette désormais les documents PDF/A et les noms de déclencheur invalides au lieu d'écrire des dictionnaires d'action de champ non conformes
Version 3.142.0
Added
- Ajout d'API de chaînage d'actions pour permettre d'ajouter des actions suivantes URI, nommées et JavaScript à une annotation, un plan ou une action de champ de formulaire existante, et d'inspecter les actions chaînées via
GetActionNextCountetGetActionNextInfo
Version 3.141.0
Ajout
- Ajout de
AddLinkToSubmitFormetAddLinkToResetFormafin que les zones interactives de la page puissent soumettre ou réinitialiser les champs AcroForm via des actions PDF standards sans JavaScript
Version 3.140.0
Ajout
- Ajout de
AppendToStreamafin que les flux de travail de mise à jour incrémentielle puissent écrire directement dans un flux fourni par l'appelant au lieu de matérialiser d'abord la mise à jour sous forme deAnsiString
Modification
SaveToStreamsérialise désormais directement dans le flux cible, etAppendToString(1)ne renvoie plus que la section de mise à jour incrémentielle sans copier les octets sources d'origine dans un tampon temporaire
Version 3.139.0
Ajout
- Ajout de
GetAnnotReplyToetGetAnnotReplyTypeafin que les réponses d'annotation en fil de discussion puissent être inspectées via des accesseurs nommés en lecture au lieu de balises de propriétés d'annotation génériques
Version 3.138.0
Ajout
- Ajout de l'exemple Delphi
DocumentInspectionWorkbenchpour inspecter par lots des PDF avec des diagnostics combinés de polices, l'échantillonnage d'images, la découverte d'espaces colorimétriques, le temps de chargement et des rapports JSON, CSV et HTML
Version 3.137.0
Ajout
- Ajout de l'exemple Delphi
ImageDecodeBenchmarkpour mesurer la découverte d'images de page, les octets d'images décodées et la découverte d'espaces colorimétriques de page avec des rapports de minutage CSV et HTML
Version 3.136.0
Ajout
- Ajout de
GetDocumentFontDiagnosticsetTPDFlibFontDiagnosticspour résumer l'intégration, le sous-ensemblement, les polices Standard 14, CID, Type3 et les polices inconnues d'un document en un seul appel
Version 3.135.0
Ajout
TPDFlibSignatureVerifier.VerifySignerCertificateChainconstruit désormais la chaîne de certificats du signataire intégrée avec l'API Crypto de Windows et renvoievsValiduniquement lorsque la chaîne satisfait la politique de confiance de base de Windows, tandis que les certificats de signataire auto-signés ou par ailleurs non approuvés renvoientvsInvalidsans modifier le résultat de l'intégrité du contenu deVerifySignature
Version 3.134.0
Correction
TPDFlibSignatureVerifier.VerifySignaturevalide désormais les anciennes signaturesadbe.pkcs7.sha1, renvoyantvsValidlorsque l'empreinte signée correspond aux octets couverts par/ByteRangeetvsInvaliden cas de modification du contenu couvert
Version 3.133.0
Ajout
- Ajout de
RenderPagesToFilesetDARenderPagesToFilespour rendre des plages de pages arbitraires dans des fichiers de sortie numérotés tout en réutilisant la configuration du moteur de rendu sur les pages sélectionnées
Version 3.132.0
Ajout
- Ajout des tampons pratiques
AddPageHeaderetAddPageFooterqui placent du texte à une marge supérieure ou inférieure fixe sur chaque page d'une plage, avec un alignement à gauche/au centre/à droite et une expansion de jetons (&Ppage actuelle,&Nnombre total de pages,&Ddate,&Ttitre du document,&&esperluette littérale) StampTextetStampImageavecsoUnderlayplacent désormais réellement le contenu sous le contenu de la page existante en préfixant une nouvelle couche de contenu (auparavant, cela dessinait par-dessus commesoOverlay) ; soutenu par une nouvelle méthode d'arborescence de pagesPrependContentLayer
Version 3.131.0
Ajout
- Ajout de
ScalePage(ScaleX, ScaleY, Anchor)qui met à l'échelle le contenu de la page sélectionnée en enveloppant chaque couche de contenu dans un bloc d'état graphiqueq sx 0 0 sy tx ty cm ... Qet en redimensionnant la MediaBox et la CropBox ; l'ancre conserve l'origine en bas à gauche (0), centre le contenu (1) ou conserve le coin en haut à gauche (2) - Extension de
EnumPageElementsavec un nouveau type d'élémentekPath: chaque page signale désormais également ses tracés vectoriels avec une boîte de délimitation, un nombre de points, un indicateur de fermeture et un opérateur de peinture, extraits des flux de contenu via le modèle de contenu structuré
Version 3.130.0
Ajout
- Ajout de trois API d'optimisation de la taille des fichiers qui réduisent les documents chargés lors de leur sauvegarde :
SubsetEmbeddedFontsréécrit chaque programme de police TrueType intégré (FontFile2) pour ne conserver que les caractères Unicode que le document affiche réellement via le serviceCreateFontPackagede FontSub.dll ;DownsampleImages(MaxDPI, Quality, Filter)décode chaque image XObject au-dessus de la résolution cible, la rééchantillonne (boîte ou bilinéaire) et la réencode en JPEG ou PNG ;NormalizeLZWStreamsréécrit chaque flux encore filtré avec LZWDecode en FlateDecode via le décodeur LZW et l'encodeur Flate existants, en préservant les paramètres Predictor
Version 3.129.0
Ajout
- Ajout d'API de création d'ombrage par maillage pour les quatre types d'ombrage qui ne bénéficiaient auparavant que d'une prise en charge en lecture/analyse :
NewRGBFreeFormTriangleMesh(ShadingType 4, triangles Gouraud de forme libre),NewRGBLatticeTriangleMesh(ShadingType 5, Gouraud en forme de treillis),NewRGBCoonsPatchMesh(ShadingType 6, maillage de carreaux de Coons) etNewRGBTensorPatchMesh(ShadingType 7, maillage de carreaux de produits tensoriels) — chacune construit un motif d'ombrage par maillage nommé à partir d'une liste plate de sommets ou de carreaux avec une profondeur de bits de coordonnées/couleurs sélectionnable et une boîte de délimitation, pouvant être sélectionné avecSetFillShader/SetLineShader/SetTextShaderà l'instar des ombrages axiaux et radiaux existants
Version 3.128.0
Ajout
- Ajout d'une bande de miniatures pour la visionneuse :
TPDFlibThumbnailBaraffiche une miniature de chaque page, rendue paresseusement à mesure que les lignes défilent dans la vue, avec le numéro de page en dessous ; cliquer sur une miniature fait passer la visionneuse attachée à cette page — complétant la famille des contrôles de visionneuse (visionneuse, panneau de signets, panneau de recherche, miniatures)
Version 3.127.0
Ajout
- Ajout d'un panneau de recherche pour la visionneuse :
TPDFlibSearchPanel.RunSearcheffectue une recherche dans l'intégralité du document attaché et liste une ligne par résultat avec son numéro de page et le texte correspondant ; cliquer sur un résultat fait passer la visionneuse à cette page
Version 3.126.0
Ajout
- Ajout d'un panneau de signets pour la visionneuse :
TPDFlibOutlineViewerliste l'arborescence des signets du document avec indentation et fait passer la visionneuse attachée (viaAttachViewer) à la page de destination d'un signet lorsqu'il est cliqué ; il est construit sur une classe de base de panneau réutilisable que les futurs panneaux latéraux partageront
Version 3.125.0
Ajout
- Ajout de la sélection de texte au contrôle de visionneuse : faites glisser avec le bouton gauche de la souris pour sélectionner, appuyez sur Ctrl+C ou appelez
CopySelectedTextpour copier la sélection dans le presse-papiers ; le texte capturé est disponible via la propriétéSelectedText, ordonné de haut en bas avec des sauts de ligne entre les bandes - Ajout de
GetTextInRegion, qui renvoie directement le texte d'une zone rectangulaire de la page — la même recherche basée sur les blocs que celle utilisée par la sélection à la souris, disponible pour les interfaces de sélection personnalisées
Version 3.124.0
Ajout
- Le contrôle de visionneuse pré-rend désormais les pages voisines sur un thread d'arrière-plan, de sorte que faire défiler les pages en avant ou en arrière affiche la page suivante instantanément ; le processus de travail utilise sa propre instance de document et transmet les rendus terminés au cache sans bloquer l'interface utilisateur
- Ajout de l'interactivité des liens à la visionneuse : cliquer sur une annotation de lien déclenche
OnLinkClickavec le numéro de page et le même résumé d'action typée que produitGetAnnotActionInfo(adresse web, destination dans le document, action nommée, etc.) ;LinkActionAtPagePointexpose le test d'impact sous-jacent pour une manipulation personnalisée
Version 3.123.0
Ajout
- Le contrôle de visionneuse bénéficie désormais d'un défilement continu :
SetDisplayModebasculeTPDFlibViewerentre l'affichage d'une seule page et un défilement vertical continu à travers tout le document, avec seules les pages visibles dans la zone d'affichage qui sont rendues et la page courante qui suit la position de défilement (déclenchantOnPageChangeau fur et à mesure que les pages apparaissent) - Les pages rendues sont désormais conservées dans un cache de bitmaps des moins récemment utilisées, de sorte que le défilement dans les deux sens ne nécessite pas de nouveau rendu ; le budget mémoire est par défaut de 128 Mo et s'ajuste avec
SetCacheLimit, expulsant les pages les plus anciennes lorsque le budget se réduit ou se remplit - Ajout du défilement avec la molette de la souris et de la navigation au clavier à la visionneuse : Page précédente/Page suivante (sauts de page en mode page simple, sauts de zone d'affichage en mode continu), touches fléchées, touches Début et Fin
Version 3.122.0
Ajout
- Ajout d'un contrôle de visionneuse PDF interactive :
TPDFlibViewerest un contrôle de défilement VCL qui ouvre un document à partir d'un fichier ou s'attache à une instance existante deTPDFlib, affiche les pages via le moteur de rendu sélectionné (GDI+, Cairo ou PDFium), et offre une navigation entre les pages (GoToPage/NextPage/PrevPageavec un événementOnPageChange) et un contrôle du zoom — un pourcentage fixe, ajuster à la largeur ou ajuster à la page, recalculé automatiquement lorsque le contrôle est redimensionné ; les pages plus larges que la zone d'affichage défilent, les pages plus étroites se centrent - Ajout d'un paquet à la conception (
Package\PDFlibViewerPkg.dpk) qui enregistre le contrôle sur la page de la palette PDF losLab pour une utilisation par glisser-déposer dans l'EDI
Version 3.121.0
Ajout
- Façonnage automatique des scripts complexes dans
DrawText: le texte contenant de l'arabe, de l'hébreu, de l'indien ou d'autres caractères de scripts complexes est désormais détecté et façonné automatiquement — les formes contextuelles des lettres, les ligatures obligatoires et l'ordre de droite à gauche s'affichent correctement sans modification du code ; les 14 noms standards sont mappés sur leurs polices installées compatibles avec les métriques (Helvetica vers Arial, Times vers Times New Roman, Courier vers Courier New) etGetTextWidtheffectue les mesures via la même passe de façonnage pour que l'alignement reste cohérent ; le texte latin, cyrillique, grec et CJK conserve son chemin de dessin existant octet par octet - Ajout de
SetTextShapingpour activer ou désactiver le routage automatique (activé par défaut ; passez 0 pour restaurer le comportement exact d'avant le façonnage)
Version 3.120.0
Modification
- Les polices d'accompagnement de texte façonné sont désormais sous-ensemblées au moment de la sauvegarde aux seuls glyphes que le document affiche, ce qui réduit considérablement les fichiers de sortie (un programme de police complet de plus d'un mégaoctet est réduit aux glyphes utilisés) ; la police sous-ensemblée conserve sa numérotation de glyphes, porte un nom
BaseFontbalisé comme sous-ensemble et de vraies largeurs/Wpar glyphe, et gagne une table ToUnicode qui traduit chaque glyphe façonné vers ses caractères sources — ainsi, copier ou extraire la sortie deDrawShapedTextrenvoie la chaîne d'origine, y compris les deux lettres derrière une ligature lam-alef
Version 3.119.0
Ajout
- Ajout du dessin de texte de scripts complexes :
DrawShapedTextfaçonne les chaînes en arabe, en hébreu et dans d'autres scripts complexes avant de les dessiner — les formes contextuelles des lettres, les ligatures obligatoires telles que lam-alef et l'ordre de droite à gauche s'affichent toutes correctement — et écrit les glyphes façonnés via une police d'accompagnement de Type 0 (Identity-H) intégrant l'ensemble du programme de la police, de sorte que les formes n'ayant pas de code de caractère propre soient rendues de manière exacte ; une police d'accompagnement est créée par police de caractères et réutilisée entre les appels - Ajout de
GetShapedTextWidth, qui mesure le texte via la même passe de façonnage de sorte que le texte ligaturé est mesuré à sa vraie largeur de dessin — utilisez-le pour aligner à droite ou centrer les paragraphes façonnés
Version 3.118.0
Ajout
- Ajout de la base pour la mise en forme du texte des scripts complexes : une nouvelle liaison Uniscribe (usp10.dll) transforme l'arabe, l'hébreu et d'autres chaînes de scripts complexes en séries de glyphes correctement ordonnées et formées — formes arabes contextuelles, ligatures obligatoires telles que lam-alef et l'ordre de droite à gauche — signalant l'index de glyphe de la police de chaque glyphe, l'avance et le groupe de caractères source ; c'est le moteur de mise en forme sur lequel les versions ultérieures construisent le tracé de dessin, et il est chargé paresseusement de sorte que les plateformes sans Uniscribe conservent simplement le tracé par caractère existant
Version 3.117.0
Ajout
- Ajout de l'introspection du profil ICC :
GetOutputIntentICCInfoanalyse le profil ICC attaché à l'intention de sortie (OutputIntent) du document et signale sa version, la classe d'appareil, l'espace colorimétrique des données, l'espace de connexion du profil, l'intention de rendu et le nombre de composants — utile pour inspecter la condition d'impression des fichiers PDF/A et PDF/X ; la gestion de l'espace colorimétrique ICCBased du moteur de rendu déduit désormais également le nombre de composants de l'en-tête du profil lui-même lorsque l'espace colorimétrique d'un ombrage ne comporte ni/Alternateni/N
Version 3.116.0
Ajout
- Ajout d'un mode d'extraction de texte tenant compte des tableaux : l'option 10 de
GetPageTextregroupe les bords gauches des blocs de texte de la page en positions de colonnes globales et émet des lignes séparées par des tabulations, afin que les mises en page tabulaires soient extraites sous forme de TSV prêts à importer avec des cellules alignées verticalement restant alignées sur l'ensemble des lignes
Version 3.115.0
Ajout
- Ajout de l'imposition de pages :
ImposePagesNUpdispose chaque page du document sur de nouvelles feuilles dans une grille N pages par feuille (2 par feuille, 4 par feuille, 9 par feuille ou toute disposition Colonnes x Lignes) avec chaque page ajustée selon ses proportions et centrée dans sa cellule en tant que contenu vectoriel en direct, ou — avec l'option livret — produit des feuilles piquées à cheval dont le jumelage des pages se plie en un livret lorsqu'elles sont imprimées en recto verso et empilées
Version 3.114.0
Ajout
- Extension des lecteurs d'actions typées
GetAnnotActionInfoetGetOutlineActionInfoà quatre autres types d'actions — Masquer (avec le nombre de cibles masquées et le drapeau masquer/afficher), Soumettre le formulaire (URL de soumission et nombre de champs), Réinitialiser le formulaire (nombre de champs) et Importer des données (fichier source) — et pour exposer la charge utile du nom des actions nommées (par exemple,NextPage) ; les deux lecteurs partagent désormais un analyseur (parser), de sorte que les liens d'annotation et les signets signalent des informations identiques
Version 3.113.0
Ajout
- Ajout d'assistants de formatage des champs de formulaire :
SetFormFieldNumberFormat(nombre de décimales, style de séparateur, style négatif et emplacement de la devise),SetFormFieldPercentFormatetSetFormFieldDateFormat(chaînes d'images de date Acrobat telles quemm/jj/aaaa) écrivent chacun la paire de JavaScript de formatage standard Acrobat sur les actions supplémentaires du champ — un filtre de frappe plus un formateur d'affichage — afin que les visionneuses conformes valident la saisie et rendent les valeurs formatées sans code JavaScript écrit à la main
Version 3.112.0
Ajout
- Ajout de la création d'annotations de son :
AddSoundAnnotationFromFilelit un fichier WAV PCM non compressé (8 ou 16 bits, mono ou stéréo) et intègre ses échantillons derrière une annotation d'icône de haut-parleur en tant que flux/Sounddans l'encodage signé attendu par le mécanisme audio du PDF, achevant l'aller-retour avec les lecteursGetAnnotSoundToFile/GetAnnotSoundToStringexistants
Version 3.111.0
Ajout
- Ajout de réponses d'annotation en fil de discussion (ISO 32000-1 §12.5.6.3) :
AddAnnotationReplyajoute une réponse à toute annotation existante en tant qu'annotation de texte masquée dont le/IRTfait référence à la cible avec la relation de réponse/RT, de sorte qu'Acrobat et d'autres visionneuses la montrent en fil de discussion sous la cible dans le panneau de commentaires ; combinez avecAddAnnotationStateet l'échange de commentaires FDF pour des allers-retours complets de révision collaborative
Version 3.110.0
Ajout
- Ajout du rendu d'ombrage basé sur un maillage et sur une fonction, achevant la couverture des sept types d'ombrage PDF : maillages de triangles Gouraud de forme libre (type 4), maillages Gouraud en forme de treillis (type 5), maillages de carreaux de Coons (type 6) et maillages de carreaux de produits tensoriels (type 7) sont décodés à partir de leurs flux de données compactés en bits — y compris les indicateurs de carreaux à arêtes partagées, le mappage de valeurs
/Decodeet les rampes de/Functionde couleurs facultatives — et peints via les dégradés de maillage natifs du moteur Cairo ; les ombrages basés sur des fonctions (type 1) sont approximés en échantillonnant la fonction d'ombrage sur son domaine dans une fine grille de carreaux ; les espaces colorimétriques pris en charge couvrent DeviceRGB, DeviceGray, DeviceCMYK et les alternatives ICCBased (le moteur GDI+ n'a pas de primitive de dégradé de maillage et laisse les zones ombrées de maillage non peintes)
Version 3.109.0
Ajout
- L'édition au niveau du texte complète le cadre d'édition de contenu (phase 4) :
TPDFContentProgram.GetTextRunsénumère les instructions affichant du texte d'une page avec la ressource de police et la taille actives pour chacune (suivi de l'état de la police au travers de l'imbrication d'enregistrement/restauration), etReplaceTextRunéchange le texte affiché sur place — un véritable remplacement du flux de contenu qui conserve la position, la police et la couleur d'origine, contrairement aux approches basées sur la superposition qui masquent l'ancien texte et redessinent par-dessus
Version 3.108.0
Ajout
- Ajout d'un modèle objet pour la géométrie de la page au cadre d'édition de contenu (phase 3) :
TPDFContentProgram.LiftPathélève un objet de tracé (opérateurs de construction de déplacement/ligne/courbe/rectangle ainsi que les opérateurs d'écrêtage et de peinture qui le terminent) en unTPDFPathéditable de sous-tracés et de segments ;TPDFPath.Transformapplique une matrice affine à chaque point (déplace, met à l'échelle, fait pivoter ou incline les illustrations existantes) ;LowerPathréécrit la géométrie modifiée par-dessus les instructions d'origine, prête pourWritePageContentLayer
Version 3.107.0
Ajout
- Extension du cadre d'édition de contenu (phase 2) avec des commodités au niveau de l'instruction sur
TPDFContentProgram:InsertFromSourceanalyse un extrait de contenu et joint ses instructions à n'importe quelle position ;SetOperandréécrit un seul opérande à partir de la syntaxe source (renumérote une coordonnée, recolore un remplissage) ;OperandTextrelit un opérande ;InstructionGroup,FindNextOpetFindNextGroupnaviguent dans la liste d'instructions par opérateur ou par catégorie d'opérateur ISO 32000-1
Version 3.106.0
Ajout
- Ajout de la première phase du cadre d'édition de contenu structuré :
ParsePageContentLayerdécode une couche de contenu de page en unTPDFContentPrograméditable — une liste d'instructions, chacune avec un opérateur de contenu PDF (les 73 opérateurs du tableau 51 de la norme ISO 32000-1) avec ses objets d'opérande décodés — etWritePageContentLayersérialise le programme à nouveau dans la page, de sorte que les appelants peuvent analyser, inspecter, supprimer ou réorganiser les instructions de dessin et réécrire la page ;GetPageContentLayerCountsignale le nombre de couches de contenu, qui sont éditées indépendamment ; l'émetteur préserve le comportement (un aller-retour non modifié est rendu de manière identique au pixel), les opérateurs inconnus survivent inchangés et les images intégrées sont transportées textuellement
Version 3.105.0
Ajout
- Ajout d'un mode d'extraction de texte par ordre de lecture : l'option 9 de
GetPageTextrenvoie le texte de la page dans l'ordre de lecture visuel en utilisant une analyse des espaces récursive (découpage XY), de sorte que les mises en page à plusieurs colonnes sortent colonne par colonne — d'abord un titre sur toute la largeur, puis toute la colonne de gauche, puis la colonne de droite — au lieu d'entrelacer les colonnes ligne par ligne comme le font les classements géométriques haut puis gauche
Version 3.104.0
Ajout
- Ajout de l'introspection du certificat du signataire au vérificateur de signature :
GetSignerCertificatedécode la charge utile PKCS#7 du premier champ de signature et renvoie un résumé typé du certificat du signataire intégré — noms d'affichage du sujet et de l'émetteur, le numéro de série sous forme hexadécimale conventionnelle, la fenêtre de validité UTC (NotBefore/NotAfter) et un indicateur de commodité signalant si le certificat se trouve actuellement dans cette fenêtre ; le signataire est recherché parmi les certificats intégrés par émetteur et numéro de série
Version 3.103.0
Ajout
- Ajout de
NewRGBRadialShader, l'équivalent radial deNewRGBAxialShader: enregistre un dégradé radial à deux cercles nommé (ShadingType 3, ISO 32000-1 §8.7.4.5.3) mélangeant deux couleurs RVB, avec une extension de couleur facultative au-delà des cercles ; sélectionnez-le avec les fonctions existantesSetFillShader,SetLineShaderouSetTextShaderpour peindre des remplissages de type “lueur” circulaires, des traits et du texte
Version 3.102.0
Ajout
- Ajout du rendu de dégradé radial (ShadingType 3) (ISO 32000-1 §8.7.4.5.4) : le moteur de rendu de page peint désormais les ombrages radiaux à deux cercles utilisés par les opérateurs
shet les remplissages par motif d'ombrage, en plus des dégradés axiaux (ShadingType 2) précédemment pris en charge ; pris en charge par les moteurs raster GDI+ et Cairo avec des fonctions de couleur à arrêts multiples, les espaces colorimétriques DeviceRGB/DeviceCMYK/DeviceN/Separation/ICCBased et la gestion de/Extend
Version 3.101.0
Ajout
- Ajout d'effets de bordure en nuage (ISO 32000-1 §12.5.4) :
SetAnnotCloudyEffecttransforme la bordure d'une annotation de type Carré, Cercle, Polygone ou Texte libre en un “nuage de révision” composé de demi-cercles reliés en écrivant le dictionnaire d'effets de bordure/BE, l'intensité 1 ou 2 correspondant aux styles Nuageux d'Acrobat et 0 supprimant à nouveau l'effet ;GetAnnotCloudyEffectrelit le paramètre (0 = pas de nuage, sinon l'intensité 1..2)
Version 3.100.0
Ajout
- Ajout d'états de révision d'annotation (ISO 32000-1 §12.5.6.3) :
AddAnnotationStateenregistre un changement de statut de révision pour une annotation existante en ajoutant une annotation de texte masquée dont le/IRTpointe vers la cible et dont le/State+/StateModelporte le statut, en prenant en charge le modèleReview(None/Accepted/Rejected/Cancelled/Completed) et le modèleMarked(Unmarked/Marked) utilisés par le workflow d'examen des commentaires d'Acrobat ;GetAnnotStateetGetAnnotStateModelrelisent les chaînes enregistrées à partir de n'importe quelle annotation (vide en cas d'absence)
Correction
- Correction d'un échec de temps de chargement qui empêchait les applications construites avec des versions de développement récentes de démarrer (une recherche de nom de certificat Windows était liée à un point d'entrée DLL inexistant), et réparation de régressions de compilation dans l'importation de commentaires FDF, la rotation de la plage de pages et les chemins d'indicateurs de signature
Version 3.99.0
Ajout
- Ajout des API de lecture de l'empreinte du document et de la transition :
GetDocumentFileIDrenvoie l'identifiant permanent du document à partir du tableau/IDde la fin de fichier (premier élément encodé en hexadécimal), utile comme clé de cache stable ou empreinte de document ;GetPageTransitionest l'équivalent en lecture deSetPageTransition, renvoyant le style de transition sous forme de valeur typéeTPDFlibPageTransitionainsi que la durée d'affichage et la durée de transition en mappant de manière inversée les entrées stockées/Trans/S,/Dmet/M
Version 3.98.0
Ajout
- Ajout de la rotation de plage de pages et de l'introspection des miniatures :
RotatePageRangeapplique une rotation de 0/90/180/270 à chaque page d'une plage (enveloppant la fonction existante pour une seule pageRotatePageafin que les appelants n'aient plus besoin d'une boucle par page) ;HasPageThumbnailindique si une page contient une entrée/Thumb;GetPageThumbnailInfolit la largeur, la hauteur et les bits par composant de l'image miniature XObject
Version 3.97.0
Ajout
- Ajout des lecteurs de propriétés d'annotation étendues :
GetAnnotColorlit le tableau de couleurs/C(0..1 RVB, avec un indicateur HasColor distinguant « aucune couleur explicite » de « noir explicite ») ;GetAnnotBorderWidthlit/BS /W, en se rabattant sur le tableau hérité/Border;GetAnnotOpacitylit l'alpha du trait/CA(par défaut 1.0) ;GetAnnotCreationDatelit l'horodatage/CreationDate;GetAnnotFlagslit l'octet des indicateurs de visibilité/d'impression/F
Version 3.96.0
Ajout
- Ajout d'API d'introspection de sécurité en lecture :
IsEncryptedindique si le document chargé contient un dictionnaire/Encrypt;GetEncryptionLevelrenvoie une force typée (0=aucune, 1=RC4-40, 2=RC4-128, 3=AES-128, 4=AES-256, 5=AES-256 Acrobat X) correspondant aux options de chiffrement en écriture ;GetUserPermissionsrenvoie le mot de permission brut/Ppour un test de bit direct ;IsOwnerPasswordindique si le document a été ouvert avec les informations d'identification du propriétaire
Version 3.95.0
Ajout
- Ajout de l'impression avancée et du remplacement de texte :
PrintDocumentAdvancedpilote le DEVMODE complet de l'imprimante (recto verso, orientation, couleur, qualité d'impression, taille du papier, bac à papier) en plus des copies/assemblage via un enregistrement typéTPDFlibPrintSettings, en appliquant chaque champ non par défaut via le mécanisme de profil d'imprimante personnalisée existant ;SearchAndReplaceTextexécute une recherche sur une plage de pages et, pour chaque correspondance, masque le bloc de texte d'origine avec un rectangle blanc opaque et redessine le texte de remplacement à l'origine du bloc dans la police sélectionnée par l'appelant, reproduisant le comportement de remplacement en superposition de PDFtoolkit SearchAndReplace
Version 3.94.0
Ajout
- Ajout de l'échange FDF d'annotations (« Exporter/Importer des commentaires » d'Acrobat) :
ExportAnnotationsToFDFStringetExportAnnotationsToFDFparcourent les/Annotsde chaque page et sérialisent chaque annotation en tant qu'entrée/Type /Annotdans un tableau FDF/Annots, portant/Subtype,/Contents,/Rect, l'étiquette d'auteur/T,/Subjet l'index de page/Pagebasé sur zéro ;ImportAnnotationsFromFDFStringetImportAnnotationsFromFDFanalysent un tel FDF avec une petite machine à états et recréent chaque entrée en tant que nouvelle annotation sur la page correspondante, en préservant le dictionnaire d'annotations complet au lieu de le réduire à un simple pense-bête
Version 3.93.0
Ajout
- Ajout des API de certification de signature et de propriétés de champ de formulaire :
SetSignProcessDocMDPtransforme la prochaine signature produite par un processus de signature en une signature de certification (auteur) en attachant une transformation DocMDP/Referenceau niveau 1/2/3 (aucune modification / remplissage de formulaire / annotations) et en définissant le bit AppendOnly de/SigFlagsdans AcroForm ;GetSigFlags/SetSigFlagslisent et écrivent directement l'octet brut/SigFlagsd'AcroForm ;GetFormFieldIsComb,GetFormFieldIsMultiLine,GetFormFieldJustificationetGetFormFieldAllowedValuesexposent les bits de style/Ffpar champ, le quadrillage de texte/Qet le tableau de choix/Optsous forme de valeurs typées
Version 3.92.0
Ajout
- Ajout d'API pratiques d'exportation de pièces jointes et de champs de formulaire :
SaveAllAttachmentsparcourt la liste unifiée des pièces jointes (les/EmbeddedFilesau niveau du document ainsi que les annotations/FileAttachmentpar page) et écrit chaque flux dans un répertoire sous son nom de spécification de fichier, en résolvant les collisions avec un suffixe numérique ;RemoveFormFieldByNamerésout un nom de champ complet en son index et le supprime ;RenameFormFieldrenomme un champ par son nom sans recherche d'index séparée
Version 3.91.0
Ajout
- Ajout d'API d'énumération à l'échelle du document :
EnumDocumentFontsparcourt chaque dictionnaire Font (en appelantFindFontsau préalable si nécessaire) et renvoie unTPDFlibDocumentFontpar police avec son numéro d'objet, son nom/BaseFont, son type, son encodage et son statut d'intégration/sous-ensemble, supprimant ainsi le besoin de faireSelectFontpour chaque entrée et d'interroger les accesseurs scalaires ;EnumAttachmentsunifie l'arbre de noms/EmbeddedFilesau niveau du document avec les annotations/FileAttachmentpar page en une seule listeTPDFlibAttachment, en enregistrant la source de chaque entrée, l'index de source basé sur 1, le nom de fichier, le sous-type MIME, la description et la taille en octets
Version 3.90.0
Ajout
- Ajout d'API d'introspection en lecture seule pour les annotations, les signets et la version du document :
GetPDFVersionrenvoie la chaîne de version effective du PDF (par ex.1.7) ;GetAnnotType,GetAnnotTitle,GetAnnotSubject,GetAnnotContentsEx,GetAnnotModifiedDate,GetAnnotNameetGetAnnotRectExexposent les champs par annotation en tant qu'enveloppes nommées (afin que les appelants n'aient plus besoin de numéros d'étiquette de propriété magiques) sur le cacheAnalyseAnnotexistant ;GetOutlineLevelrenvoie la profondeur d'un signet par rapport à la racine du plan etGetOutlineIsOpenindique s'il est développé dans une visionneuse (un/Countnégatif signifie réduit), reflétant l'état de mise en page qu'un panneau de signets afficherait
Version 3.89.0
Ajout
- Ajout d'une unité d'encodage d'image JBIG2
PDFlibJBIG2Enc(TPLJBIG2Encoder.EncodeToByteArray), portée depuis le produit frère HotPDF, avec deux backends : sur Win64, le codeur arithmétique C++jbig2enc(ITU-T T.88) est lié de manière statique viaPDFlibJBIG2EncC+HPDFCLibs(228 objets leptonica/jbig2enc sousthirdparty/Win64x/) et enregistré en tant que backend par défaut, correspondant au chemin de production de HotPDF ; sur les autres cibles, ou lorsqueUseExternalEncoderest False, une solution de secours pure Pascal MMR compresse les lignes de balayage bicolores avec l'encodeur CCITT G4 et les encapsule dans des en-têtes de segment JBIG2 (type d'infos sur la page 48 + région générique immédiate de type 38) - Ajout d'une unité d'encodage LZW
PDFlibLZWEnc(TPLLZWEncoder.Compress), l'homologue encodeur du décodeurPDFlibLZWexistant : produit un flux/LZWDecodeconforme à la spécification PDF avec des codes de largeur variable de 9 à 12 bits, ClearCode/EOI et sémantique EarlyChange par défaut de PDF, plus le TIFF Predictor 2 (différenciation horizontale) facultatif afin qu'un aller-retour par le décodeur reproduise les octets d'origine
Version 3.88.0
Ajout
- Added a CCITT Group 3 / Group 4 (T.6) bi-level image encoder unit
PDFlibCCITTEnc(TPLCCITTEncoder), the encoder counterpart to the existingPDFlibCCITTdecoder: it encodes apf1bitbitmap to a CCITT G3 1D / G3 2D / G4 (T.6) byte stream viaCompressImage/Execute, ported from the HotPDF sibling product (both share the losLab license); this supplies the missing encoder so monochrome image data can be produced forCCITTFaxDecodeoutput, with full image-pipeline andRenderPageToMonochromeFileG4-output integration to follow
Version 3.87.0
Ajout
- Implemented cryptographic signature verification for detached PKCS#7 signatures:
TPDFlibSignatureVerifier.VerifySignature(previously a stub returningvsUnknown) now recomputes the document digest over the two/ByteRangesegments and validates it against the signedmessageDigestattribute and the signer's public key via the Windows CryptoAPI (CryptVerifyDetachedMessageSignature), returningvsValid/vsInvalidforadbe.pkcs7.detachedandETSI.CAdES.detachedsubfilters; this is the first verification layer and covers digest+signature integrity only (certificate chain, CRL/OCSP revocation and RFC 3161 timestamp-token validation remain out of scope and will be added in later layers)
Version 3.86.0
Ajout
- Added a merge-time per-bookmark callback: the
OnMergeOutlineevent fires for each top-level source outline whileMergeFileList/MergeFileListFast/MergeFileListStrictlinks the merged outline tree, letting the caller rename (Title) or drop (Skip=True) an incoming bookmark before it lands in the target document; the callback receives the 0-based source document index so callers can apply per-document policies
Version 3.85.0
Ajout
- Added signing from the Windows system certificate store:
SetSignProcessCertFromStoreresolves the signing certificate from a named store ("MY"/"Root"/...) by Subject simple-display name (typically the CN, matched case-insensitively; an empty name picks the first certificate that has a private key) and reuses the existing PKCS#7 sign pipeline, so a document can be signed without supplying a.pfx/.p12file; pair it withSetSignProcessKeysetto chooseCURRENT_USER(1) vsLOCAL_MACHINE(2)
Version 3.84.0
Ajout
- Added font program embedding for already-loaded documents:
EmbedMissingFontswalks every Font dictionary, reads the matching installed system font program by BaseFont name and writesFontFile2orFontFile3back, returning the number of fonts that gained a program;EmbedFontProgramembeds a single font by name using the installed system font;EmbedFontProgramFromFileembeds a single font using a caller-supplied.ttfor.otffile for fonts not installed on the system - Added
SetEmbedAllFonts, a writer-side guard that promotesAddTrueTypeFontEmbed=0toEmbed=1so newly created documents cannot accidentally reference non-embedded system fonts outside PDF/A mode as well
Version 3.83.0
Ajouté
- Ajout d'API de commodité de rendu :
RenderPageToMonochromeFileeffectue le rendu de la page en un bitmap monochrome 1 bit (scénarios de télécopie/archivage/OCR), dégradé depuis 24 bits via le tramage de demi-teintes GDI, sans modifier le cœur de rendu ;RenderPageRegionToFileeffectue uniquement le rendu d'un sous-rectangle spécifié de la page (“Left,Top,Width,Height”) en un bitmap, connectant le pipeline ClipRenderPageToDCClipprécédemment déconnecté
Version 3.82.0
Ajouté
- Ajout de l'exportation des données de formulaire FDF :
ExportFormDataToFDFécrit tous les noms et valeurs des champs de formulaire du document actuel dans un fichier FDF indépendant (tableau/Fieldsenveloppé par%FDF-1.2),ExportFormDataToFDFStringrenvoie une chaîne de même structure, facilitant le stockage séparé des données de formulaire depuis le PDF ou une fusion ultérieure ; les octets non-ASCII sont échappés en notation octale à trois chiffres selon l'ISO 32000-1
Version 3.81.0
Ajouté
- Ajout d'API de commodité pour les pages et la structure :
SetPageTransitionécrit l'effet de transition de présentation (les 17 transitions standard de/Trans, y compris Split/Blinds/Wipe/Dissolve/Glitter, etc.) et la durée d'affichage pour la page spécifiée ;GetPageFontCount,GetPageFontIDénumèrent les polices référencées par la page spécifiée ;SetMeasurementUnitaccepte une énumération d'unités typée (ajoutant les twips et les points aux pixels/millimètres/pouces existants), accompagné des aides à la conversion d'unitésConvertToPointsetConvertFromPoints;SaveToFileOptionsregroupe la compression, la linéarisation et les options de préservation de la date de modification dans un seul enregistrement
Version 3.80.0
Ajouté
- Ajout d'API de commodité pour la sécurité et les signatures :
EncryptFileExaccepte un ensemble de permissions nommées typé (TPDFlibUserPermissions, distinguant l'impression basse résolution de l'impression haute résolution parmi 8 bits de permissions nommés) remplaçant l'entier brut de bits de permissions ;TPDFlibSignatureVerifier.GetSignatureMetadatalit directement le nom du champ, Filter, SubFilter, l'heure de signature, la raison, le lieu, les informations de contact, le signataire et valide la structure ByteRange depuis le dictionnaire de signature, sans nécessiter de décodage PKCS#7 ;PrintDocumentExspécifie le nombre de copies et le mode de tri de l'impression en un seul appel
Version 3.79.0
Ajouté
- Ajout d'API de commodité d'édition :
MaskRectdessine un rectangle de remplissage opaque sur la page spécifiée pour couvrir une zone (masquage/rédaction) ;SetPageThumbnailFromFileattache directement le/Thumbde la page depuis un fichier image sans polluer l'état de dessin du flux de contenu ;FlattenFormFieldsOnPageRangeaplatit tous les champs de formulaire selon une plage de pages (l'apparence est cuite dans le contenu statique et les champs actifs sont supprimés) ;InsertAnnotationinsère un dictionnaire d'annotations déjà construit à la position spécifiée ;NewMarkupAnnotationcrée en une seule étape des annotations de marquage de type surbrillance/barré/souligné/ligne ondulée et écrit les points quad, la couleur et l'opacité ;StampText,StampImageapposent un filigrane selon une plage de pages, prenant en charge l'opacité, l'angle de rotation et la position de superposition
Version 3.78.0
Ajouté
- Ajout d'API de recherche de texte et d'énumération des éléments de page :
SearchTextrecherche un terme dans la plage de pages spécifiée, renvoyant le numéro de page et le rectangle englobant de chaque occurrence, avec prise en charge des options de respect de la casse et de mot entier ;EnumPageElementsénumère tous les blocs de texte et les éléments d'image incorporés de la page spécifiée, renvoyant de manière unifiée le type d'élément, le rectangle, le texte, le nom de la police et l'ID de l'image ;GetTextInAreaExest la version avec rectangle deGetTextInArea, renvoyant chaque bloc de texte dans la zone et son rectangle englobant
Version 3.77.0
Ajouté
- Ajout d'API d'introspection en lecture seule, complétant l'asymétrie antérieure “capable d'écrire mais pas de lire” :
FindOutlineByTitlerecherche les signets par titre (prenant en charge trois profondeurs : fratrie uniquement/enfants uniquement/toute l'arborescence),GetOutlineActionInfoetGetAnnotActionInforenvoient le type d'action du signet ou de l'annotation (GoTo/GoToR/URI/Launch/Named/JavaScript) ainsi que la charge utile URI, JavaScript ou nom de fichier dans une structure typée,GetOutlineDestinationInforenvoie la page de destination et le type de Fit (XYZ/Fit/FitH/FitV/FitR/FitB/FitBH/FitBV) avec les coordonnées,EnumSignatures,GetSignatureFieldCount,GetSignatureFieldInfoénumèrent les champs de signature et signalent s'ils sont déjà signés
Version 3.76.3
Modifications
- Le profil Factur-X EXTENDED de la démo E-Invoice utilise désormais la valeur de conformance et le guideline ID standard, et la facture ZUGFeRD 1.0 ajoute les éléments de somme
ChargeTotalAmountetAllowanceTotalAmount; les 6 profils produisent désormais des sorties PDF/A-3b et PDF/A-3u qui passent à la fois veraPDF (conformité PDF/A) et Mustang (règles métier de facturation électronique)
Version 3.76.2
Corrections
- Les métadonnées XMP des factures hybrides Factur-X/ZUGFeRD déclarent désormais le schéma d’extension PDF/A (
pdfaExtension:schemas) pour décrire les propriétés de facturefx:; l’absence de cette déclaration faisait auparavant que le PDF/A-3 généré était jugé non conforme par les validateurs tels que veraPDF
Modifications
- Le XML de facture de la démo E-Invoice inclut désormais les adresses électroniques du vendeur et de l’acheteur ainsi que le téléphone du vendeur, permettant à plus de profils de passer la validation des règles métier ZUGFeRD/Factur-X
- Le catalogue de profils, la construction du XML et le flux de génération PDF/A-3 de la démo E-Invoice ont été extraits vers une unité partagée que la GUI et le nouvel outil de test de validateur externe réutilisent tous deux
Version 3.76.1
Corrections
- Correction d’un crash lors du clic sur Générer dans la démo E-Invoice : les polices standard intégrées ne sont pas disponibles en mode PDF/A, la démo incorpore donc désormais une police TrueType pour rendre la page de facture
Modifications
- La démo E-Invoice supprime l’option PDF/A-3a (rarement utilisée pour la facturation électronique), et le profil XRechnung utilise désormais PDF/A-3u par défaut
Version 3.76.0
Modifications
- La GUI de la démo E-Invoice est désormais pilotée par les données : numéro de facture, date d’émission, acheteur et vendeur, montant net, taux de TVA et devise sont éditables, et le XML de facture correspond exactement aux montants visibles de la page au lieu d’utiliser un contenu placeholder fixe
- La démo génère un XML de facture structurellement correct par profil : Factur-X, XRechnung et ZUGFeRD 2.0 utilisent la structure
CrossIndustryInvoice, tandis que ZUGFeRD 1.0 COMFORT utilise sa propre structureCrossIndustryDocumentavec lignes d’articles, totaux de taxe et conditions de paiement - Les montants sont écrits dans le XML avec un format à point décimal anglais fixe afin d’éviter que les séparateurs de milliers localisés ou les virgules ne corrompent le schéma, et les saisies utilisateur sont échappées avant l’écriture
- La démo ajoute un aperçu XML en direct, des auto-vérifications de contenu par profil, l’analyse du rapport de validation externe
.validation.jsonde même nom, et charge explicitement l’intent de sortie ICC sRGB du dépôt lors de la génération
Version 3.75.6
Ajouté
SetPDFAModeajoute le mode7, qui autorise les métadonnées PDF/A-3u tout en continuant à permettre les fichiers associés PDF/A-3; la démonstration graphique E-Invoice propose aussi une option PDF/A-3u, et le profil ZUGFeRD 2.0 BASIC utilise désormais PDF/A-3u par défaut
Version 3.75.5
Ajouté
- Ajoute une démonstration graphique Delphi E-Invoice permettant de choisir les profils Factur-X, ZUGFeRD et XRechnung, de générer des factures hybrides PDF/A-3, d'incorporer le nom de fichier XML et le guideline ID correspondants, d'exécuter la validation du conteneur dans l'interface et d'afficher les informations XMP de facture, les problèmes de validation et le XML extrait
Version 3.75.4
Ajouté
- Ajoute la prise en charge des fichiers associés PDF/A-3 et du XML de facture électronique:
AddPDFA3AssociatedFileFromStringpeut créer des fichiers associés Catalog/AFdirectement depuis des octets en mémoire,AddFacturXAssociatedFileFromStringpeut écrire du XML Factur-X, ZUGFeRD et XRechnung, synchroniser les métadonnées XMP et valider la combinaison nom de fichier, profil, espace de noms XMP et guideline ID XML, tandis que la lecture ajoute des APIs de détection, validation, liste de problèmes et extraction XML
Version 3.75.3
Corrigé
- Fonction de fusion PDF : les variables locales
GlobalRootObjNum,GlobalRootGenNum,StructRootGlobalObjNumetStructRootGlobalGenNumn'étaient affectées qu'à l'intérieur de blocs conditionnels, ce qui provoquait des avertissements W1036 “variable might not be initialized” sur les compilateurs Delphi Win64 26 et 29 (RAD Studio 12 et 16) ; ajout d'une initialisation à zéro au début de la fonction
Version 3.75.2
Corrigé
- Compatibilité de compilation multi-version : la boucle
fordu analyseur de chaînes hexadécimales (PDFlibStruct) utilisait une variable de contrôleInt64, que Delphi XE3/XE5 (compilateurs 26/27) rejettent comme non ordinal ; réécrite en boucleWhilepour rétablir la compatibilité avec RAD Studio 12 et 14 - Vérificateur de XObject de référence (
PDFlibPDFUA) : le pointeur de dictionnaireDn'était pas initialisé dans la branche non-stream/non-dictionary, ce qui provoquait un conseil du compilateur sur toutes les cibles ; la branche a été restructurée pour affecter systématiquementDavant le testAssigned - Enveloppe
CreateFontPackage(PDFlibFont) : suppression du faux avertissement W1035 “return value might be undefined” sur Delphi ≤ XE8 tout en évitant le conseil complémentaire H2077 de dead assignment sur les compilateurs plus récents, grâce à une garde{$IF CompilerVersion} - Émetteur DPI BMP et chemin d'enregistrement incrémental PDF : remplacement des appels obsolètes à
TStream.Seek(Longint, Word)par des affectationsPosition :=(PDFlibPDFium,PDFlibDocument)
Version 3.75.1
Corrigé
- Analyseur TIFF multipage : la garde de fin de boucle contre des comptages de pages excessivement grands était inefficace parce que
FPageCountétait déclaré enWord(maximum 65 535), ce qui rendait la comparaison> 65535toujours fausse ; passage àIntegerpour que la garde se déclenche correctement sur les fichiers pathologiques - Analyseur de jeu de caractères CFF/Type 2 (Format 1 et Format 2) : suppression des affectations mortes
Done := Truequi précédaient immédiatement unBreaket n'étaient donc jamais lues, ce qui élimine les conseils du compilateur
Version 3.75.0
Sécurité
- Renforcement de l'analyse des polices incorporées non fiables (TrueType, Type 1, CFF et CMap) contre les écritures hors limites, la récursion illimitée des charstrings et les allocations mémoire excessives dues à des données de police mal formées
- Renforcement des décodeurs d'images (PNG, GIF, TIFF, JBIG2 et CCITT Group 3 et 4) contre les lectures et écritures hors limites, le dépassement d'entier dans les calculs de largeur et de hauteur, et les déréférencements de palette vide provenant d'images malveillantes
- Renforcement des filtres de flux (LZW, ASCII85 et prédicteurs Flate) contre les lectures au-delà du tampon, la division par zéro et les boucles non terminantes sur des données de flux forgées
- Renforcement de l'analyse des tables de références croisées, de la reconstruction du document et de l'arborescence de noms contre les accès hors limites et les boucles infinies causés par des données de références croisées mal formées ou cycliques
- Le déchiffrement AES-CBC valide désormais l'alignement des blocs de chiffré et initialise à zéro son tampon de sortie, ce qui empêche la mémoire tas non initialisée de fuir dans les chaînes et les flux déchiffrés
Corrigé
- Les empreintes détachées SHA-256, SHA-384 et SHA-512 sont désormais produites avec le bon fournisseur cryptographique ; elles renvoyaient auparavant une empreinte vide et produisaient des signatures invalides
- Le décodage ASCII85 et RC4 ne renvoie plus de données non initialisées et ne lève plus d'exception sur une entrée tronquée ou une clé vide
- La couleur d'arrière-plan GIF est désormais lue avec le bon canal bleu au lieu de dupliquer le canal vert
Version 3.74.1
Corrigé
- Correction d'une erreur de compilation E2010 de types incompatibles dans la prise en charge des données de validation de signature PAdES (VRI) qui empêchait la bibliothèque de se compiler
- Suppression du dernier avertissement du compilateur et des conseils de variable non utilisée ; tous les builds de bibliothèque d'essai et de diffusion Win32 et Win64 compilent désormais sans avertissement
Version 3.74.0
Ajouté
- Les chemins de fichier directs de
EncryptFileetDecryptFilelisent désormais les PDF dont les données de références croisées résident dans des flux de références croisées, y compris les chaînes mises à jour incrémentalement et les fichiers à référence hybride avec une section latérale/XRefStm, au lieu de retomber sur le lecteur complet plus lent : la protection AES-256 d'un document de référence de 1.25 GB est passée d'environ 4.4 à 2.5 secondes et le déchiffrement d'environ 1.7 à 1.3 secondes - Les réécritures qui transportent des objets stockés dans des flux d'objets compressés émettent désormais un trailer de flux de références croisées, ce qui maintient ces objets adressables dans la sortie chiffrée ou déchiffrée
Corrigé
- Une révision sans
/IDde document dans un fichier mis à jour incrémentalement n'efface plus l'identifiant hérité d'une révision antérieure lors d'une réécriture directe
Version 3.73.2
Modifié
DASaveAsFileregroupe désormais ses écritures de sortie et localise le mot-clé de fermeture de chaque objet sans allocations de chaînes à chaque étape, ce qui réduit la réécriture d'un document de référence de 2 GB contenant plus d'un million d'objets d'environ 57 à 11 secondes
Version 3.73.1
Modifié
- Les chemins de fichier directs de
EncryptFileetDecryptFilelisent désormais la source au moyen d'une fenêtre glissante et regroupent les écritures de sortie, de sorte que la protection AES-256 des très gros PDF contenant des millions d'objets s'exécute plusieurs fois plus vite : sur un document de référence de 2 GB, le chiffrement est passé d'environ 123 à 32 secondes et le déchiffrement d'environ 127 à 23 secondes - Les corps d'objet qui tiennent dans la fenêtre de lecture ne sont plus récupérés deux fois sur le disque pendant une réécriture AES-256 directe
Corrigé
- Les réécritures AES-256 directes de PDF à référence hybride (fichiers portant une entrée de trailer
/XRefStm) retombent désormais sur le lecteur complet au lieu de risquer d'omettre des objets compressés - L'analyse des références croisées dans le chemin de fichier direct ne lit plus tout le contenu de la section de références croisées jusqu'à la fin du fichier d'un seul coup, ce qui pouvait épuiser la mémoire sur les fichiers de plusieurs gigaoctets dont la chaîne
/Prevpointe près du début du fichier, et une chaîne/Prevcassée retombe désormais sur le lecteur complet au lieu de produire un document incomplet
Version 3.73.0
Ajouté
- La démo SigningWorkbench effectue désormais une vérification complète du hachage cryptographique des signatures CMS détachées (
adbe.pkcs7.detachedetETSI.CAdES.detached) via Windows CryptoAPI : les plages d'octets signées sont re-hachées et comparées à la signature CMS, un document modifié est signalé avec le nouveau code d'échec SG203, et chaque signature comporte un champdigestValidà trois états dans les rapports JSON, CSV et HTML - Nouveaux commutateurs d'automatisation SigningWorkbench :
--quietn'affiche que le résumé du lot et les chemins des rapports,--fail-fastarrête le lot au premier fichier en échec, et le rapport JSON enregistre désormais la version de la bibliothèque
Version 3.72.0
Ajouté
- La démo ComplianceWorkbench gagne des workflows de traitement par lot professionnels :
--policy-filecharge la stratégie d'audit depuis un fichier JSON afin que les équipes puissent versionner et partager leurs règles de document,--baselinecompare l'exécution à uncompliance-report.jsonantérieur et liste les nouveaux échecs, les fichiers corrigés et les fichiers qui échouent toujours, et--preflight-detailsintègre les lignes de problèmes de pré-vérification dans les rapports JSON et HTML - Nouveaux commutateurs d'automatisation ComplianceWorkbench :
--quietn'affiche que le résumé du lot et les chemins des rapports,--fail-fastarrête le lot au premier fichier en échec, et le rapport JSON enregistre désormais la version de la bibliothèque
Version 3.71.2
Corrigé
AppendToFileajoute à nouveau les mises à jour incrémentales au même fichier PDF chargé avecLoadFromFile; le chargeur en continu conserve désormais le fichier source lisible sans bloquer le handle d'écriture nécessaire à la mise à jour
Version 3.71.1
Ajouté
- Les rapports ComplianceWorkbench et SigningWorkbench incluent désormais des libellés de gravité des constatations, des champs de gravité maximale par fichier, des résumés de fréquence de gravité par lot, ainsi que des sorties JSON, CSV, HTML et console concordantes pour un tri plus rapide des règles
Version 3.71.0
Ajouté
- L'inspection de la démo SigningWorkbench signale désormais l'ordre des révisions et le niveau de certification DocMDP de chaque signature, signale les algorithmes de signature de certificat MD5/SHA-1 faibles et le SubFilter hérité
adbe.pkcs7.sha1avec--forbid-weak-digest(SG303/SG405), les certificats auto-signés avec--forbid-self-signed(SG406), les documents sans signature de certification avec--require-certified(SG304), et vérifie toujours si l'heure de signature se situe dans la période de validité du certificat (SG407) - Le mode de signature SigningWorkbench utilise désormais l'API de processus de signature avec les nouveaux commutateurs
--subfilter(sha1, detached ou cades pour les signatures PAdES baseline) et--digest(auto à sha512), et le moderneadbe.pkcs7.detachedavec SHA-256 devient la nouvelle valeur par défaut de signature - Le nouvel accesseur de lecture
TPDFlibSignDoc.GetSignatureDocMDPLevelByNamerenvoie le niveau de certification DocMDP d'un champ de signature selon l'ISO 32000-1 §12.8.2.2
Version 3.70.0
Ajouté
- La démo ComplianceWorkbench applique désormais aussi les règles de permission, de métadonnées et de taille :
--require-print-allowedet--require-copy-allowedvérifient les bits de permission du document (PC205/PC206),--require-authoret--require-creation-datevérifient l'exhaustivité des métadonnées (PC306/PC307), et--max-pageset--max-file-sizebornent l'échelle du document (PC308/PC309) - Le profil archive exige désormais aussi un auteur et une date de création, et le profil accessible exige la permission de copie sur laquelle s'appuie la technologie d'assistance
- Les rapports ComplianceWorkbench agrègent désormais un résumé de fréquence des codes d'échec sur l'ensemble du lot, et les métriques par fichier incluent l'auteur, la date de création, la taille du fichier, ainsi que les états des permissions d'impression et de copie
Version 3.69.1
Corrigé
DecryptFileretire à nouveau le chiffrement des documents protégés par AES-128 et RC4, y compris les documents qui ne portent qu'un mot de passe propriétaire ; depuis v3.67.4, le chemin rapide pour gros fichiers signalait à tort ces documents comme ayant un mauvais mot de passe (error 404) au lieu de les transmettre au chemin de déchiffrement normal, tandis que les documents AES-256 n'étaient pas affectés
Version 3.69.0
Ajouté
- Nouvelle démo Delphi SigningWorkbench : un outil console de poste de travail pour signatures et certificats qui inspecte les champs de signature d'un PDF ou d'un répertoire entier (SubFilter, heure de signature, couverture ByteRange et certificat de signature avec vérifications d'expiration), signe par lot des PDF avec un certificat PKCS #12, et audite des fichiers PFX ; chaque violation est reliée à un code d'échec de règle stable (SG101–SG501) et les résultats sont écrits sous forme de rapports JSON, CSV et HTML avec des guides de démo localisés pour les 18 langues de documentation
- Nouveaux accesseurs de lecture de signature sur
TPDFlibSignDoc:GetSignatureFieldNamesliste les champs de signature d'un document,GetSignatureTextValueByNamerenvoie les entrées /M heure de signature, /Name, /Reason, /Location, /ContactInfo et /Type (avec déchiffrement sur les documents chiffrés), etGetSignatureValueByNamerenvoie /Filter, /SubFilter, /Contents et les entrées ByteRange par nom de champ
Corrigé
- Correction de l'import Windows CryptoAPI
CertCloseStore, qui était déclaré sans son paramètre de drapeaux et pouvait corrompre la pile de l'appelant sur Win32 lorsqu'un magasin de certificats était fermé
Version 3.68.0
Ajouté
- Nouvelle démo Delphi ComplianceWorkbench : un outil console d'audit de règles par lot qui vérifie un PDF ou un répertoire entier par rapport à une stratégie de conformité configurable couvrant les contrôles préalables PDF/A et PDF/UA, les règles de chiffrement, la plage de versions PDF, Tagged PDF, la linéarisation et le titre du document, signale chaque violation comme un code d'échec de règle stable (PC101–PC501), et écrit des rapports JSON, CSV et HTML avec des codes de sortie adaptés à l'automatisation
- La nouvelle démo fournit des profils de règles qui regroupent des ensembles d'exigences courants—archive, accessible, secure et web—avec des commutateurs de ligne de commande explicites qui remplacent les valeurs du profil, et inclut des guides de démo localisés pour les 18 langues de documentation
Version 3.67.4
Modifié
EncryptFileetDecryptFileutilisent désormais un chemin de réécriture AES-256 direct pour les grands PDF à xref classique, en diffusant les données chiffrées entre les fichiers au lieu de charger et de réécrire chaque objet ; un fichier de référence de 2 GB termine désormais le chiffrement et le déchiffrement AES-256 de fichier à fichier via l'API Direct File avec le code résultat 1 etLastErrorCode0
Corrigé
- Correction de la gestion des jetons de chaîne AES-256 directs afin que les délimiteurs de dictionnaire ne soient pas pris pour des chaînes hexadécimales et que les chaînes vides chiffrées se déchiffrent correctement
Version 3.67.3
Modifications
- Les démos Delphi et C++Builder pour DrawShapes, CreateWithImage, CreateTable, EditFormField et EmbeddedFonts ont été enrichies afin que les PDF générés montrent désormais des flux de travail concrets de dessin, de placement d'images, de mise en page de tableaux, de style de champs de formulaire et de comparaison d'incorporation de polices, au lieu d'une sortie minimale à action unique
Corrections
- La démo CreateTable définit désormais explicitement un format de page A4 avant le rendu du tableau, évitant l'ancienne variable de format de page non initialisée dans l'exemple Delphi
Version 3.67.2
Corrections
- Correction d’une régression issue de la détection différée côté chargeur introduite dans v3.67.0 : la détection des fonctionnalités de contenu pouvait s’exécuter au moment de l’enregistrement et remplacer une version d’enregistrement demandée explicitement (SetInformation 0) ou une version verrouillée (LockSaveVersion), si bien qu’un enregistrement strict vers une version inférieure ne refusait plus un contenu de version supérieure et qu’une version verrouillée pouvait dériver vers le haut ; la détection s’exécute maintenant avant toute version définie explicitement et jamais pour les documents créés plutôt que chargés, rétablissant le comportement de contrôle de version antérieur à v3.67.0 tout en conservant les gains du chargement différé
Version 3.67.1
Modifications
- La détection des fonctionnalités lit maintenant les objets stream avec une analyse superficielle qui inspecte uniquement le dictionnaire de l’objet et ignore le corps du stream, puisque l’analyse n’examine jamais le contenu des streams ; sur les documents contenant de grands streams d’images, cela évite de lire les octets du corps pendant la détection, réduisant le temps de lecture des objets d’une passe de détection d’environ 40% (environ 13 s au lieu de 20 s sur un fichier de 2 GB contenant 1,6 million d’objets), tandis que la liste des fonctionnalités détectées et la version PDF effective restent identiques
Version 3.67.0
Modifié
- La détection des caractéristiques de contenu côté chargeur est désormais différée (lazy) – au lieu d''analyser tout le document lors du chargement, elle s''exécute à la première utilisation, lorsque la version PDF effective ou la liste des caractéristiques détectées est interrogée ou lorsque le document est enregistré ; les traitements en lecture seule tels que le nombre de pages, l''extraction de texte ou d''images et le rendu qui n''interrogent jamais la version et ne réenregistrent pas ignorent entièrement l''analyse, réduisant le temps de chargement des très grands documents d''environ 80% (environ 10 s au lieu de 56 s pour un fichier de 2 Go comportant 1,6 million d''objets), tandis que l''ensemble des caractéristiques détectées et la version PDF effective restent identiques une fois la détection exécutée
Version 3.66.1
Modifié
- Le chargement de très grands documents multipages est désormais nettement plus rapide : la détection des caractéristiques de contenu côté chargeur ignore les vérifications de règles qui ne peuvent pas modifier le résultat – aussi bien les règles déjà satisfaites que les règles non applicables à un objet donné – ce qui réduit de près de moitié le temps de chargement des fichiers volumineux tout en conservant des caractéristiques détectées et une version PDF effective identiques
Version 3.66.0
Modifié
- Le chargement de très grands documents multipages consomme désormais bien moins de mémoire au pic. La détection des caractéristiques de contenu côté chargeur ne matérialise plus l'intégralité du modèle objet d'un coup – elle lit les objets un par un via le lecteur à accès aléatoire – réduisant le working set de pointe d'environ 90 % sur les fichiers volumineux, tout en conservant les caractéristiques détectées et la version PDF effective identiques.
Version 3.65.0
Ajouté
- Les documents de plus de 2 GB peuvent désormais être ouverts. Le tampon en mémoire précédent, qui limitait la taille des documents à environ 2 GB, a été supprimé.
Modifié
- Lors du chargement d'un PDF depuis un fichier, les données d'objets sont désormais lues à la demande depuis la source au lieu de mettre tout le document en mémoire tampon, ce qui réduit fortement le pic d'utilisation mémoire pour les fichiers volumineux.
- Un document chargé depuis un fichier garde ce fichier ouvert en accès lecture partagée jusqu'à ce que le document soit fermé ou vidé.
Corrigé
- Robustesse améliorée lors du chargement de documents comportant des octets avant l'en-tête %PDF- et lors du traitement de données de cross-reference mal formées.
Version 3.64.0
Modifié
- Les opérations de l'API Direct sur des PDF très volumineux ou comportant de nombreux objets – EncryptFile, DecryptFile et DASaveAsFile – sont désormais nettement plus rapides et ne se bloquent plus. Un document de 2 GB d'environ 1,6 million d'objets qui ne pouvait auparavant pas aboutir est maintenant chiffré en une minute environ, et le temps de traitement évolue de façon à peu près linéaire avec le document au lieu de s'effondrer à mesure que le nombre d'objets augmente.
- Le chiffrement des documents volumineux est nettement plus rapide – une opération qui prenait auparavant plusieurs minutes s'effectue désormais en quelques secondes à une minute environ – sans changement de la force de chiffrement, de la compatibilité du texte chiffré ni de la sortie.
Version 3.63.0
Corrigé
- Correction d'un plantage du processus lors du chargement de gros fichiers PDF dont les décalages d'octets internes dépassent la limite des 32 bits (environ 2 GB); le chargeur utilise désormais des décalages 64 bits partout, de sorte que les fichiers proches de 2 GB se chargent de manière fiable et que les fichiers de 2 GB ou plus signalent une erreur de chargement proprement au lieu de planter.
Version 3.62.0
Modifications
- Le chiffrement et le déchiffrement AES-256-CBC empruntent désormais la voie AES-NI accélérée par le matériel sous Windows 32 bits également, et pas seulement en 64 bits, tout en conservant le repli automatique vers l'implémentation C portable sur les processeurs dépourvus d'AES-NI. Le texte chiffré reste inchangé sur toutes les plateformes.
Version 3.61.0
Modifications
- Le chiffrement et le déchiffrement AES-256-CBC utilisent désormais un backend AES-NI accéléré par le matériel sous Windows 64 bits, avec un repli automatique vers l'implémentation logicielle portable sur les processeurs dépourvus d'AES-NI. Le texte chiffré est identique sur toutes les plateformes ; seule la vitesse du chiffrement PDF AES-256 basé sur un mot de passe change.
Version 3.60.0
Ajouts
MergeFileListfusionne désormais les arbres de structure logique (Tagged PDF) des documents d'entrée en un seul arbre de structure accessible, au lieu de ne conserver que l'arbre du premier document et de laisser les autres sous forme d'objets inaccessibles. Les éléments de structure de premier niveau, le parent tree (avec réaffectation des clés de page/StructParentset d'annotation/StructParent),/RoleMap,/ClassMapet/IDTreesont combinés, et le catalogue fusionné est marqué comme Tagged (/MarkInfo /Marked true).
Modifications
- Lors de la fusion de documents présentant des clés
/RoleMap,/ClassMapou/IDTreeen conflit, la première occurrence est conservée. Le chemin rapide (MergeFileListFast) continue de supprimer les informations de structure.
Version 3.59.0
Modifications
MergeFileListfusionne désormais les documents en une seule passe (O(N) au lieu de O(N²)), ce qui accélère nettement la fusion de nombreux fichiers ; il bénéficie également de la fusion des signets multidocuments ajoutée au chemin rapide.- Par défaut,
MergeFileListignore désormais les fichiers d'entrée illisibles ou chiffrés et poursuit la fusion des autres, au lieu d'interrompre toute l'opération au premier fichier défectueux. Utilisez le nouveauMergeFileListStrictpour rétablir le comportement précédent d'arrêt au premier échec. - Les objets de structure logique (Tagged PDF) des entrées sont désormais conservés par
MergeFileList(le chemin rapide continue de les supprimer).
Ajouts
MergeFileListStrictfusionne une liste de fichiers mais s'arrête au premier fichier illisible ou chiffré, conservant la sémantique stricte d'arrêt en cas d'échec des versions précédentes.
Version 3.58.0
Ajouts
MergeFileListFastfusionne désormais les signets (plans) du document de tous les fichiers d'entrée, de sorte que le chemin de fusion rapide conserve les signets en plus des champs de formulaire AcroForm.- Les signets fusionnés conservent leur hiérarchie et leurs destinations de page ; le nombre de signets de premier niveau de la sortie fusionnée est égal à la somme des entrées.
Version 3.57.1
Modifications
- L'enregistrement via la Direct File API (
DASaveAsFile,DASaveToStream,DASaveCopyToStream) est désormais nettement plus rapide sur les très gros documents : les objets inchangés sont copiés directement à partir des octets source au lieu d'être réanalysés et resérialisés. Réenregistrer un document de 60 000 pages / 883 Mo est passé d'environ 33 secondes à environ 23 secondes.
Version 3.57.0
Modifications
- Les performances de
TPDFlib.MergeFileListFastpour les fusions multi-documents ont été encore améliorées : les objets non modifiés sans flux dans les documents ajoutés sont désormais réutilisés directement à partir de leurs octets sources d'origine avec un décalage de référence indirecte au niveau des octets, évitant l'aller-retour analyse / resérialisation et améliorant le débit pour les documents de plusieurs pages. La sortie de fusion reste inchangée, avec des nombres de pages identiques. - Les objets contenant des flux ou appartenant à l'arborescence de structure continuent d'utiliser le chemin de décodage existant ; le chemin d'octets plus rapide n'est appliqué que là où cela est prouvablement sûr.
Version 3.56.44
Modifications
TPDFlib.MergeFileListFasta été optimisé en préallouant les métadonnées de fusion et en écrivant les objets inchangés du premier document depuis leurs données source d’origine, ce qui réduit les mouvements mémoire et le travail évitable de décodage/sortie des objets lors des fusions rapides de plusieurs fichiers.- L’interface Delphi
MergePDFregroupe désormais la journalisation des résultats du mode rapide et évite les analyses répétées de tout le texte du mémo, ce qui garde les grandes listes d’entrée plus réactives après la fin d’une fusion.
Version 3.56.43
Modifications
- Le chemin de fusion ordinaire de
TPDFlib.MergeFileLista été optimisé en alternant ses fichiers temporaires intermédiaires au lieu de copier le PDF fusionné en croissance avant chaque entrée supplémentaire, ce qui réduit les E/S disque pour les flux à plusieurs fichiers tout en conservant le contrat existant du nombre retourné.
Version 3.56.42
Ajouts
- Une couverture de régression AES a été ajoutée pour les cas où le tampon d'entrée et le résultat partagent la même destination lors de la restauration des streams chiffrés pendant l'enregistrement, y compris de grands payloads de 504 Ko qui révélaient auparavant l'échec.
Modifications
- Le flux de l'API normale
LoadFromFile,Encrypt,SaveToFile, rechargement,DecryptetSaveToFilese termine de nouveau sur les grands PDFs chargés tout en conservant l'optimisation de déchiffrement AES-CBC à copie réduite.
Corrections
- Le chemin de déchiffrement AES-256 basé sur un tampon introduit dans v3.56.41 a été corrigé afin que les appelants puissent réaffecter le résultat au même
AnsiStringque celui qui a fourni le tampon de texte chiffré sans violation d'accès.
Version 3.56.41
Ajouts
- Ajout de
TPDFlib.DACopyFilepour les workflows Direct Access qui nécessitent un nombre de pages et une copie de fichier inchangée sans construire le graphe complet des objets normaux. - La demo Delphi
HugeFileBenchmarkinclut maintenant une lignedirect-copyainsi que les filtres--opset--skippour des exécutions ciblées sur les gros fichiers.
Modifications
- Optimisation du déchiffrement AES-256 avec des chemins AES-CBC basés sur tampon, utilisés lors du déchiffrement des chaînes et streams chargés, afin de réduire les copies supplémentaires de texte chiffré sur les grands streams chiffrés.
Version 3.56.40
Modifications
- Les demos Delphi et C++Builder
HelloWorldcreent maintenant un PDF de depart plus riche avec informations de document, sortie dans une police standard selectionnee, bloc de titre stylise, dessin vectoriel simple et indications de suite, tout en conservant le meme flux compiler-et-executer. - Toutes les notes des demos Delphi et C++Builder ont ete remplacees par des pages
Readme.htmllisibles dans un navigateur, y compris les notes auxiliaires sur les mots de passe, les fichiers restreints et les resultats de signature; les index de demos dirigent maintenant les utilisateurs vers les notes HTML.
Version 3.56.39
Modifications
- Les chemins de sauvegarde de l'API de fichiers directs construisent désormais les tables de recherche des références croisées de façon linéaire, ce qui rend
DASaveAsFileet les chemins de sauvegarde directe associés beaucoup plus rapides sur les PDF contenant de très nombreux objets ou des arbres de pages denses. - Le writer optimisé conserve la même sémantique de chaîne des objets libres tout en évitant les balayages répétés des numéros d'objets pendant la génération complète de xref, ce qui améliore les grands flux de sauvegarde directe sans modifier l'API publique ni le contrat de sortie.
Version 3.56.38
Modifications
- Le workflow de l'API normale
LoadFromFile,Encrypt,SaveToFile, rechargement,DecryptetSaveToFileconserve maintenant l'état chiffré avant leDecryptexplicite, avec le même comportement que l'API d'accès direct aux fichiers pour les grands PDFs hérités.
Corrections
- La sortie de chiffrement de l'API normale a été corrigée afin que
Encryptcrée ou conserve le trailer/IDavant d'écrire les données de sécurité AES-256, ce qui permet aux PDFs chiffrés de rester détectables au rechargement viaEncryptionStatus.
Version 3.56.37
Ajouts
- Ajout de
TPDFlib.ComparePreflightReports, un comparateur ligne par ligne pour les rapports de preflight en texte brut qui ignore les lignes d'horodatage volatilesGenerated:et renvoie une chaine vide lorsque le contenu stable du rapport correspond. - La demo Delphi
PreflightReportprend desormais en charge--compare <file>en mode fichier unique, ecrit un rapport UTF-8.diff.txtet renvoie le code de sortie 2 lorsque le rapport texte genere differe de la baseline.
Version 3.56.36
Ajouts
- La demo Delphi
PreflightReportprend maintenant en charge les traitements de repertoire par lot avec--input-dir,--output-diret--recursive, en ecrivant un rapport par PDF sous la forme<basename>.preflight.<ext>.
Modifications
- Le mode lot ecrit un fichier UTF-8
preflight-summary.csvqui enregistre chaque PDF source, le statut pass/fail, le nombre de problemes et le chemin du rapport genere, tout en conservant le contrat de codes de sortie existant pour l'automatisation.
Version 3.56.35
Ajouts
ReportFormat = 3ajoute la sortie CSV aTPDFlib.CreatePreflightReportExetTPDFlib.SavePreflightReportEx, avec des lignes UTF-8 pour les metadonnees du rapport, chaque controle de conformite selectionne, les codes et messages de probleme individuels, et le resume final.- La demo Delphi
PreflightReportprend maintenant en charge--format csvet--csv, afin que les controles preflight en ligne de commande alimentent des feuilles de calcul ou de simples analyseurs CI sans post-traiter JSON ni extraire du texte.
Version 3.56.34
Ajouts
- Ajout des API sensibles au format
TPDFlib.CreatePreflightReportExetTPDFlib.SavePreflightReportExpour produire des rapports preflight PDF/A et PDF/UA-1 en texte brut, JSON ou HTML autonome, tout en conservant les API existantes limitées au texte. - La démo Delphi
PreflightReportprend maintenant en charge--format text|json|htmlainsi que les raccourcis--jsonet--html, afin que le même flux en ligne de commande produise des rapports lisibles ou des artefacts CI exploitables par machine.
Version 3.56.33
Ajouts
- Ajout de
TPDFlib.CreatePreflightReportetTPDFlib.SavePreflightReport, afin que les applications puissent produire des rapports texte réutilisables à partir des contrôles de conformité PDF/A et PDF/UA-1 intégrés sans parcourir manuellement les handles de listes de chaînes.
Modifications
- La démo Delphi
PreflightReportappelle maintenant directement les API de rapport de la bibliothèque, ce qui garde l'exemple centré sur le flux en ligne de commande, les contrôles choisis, le mode premier problème et les codes de sortie adaptés à l'automatisation.
Version 3.56.32
Ajouts
- Ajout d'un nouvel exemple console Delphi
PreflightReportqui exécute les contrôles PDF/A et PDF/UA-1 avecCheckFileCompliance, énumère les listes de problèmes avecGetStringListCountetGetStringListItem, puis écrit un rapport de preflight en texte brut.
Modifications
- L'exemple prend en charge les options
--input,--output,--pdfa,--pdfua,--bothet--first-issue, ainsi que des codes de sortie adaptés à l'automatisation pour réussite, problèmes détectés et erreur d'exécution.
Version 3.56.31
Modifications
GetCustomKeys(2)masque désormais de manière cohérente les entrées du système Catalog gérées par la bibliothèque, notamment/OutputIntents,/Extensions,/Requirements,/Collectionet/NeedsRendering.
Corrections
- Les profils de sortie PDF/A créés par
SetPDFAModene sont plus affichés comme des clés personnalisées dans le catalogue, ce qui permet de séparer l'énumération des métadonnées de l'application des structures de conformité PDF.
Version 3.56.25
Modifications
- Le module GetPDFUADiagnostics côté rédacteur corrige le problème
MULTIPLE-H-CHILDREN:Ncorrespondant, assurant la parité avec le module10044à partir de v3.56.24. ISO 14289-1 §7.4.4 interdit qu'un nœud d'arbre de balises ait plus d'un enfant H direct ; la vérification côté rédacteur s'exécute chaque fois que l'arbre FStructElems en mémoire contient une telle violation. - Un nouveau module CountMultipleHChildren auxiliaire parcourt l'arbre en profondeur, en comptant les enfants H à chaque niveau. La vérification s'exécute en parallèle avec les parcours existants LIST-STRUCT / LIST-NO-NUMBERING et utilise le même motif de parcours FStructElems.
Version 3.56.24
Modifications
- Le module d'audit PDF/UA-1 gagne une vérification de l'unicité des balises H ISO 14289-1 §7.4.4.
10044signale tout nœud de structure qui contient plus d'un enfant H direct —, car la spécification interdit cela dans les documents fortement structurés, et la même contrainte s'applique à tout nœud d'arbre de balises, quel que soit le mode de structure global. L'autre exigence § 7.4.4 (un document doit être soit fortement structuré, soit faiblement structuré, mais pas les deux) nécessite des heuristiques à l'échelle du document et est intentionnellement exclue de cet audit. - Un nouveau parcoursur d'arbre de structure en préordre (UAVisitStructNodeForHUniqueness / ScanStructTreeForHUniqueness) compte les enfants H directs par nœud et effectue une récursion en profondeur. Réutilise le même décodeur en forme de K que les parcoursurs de titres/listes/notes existants.
Version 3.56.23
Ajouts
- La nouvelle version
Lib/PDFlibPDFUAFontInspect.pasimplémente un analyseur de répertoire de table tolérant et un analyseur de répertoire de sous-table cmap. La table Adobe Glyph List de 4281 noms, ajoutée comme structure de base dans la validation précédente, est maintenant intégrée via la vérification des différences. Les programmes qui ne sont pas analysés comme des polices SFNT (police PFB / PFA, collection, données aléatoires) sont ignorés silencieusement. Les faux négatifs sont préférés aux faux positifs au niveau de l'audit.
Modifications
- L'audit PDF/UA-1 prend en charge les deux vérifications de programme de police ISO 14289-1 §7.21.6 qui permettaient aux vérifications de la couche de dictionnaire de v3.56.10 de différer jusqu'à ce qu'un analyseur TrueType soit disponible.
10034signale les programmes TrueType non symboliques dont la table cmap intégrée contient uniquement l'entrée symbolique (platformID=3, encodingID=0) — §. Le premier paragraphe de la version 7.21.6 exige au moins une sous-table cmap non symbolique afin que le programme puisse rendre les points de code déclarés par son /Encoding..10035signale les tableaux TrueType non symboliques dont les noms de glyphes ne sont pas des membres de la liste Adobe Glyph (sauf.notdef). — §. Le troisième paragraphe de la version 7.21.6 exige que chaque entrée de différence soit présente dans AGL.
Version 3.56.22
Modifications
- L'audit PDF/UA-1 prend en charge les vérifications des données de clip multimédia.
10042signale les dictionnaires de données de clip multimédia (identifiés par/S /MCD, éventuellement/Type /MediaClip) qui ne contiennent pas l'entrée de type de contenu/CTrequise.10043signale les mêmes dictionnaires qui ne contiennent pas le tableau/Altrequis. ISO 32000-1 Le tableau 274 indique que les deux clés sont facultatives, mais ISO 14289-1 §7.18.6 les rend obligatoires afin que les lecteurs d'écran puissent annoncer une description significative pour les supports multimédias intégrés. - Ceci est la phase 6 du plan d'audit approfondi PDF/UA (
.superpowers/plans/2026-05-23-pdfua-deep-audit-plan.md). Il s'exécute sans aucune dépendance de l'analyseur de programme de police ou du flux de contenu, il s'agit donc du premier sous-classe après la série v3.56.0..v3.56.13.
Version 3.56.21
Ajouts
- La nouvelle fonctionnalité
SetSignProcessCommitmentTypeémet l'attribut signé CAdEScommitment-type-indication(OID 1.2.840.113549.1.9.16.2.16, ETSI EN 319 122-1 v1.2.1 §5.2.3) à l'intérieur du chemin PAdES-B-B SignerInfo. Elle accepte des codes entiers de 1 à 6, qui correspondent aux engagements ETSI bien connusid-cti-ets-proofOfOriginàid-cti-ets-proofOfCreation; utilisez 0 pour effacer. Les codes hors plage sont rejetés. - La nouvelle fonctionnalité
SetSignProcessSignaturePolicyémet l'attribut signé CAdESsignature-policy-identifier(OID 1.2.840.113549.1.9.16.2.15, §5.2.9). Elle prend en charge la politique au format décimal pointé OID, le hachage du document de politique sous forme de chaîne hexadécimale en majuscules et un code d'algorithme de hachage (1=SHA-1, 2=SHA-256, 3=SHA-384, 4=SHA-512, 0=auto/SHA-256). L'attribut contient laSignaturePolicyIdSEQUENCE avecsigPolicyId+sigPolicyHash(OtherHashAlgAndValueSEQUENCE).
Modifications
- Ces deux attributs ne prennent effet que lorsque la SubFilter est
ETSI.CAdES.detached(le chemin PAdES-B-B) ; ils étendent le tableaurgAuthAttrexistant, en plus decontent-typeetsigning-certificate-v2. Le tableau 1, ligne d), interdit de combinercommitment-type-indicationavec l'entrée du dictionnaire de signature PDF/Reason; l'appelant est responsable de ne pas définir les deux.
Version 3.56.20
Ajouts
- La nouvelle fonctionnalité
AddPAdESDSSVRIajoute une entrée de sous-dictionnaire Signature VRI à l'objet DSS en cours de construction, complétant la structure ETSI EN 319 142-1 v1.2.1 clause 5.4.2.3 Informations de validation. L'entrée est indexée par la valeur hexadécimale en majuscules SHA-1 des octets de la signature ' ; ses sous-tableauxCert/CRL/OCSPsont remplis en faisant référence aux flux parents correspondants via des index basés sur zéro fournis sous forme de listes séparées par des virgules (par exemple,"0,2,5").
Modifications
- La fonctionnalité sous-jacente
TSmartPDFDocument.AddPAdESDSSWithVRIsuit les numéros d'objet de flux émis pour chaque certificat / CRL / OCSP et les utilise pour écrire les sous-tableaux VRI en tant que références indirectes vers les mêmes flux auxquels les tableaux parents DSS pointent déjà, ce qui satisfait l'exigence de la spécification selon laquelle les entrées VRI partagent le stockage avec le dictionnaire parent DSS. Le point d'entréeAddPAdESDSSoriginal continue de fonctionner sans modification pour les appelants qui n'ont pas besoin de la fonctionnalité VRI. - Chaque sous-dictionnaire VRI par signature contient le marqueur optionnel
/Type /VRI, de sorte que les outils qui parcourent le catalogue par balisesTypepeuvent reconnaître la structure sans avoir à résoudre le chemin parent.
Version 3.56.19
Ajouts
- Nouveau flux de travail PAdES-B-T pour joindre une signature-horodatage (id-aa-signatureTimeStampToken, OID 1.2.840.113549.1.9.16.2.14) à une signature PAdES-B-B existante.
NewPAdESSignatureTimeStampProcessFromFile/FromStream/FromStringouvre un PDF signé,SetPAdESSignatureTimeStampFieldnomme le champ,GetPAdESSignatureValueHashHexrenvoie le hachage SHA-256 (ou 384 / 512) dusignatureValuedu signataire pour la soumission à une TSA,GetPAdESSignatureCMSBytesexpose la charge utile CMS existante,SetPAdESSignatureCMSBytesaccepte les octets augmentés CMS que l'appelant assemble via sa bibliothèque CMS de choix, etEndPAdESSignatureTimeStampProcessToFile/ToStream/ToStringinsère la nouvelle CMS dans le placeholder/Contentsoriginal. - La nouvelle
SetSignProcessReserveContentsBytesélargit le placeholder/Contentsau moment de la signature initiale afin que le CMS augmenté ultérieurement tienne sans déborder de la réservation initiale. Les attributs TimeStampTokens typiques émis par13ajoutent 2 à 6 KB au SignerInfo ; indiquez 1024-8192 pour laisser de la marge. En cas de réserve insuffisante, l'appel d'augmentation renvoie13(dépassement de la sortie).
Modifications
BuildPAdESSignatureTimeStampAttributeest un utilitaire sans état qui encapsule un TimeStampToken émis par TSA dans l'attribut CMS queSignerInfo.unsignedAttrsattend, de sorte que les appelants qui disposent déjà d'une bibliothèque CMS peuvent éviter la complexité de OID + SET.- La bibliothèque ne fournit pas de client TSA HTTP ; l'appelant récupère l'attribut TimeStampToken (généralement 30 à 50 lignes de requête TSP + HTTP POST par rapport à, par exemple, FreeTSA ou DigiCert). Sur Windows,
CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTRpourrait, en principe, automatiser l'injection CMS dans la bibliothèque, mais renvoieCRYPT_E_INVALID_INDEX(0x80091008) pour la forme détachée SignedData PAdES émise, de sorte que les octets CMS fournis par l'appelant sont utilisés à la place.
Version 3.56.18
Ajouts
- Les nouveaux utilitaires ASN.1
DER_IntegerFromLittleEndian(gère l'ordre d'octet Win32CRYPT_INTEGER_BLOB) etDER_ContextTagExplicit(encapsule une charge utile dans une étiquette contextuelle construite) complètent le micro-encodeurPDFlibASN1. Les nouvelles déclarationsCERT_INFO/CRYPT_ALGORITHM_IDENTIFIER/CRYPT_INTEGER_BLOB/PCERT_CONTEXTdansPDFlibCryptoAPIdonnent au chemin de signature accès aux champs de certificat analysés.
Modifications
- L'attribut PAdES
signing-certificate-v2inclut désormais le champ optionnelIssuerSerialdéfini par RFC 5035 (ESSCertIDv2). Le nom distinctif de l'émetteur du certificat de signature est encapsulé dans unGeneralName [4] EXPLICIT directoryNameCHOICE dansGeneralNames, suivi du numéro de série du certificat en tant que ASN.1 INTEGER. Les octets du numéro de série arrivent en ordre little-endian depuis Windows CryptoAPI (CRYPT_INTEGER_BLOB) et sont inversés en ordre big-endian avec l'ajout de l'octet de remplissage entier positif lorsque le bit de poids fort est activé, comme OpenSSL et BouncyCastle émettent le même champ. - Les vérificateurs qui vérifient le nom de l'émetteur + la paire numéro de série par rapport à leur ensemble de candidats de construction de chemin (notamment EU DSS en mode strict) trouvent maintenant les deux identificateurs dans l'attribut signing-cert-v2 ; la sortie v3.56.17 précédente ne fournissait que la référence
certHash.
Version 3.56.17
Ajouts
- La nouvelle unité
PDFlibASN1fournit un micro-encodeur DER (X.690) ciblé — préfixe de longueur, OCTET STRING, SEQUENCE, SET, OBJECT IDENTIFIER — utilisé pour bâtir la valeur de l'attributSigningCertificateV2. L'encodeur respecte les règles standard des arcs OID en base-128 et omet le champ optionnelhashAlgorithmlorsque celui-ci ne ferait que répéter la valeur par défaut SHA-256, comme le font OpenSSL et BouncyCastle.
Modifications
- Le chemin de signature intégré
ETSI.CAdES.detachedproduit désormais des signatures PAdES-B-B structurellement conformes. La bibliothèque construit elle-même les attributs authentifiés CMS —content-type(id-data) etsigning-certificate-v2issus de RFC 5035 / RFC 5816, accompagnés d'un hash SHA-256 du certificat de signature — et les transmet àCryptSignMessageviargAuthAttr. Dès que ce champ n'est plus NULL, l'API Windows CryptoAPI cesse d'injecter automatiquement l'attributsigning-timeque PAdES (ETSI EN 319 142-1 v1.2.1 Table 1) interdit, de sorte que leSignerInforésultant ne porte que les attributs requis et eux seuls. ApplySignatureachemine désormaisETSI.CAdES.detachedpar le chemin raw-byte (le même que celui utilisé paradbe.pkcs7.detached) au lieu de fournir un digest précalculé. La CryptoAPI calcule maintenant l'attribut authentifiémessageDigestsur le contenu effectivement signé, ce qui correspond à ce qu'attendent les vérificateurs.- SHA-384 et SHA-512 sont également honorés lors de la construction de l'attribut signing-certificate-v2 : le champ
hashAlgorithmest émis avec l'AlgorithmIdentifiercorrespondant plutôt que de s'appuyer sur la valeur par défaut. SHA-1 est silencieusement promu en SHA-256 dans ce contexte, car PAdES-B-B n'autorise pas SHA-1 (clause 6.2.1).
Version 3.56.16
Ajouts
- Le nouveau
SetSignProcessDigestAlgorithmsélectionne l'algorithme de message-digest pour la signature :1= SHA-1 (deprecated),2= SHA-256 (valeur par défaut moderne),3= SHA-384,4= SHA-512,0= auto (SHA-256 pour chaque SubFilter sauf le chemin légatadbe.pkcs7.sha1, qui reste sur SHA-1 pour conserver une compatibilité binaire stable). ETSI EN 319 142-1 v1.2.1 §6.2.1 interdit MD5 et renvoie à ETSI TS 119 312 pour les suites cryptographiques recommandées, donc les signataires PAdES doivent choisir SHA-256 ou plus fort. - Ajout des helpers de hachage
SHA256StreamRange,SHA384StreamRangeetSHA512StreamRangeà côté duSHA1StreamRangeexistant ; le chemin de signature les utilise pour hacher le ByteRange du PDF avec l'algorithme sélectionné. L'OIDSignerInfo.digestAlgorithmde PKCS#7 et les octets de hachage effectivement écrits sont désormais garantis cohérents (le code précédent transmettait toujours le digest SHA-1 quel que soit l'algorithme négocié).
Modifications
TPDFlibPFXFile.SignDataprend désormais un paramètreDigestAlgorithmet choisit l'OID correct pour chaque paire (SubFilter, algorithme) :2.16.840.1.101.3.4.2.1/.2/.3pour SHA-256/384/512 sur les SubFilters detached et custom (RFC 5754), et les OIDs de la famillesha256WithRSAEncryptioncorrespondants pour le chemin légatadbe.pkcs7.sha1.
Version 3.56.15
Ajouts
- Nouveau
SetSignProcessDocTimeStampbascule un processus de signature en mode PAdES Document Time-stamp conformément à ETSI EN 319 142-1 v1.2.1 §5.4.3. Le dictionnaire de signature résultant porte/Type /DocTimeStampet/SubFilter /ETSI.RFC3161, omet les clés interdites/M,/Reason,/Location,/ContactInfoet/Name, et réserve un espace réservé hexadécimal de 8192 octets (ou de la taille spécifiée par l'appelant) dans/Contentspour un TimeStampToken RFC 3161 récupéré en externe.
Modifications
- Le mode passthrough est activé automatiquement lorsque le mode DocTimeStamp est sélectionné car le TimeStampToken provient d'une TSA externe. Les appels à
SetSignProcessInfoeffectués après le basculement en mode DocTimeStamp sont silencieusement ignorés pour maintenir le dictionnaire de signature conforme à la spécification. - L'auto-injection PAdES
/Extensions /ESICexistante ajoutée en v3.56.8 couvre déjà DocTimeStamp car son SubFilter commence parETSI., de sorte qu'un PDF Document Time-stamp déclare l'extension de catalogue requise sans câblage supplémentaire.
Version 3.56.14
Ajouts
- Nouvelle API d'augmentation PAdES Document Security Store (DSS).
NewPAdESDSSProcessFromFile/NewPAdESDSSProcessFromStream/NewPAdESDSSProcessFromStringouvrent un PDF précédemment signé,AddPAdESDSSCertificate/AddPAdESDSSCRL/AddPAdESDSSOCSPmettent en file le matériel de validation encodé en DER, etEndPAdESDSSProcessToFile/EndPAdESDSSProcessToStream/EndPAdESDSSProcessToStringécrivent une mise à jour incrémentale contenant un dictionnaire/DSS << /Type /DSS /Certs [...] /CRLs [...] /OCSPs [...] >>tel que spécifié par ETSI EN 319 142-1 v1.2.1 §5.4.2.2. C'est la brique de base pour promouvoir une signature PAdES-B-B / B-T en validation à long terme PAdES-B-LT.
Modifications
- Le processus DSS élève automatiquement l'entrée de catalogue
/Extensions /ESICà au moinsExtensionLevel 1lors de l'ajout de matériel de validation, conformément à l'exigence du §5.6, et fusionne les nouveaux certificats, CRL et réponses OCSP dans les tableaux existants/Certs//CRLs//OCSPslors d'invocations répétées afin que les révisions s'accumulent au lieu de s'écraser. GetPAdESDSSProcessResult/ReleasePAdESDSSProcesscomplètent le cycle de vie, reproduisant la surface d'APISignProcessexistante.
Version 3.56.8
Modifications
- Conformité PAdES baseline : lorsqu'une signature est créée avec un SubFilter PAdES (
ETSI.CAdES.detachedouETSI.RFC3161), le catalogue du document reçoit désormais automatiquement l'entrée/Extensions /ESIC <</BaseVersion /1.7 /ExtensionLevel 2>>requise par ETSI EN 319 142-1 v1.2.1 §5.6. L'entrée est ajoutée via la même mise à jour incrémentale qui porte la signature, ne dégrade jamais un/ExtensionLevelexistant plus élevé, et suit les références indirectes/Extensionsou/ESIClorsque le PDF source les stocke déjà comme objets séparés. - Le marqueur d'extension équivalent Adobe écrit par SetSignProcessCustomSubFilter pour les PDF créés via
TPDFlibest désormais/ADBE /BaseVersion /1.7 /ExtensionLevel 8(étaitExtensionLevel 5), correspondant à la déclaration alternative que les signatures PAdES baseline sont autorisées à utiliser ; le niveau 5 ne couvrait que les fonctionnalités formulaires / 3D / RichMedia ISO 32000-2 et n'identifiait pas réellement les extensions PAdES.
Version 3.56.13
Modifications
- Lorsque SetPDFUAMode est actif et que le document est enregistré, tout élément de structure L (liste) auquel manque un attribut
ListNumberingexplicite reçoit désormais automatiquement/O = List /ListNumbering = None. ISO 14289-1 §7.6 requiert que chaque balise L déclare son style de numérotation ; la nouvelle correction au moment de l'enregistrementApplyPDFUAListNumberingrejoint la famille existanteApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationship/ApplyPDFUAStripTrapNet. - Les auteurs qui se soucient d'un style de liste spécifique doivent toujours appeler SetStructElemListNumbering avant EndTag ; l'auto-correction ne se déclenche que lorsqu'aucun attribut ListNumbering n'est présent au moment de l'enregistrement, donc les valeurs explicites sont préservées.
- Le message de diagnostic côté writer
LIST-NO-NUMBERING:Nnote désormais que l'auto-correction masquera le problème au moment de l'enregistrement, afin que les utilisateurs comprennent à la fois l'attribut manquant et le comportement de réparation automatique.
Version 3.56.12
Modifications
- L'audit PDF/UA-1 gagne trois nouvelles vérifications ISO 14289-1.
10031signale les annotations Link dont le dictionnaire d'action URI porte/IsMap = true(interdit par §7.18.5 sauf si une fonctionnalité équivalente est fournie ailleurs dans le contenu ; les auteurs avec un cas d'utilisation IsMap légitime peuvent supprimer le diagnostic par eux-mêmes).10032signale les éléments de structureNoteauxquels manque l'entrée/ID— §7.9 requiert que chaque balise Note déclare un ID unique.10033signale les comptes de paires en double lorsque deux balises Note ou plus partagent la même valeur/ID. - La détection de collision d'ID de Note est effectuée en collectant les ID dans une TStringList triée et en parcourant les paires adjacentes, donc un groupe de trois Notes partageant un seul ID compte comme deux paires en double.
- La vérification d'action URI parcourt le tableau
/Annotsde chaque page, filtre par/Subtype /Link, puis inspecte/A /S /URIet le booléen/IsMap. Les références indirectes sont déréférencées à chaque étape afin que les dictionnaires d'action séparés se comportent de la même manière que ceux en ligne.
Version 3.56.11
Modifications
- ISO 14289-1 §7.6 requiert que chaque élément de structure L (liste) porte un attribut
ListNumberingexplicite.10030(côté reader) etLIST-NO-NUMBERING:N(côté writer) signalent les balises L qui l'omettent. Le parcoureur côté reader décode les deux formes/A(dictionnaire d'attribut unique, ou un tableau de dictionnaires mélangés avec des entiers de révision) et recherche la clé/ListNumberingquel que soit le propriétaire. La vérification côté writer inspecteTPDFStructElem.Attributespour le même nom à la fois dans la liste de structure finalisée et dans la pile de balises encore ouvertes. - Les valeurs
ListNumberingvalides selon ISO 32000-1 Table 347 sontNone,Disc,Circle,Square,Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha. L'audit vérifie uniquement la présence de la clé, pas quelle valeur est choisie — chaque balise L a besoin de l'une d'elles.
Version 3.56.10
Modifications
- L'audit PDF/UA-1 gagne les règles d'encodage TrueType ISO 14289-1 §7.21.6.
10028signale les polices TrueType non symboliques dont/Encoding(ou le/BaseEncodingà l'intérieur d'un dictionnaire Encoding) n'est niMacRomanEncodingniWinAnsiEncoding.10029signale les polices TrueType symboliques qui portent une entrée/Encodingtout court (interdit par §7.21.6 quatrième paragraphe). - Symbolique vs non symbolique est décidé à partir du bit 3 de
/Flagsdu FontDescriptor (masque4), réutilisant l'assistantUAFontDescriptorSymbolicexistant de la sous-classe 4. Le premier paragraphe complet du §7.21.6 (le programme TrueType intégré doit contenir des entrées cmap correspondantes) requiert l'analyse du programme de police TrueType et est toujours en attente ; les règles au niveau du dictionnaire ci-dessus sont la couche pratique que cet audit peut vérifier sans analyseur TrueType. - Les règles de tableau Differences dans §7.21.6 (noms de glyphe AGL uniquement, présence de cmap Microsoft Unicode) restent hors de portée pour la même raison — elles requièrent l'inspection du programme de police.
Version 3.56.9
Modifications
- L'audit PDF/UA-1 gagne une vérification ISO 14289-1 §7.18.4 complète.
10027signale les annotations Widget dont/StructParentse résout via le/ParentTreede l'arbre de structure mais ne se termine pas sur un élément de structure avec/S = Form. La précédente vérification partielle v3.56.7 (10026) ne détectait que les Widgets auxquels manquait entièrement/StructParent; la nouvelle vérification complète la règle en suivant le pointeur d'arbre numérique et en vérifiant la balise de destination. - Un nouvel assistant
NumberTreeLookupimplémente la forme d'arbre numérique ISO 32000-1 §7.9.7 (racine plate/Nums,/Kidsintermédiaires délimités par/Limits). Les futurs audits qui ont besoin de résoudre les entrées de page/StructParentsou les étiquettes/PageLabelspeuvent le réutiliser. - La vérification de balise Form pour annotation Widget utilise un modèle à deux niveaux : un Widget sans
/StructParentest signalé comme10026; un Widget dont/StructParentexiste mais ne se résout pas en/S = Formest signalé comme le plus spécifique10027. Cela évite de compter deux fois la même violation sous les deux codes.
Version 3.56.7
Modifications
- Lorsque SetPDFUAMode est actif et que le document est enregistré, toute entrée d'annotation
TrapNetest désormais automatiquement supprimée du tableau/Annotsde chaque page. ISO 14289-1 §7.18.2 interdit les annotationsTrapNet; la nouvelle correction au moment de l'enregistrementApplyPDFUAStripTrapNetrejoint la famille existanteApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationshipafin que les documents en mode PDF/UA cessent d'émettre silencieusement des résidusTrapNet. - L'audit PDF/UA-1 gagne une vérification partielle §7.18.4.
10026signale les annotations Widget auxquelles manque/StructParent— un Widget sans/StructParentne peut pas être atteint depuis l'arbre de structure et ne peut donc pas être imbriqué dans une balise de structureForm. La vérification structurelle complète (résolution de/StructParentvia leParentTreeet confirmation que le/Sparent estForm) est laissée à une version de suivi. - GetPDFUADiagnostics côté writer gagne l'incident correspondant
WIDGET-NO-STRUCTPARENT:N. Le message TRAPNET-ANNOT existant note également désormais que SetPDFUAMode les supprime automatiquement au moment de l'enregistrement.
Version 3.56.6
Modifications
- L'audit PDF/UA-1 gagne deux vérifications de hiérarchie de titres ISO 14289-1 §7.4.2.
10024signale lorsque le premier élément de titre dans l'ordre du document n'est pas H1 (ou H).10025signale le nombre de sauts de niveau de titre dans une séquence descendante (par ex. H1 suivi de H3 sans H2). Les deux vérifications partagent un seul parcours en préordre de l'arbre de structure qui décode les formes/Kimbriquées (StructElem unique, tableau de StructElems / IndRefs / MCRs). - GetPDFUADiagnostics côté writer gagne l'incident correspondant
FIRST-HEADING-NOT-H1, parité avec le reader10024. La vérification writer HEADING-LEVEL-SKIP précédemment existante a désormais une compagne qui attrape également les problèmes de style « le premier titre était H2 ».
Version 3.56.5
Modifications
- Lorsque SetPDFUAMode est actif et que le document est ultérieurement chiffré, la clé d'autorisation de chiffrement (
/Pdans le dictionnaire de chiffrement) a désormais automatiquement le bit 10 (masque$200, « Extraire le texte et les graphiques en support à l'accessibilité ») défini, même lorsque l'appelant n'a pas inclusppCanCopyAccessdans lesTPDFExtraPermissionspassées à Encrypt. ISO 14289-1 §7.16 requiert que chaque fichier chiffré conforme permette l'extraction pour accessibilité, et le bit est par ailleurs facile à oublier. Le bit est toujours sûr à définir — il n'accorde qu'un accès supplémentaire aux technologies d'assistance, pas aux autres chemins d'extraction. - GetPDFUADiagnostics côté writer gagne un nouvel incident
ENCRYPT-NO-ACCESSqui se déclenche lorsque PDFUAMode est actif et que le bit 10 de/Pdu dictionnaire de chiffrement est effacé. Cela attrape le cas limite d'ordre d'appel dans lequel l'utilisateur a appeléEncrypt()en premier et SetPDFUAMode seulement après — le diagnostic indique à l'utilisateur d'appeler à nouveauEncrypt()afin que le dictionnaire de chiffrement soit ré-émis avec le/Pcorrigé.
Version 3.56.4
Modifications
- GetPDFUADiagnostics côté writer gagne cinq nouvelles vérifications ISO 14289-1 afin que l'audit de document en mémoire attrape les mêmes violations que l'audit ComplianceTest=2 de CheckFileCompliance côté reader.
SUSPECTS-TRUEsignale MarkInfo/Suspects=true (§7.1 : les fichiers conformes PDF/UA requièrent Suspects=false).ROLEMAP-STANDARD-REMAP:Nsignale les appels AddRoleMap qui remapperaient une balise de structure standard — §7.1 interdit de remapper les balises standard.DC-TITLE-MISSINGsignale un XMP dc:title vide (distinct de DOCINFO-TITLE-MISSING, qui vérifie /Info /Title).TRAPNET-ANNOT:Nsignale les annotations TrapNet (§7.18.2 les interdit).ANNOT-PAGE-NO-TABS-S:Nsignale les pages portant des annotations dont le dictionnaire de page /Tabs n'est pas /S (§7.18.3 requiert un ordre de tabulation par arbre de structure sur ces pages). - Les audits PDF/UA-1 côté writer et côté reader sont désormais à peu près à parité : chaque incident que l'audit côté reader signale sur un fichier enregistré est également atteignable depuis le diagnostic en mémoire, modulo les conventions de format de chaque fonction (texte séparé par sauts de ligne vs liste de chaînes de code NNNNN).
Version 3.56.3
Modifications
- L'audit PDF/UA-1 gagne ses vérifications de polices §7.21.
10020signale toute police non Standard-14 dont le FontDescriptor manqueFontFile/FontFile2/FontFile3(§7.21.4.1 : chaque police rendue doit intégrer son programme).10021signale les descendants CIDFontType2 sans entrée/CIDToGIDMap(§7.21.3.2).10022signale les polices Standard 14 (Helvetica, Times, Courier, Symbol, ZapfDingbats et variantes gras / oblique) référencées sans programme intégré — §7.21.4 NOTE 5 indique clairement qu'il n'y a pas d'exemption d'intégration pour ces polices.10023signale les polices auxquelles manque une CMap/ToUnicodeet qui ne correspondent pas à la liste d'exemption du §7.21.7 (encodages prédéfinis MacRoman / MacExpert / WinAnsi, Type 0 avec collections de caractères Adobe-GB1 / CNS1 / Japan1 / Korea1, TrueType non symbolique). - Les polices composites Type 0 sont inspectées aux deux couches :
/ToUnicodesur le dictionnaire parent Type 0 lui-même, et l'intégration //CIDToGIDMapsur le premier CIDFont descendant. Les polices Type 3 sautent la vérification d'intégration (leurs glyphes sont des CharProcs en ligne) mais participent toujours à la vérification/ToUnicode. - Les assistants PDFlibPDFA pour un travail de polices similaire n'ont volontairement pas été partagés — une demi-douzaine de routines courtes (suppression de préfixe de sous-ensemble, table de noms Standard-14, présence de FontFile, drapeau Symbolic) sont dupliquées localement comme assistants
UA*afin que l'audit PDF/A puisse continuer d'évoluer sans casser PDF/UA, et vice versa.
Version 3.56.2
Modifications
- L'audit PDF/UA-1 gagne cinq vérifications ISO 14289-1 supplémentaires couvrant les annotations, fichiers intégrés et contenu optionnel.
10015signale les annotations Link auxquelles manque une description alternative/Contentsnon vide (§7.18.5) afin que les lecteurs d'écran puissent annoncer les cibles de lien.10016et10017signalent les dictionnaires FileSpec de fichier intégré auxquels manquent les clés requises de nom de fichier/Fou/UF(§7.11).10018signale les dictionnaires de configuration de contenu optionnel qui omettent une chaîne de texte/Namenon vide (§7.10).10019signale les dictionnaires de configuration de contenu optionnel qui contiennent la clé interdite/AS(§7.10). - Le parcours d'annotations par page qui alimentait déjà les vérifications TrapNet et
/Tabs /Scollecte désormais également les données Link //Contentsdans la même passe, gardant l'audit en O(N) sur le nombre d'objets.
Version 3.56.1
Modifications
- L'audit PDF/UA-1 gagne cinq nouvelles vérifications ISO 14289-1.
10010vérifie l'autorisation d'extraction pour accessibilité (bit 10 de la clé/Pde chiffrement) sur les fichiers chiffrés (§7.16).10011détecte les formulaires XFA dynamiques via l'élément<dynamicRender>required</dynamicRender>à l'intérieur du paquet XFA XDP (§7.15).10012signale les Form XObjects qui portent une entrée/Ref— les XObjects de référence sont interdits (§7.20).10013signale les annotationsTrapNet(§7.18.2).10014parcourt chaque page et signale toute page portant des annotations dont le dictionnaire de page ne définit pas/Tabs /S(§7.18.3) afin que l'ordre de tabulation suive l'arbre de structure. - Les cinq nouveaux codes passent par la même paire de handles CheckFileCompliance + GetStringListItem ajoutée dans la version précédente — il n'y a pas de nouvelle surface d'API publique.
Version 3.56.0
Ajouts
- Nouvel audit côté reader
CheckCompliancePDFUAvalide un PDF externe contre ISO 14289-1 (PDF/UA-1). Il complète la vérification côté writer existante GetPDFUADiagnostics en acceptant tout PDF d'entrée (sortie propre, sortie de scanner, contenu tiers) et en listant les violations PDF/UA-1 de la même manière que CheckFileCompliance signale déjà les problèmes PDF/A.
Modifications
- CheckFileCompliance accepte désormais
ComplianceTest = 2pour exécuter le nouvel audit PDF/UA-1. Le test PDF/A sousComplianceTest = 1est inchangé, et la liste d'incidents transite toujours via la paire de handles existante GetStringListCount / GetStringListItem. - La première mouture couvre les portes de conformité PDF/UA-1 fondamentales du §5 (identification XMP
pdfuaid:part) et du §7.1 (flux/Metadatadu catalogue, marqueur tagged-PDF, arbre de structure, préférence de titre de visionneuse, langue du document, XMPdc:title, valeur/Suspects, et l'interdiction de remapper les balises de structure standard). Huit codes de diagnostic sont émis —10001à10009— gardant la plage numérique visuellement séparée des codes PDF/A00xxx. - Les clauses PDF/UA-1 plus profondes (sécurité, annotations, XObjects, sous-ensemble de polices) sont suivies pour des versions correctives ultérieures sur le même cadre d'audit.
Version 3.55.6
Modifications
- Chaque paquet XMP nouvellement généré porte désormais une propriété xmpMM:InstanceID au format uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. L'identifiant est généré via Win32 CoCreateGuid et donne à chaque document produit une empreinte unique et indépendante de la version comme recommandé par ISO 19005-1 §6.7.2 (Cor2) et les guides de bonnes pratiques PDF/A. Les builds non Windows (où le paquet XMP reste vide) ne sont pas affectés.
- L'espace de noms xmpMM (http://ns.adobe.com/xap/1.0/mm/) fait désormais partie des SelectionNamespaces du paquet XMP ; les nouveaux assistants SetXMPMM et GenerateInstanceID sous-tendent l'émission d'InstanceID et fournissent la base pour le futur support xmpMM:History / xmpMM:DerivedFrom.
- Le schéma de description PDF/A Extension Schema (pdfaExtension / pdfaSchema / pdfaProperty / pdfaType / pdfaField) n'est pas ajouté dans cette version. La création d'un schéma d'extension personnalisé nécessite une construction multi-étape de propriétés bag / seq / structurées au-delà de la forme actuelle SetDublinCore / SetXMPBasic ; le travail est suivi pour une version future. Les documents qui ont besoin de déclarer des propriétés XMP personnalisées continuent à se replier sur le chemin LoadFromString.
Version 3.55.5
Modifications
- Les documents PDF/A ont désormais leurs drapeaux /F d'annotation normalisés au moment de l'enregistrement. ISO 19005-1 §6.5.3 requiert que le bit Print soit 1 et les bits Hidden / Invisible / NoView soient 0 sur chaque annotation ; le writer applique désormais ce masque au moment de l'enregistrement afin que les appelants n'aient pas à se rappeler la disposition des bits. Le cas /Subtype /Popup est exempté — les popups sont enfants d'autres annotations et traditionnellement non imprimés.
- Le drapeau AcroForm /NeedAppearances est désormais forcé à false au moment de l'enregistrement lorsque le document est dans tout mode PDF/A. ISO 19005-1 §6.9 requiert que le drapeau soit absent ou false ; précédemment le writer laissait la valeur que l'appelant avait définie, ce qui produisait des documents qui demandaient à la visionneuse de régénérer les apparences à l'ouverture et violait silencieusement la spécification lorsque l'appelant l'avait défini à true. La correction s'exécute également pour les documents qui avaient précédemment le drapeau absent — le writer émet un /NeedAppearances false explicite pour ne laisser aucune ambiguïté au validateur.
Version 3.55.4
Modifications
- AddStandardFont rejette désormais les appels en mode PDF/A. ISO 19005-1 §6.3.4 révoque l'exemption « Standard 14 peut être non intégrée » de la référence PDF : chaque programme de police dans un fichier conforme doit être intégré, et la bibliothèque ne fournit pas les contours Standard 14. La façade retourne 0 silencieusement ; les appelants doivent passer à AddTrueTypeFont ou AddType1Font avec un vrai fichier de police.
- AddTrueTypeFont promeut désormais silencieusement Embed=0 (pas d'intégration) en Embed=1 (intégrer la police complète) lorsque le mode PDF/A est actif. Le chemin de référence non intégré produisait un PDF qui dépendait du repli de police de la visionneuse sur une installation système Arial / Times / Courier, ce qui viole ISO 19005-1 §6.3.4. Les appelants existants qui ont demandé l'intégration (Embed=1 ou 2) ne sont pas affectés.
- La vérification de conformité d'encodage TrueType non symbolique (ISO 19005-1 §6.3.7 Cor2 requiert WinAnsi ou MacRoman comme nom d'encodage ou BaseEncoding, sans /Differences) n'est pas ajoutée dans cette version car la bibliothèque émet déjà /WinAnsiEncoding pour les sous-ensembles TrueType non symboliques, et l'application plus profonde nécessiterait de suivre le dispatch symbolique-vs-non-symbolique à travers le chemin de sous-ensemble. CheckCompliancePDFA 00034 / 00035 (ajouté en v3.51.0) signale toute sortie non conforme au moment de la validation.
Version 3.55.3
Modifications
- Les dictionnaires de police CIDFontType2 soutenus par TrueType portent désormais /CIDToGIDMap /Identity explicitement. ISO 19005-1 §6.3.3.2 (Cor2) requiert que l'entrée soit présente pour chaque CIDFont Type 2 intégré ; la référence PDF permet le défaut Identity implicite, mais PDF/A exige une valeur explicite. Le writer omettait précédemment entièrement la clé, amenant veraPDF (et CheckCompliancePDFA 00033 ajouté en v3.51.0) à signaler le fichier. Le nom /Identity correspond à la disposition GID-comme-CID que le writer produisait déjà implicitement, donc les documents existants se rendent à l'identique.
- FontDescriptor /CharSet (pour les sous-ensembles Type 1) et /CIDSet (pour les sous-ensembles CIDFont) restent TODO ; le writer aurait besoin de suivre quels noms de glyphes / CID se sont retrouvés dans le sous-ensemble pour les remplir avec précision. CheckCompliancePDFA 00031 et 00032 (également ajoutés en v3.51.0) signaleront l'absence afin que les utilisateurs voient le problème au moment de la validation.
Version 3.55.2
Modifications
- AddImageDirectFromString rejette désormais les filtres incompatibles avec PDF/A au point d'entrée. Passer Filter = 'LZWDecode' est rejeté pour chaque partie PDF/A (ISO 19005-1 §6.1.10 plus les règles équivalentes ISO 19005-2 / -3). Passer Filter = 'JBIG2Decode' ou 'JPXDecode' est rejeté pour PDF/A-1 (modes 1 et 2). PDF/A-2 et PDF/A-3 admettent JPXDecode sous ISO 19005-2 §6.2.8.3 avec des contraintes de sous-spécification (nombre de canaux de couleur, uniformité de profondeur de bits, exigences METH/APPROX) que la porte côté writer n'applique pas — les appelants dans ces modes doivent encore s'assurer que le flux JPEG 2000 est conforme. La façade retourne 0 silencieusement lorsqu'un filtre interdit est demandé.
- Les entrées TIFF, PNG, JPEG et JPEG 2000 chargées via AddImageFromFile / AddImageFromStream ne sont pas affectées : l'importeur décompresse les octets source et ré-encode avec FlateDecode (ou DCTDecode pour les charges utiles JPEG), donc l'entrée LZW ne se propage jamais à la chaîne Filter de sortie. Le validateur CheckCompliancePDFA ajouté en v3.50.0 (00004) et v3.52.0 (00022, 00023) fournit une seconde ligne de défense au moment de la validation pour tout chemin indirect qui glisserait encore un filtre interdit dans la sortie.
Version 3.55.1
Modifications
- AddLinkToHideField rejette désormais les appels en mode PDF/A. La version précédente laissait un commentaire affirmant que l'action était compatible PDF/A, mais ISO 19005-1 Cor2 a ajouté /Hide à la liste d'actions interdites (§6.6.1), et ISO 19005-2 / -3 héritent de la restriction. La façade retourne 0 silencieusement lorsqu'appelée en mode PDF/A, correspondant à AddLinkToJavaScript et AddLinkToImportData.
- AddSWFAnnotationFromFile rejette désormais les appels en mode PDF/A. Les annotations SWF / RichMedia enveloppent des médias Flash qui sont interdits par ISO 19005-1 §6.5.2 (pas de sous-types Movie / Sound) et renforcés par ISO 19005-2 §6.3.1 (pas de 3D / Sound / Screen / Movie). La façade retourne 0 silencieusement.
- AddEmbeddedFile et AddLinkToEmbeddedFile rejettent désormais les appels en modes PDF/A-1 et PDF/A-2. ISO 19005-1 §6.1.11 interdit /EF, et ISO 19005-2 §6.8 n'admet que les fichiers PDF/A intégrés ; plutôt que de vérifier la PDF/A-ité récursive de la charge utile attachée, le writer refuse simplement l'appel dans ces modes. PDF/A-3 (SetPDFAMode 5 ou 6) reste autorisé — voir v3.55.0 pour l'injection automatique /AFRelationship.
- SetOpenActionMenu rejette désormais les valeurs MenuItem en dehors de la liste blanche {NextPage, PrevPage, FirstPage, LastPage} lorsque le document est en mode PDF/A. ISO 19005-1 §6.6.1 restreint les actions nommées à cet ensemble, donc précédemment l'API produisait silencieusement des dictionnaires d'Open-Action Find / Print / FullScreen non conformes que veraPDF rejetterait.
- NewOptionalContentGroup rejette désormais les appels en modes PDF/A-1 (SetPDFAMode 1 ou 2). ISO 19005-1 §6.1.13 interdit la clé /OCProperties du catalogue. PDF/A-2 (modes 3/4) et PDF/A-3 (modes 5/6) admettent du contenu optionnel avec les contraintes de leurs §6.9 respectifs, donc la porte ne se déclenche que pour PDF/A-1.
Version 3.55.0
Modifications
- Les documents PDF/A-3 reçoivent désormais automatiquement une entrée /AFRelationship sur chaque fichier intégré. Précédemment un fichier PDF/A-3 créé avec la bibliothèque pouvait échouer à la validation car ISO 19005-3 Annexe E, Table E.1 requiert AFRelationship sur chaque spécification de fichier intégré. Le writer injecte désormais la valeur par défaut configurée ('Unspecified' par défaut) sur tout dictionnaire FileSpec auquel manque l'entrée au moment de l'enregistrement, reproduisant l'auto-injection AFRelationship PDF/UA introduite plus tôt. Seuls les modes PDF/A-3 (SetPDFAMode 5 = PDF/A-3b ou 6 = PDF/A-3a) déclenchent l'auto-injection ; PDF/A-1 et PDF/A-2 rejettent encore les fichiers intégrés tout court selon ISO 19005-1 §6.1.11 et ISO 19005-2 §6.8.
- SetPDFA3DefaultAFRelationship est une nouvelle API qui remplace la valeur par défaut écrite par le writer lorsqu'un fichier intégré manque d'entrée /AFRelationship. Accepte les valeurs ISO 19005-3 Table E.1 'Source' (le fichier intégré est le matériel source qui a produit le contenu PDF), 'Data' (le fichier est les données structurées supportant un tableau ou graphique visuel), 'Alternative' (un rendu alternatif tel qu'une version audio), 'Supplement' (une représentation supplémentaire telle qu'une forme MathML d'une équation), 'Unspecified' (la relation ne peut être caractérisée par ce qui précède), ou tout nom de seconde classe enregistré. Une chaîne vide remet à zéro sur 'Unspecified'. Les surcharges par fichier restent disponibles via SetEmbeddedFileAFRelationship.
- Les nouvelles API sont exposées sur la façade Delphi sous TPDFlib.SetPDFA3DefaultAFRelationship et via la DLL sous DLSetPDFA3DefaultAFRelationship (PWideChar) et DLSetPDFA3DefaultAFRelationshipA (PAnsiChar).
Version 3.54.0
Modifications
- LoadOutputIntentProfile est une nouvelle API qui remplace le profil OutputIntent sRGB fourni par un profil ICC externe chargé depuis le disque. Requis lors de la production de documents PDF/A dans les espaces de couleur DeviceCMYK ou DeviceGray, puisque la bibliothèque ne livre qu'un profil sRGB. L'utilisation typique est d'appeler d'abord SetPDFAMode (qui initialise le squelette OutputIntent), puis LoadOutputIntentProfile('C:\\path\\to\\FOGRA39.icc', 'DeviceCMYK') pour échanger les octets du profil et marquer le document avec le nouvel espace de couleur. Retourne 1 en cas de succès, 0 si fichier introuvable ou espace de couleur inconnu. Exposé sur la façade Delphi sous TPDFlib.LoadOutputIntentProfile et via la DLL sous DLLoadOutputIntentProfile (forme PWideChar) et DLLoadOutputIntentProfileA (forme PAnsiChar). ISO 19005-1 §6.2.2 autorise tout profil ICC enregistré dans le flux DestOutputProfile.
- SetFillColorCMYK, SetTextColorCMYK, SetTextHighlightColorCMYK, SetTextUnderlineColorCMYK, AddSeparationColor, SetFillColorSep, SetLineColorSep, SetTextHighlightColorSep et SetTextColorSep réussissent désormais en mode PDF/A lorsque le profil OutputIntent du document est DeviceCMYK. Précédemment ces API rejetaient chaque appel en mode PDF/A quel que soit l'OutputIntent, ce qui empêchait de produire des documents CMYK conformes. La porte est désormais PDFAMode = 0 OU OutputIntentColorSpace = 'DeviceCMYK', correspondant à la règle ISO 19005-1 §6.2.3.3 selon laquelle DeviceCMYK est permis lorsque l'OutputIntent utilise un profil CMYK, et ISO 19005-1 §6.2.3.4 qui autorise les alternatives Separation dont l'espace de couleur de base est également conforme.
- SetTextShader réussit désormais en mode PDF/A lorsque le profil OutputIntent est soit DeviceRGB soit DeviceCMYK. Les shaders eux-mêmes ne sont pas interdits par PDF/A ; le validateur (côté reader) vérifie que l'espace de couleur interne du shader correspond à l'OutputIntent. Le précédent comportement de rejet strict refusait l'utilisation conforme de shader.
- Le déblocage CMYK / Separation / Shader dépend de la balise OutputIntentColorSpace définie par AddOutputIntent et LoadOutputIntentProfile (introduits en v3.53.0). Appeler SetPDFAMode sans LoadOutputIntentProfile garde l'espace de couleur comme DeviceRGB (le profil sRGB fourni), donc les appels CMYK rejettent encore par défaut — le nouveau comportement est opt-in via LoadOutputIntentProfile.
Version 3.53.0
Modifications
- Le dictionnaire OutputIntent porte désormais les champs squelette PDF/A complets recommandés par ISO 19005-1 §6.2.2 et le preflight Adobe Acrobat : /OutputCondition (description lisible de la condition de couleur), /Info (texte d'identification long), et /RegistryName (URL de registre, par défaut http://www.color.org). Les valeurs par défaut sont "sRGB IEC61966-2.1" / "sRGB IEC61966-2.1" / "http://www.color.org" pour les sites d'appel hérités à argument unique ; la nouvelle surcharge AddOutputIntent prend les quatre champs personnalisés directement afin que les appelants puissent les remplir pour leurs propres conditions de couleur.
- AddOutputIntent gagne une nouvelle surcharge à cinq arguments : AddOutputIntent(ColorSpace, OutputConditionIdentifier, OutputCondition, Info, RegistryName). La forme héritée à argument unique continue de fonctionner inchangée ; elle délègue désormais à la nouvelle surcharge avec les défauts sRGB. L'argument ColorSpace sélectionne également le nombre de composants /N écrit dans le dictionnaire de profil ICC intégré (3 pour DeviceRGB, 4 pour DeviceCMYK, 1 pour DeviceGray) ; le profil intégré lui-même reste le flux sRGB fourni jusqu'à ce que la prochaine API LoadOutputIntentProfile arrive en v3.54.0.
- TPDFDocument expose OutputIntentColorSpace comme propriété lecture/écriture suivant l'espace de couleur du dernier appel AddOutputIntent. Cela devient la condition de porte pour les restrictions côté writer CMYK / Separation / Shader en v3.54.0, où les API de couleur qui aujourd'hui rejettent chaque appel en mode PDF/A rejetteront uniquement lorsque l'espace de couleur ne correspond pas à l'OutputIntent.
Version 3.52.0
Modifications
- CheckCompliancePDFA audite désormais les annotations, l'état graphique, les actions et les Form XObjects, complétant la couverture du validateur PDF/A côté reader des chapitres ISO 19005-1 6.2-6.6 et des règles différentielles équivalentes PDF/A-2/-3. Le validateur signale 14 nouvelles classes d'incidents (00050-00067) : sous-types d'annotation interdits (00050 ; ISO 19005-1 §6.5.2 interdit FileAttachment / Sound / Movie pour PDF/A-1, et ISO 19005-2 §6.3.1 interdit 3D / Sound / Screen / Movie pour PDF/A-2 et PDF/A-3), /CA d'annotation autre que 1.0 (00051 ; §6.5.3), /F d'annotation manquant ou avec Print=0 / Hidden=1 / Invisible=1 / NoView=1 (00052 ; §6.5.3, avec /Subtype /Popup exempté), /AA d'annotation (00054 ; §6.6.2), dictionnaire d'apparence d'annotation avec des clés autres que /N ou valeur /N non conforme (00055 ; §6.5.3 Cor2), annotation Widget avec /A (00056 ; §6.9), ExtGState /TR (00058 ; §6.2.8), ExtGState /TR2 autre que /Default (00059 ; §6.2.8), et en PDF/A-1 uniquement : ExtGState /SMask autre que /None (00061 ; §6.4), /BM autre que Normal ou Compatible (00062 ; §6.4), /CA ou /ca autre que 1.0 (00063 ; §6.4).
- L'audit action-partout (00064, 00065) remplace la vérification OpenAction-seulement de v3.50.0 par un balayage complet qui signale les valeurs d'action /S interdites (Launch, Sound, Movie, ResetForm, ImportData, JavaScript, Hide, SetState, NOP, Trans, GoTo3DView, Rendition, SetOCGState) et les actions nommées dont /N est en dehors de {NextPage, PrevPage, FirstPage, LastPage} quel que soit l'endroit où vit l'action (annotation /A, widget /A, outline /A, catalogue /OpenAction, etc.). ISO 19005-1 §6.6.1.
- L'audit XObject (00066, 00067) signale les XObjects PostScript et Reference, plus les clés interdites sur les Form XObjects (/OPI, /PS, /Subtype2 = /PS) et les Image XObjects (/Alternates, /OPI, /Interpolate true). ISO 19005-1 §6.2.4 - §6.2.7.
Version 3.51.0
Modifications
- CheckCompliancePDFA audite désormais la conformité des polices et des espaces de couleur en plus des vérifications structurelles ajoutées en v3.50.0. Le validateur signale neuf nouvelles classes d'incidents : au moins un programme de police n'est pas intégré (00030 ; ISO 19005-1 §6.3.4 requiert que chaque programme de police, y compris les substitutions Standard 14, soit intégré), sous-ensemble Type 1 sans /CharSet dans son FontDescriptor (00031 ; §6.3.5), sous-ensemble CIDFont sans /CIDSet (00032 ; §6.3.5), CIDFontType2 sans /CIDToGIDMap (00033 ; §6.3.3.2 Cor2), TrueType non symbolique avec un /Encoding non conforme (00034 ; §6.3.7 Cor2 requiert WinAnsi/MacRoman directement ou comme BaseEncoding, sans /Differences), TrueType symbolique qui porte encore /Encoding (00035 ; §6.3.7 Cor2), au moins une police sans /ToUnicode dans les documents PDF/A-Na ou PDF/A-Nu (00036 ; exemption en quatre classes §6.3.8 appliquée), espace de couleur ICCBased qui n'intégre pas son flux de profil (00037 ; §6.2.3.2), et un fichier qui utilise à la fois DeviceRGB et DeviceCMYK (00038 ; §6.2.3.3 interdit le mélange).
- La vérification /ToUnicode (00036) est limitée aux niveaux de conformité A et U car seuls ces niveaux requièrent un mappage Unicode selon ISO 19005-1 §6.3.8 et ISO 19005-2 §6.2.11.7. Les fichiers de niveau B (PDF/A-1b, PDF/A-2b, PDF/A-3b) ne sont pas signalés. L'exemption en quatre classes reconnaît les encodages prédéfinis (MacRomanEncoding, MacExpertEncoding, WinAnsiEncoding), les BaseFonts Type 1 Standard 14 comme proxy pour les polices Adobe Standard Latin / Symbol à noms de glyphes, et les polices Type 0 dont le CIDFont descendant utilise les registres Adobe-GB1, Adobe-CNS1, Adobe-Japan1 ou Adobe-Korea1.
- L'audit de polices parcourt chaque dictionnaire de police, le classifie par Subtype (Type1, MMType1, TrueType, Type3, Type0 avec son descendant CIDFontType0 ou CIDFontType2), puis dispatche les vérifications pertinentes. Les polices composites Type 0 délèguent les vérifications d'intégration et de sous-ensemble à leur CIDFont descendant tout en gardant /ToUnicode sur l'enveloppe Type 0. La détection de sous-ensemble utilise la convention standard du préfixe de six lettres majuscules.
Version 3.50.0
Modifications
- CheckCompliancePDFA signale désormais 15 incidents de non-conformité PDF/A supplémentaires que le validateur omettait précédemment : tableau trailer /ID manquant (00013), flux /Metadata du catalogue de document manquant (00014), /Filter appliqué au flux /Metadata (00015), dictionnaires de flux qui référencent des fichiers externes via /F, /FFilter ou /FDecodeParms (00016), fichiers intégrés déclarés via /EF dans tout dictionnaire de spécification de fichier ou via l'entrée d'arbre de noms /EmbeddedFiles dans les documents PDF/A-1 (00017, 00018), /OpenAction pointant vers un type d'action interdit (00019), dictionnaires d'action additionnelle /AA dans le catalogue de document ou toute page (00020, 00021), filtres JBIG2Decode ou JPXDecode dans les documents PDF/A-1 (00022, 00023), filtres Crypt dont le /Name n'est pas /Identity (00024), /Requirements dans le catalogue de document (00025), /Perms avec des clés autres que /UR3 et /DocMDP (00026), et /AcroForm /NeedAppearances défini à true (00027). Le validateur signale désormais les types d'action /OpenAction de catalogue interdits (/Launch, /Sound, /Movie, /ResetForm, /ImportData, /JavaScript, /Hide, /SetState, /NOP, /Trans, /GoTo3DView, /Rendition, /SetOCGState) et les valeurs /N d'action nommée en dehors de la liste blanche {NextPage, PrevPage, FirstPage, LastPage} selon ISO 19005-1 §6.6.1.
- Les vérifications spécifiques aux filtres (JBIG2Decode, JPXDecode) et les vérifications de fichiers intégrés (/EF, /EmbeddedFiles) restent limitées à PDF/A-1 car ISO 19005-2 §6.2.8.3 et §6.8 relâchent explicitement ces restrictions pour PDF/A-2 et PDF/A-3. Les vérifications de structure de document (/Metadata, /AcroForm /NeedAppearances, /OpenAction, /AA, /Requirements, /Perms) s'appliquent à chaque partie PDF/A.
Corrections
- L'analyseur PDFAID accepte le suffixe de conformité U (PDF/A-2U, PDF/A-3U) aux côtés des variantes A et B existantes, donc CheckCompliancePDFA ne lève plus un avertissement fallacieux "00005 PDFA Mark NOT Found or invalid" lors du scan d'un fichier PDF/A-2U ou PDF/A-3U produit par un autre outil. Les niveaux de conformité de mappage Unicode ajoutés en ISO 19005-2:2011 sont désormais reconnus par le validateur.
Version 3.49.0
Modifications
- AddLinkToImportData crée une annotation Link dont l'action est une action PDF d'import de données (/S /ImportData) qui remplit les champs AcroForm du document à partir d'un fichier FDF externe lorsque l'utilisateur clique sur le lien (ISO 32000-1 §12.6.4.8, Table 198). Le paramètre FileName est référencé comme un dictionnaire filespec, avec les mêmes règles de normalisation de chemin utilisées par AddLinkToFile / AddLinkToFileEx (les antislashes sont convertis en slashes selon ISO 32000-1 §7.11.2.1). Le bit 0 d'Options active la bordure visible et les bits 1–3 sélectionnent le mode de surbrillance du lien (Invert, Outline, Push), conformément aux conventions existantes AddLinkTo*. PDF 1.4 ou ultérieur. NON autorisé en PDF/A car l'action référence une ressource externe ; la façade retourne silencieusement 0 lorsqu'appelée en mode PDF/A. Exposé dans la bibliothèque Delphi et l'interface DLL sous DLAddLinkToImportData / DLAddLinkToImportDataA (formes PWideChar et PAnsiChar).
Version 3.48.0
Modifications
- AddLinkToHideField crée une annotation Link dont l'action est une action PDF de masquage (/S /Hide) basculant la visibilité d'un ou plusieurs champs AcroForm lorsque l'utilisateur clique sur le lien (ISO 32000-1 §12.6.4.10, Table 196). FieldNames accepte un ou plusieurs noms de champs pleinement qualifiés séparés par des virgules, points-virgules ou sauts de ligne ; un nom unique émet /T comme chaîne de texte et deux noms ou plus émettent /T comme tableau, les deux formes étant autorisées par la spécification. HideFlag sélectionne le sens de visibilité : une valeur non nulle masque les champs listés (/H true) et zéro les affiche (/H false). Le bit 0 d'Options active la bordure visible et les bits 1–3 sélectionnent le mode de surbrillance du lien (Invert, Outline, Push), conformément à AddLinkToWeb / AddLinkToNamedAction. PDF 1.2 ou ultérieur. Compatible PDF/A car aucune ressource externe n'est référencée. Exposé dans la bibliothèque Delphi et l'interface DLL sous DLAddLinkToHideField / DLAddLinkToHideFieldA (formes PWideChar et PAnsiChar).
Version 3.47.0
Modifications
- AddLinkToNamedAction crée une annotation Link dont l'action est une action nommée PDF (/S /Named) déclenchant l'une des quatre commandes standard de navigation de visionneuse définies dans ISO 32000-1 §12.6.4.11, Table 194 : NextPage, PrevPage, FirstPage et LastPage. Le paramètre NamedActionType sélectionne la commande (0=NextPage, 1=PrevPage, 2=FirstPage, 3=LastPage) ; les valeurs hors de cet intervalle se replient sur NextPage afin que le writer émette toujours un nom /N conforme à la spécification. Le bit 0 d'Options active la bordure visible et les bits 1–3 sélectionnent le mode de surbrillance du lien (Invert, Outline, Push), conformément aux conventions existantes AddLinkToWeb / AddLinkToPage. L'annotation requiert PDF 1.1 ou ultérieur et est compatible avec PDF/A car aucune ressource externe n'est référencée. Disponible dans la bibliothèque Delphi et les interfaces DLL.
Version 3.46.1
Modifications
- AddCaretAnnotation crée une annotation de balisage caret (PDF /Subtype /Caret) au rectangle donné, marquant une position sur la page où du texte ou contenu a été inséré, omis ou requiert l'attention du réviseur. Prend en charge deux types de symboles (None et Paragraph) via SymbolType (0 / 1), couleur configurable, opacité, titre, contenu et horodatages de création/modification. Définie dans ISO 32000-1 §12.5.6.11. PDF 1.5 ou ultérieur. Disponible dans la bibliothèque Delphi et les interfaces DLL.
- Cette entrée achève le rattrapage des annotations géométriques qui a commencé avec v3.44.0 Square+Circle. PDFlibPas crée désormais des annotations Text, Stamp, FreeText, TextMarkup (Highlight/Underline/Squiggly/StrikeOut), Square, Circle, Line, Polygon, PolyLine, Ink et Caret, en plus du support existant pour Link, FileAttachment, SVG, U3D et SWF.
Version 3.46.0
Modifications
- AddInkAnnotation crée une annotation de balisage encre (PDF /Subtype /Ink) représentant des traits manuscrits ou marques à main levée dessinées sur la page. Les traits sont fournis comme une chaîne unique où plusieurs traits sont séparés par '|' ou retour à la ligne, et à l'intérieur de chaque trait les paires de coordonnées suivent le même format espace/virgule/point-virgule/tabulation utilisé par AddPolygonAnnotation. Par exemple "100 100 110 105 120 110 | 200 200 210 205" décrit deux traits séparés. Prend en charge largeur de bordure configurable, couleur d'encre, opacité, titre, contenu et horodatages. Définie dans ISO 32000-1 §12.5.6.13. PDF 1.3 ou ultérieur. Disponible dans la bibliothèque Delphi et les interfaces DLL.
- Chaque trait doit contenir un nombre pair de valeurs (au moins quatre), sinon l'appel retourne 0 sans écrire d'annotation. Le /Rect est calculé automatiquement à partir de l'étendue combinée de tous les traits plus un petit espacement afin que les traits restent à l'intérieur de la boîte englobante de l'annotation.
Version 3.45.0
Modifications
- AddPolygonAnnotation crée une annotation de balisage polygone fermé (PDF /Subtype /Polygon) avec des sommets fournis comme une chaîne de paires de coordonnées séparées par espaces, virgules, points-virgules ou tabulations (par ex. "100 100 200 100 200 200 100 200"). Prend en charge largeur de bordure configurable, couleur de bordure, couleur de remplissage intérieur optionnelle, opacité, titre, contenu et horodatages. Définie dans ISO 32000-1 §12.5.6.9. PDF 1.5 ou ultérieur. Disponible dans la bibliothèque Delphi et les interfaces DLL.
- AddPolyLineAnnotation crée une annotation de balisage polyligne ouverte (PDF /Subtype /PolyLine) avec le même format de chaîne de sommets et des styles d'extrémité de ligne configurables à chaque terminaison (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash). Définie dans ISO 32000-1 §12.5.6.9. PDF 1.5 ou ultérieur. Disponible dans la bibliothèque Delphi et les interfaces DLL.
- Les deux annotations requièrent au moins deux sommets (quatre nombres) et un nombre total pair de valeurs ; l'appel retourne 0 si la chaîne de sommets ne peut être analysée en une liste de paires valide. Le /Rect est calculé à partir de l'étendue des sommets plus un espacement proportionnel à la largeur de bordure afin que les décorations d'extrémité restent visibles.
- Les deux annotations élèvent la version du document à PDF 1.5 lorsqu'elles sont émises sous un verrou de version minimum inférieur.
Version 3.44.1
Modifications
- AddLineAnnotation crée une annotation de balisage ligne (PDF /Subtype /Line) entre deux extrémités, avec largeur de bordure configurable, couleur de ligne, couleur de remplissage intérieur optionnelle, styles d'extrémité de ligne pour les deux extrémités (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash), opacité, titre, contenu et horodatages de création/modification. Définie dans ISO 32000-1 §12.5.6.7. PDF 1.3 ou ultérieur. Disponible dans la bibliothèque Delphi et les interfaces DLL.
- Le /Rect de l'annotation est calculé à partir des deux extrémités plus un espacement proportionnel à la largeur de bordure afin que les décorations d'extrémité restent à l'intérieur de la boîte englobante de l'annotation.
Version 3.44.0
Modifications
- AddSquareAnnotation crée une annotation de balisage rectangle (PDF /Subtype /Square) au rectangle donné, avec largeur de bordure configurable, couleur de bordure, couleur de remplissage intérieur optionnelle, opacité, titre, contenu et horodatages de création/modification. Définie dans ISO 32000-1 §12.5.6.8. PDF 1.3 ou ultérieur. Disponible dans la bibliothèque Delphi et les interfaces DLL.
- AddCircleAnnotation crée une annotation de balisage ellipse (PDF /Subtype /Circle) inscrite dans le rectangle donné, avec les mêmes bordure, remplissage, opacité, titre, contenu et horodatages configurables que AddSquareAnnotation. Définie dans ISO 32000-1 §12.5.6.8. PDF 1.3 ou ultérieur. Disponible dans la bibliothèque Delphi et les interfaces DLL.
- Les deux nouvelles annotations élèvent automatiquement la version du document à PDF 1.3 lorsqu'elles sont émises sous un verrou de version minimum inférieur et émettent un ensemble standard de champs d'annotation de balisage (/Type /Subtype /Rect /C /IC /BS /Border /CA /F /M /CreationDate /NM /T /Contents /Subj /P) afin que les workflows de relecture existants dans Acrobat, Foxit et Edge puissent les modifier après création.
Version 3.43.0
Modifications
- SetStructElemSpaceBefore et SetStructElemSpaceAfter définissent les attributs /SpaceBefore et /SpaceAfter (propriétaire Layout) sur l'élément de structure actuellement ouvert, exprimant l'espacement avant et après les éléments de niveau bloc en points. Définis dans ISO 32000-1 §14.8.5.4.2 Table 340. Disponibles dans la bibliothèque Delphi, ActiveX (Dispids 73008051/73008052) et les interfaces DLL.
- SetStructElemStartIndent et SetStructElemEndIndent définissent les attributs /StartIndent et /EndIndent (propriétaire Layout), exprimant l'indentation depuis les bords de début et de fin du rectangle de contenu, sensibles au mode d'écriture, en points. Définis dans ISO 32000-1 §14.8.5.4.2 Table 340. Disponibles dans la bibliothèque Delphi, ActiveX (Dispids 73008053/73008054) et les interfaces DLL.
- SetStructElemColor définit l'attribut /Color (propriétaire Layout) comme un triplet RVB (chaque composante 0.0-1.0), décrivant la couleur de premier plan de l'élément pour les moteurs de redistribution et les vérificateurs de contraste de couleur en aval. Défini dans ISO 32000-1 §14.8.5.4.2 Table 340. Disponible dans la bibliothèque Delphi, ActiveX (Dispid 73008055) et les interfaces DLL.
Corrections
- Correction d'un bogue de sérialisation dans BuildStructElemDictRef : les valeurs d'attribut numériques à jeton unique (telles que SpaceBefore, SpaceAfter, StartIndent, EndIndent) étaient écrites comme des noms PDF au lieu de nombres PDF. La correction s'applique aux branches d'attribut à propriétaire unique comme à propriétaires multiples.
Version 3.42.0
Modifications
- Trois nouvelles vérifications de conformité ajoutées : le code 00006 signale les documents chiffrés (le chiffrement est interdit dans toutes les versions PDF/A) ; le code 00007 signale les documents auxquels manque une entrée OutputIntents dans le catalogue (requise par toutes les versions PDF/A) ; les codes 00011 et 00012 signalent les documents auxquels manque MarkInfo ou StructTreeRoot lorsque le niveau de conformité est -a (accessibilité).
Corrections
- CheckCompliancePDFA valide désormais correctement les six modes PDF/A (1a, 1b, 2a, 2b, 3a, 3b). La vérification PDFAID (code 00005) accepte n'importe lequel des six marqueurs XMP valides au lieu de seulement '1B'. La vérification de plafond de version (00002) applique 1.4 pour PDF/A-1 et 1.7 pour PDF/A-2 et PDF/A-3.
- La vérification OCProperties (code 00003) est désormais conditionnelle : elle ne s'applique qu'aux documents PDF/A-1, où le contenu optionnel (calques) est interdit. PDF/A-2 et PDF/A-3 autorisent les calques et ne sont plus signalés.
Version 3.41.0
Modifications
- Le mode PDF/A impose désormais les opérations interdites au niveau de l'API. Lorsqu'un mode PDF/A est actif (l'un quelconque des modes 1-6), les appels à SetEncryption, AddSeparationColor, SetFillColorCMYK, SetTextColorCMYK ou toute autre API CMYK/Separation/Shader retournent 0 et n'ont aucun effet, conformément à l'exigence PDF/A d'un seul output intent sRGB.
- La transparence est interdite en PDF/A-1 (modes 1 et 2) : SetTransparency, SetBlendMode et SetPageTransparencyGroup retournent 0 et sont sans effet lorsque le mode actif est 1 ou 2. PDF/A-2 et PDF/A-3 (modes 3-6) autorisent une transparence limitée et ne sont pas restreints.
- Les actions JavaScript sont interdites dans tous les modes PDF/A (1-6) : SetOpenActionJavaScript, PageJavaScriptAction, DocJavaScriptAction, AddGlobalJavaScript et AddLinkToJavaScript retournent tous 0 et sont sans effet lorsqu'un mode PDF/A est actif. ISO 19005-1 §6.6.1 interdit explicitement JavaScript dans les documents PDF/A.
- Les API de pièces jointes (EmbedFile, AddFileAttachment) sont bloquées dans les modes PDF/A-1 et PDF/A-2 (1-4). Elles restent fonctionnelles dans PDF/A-3 (modes 5 et 6), qui autorise explicitement des fichiers intégrés arbitraires.
Version 3.40.0
Ajouts
- SetPDFAMode prend désormais en charge les niveaux de conformité PDF/A-2 et PDF/A-3. Passer NewMode=3 pour PDF/A-2b, 4 pour PDF/A-2a, 5 pour PDF/A-3b ou 6 pour PDF/A-3a. PDF/A-2 vise PDF 1.7 et autorise les calques, formulaires interactifs, images JPEG2000 et transparence limitée. PDF/A-3 étend PDF/A-2 en autorisant des fichiers intégrés arbitraires (tout type MIME). Toutes les variantes -a écrivent automatiquement /MarkInfo et les marqueurs de structure tagged-PDF requis par le niveau de conformité d'accessibilité.
Modifications
- GetInformation(201) retourne '1' à '6' correspondant au mode PDF/A actif, conformément à la nouvelle numérotation des modes.
Corrections
- Corrigé : SetPDFAMode(1) (PDF/A-1a) était précédemment sans effet en raison d'un bogue de routage interne introduit en v3.20.0. Il écrit désormais correctement /MarkInfo et /OutputIntents et définit XMP pdfaid:part=1/conformance=A.
Version 3.39.0
Modifications
- SetStructElemWritingMode définit l'attribut /WritingMode (propriétaire Layout) sur l'élément de structure actuellement ouvert. Les valeurs valides sont LrTb (de gauche à droite, par défaut pour les écritures latines), RlTb (de droite à gauche, pour l'arabe et l'hébreu) et TbRl (de haut en bas, de droite à gauche, pour le texte vertical CJK traditionnel). Défini dans ISO 32000-1 §14.8.5.4.2 Table 340. Disponible dans la bibliothèque Delphi, ActiveX (Dispid 73008049) et les interfaces DLL.
- SetStructElemListNumbering définit l'attribut /ListNumbering (propriétaire List) sur l'élément de structure actuellement ouvert. Les valeurs prises en charge incluent None, Disc, Circle, Square (marqueurs non ordonnés) et Decimal, UpperRoman, LowerRoman, UpperAlpha, LowerAlpha (numérotation ordonnée). L'attribut est défini sur l'élément L (list) et permet aux technologies d'assistance d'annoncer correctement le type de liste. Défini dans ISO 32000-1 §14.8.5.3.2 Table 336. Disponible dans la bibliothèque Delphi, ActiveX (Dispid 73008050) et les interfaces DLL.
Version 3.38.0
Modifications
- SetStructElemColSpan définit l'attribut /ColSpan (propriétaire Table) sur l'élément de structure actuellement ouvert, indiquant sur combien de colonnes la cellule s'étend. Défini dans ISO 32000-1 §14.8.5.7.2 Table 337. Disponible dans la bibliothèque Delphi, ActiveX (Dispid 73008047) et les interfaces DLL.
- SetStructElemRowSpan définit l'attribut /RowSpan (propriétaire Table) sur l'élément de structure actuellement ouvert, indiquant sur combien de lignes la cellule s'étend. Défini dans ISO 32000-1 §14.8.5.7.2 Table 337. Disponible dans la bibliothèque Delphi, ActiveX (Dispid 73008048) et les interfaces DLL.
- Les deux fonctions sont des wrappers de commodité équivalents à l'appel à AddTagAttribute avec Owner='Table' et le nom d'attribut respectif. Elles complètent SetStructElemScope pour des cellules de tableau pleinement décrites dans des tableaux complexes ou à en-têtes étendus.
Version 3.37.2
Modifications
- GetPDFUADiagnostics signale désormais FORM-NO-TOOLTIP:N lorsque N champs de formulaire interactifs (annotations Widget) ne disposent pas d'une entrée TU (info-bulle / nom accessible). ISO 14289-1 §7.18.4 requiert que tous les champs de formulaire interactifs portent une entrée TU afin que les technologies d'assistance puissent annoncer le but du champ à l'utilisateur lorsque le champ reçoit le focus. /TU est le nom accessible que les lecteurs d'écran prononcent à voix haute ; il est distinct de /T, qui est le nom partiel de champ utilisé pour l'accès programmatique et la soumission de formulaire.
Version 3.37.1
Modifications
- GetPDFUADiagnostics signale désormais LIST-STRUCT:N lorsque N éléments de structure LI ou LBody apparaissent en dehors de leur élément parent requis. ISO 32000-1 §14.8.4.4 requiert que LI soit un enfant direct de L (liste) et que LBody soit un enfant direct de LI (élément de liste). Une imbrication de listes mal formée empêche les technologies d'assistance de parcourir et annoncer correctement le contenu de la liste, et peut provoquer des échecs de validation de structure de document dans les validateurs PDF/UA-1.
Version 3.37.0
Modifications
- BeginTagEx2 est une nouvelle API qui ouvre un élément de structure et définit toutes les propriétés principales de l'élément en un seul appel. En plus des paramètres TagType, AltText, ActualText et Lang de BeginTagEx, BeginTagEx2 accepte Title (/T, pour le panneau de navigation Tags), ElemID (/ID, identifiant unique de l'élément) et Expansion (/E, texte complet d'une abréviation ou d'un acronyme). Passer une chaîne vide pour l'un quelconque de ces trois paramètres additionnels équivaut à omettre le setter correspondant. BeginTagEx2 réduit le code passe-partout pour les éléments bien décrits — plutôt que d'appeler BeginTagEx suivi de SetStructElemTitle, SetStructElemID et SetStructElemExpansion séparément, toutes les sept propriétés peuvent être définies en un seul appel. La fonction est disponible dans la bibliothèque Delphi, ActiveX (Dispid 73008046) et les interfaces DLL.
Version 3.36.1
Modifications
- GetPDFUADiagnostics signale désormais TABLE-TH-NO-SCOPE:N lorsque N éléments de structure TH (cellules d'en-tête de tableau) sont dépourvus d'attribut Scope. ISO 32000-1 §14.8.4.3.4 Table 337 définit Scope (Row, Column ou Both) comme l'attribut qui décrit à quelles cellules de données une cellule d'en-tête s'applique. Sans lui, les lecteurs d'écran et autres technologies d'assistance ne peuvent pas associer de façon fiable les cellules d'en-tête aux cellules de données dans des tableaux complexes ou multi-en-têtes, ce qui est requis par ISO 14289-1 §7.5. Appelez SetStructElemAttr('Table','Scope', 'Column') (ou 'Row' / 'Both') immédiatement après avoir balisé chaque élément TH.
Version 3.36.0
Modifications
- SetStructElemExpansion est une nouvelle API qui définit l'entrée /E (texte d'expansion) sur l'élément de structure actuellement ouvert (ISO 32000-1 §14.9.5). Le texte d'expansion est la forme pleinement épelée d'une abréviation ou d'un acronyme contenu dans l'élément — par ex. "World Wide Web" pour un Span dont le texte est "WWW". Les lecteurs d'écran prononcent l'expansion au lieu de tenter de prononcer les caractères abrégés, ce qui est essentiel pour l'accessibilité des contenus techniques et scientifiques. PDF/UA-1 (ISO 14289-1 §7.2) requiert que la langue naturelle soit déterminable sans ambiguïté ; /E est le mécanisme standard pour les abréviations et acronymes. La fonction est disponible dans la bibliothèque Delphi, ActiveX et les interfaces DLL.
Version 3.35.1
Modifications
- GetPDFUADiagnostics signale désormais DOCINFO-TITLE-MISSING lorsque l'entrée /Title du dictionnaire d'information du document est absente ou vide. PDF/UA-1 (ISO 14289-1) requiert un titre de document afin que les lecteurs d'écran puissent l'annoncer lorsque le document est ouvert. La vérification existante DISPLAYDOCTITLE-FALSE confirme que le titre est affiché dans la barre de titre de la visionneuse ; DOCINFO-TITLE-MISSING est complémentaire — elle confirme que la valeur de titre elle-même est définie. Appelez SetDocumentInfo('Title', ...) pour fournir la valeur.
Version 3.35.0
Modifications
- SetStructElemTitle est une nouvelle API qui définit l'entrée /T (titre) sur l'élément de structure actuellement ouvert (ISO 32000-1 §14.7.2 Table 324). Le titre est une étiquette lisible par un humain qui identifie l'instance spécifique de l'élément — par exemple "Chapter 1", "Summary Table" ou "Figure 3: Quarterly Sales" — et est affiché dans le panneau de navigation Tags des visionneuses PDF et utilisé par les outils de remédiation d'accessibilité. /T est distinct de /Alt (texte alternatif pour les utilisateurs avec déficience de rendu) et /ActualText (correction de texte au niveau glyphe) ; il est le plus utile sur des éléments conteneurs non textuels tels que Table, Figure, Form, Sect et Div. Passez une chaîne vide pour effacer une valeur précédemment définie. La fonction est disponible dans la bibliothèque Delphi, ActiveX et les interfaces DLL.
Version 3.34.0
Modifications
- SetStructElemAltText est une nouvelle API qui définit l'entrée /Alt sur l'élément de structure actuellement ouvert (ISO 32000-1 §14.9.3). Elle équivaut à passer AltText à BeginTag mais permet de définir ou mettre à jour la description de texte alternatif après que l'élément a été ouvert — utile lorsque la description est calculée séparément du type d'élément. PDF/UA-1 (ISO 14289-1 §7.5) requiert un texte Alt sur les éléments Figure et Formula ; GetPDFUADiagnostics signale déjà FIGURE-NO-ALT:N pour les valeurs manquantes. La fonction est disponible dans la bibliothèque Delphi, ActiveX et les interfaces DLL.
Version 3.33.1
Ajouts
- GetPDFUADiagnostics inclut désormais une vérification ROLEMAP-UNMAPPED:N qui détecte les noms de type d'élément de structure personnalisés utilisés dans le document mais sans entrée dans le dictionnaire /RoleMap. ISO 14289-1 §7.1 et ISO 32000-1 §14.7.3 requièrent que chaque type de structure non standard soit mappé sur un type PDF standard (tel que P, Span ou Figure) afin que les technologies d'assistance puissent déterminer comment traiter l'élément. Lorsque N types non mappés sont trouvés, la description de l'incident inclut la liste des noms de type afin que les appelants sachent quelles entrées AddRoleMap sont nécessaires. Tous les 49 types de structure standard définis dans ISO 32000-1 Table 333 (PDF 1.7) sont reconnus et exclus du rapport.
Version 3.33.0
Modifications
- SetStructElemLang est une nouvelle API qui définit l'entrée /Lang sur l'élément de structure actuellement ouvert (ISO 32000-1 §14.9.2). La balise de langue remplace la langue au niveau document déclarée par SetDocumentLanguage ou SetPDFUAMode pour l'élément et tous ses descendants, permettant aux documents multilingues de marquer chaque portion avec sa balise de langue BCP 47 correcte (par ex. 'en-US', 'fr', 'zh-Hant-TW'). Les lecteurs d'écran utilisent le /Lang au niveau élément pour sélectionner le moteur de synthèse vocale ou la voix appropriée lors de la lecture du document à voix haute. La fonction est disponible dans la bibliothèque Delphi, ActiveX et les interfaces DLL.
Version 3.32.0
Modifications
- SetStructElemActualText est une nouvelle API qui définit l'entrée /ActualText sur l'élément de structure actuellement ouvert (ISO 32000-1 §14.9.4). Utilisez-la pour spécifier le texte Unicode exact qu'une séquence de glyphes représente lorsque l'extraction du flux de contenu donnerait des résultats incorrects — les cas les plus courants sont les glyphes de ligature OpenType (U+FB00 ff, U+FB01 fi, U+FB02 fl) et les abréviations à expansions non évidentes. ActualText complète, plutôt que de remplacer, le contenu rendu ; il remplace ce que les technologies d'assistance et les extracteurs de texte lisent pour cet élément sans supprimer le rendu visuel. La fonction est disponible dans la bibliothèque Delphi, ActiveX et les interfaces DLL.
Version 3.31.1
Modifications
- GetPDFUADiagnostics vérifie désormais les éléments de structure Formula en plus des éléments Figure lors du signalement de texte Alt manquant (FIGURE-NO-ALT:N). ISO 32000-1 §14.9.3 requiert des descriptions alternatives pour à la fois les figures graphiques et les formules mathématiques ; auparavant seuls les éléments Figure étaient scannés.
- GetPDFUADiagnostics signale désormais PDF-VERSION-LOW lorsque la version PDF du document est inférieure à 1.7. PDF/UA-1 (ISO 14289-1) est défini par rapport à PDF 1.7 (ISO 32000-1:2008) ; les documents en PDF 1.5 ou 1.6 ne satisferaient pas les exigences de base de la spécification. Appelez SetPDFUAMode pour élever automatiquement la version à 1.7.
Version 3.31.0
Corrections
- Les identifiants d'élément de structure et l'association des en-têtes de tableau sont désormais pris en charge. SetStructElemID assigne un identifiant de chaîne unique (/ID) à l'élément de structure actuellement ouvert ; les ID sont collectés dans un arbre de noms /IDTree sur la racine de l'arbre de structure lorsque le document est sauvegardé, permettant aux outils d'accessibilité et aux références croisées de localiser les éléments par ID (ISO 32000-1 §14.7.4). SetStructElemHeaders associe la cellule de tableau actuelle (TD ou TH) à une ou plusieurs cellules d'en-tête via une liste séparée par des virgules d'ID précédemment assignés, en écrivant le tableau /Headers dans le dictionnaire de propriétaire d'attribut Table (ISO 32000-1 §14.8.5.7.2). Ensemble, ces deux fonctions prennent en charge le balisage complexe de tableaux pour PDF/UA-1 (ISO 14289-1 §7.10) et WCAG 2.x SC 1.3.1. Les deux fonctions sont disponibles dans la bibliothèque Delphi, ActiveX et les interfaces DLL. AddTagAttribute gère également désormais correctement l'attribut /Headers avec des valeurs délimitées par des virgules écrites comme des tableaux de chaînes de texte PDF.
Version 3.30.1
Ajouts
- GetPDFUADiagnostics inclut désormais une vérification HEADING-LEVEL-SKIP:N qui détecte les sauts de niveau de titre dans l'ordre du document (par ex. un H1 immédiatement suivi d'un H3 sans H2 entre les deux). La vérification effectue un parcours pré-ordre de l'arbre complet des éléments de structure et compte chaque occurrence où le niveau de titre suivant dépasse le précédent de plus d'un. Les éléments H génériques sont traités comme H1. Revenir à un titre de niveau supérieur (H3 → H1) n'est pas compté comme un saut. WCAG 2.x Critère de Succès 1.3.1 et ISO 14289-1 §7.1 requièrent que les titres s'imbriquent sans écart.
Version 3.30.0
Modifications
- Les attributs d'élément de structure sont désormais pris en charge pour les documents tagged-PDF et PDF/UA. Trois nouvelles fonctions d'API permettent d'attacher des attributs à l'élément de structure actuellement construit sur la pile de balises : AddTagAttribute (générique, n'importe quel propriétaire/nom/valeur), SetStructElemScope (wrapper de commodité qui définit l'attribut /Scope sous le propriétaire Table, pour les cellules d'en-tête TH — ISO 32000-1 §14.8.5.7.2) et SetStructElemBBox (wrapper de commodité qui définit l'attribut /BBox sous le propriétaire Layout, pour les figures et autres éléments positionnés visuellement — ISO 32000-1 §14.8.5.4). Lorsque le document est sauvegardé, les attributs sont écrits comme dictionnaires d'attributs /A dans chaque élément de structure ; plusieurs attributs du même propriétaire sont groupés en un seul dict, et les attributs de différents propriétaires sont écrits comme un tableau de dicts. Les trois fonctions sont disponibles dans la bibliothèque Delphi, ActiveX et les interfaces DLL.
Version 3.29.1
Ajouts
- GetPDFUADiagnostics inclut désormais deux vérifications supplémentaires : si des éléments de structure Figure dans le document sont dépourvus d'une valeur de texte Alt (signalé comme FIGURE-NO-ALT:N, selon ISO 14289-1 §7.5 et ISO 32000-1 §14.9.3), et si des éléments de structure sont encore ouverts parce que EndTag n'a pas été appelé (signalé comme STRUCT-UNCLOSED:N). La vérification de figure effectue un parcours récursif complet de l'arbre des éléments de structure, couvrant les éléments à toutes les profondeurs d'imbrication.
Version 3.29.0
Modifications
- GetPDFUADiagnostics est une nouvelle API de diagnostic qui vérifie un document pour les problèmes potentiels de conformité PDF/UA-1 (ISO 14289-1) et retourne une liste de constats séparés par des sauts de ligne. Six vérifications sont effectuées : si MarkInfo/Marked est défini (tagged PDF), si le catalogue du document a une entrée /Lang, si ViewerPreferences/DisplayDocTitle est vrai, si les métadonnées XMP contiennent un identifiant pdfuaid:part, le nombre d'annotations non exemptées dépourvues d'une entrée Contents, et le nombre de fichiers intégrés dépourvus d'une entrée AFRelationship. Chaque constat est identifié par un code court (par ex. LANG-MISSING, ANNOT-NO-CONTENTS:3) suivi d'une description lisible par un humain. Retourne une chaîne vide lorsqu'aucun problème n'est trouvé. Disponible dans la bibliothèque Delphi, ActiveX et les interfaces DLL.
Version 3.28.5
Modifications
- Amélioration d'accessibilité d'annotation PDF/UA-1 : lorsqu'une annotation FileAttachment n'a pas d'entrée Contents ni de champ /T, le nom de fichier de la spécification de fichier intégré de l'annotation (/FS /UF ou /F) est désormais utilisé comme description accessible de repli. Cela complète la chaîne de repli de Contents d'annotation : /T → URI de Link → nom de Stamp → nom de fichier de FileAttachment. Les lecteurs d'écran reçoivent le nom du fichier attaché plutôt que le silence, satisfaisant ISO 14289-1 §7.18.1 pour les types d'annotation les plus courants.
Version 3.28.4
Modifications
- Amélioration d'accessibilité d'annotation PDF/UA-1 : lorsqu'une annotation Stamp n'a pas d'entrée Contents (ou une vide) ni de champ /T, le nom de type de tampon de l'entrée /Name de l'annotation est désormais utilisé comme description accessible de repli (par ex. "Approved", "Draft", "Confidential", "Final"). Cela étend la chaîne de repli de Contents d'annotation introduite en v3.28.3 pour couvrir les annotations de tampon, qui sont courantes dans les workflows impliquant des documents révisés ou approuvés et manquent fréquemment d'une valeur Contents explicite.
Version 3.28.3
Modifications
- Amélioration d'accessibilité d'annotation PDF/UA-1 : lorsqu'une annotation Link n'a pas d'entrée Contents (ou une vide) ni de champ /T, l'URI de l'action URI de l'annotation est désormais utilisé comme description accessible de repli. Cela s'applique uniquement lors du traitement de SetPDFUAMode et uniquement aux annotations Link portant une action /URI. Les lecteurs d'écran reçoivent l'URL comme étiquette de dernier recours, satisfaisant ISO 14289-1 §7.18.1 dans le cas courant où les auteurs créent des hyperliens sans fournir de description lisible par un humain.
Version 3.28.2
Modifications
- SetEmbeddedFileAFRelationship est une nouvelle API pour définir explicitement la valeur AFRelationship sur le dictionnaire de spécification de fichier d'un fichier intégré. Requise par ISO 14289-1 (PDF/UA-1) §7.11, elle permet aux appelants de spécifier la relation sémantique d'un fichier intégré au contenu du document en choisissant parmi les cinq valeurs valides : Source, Data, Alternative, Supplement ou Unspecified. Lorsque SetPDFUAMode est actif, tout fichier intégré sans clé AFRelationship se voit automatiquement assigner Unspecified ; utilisez cette fonction pour remplacer cette valeur par défaut avant la sauvegarde. Disponible dans la bibliothèque Delphi, ActiveX et les interfaces DLL.
Version 3.28.1
Modifications
- Lorsque SetPDFUAMode est appelé sur un document dont les métadonnées XMP portent le titre générique par défaut de la bibliothèque plutôt qu'un titre spécifique au document, le titre est désormais automatiquement remplacé par la valeur de l'entrée Title du /Info du document (si présente). Cela garantit que le packet XMP pdfuaid:part-1 reflète le titre réel du document plutôt qu'un placeholder, satisfaisant les attentes du vérificateur PDF/UA-1.
- Le parseur XMP (LoadFromString) lit désormais la valeur dc:title des métadonnées XMP existantes lorsqu'un document est chargé, de sorte qu'un aller-retour d'un PDF qui a déjà dc:title préserve correctement ce titre au lieu de revenir au placeholder par défaut.
Version 3.28.0
Modifications
- BeginArtifactEx(ArtifactType, ArtifactSubtype) est une nouvelle API tagged-PDF qui étend BeginArtifact pour exprimer à la fois le /Type de l'artefact et le /Subtype Pagination en un seul appel. Lorsque les deux paramètres sont non vides, l'opérateur écrit est /Artifact << /Type /T /Subtype /S >> BMC, permettant des artefacts Pagination pleinement spécifiés tels que les en-têtes et pieds de page selon ISO 32000-1 §14.8.2.2.1. Si un seul paramètre est non vide, la forme à clé unique correspondante est utilisée. Les points d'entrée DLL DLBeginArtifactEx et DLBeginArtifactExA sont également exportés.
Version 3.27.2
Corrections
- BeginArtifact distingue désormais correctement les types d'artefact des sous-types de pagination. Lorsque l'argument est Pagination, Layout ou Page (types d'artefact selon ISO 32000-1 §14.8.2.2.1 Table 330), l'opérateur de contenu marqué écrit /Type plutôt que /Subtype. D'autres valeurs telles que Header, Footer et Watermark continuent d'être écrites comme /Subtype. Cela corrige la sortie précédemment incorrecte qui écrivait /Subtype /Pagination lorsque l'appelant avait l'intention de marquer un artefact de pagination.
Version 3.27.1
Modifications
- Lorsque le mode PDF/UA est actif et que le document contient des fichiers intégrés, chaque dictionnaire de spécification de fichier dépourvu d'une entrée AFRelationship en reçoit désormais une automatiquement au moment de la sauvegarde. La valeur écrite est /Unspecified, satisfaisant l'exigence ISO 14289-1 §7.11 que chaque fichier intégré porte une clé AFRelationship. Cela s'applique aux fichiers ajoutés via EmbedFile et aux fichiers intégrés déjà présents dans un document chargé.
Version 3.27.0
Modifications
- AddRoleMap(CustomType, StandardType) est une nouvelle API tagged-PDF qui enregistre une correspondance entre un nom de type d'élément de structure personnalisé (non standard) et un type de structure PDF standard. Lors de la sauvegarde, les correspondances sont écrites dans le dictionnaire RoleMap de la racine de l'arbre de structure, satisfaisant l'exigence ISO 14289-1 §7.1 pour les documents qui utilisent des noms de balises spécifiques à l'application. Plusieurs correspondances peuvent être enregistrées ; les clés en doublon sont remplacées par le dernier appel. Les points d'entrée DLL DLAddRoleMap et DLAddRoleMapA sont également exportés.
Version 3.26.0
Modifications
- BeginTagEx(TagType, AltText, ActualText, Lang) est une nouvelle API tagged-PDF qui étend BeginTag avec un attribut de langue naturelle explicite. Lorsque Lang est non vide, il est écrit dans l'attribut /Lang de l'élément de structure, permettant l'annotation de langue par élément requise par ISO 14289-1 §7.2 pour les documents multilingues. Passez une chaîne Lang vide pour vous comporter de façon identique à BeginTag. Les points d'entrée DLL DLBeginTagEx et DLBeginTagExA sont également exportés.
Version 3.25.1
Modifications
- Les polices TrueType non sous-ensemblées chargées avec la page de codes Windows par défaut (WinAnsiEncoding) reçoivent désormais un flux CMap ToUnicode, permettant l'extraction Unicode fiable de texte et le copier/coller pour ces polices. Auparavant un flux ToUnicode n'était écrit que lorsqu'un remplacement explicite de page de codes ou un tableau Differences était présent ; le chemin courant d'encodage par défaut en manquait.
- La même correction s'applique aux polices TrueType chargées avec une page de codes explicite non par défaut mais sans tableau Differences, et aux polices chargées via le format de police empaqueté.
Version 3.25.0
Modifications
- Lorsque le mode PDF/UA est actif, les annotations non exemptées (tous les types sauf Widget, PrinterMark et TrapNet) dépourvues d'une entrée Contents non vide en reçoivent désormais une automatiquement au moment de la sauvegarde. La valeur /T (titre / auteur) de l'annotation est utilisée comme repli, satisfaisant ISO 14289-1 §7.18.1 pour les annotations qui portent un titre mais aucune description accessible explicite.
Version 3.24.0
Modifications
- Lorsque le mode PDF/UA est actif, les champs de formulaire interactifs dépourvus d'une entrée TU (info-bulle / description alternative) en reçoivent désormais une automatiquement au moment de la sauvegarde. Le nom partiel du champ (entrée /T) est utilisé comme valeur de repli, garantissant que les lecteurs d'écran peuvent identifier chaque champ. Les boutons-poussoirs sont correctement exclus de cette exigence selon ISO 14289-1 §7.18.4.
Version 3.23.1
Modifications
- GetInformation(200) retourne '1' lorsque le mode PDF/UA-1 est actif sur le document sélectionné, permettant aux appelants d'interroger le statut du mode de conformité à l'exécution.
- GetInformation(201) retourne '1' pour PDF/A-1a, '2' pour PDF/A-1b, ou une chaîne vide lorsque le mode PDF/A est désactivé.
- GetInformation(313) retourne la chaîne de version PDF à laquelle la cible de sauvegarde est actuellement verrouillée, ou une chaîne vide pour les documents à versionnement libre.
Corrections
- GetInformation(311) et GetInformation(312) retournent désormais correctement la chaîne d'exigence de version et le nom de la fonctionnalité du conflit de verrouillage de version le plus récent (précédemment annoncé dans l'entrée v3.20.3 mais pas encore implémenté).
Version 3.23.0
Modifications
- SetMarkInfo(Marked) est désormais une API publique, permettant de définir l'indicateur MarkInfo.Marked indépendamment de la configuration PDF/UA-1 complète effectuée par SetPDFUAMode. Lorsque Marked vaut 1, MarkInfo.Suspects est également défini à false comme requis par ISO 14289-1 §7.18.6.
- Lorsque le mode PDF/UA est actif, toutes les pages reçoivent automatiquement une entrée /Tabs /S au moment de la sauvegarde, satisfaisant l'exigence d'ordre de tabulation basé sur la structure de ISO 14289-1 §7.18.4.
- Documentation de référence HTML ajoutée pour SetPDFUAMode, SetDocumentLanguage, SetMarkInfo, BeginTag, EndTag, BeginArtifact et EndArtifact, avec tables de syntaxe complètes et exemples d'usage.
Version 3.22.0
Modifications
- BeginTag(TagType, AltText, ActualText) ouvre un élément de structure tagged-PDF dans le flux de contenu actuel, écrivant un opérateur BDC avec un MCID assigné automatiquement et enregistrant l'élément dans l'arbre de structure du document. TagType est n'importe quel type de structure standard PDF (P, H1, Figure, Table, etc.). AltText et ActualText sont des chaînes d'accessibilité optionnelles encodées comme chaînes de texte PDF (UTF-16BE).
- EndTag ferme l'élément de structure le plus récemment ouvert, écrivant l'opérateur EMC correspondant dans le flux de contenu.
- BeginArtifact(SubType) marque une région de contenu comme un artefact PDF (artefact de pagination, arrière-plan, etc.), écrivant un opérateur BMC. SubType est optionnel ; lorsque fourni, il est écrit comme /Artifact << /Subtype /SubType >>.
- EndArtifact ferme la région d'artefact avec un opérateur EMC.
- Au moment de la sauvegarde, lorsque des éléments de structure tagged ont été enregistrés, la bibliothèque construit automatiquement le StructTreeRoot complet, assigne les clés StructParents aux pages affectées et écrit l'arbre de nombres ParentTree, satisfaisant les exigences ISO 32000-1 §14.7 pour le tagged PDF.
- Les polices standard Type 1 (Helvetica, Times, famille Courier, Symbol) et les polices Type 1 intégrées avec encodage WinAnsi reçoivent désormais un flux CMap ToUnicode, permettant l'extraction Unicode fiable de texte et le copier/coller pour ces types de polices.
Version 3.21.0
Modifications
- SetPDFUAMode(Language) active le mode de conformité PDF/UA-1 (ISO 14289-1) : élève automatiquement le document à PDF 1.7, écrit MarkInfo.Marked et MarkInfo.Suspects, active DisplayDocTitle dans ViewerPreferences, définit Catalog.Lang lorsque Language est non vide, et écrit l'entrée d'espace de noms XMP pdfuaid:part = 1 requise par ISO 14289-1 Section 6.7.11.
- SetDocumentLanguage(Language) écrit directement l'entrée Catalog /Lang, permettant de déclarer la langue du document indépendamment du mode PDF/UA.
- MarkInfo.Suspects est désormais défini à false chaque fois que MarkInfo.Marked est défini à true, satisfaisant l'exigence de structure tagged-PDF de ISO 14289-1 (Section 7.18.6).
- Encrypt force désormais l'indicateur de permission CanCopyAccess (copie de contenu pour l'accessibilité) lorsque le document est en mode PDF/UA, comme requis par ISO 14289-1 Section 7.17.
Corrections
- Les champs de formulaire Choice (liste déroulante) ne portent plus une valeur d'info-bulle codée en dur sans signification ; TU est laissé non défini afin que l'appelant puisse assigner une étiquette significative via l'API de propriétés de champ de formulaire.
Version 3.20.3
Modifications
- Encrypt et AddSWFAnnotationFromFile retournent désormais 0 immédiatement avec LastErrorCode 602 lorsque la version de sauvegarde est verrouillée en dessous du minimum requis par la force de chiffrement ou le type d'annotation sélectionné, au lieu de procéder silencieusement et échouer uniquement au moment de la sauvegarde.
- GetInformation(311) et GetInformation(312) reflètent désormais l'exigence de version conflictuelle au moment de l'écriture lorsqu'une version verrouillée bloque des fonctionnalités de niveau d'extension telles que AES-256 ou les annotations RichMedia.
Version 3.20.2
Modifications
- AddU3DAnnotationFromFile élève désormais automatiquement la version du document à PDF 1.6 lorsqu'une annotation 3D est ajoutée à un document de version inférieure, conformément au comportement d'élévation automatique de version de tous les autres points d'entrée d'API PDF 1.6+.
Version 3.20.1
Modifications
- Les cibles de sauvegarde PDF 1.2 sont désormais appliquées comme des contrats stricts PDF 1.2. Sauvegarder des objets PDF 1.3+ tels que les données TrimBox de page sous une cible PDF 1.2 échoue avant que la sortie ne soit écrite au lieu d'émettre un fichier à versions mixtes.
- La conformité PDF 1.7 au niveau d'extension Adobe fait désormais partie du preflight de sauvegarde. AESV3, AES-256, RichMedia, Projection, dictionnaires géospatiaux et sous-filtres de signature ETSI sont vérifiés par rapport à l'ExtensionLevel requis.
- Le chiffrement AES-256, les annotations RichMedia, les dictionnaires géospatiaux et les sous-filtres de signature ETSI déclarent désormais l'entrée Adobe Extensions correspondante lorsque PDFlib élève automatiquement un document à un contenu d'extension PDF 1.7.
- Les sauvegardes incrémentielles utilisent désormais la même porte de conformité de version que les sauvegardes complètes.
- Les DLL d'exécution PDFium optionnelles fournies ont été rafraîchies pour Win32 et Win64. GDI+ reste le moteur de rendu par défaut ; PDFium reste opt-in via SetPDFiumFileName et SelectRenderer(3).
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 207/207 chacune, et le GoogleTest C++Builder Win64x a passé 61 tests avec 2 tests dépendant d'échantillons existants ignorés.
Version 3.20.0
Modifications
- Huit points d'entrée writer PDFlib supplémentaires passent désormais par Phase 3 EnsureMinVersion afin que la version du document soit automatiquement élevée au minimum requis par la fonctionnalité émise : SetDocumentMetadata (PDF 1.4 - flux XMP /Metadata) SetPDFAMode(1 ou 2) (PDF 1.4 - /MarkInfo + /OutputIntents) PageJavaScriptAction (PDF 1.5 - Page /AA + JavaScript) DocJavaScriptAction (PDF 1.4 - Catalog /AA + JavaScript) SetTabOrderMode (PDF 1.5 - Page /Tabs) NewOptionalContentGroup (PDF 1.5 - /Type /OCG) SetNeedAppearances (PDF 1.5 - AcroForm /NeedAppearances) NewFormField(ftSignature) (PDF 1.5 - AcroForm /SigFlags AppendOnly)
- Combiné avec l'ensemble v3.15.0 (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout) et l'ensemble v3.17.0 (huit entrées JavaScript / fichier intégré / XFA / SWF), PDFlib élève désormais automatiquement FVersion sur vingt et un points d'entrée writer.
- NewOptionalContentGroup élevait précédemment FVersion directement ; il passe désormais par EnsureMinVersion afin que LockSaveVersion soit respecté et que l'élévation soit enregistrée dans AutoBumpedFeatures.
Version 3.19.0
Modifications
- La conformité de version PDF au moment de la sauvegarde et au moment du chargement reconnaît désormais également quatre fonctionnalités précédemment différées : Btn /Ff bit 15 NoToggleToOff (radio-button uniquement) -> PDF 1.4 DeviceN /Subtype /NChannel (raffinement d'espace de couleur) -> PDF 1.6 FontFile3 /Subtype /OpenType (type de programme de police) -> PDF 1.6 Sig /SubFilter ETSI.CAdES.detached ou ETSI.RFC3161 -> PDF 1.7
- La règle NChannel correspond à la forme de tableau d'espace de couleur DeviceN [/DeviceN names alternateSpace tintTransform attributes] lorsque le dictionnaire d'attributs à l'index 4 porte /Subtype /NChannel.
- La règle FontFile3 OpenType se déclenche uniquement lorsque le flux est atteint via une clé parent nommée 'FontFile3', de sorte que les flux non liés qui portent /Subtype /OpenType ne sont pas signalés.
- La table PDFFeatureRules porte désormais 103 règles (99 + 4 nouvelles).
Version 3.18.6
Modifications
- La conformité de version PDF au moment de la sauvegarde et au moment du chargement reconnaît désormais /AA (actions additionnelles) avec une prise en compte du type de conteneur : Catalog /AA (déclencheurs au niveau document) -> PDF 1.4 Annot /AA (déclencheurs d'annotation) -> PDF 1.4 Page /AA (déclencheurs de page) -> PDF 1.5
- Le /AA de champ de formulaire (PDF 1.2) reste couvert par le contrat de sauvegarde PDF 1.3 existant ; aucune règle nécessaire.
- La table PDFFeatureRules porte désormais 99 règles (96 + 3 nouvelles).
Version 3.18.5
Ajouts
- Nouvelle règle : AcroForm /NeedAppearances est reconnu comme une fonctionnalité PDF 1.5 selon PDF 1.5 Table 218.
Modifications
- La table PDFFeatureRules porte désormais 96 règles (95 + 1 nouvelle).
Corrections
- La conformité de version PDF au moment de la sauvegarde et au moment du chargement classe désormais correctement Page /Tabs comme une fonctionnalité PDF 1.5 ; elle était précédemment mal classée comme PDF 1.4. Le document de modifications de la spec PDF 1.4 (Adobe TN #5409) ne mentionne pas /Tabs, et PDF 1.5 Table 8.10 introduit "Tabs (Optional; PDF 1.5)".
Version 3.18.4
Ajouts
- La couverture de régression zlib-ng inclut désormais des charges utiles de taille frontière, des données de scanline de type PNG, des flux multi-blocs stockés et des flux zlib connus à travers les runners de tests Delphi et C++Builder.
Modifications
- PDFlibZLib utilise désormais toujours le backend d'objet zlib-ng statique fourni dans les builds normaux de la bibliothèque, supprimant le chemin de repli System.ZLib restant.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 194/194 chacune, et le GoogleTest C++Builder Win64x a passé 58 tests avec 2 tests dépendant d'échantillons existants ignorés.
Version 3.18.3
Modifications
- Les démos Delphi et C++Builder qui génèrent une sortie PDF ou texte ouvrent désormais automatiquement le document généré après une sauvegarde réussie.
- L'empaquetage de l'installeur garde désormais les artefacts de build en dehors des dossiers de démo et rend les échantillons C++Builder ainsi que les modules DLL et ActiveX/OCX en composants opt-in ; leurs fichiers correspondants sont installés uniquement lorsque le composant est sélectionné.
Version 3.18.2
Modifications
- Les démos EditFormField Delphi et C++Builder effacent désormais /NeedAppearances avant de mettre à jour les valeurs des champs, afin que chaque champ texte édité obtienne un flux d'apparence normal rafraîchi dans le PDF sauvegardé.
- Cela garde le flux /AP sauvegardé synchronisé avec la valeur /V stockée et évite les différences dépendantes de la visionneuse où le focus sur le champ révèle du texte qui manquait à l'apparence statique du champ.
Version 3.18.1
Modifications
- La conformité de version PDF au moment de la sauvegarde et au moment du chargement reconnaît désormais également les drapeaux /Ff de champ de formulaire au niveau bit et le bit AcroForm /SigFlags AppendOnly : /Ff bit 21 (FileSelect, mask 1048576) -> PDF 1.4 /Ff bit 22 (MultiSelect, mask 2097152) -> PDF 1.4 /Ff bit 23 (DoNotSpellCheck, mask 4194304) -> PDF 1.4 /Ff bit 24 (DoNotScroll, mask 8388608) -> PDF 1.4 /Ff bit 25 (Comb, mask 16777216) -> PDF 1.5 /Ff bit 26 (RichText / RadiosInUnison, 33554432) -> PDF 1.5 /Ff bit 27 (CommitOnSelChange, mask 67108864) -> PDF 1.5 /SigFlags bit 2 (AppendOnly, mask 2) -> PDF 1.5
- L'héritage /Parent n'est pas suivi : seuls les dictionnaires qui portent explicitement /Ff ou /SigFlags déclenchent les règles.
- La table PDFFeatureRules porte désormais 95 règles (87 + 8 nouvelles au niveau bit).
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 191/191 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.18.0
Modifications
- La conformité de version PDF au moment de la sauvegarde et au moment du chargement reconnaît désormais également neuf sous-clés et fonctionnalités au niveau bit supplémentaires : drapeaux d'annotation au niveau bit (/F mask) : Locked (128) -> PDF 1.4 ToggleNoView (256) -> PDF 1.5 LockedContents (512) -> PDF 1.7 sous-clés distinctives de catalogue et de page : /BoxColorInfo (page) -> PDF 1.4 /Permissions, /Legal, /PresSteps -> PDF 1.5 /VP (page geospatial viewport) -> PDF 1.6 /Collection (catalog portable collection) -> PDF 1.7
- La table PDFFeatureRules porte désormais 87 règles (78 au niveau chapitre + 9 sous-clés / niveau bit).
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 189/189 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.17.0
Modifications
- Huit points d'entrée writer PDFlib supplémentaires passent désormais par Phase 3 EnsureMinVersion afin que la version du document soit automatiquement élevée au minimum requis par la fonctionnalité émise : AddLinkToJavaScript, SetOpenActionJavaScript, AddGlobalJavaScript, FormFieldJavaScriptAction (PDF 1.3 - actions JavaScript) AddEmbeddedFile, AddFileAttachment (PDF 1.3 - pièces jointes) SetXFAFromString (PDF 1.5 - formulaires XFA) AddSWFAnnotationFromFile (PDF 1.7 - annotation RichMedia)
- Combiné avec l'ensemble v3.15.0 (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout), PDFlib couvre désormais treize points d'entrée writer de version élevée de bout en bout.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 187/187 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.16.3
Ajouts
- Nouvelle API PDFlib : LockSaveVersion(Version) épingle le document à Version et empêche Phase 3 EnsureMinVersion côté writer d'élever automatiquement au-delà. UnlockSaveVersion supprime le verrou.
Modifications
- La porte au moment de la sauvegarde reste inchangée : les fonctionnalités émises par le writer au-dessus de la version verrouillée produisent toujours LastErrorCode 602 au moment de la sauvegarde, au lieu d'élever silencieusement l'en-tête.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 184/184 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.16.2
Modifications
- Les PDF chargés exposent désormais une vue réservée aux contributeurs de la détection de fonctionnalités au moment du chargement via GetInformation(103) ("ContributorFeatures"). La liste ne contient que les fonctionnalités dont la version minimale requise est strictement supérieure à HeaderVersion (clé 100), elle répond donc directement à "pourquoi la version effective est-elle supérieure à l'en-tête du fichier ?".
- GetInformation(101) ("DetectedFeatures") est inchangé et liste toujours toutes les fonctionnalités appariées indépendamment de leur contribution.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 181/181 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.16.1
Ajouts
- Couverture de test étendue de la détection côté chargeur avec six fixtures synthétiques supplémentaires : ExtGState de transparence intra-page (pas d'élévation de version), Catalog /MarkInfo (PDF 1.3 -> PDF 1.4), /OCProperties + contenu OCG (PDF 1.4 -> PDF 1.5), /Type /3DStream (PDF 1.5 -> PDF 1.6), une fixture de combinaison multi-fonctionnalités et une vérification de stabilité d'instantané.
Modifications
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 179/179 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.16.0
Ajouts
- Nouvelles clés GetInformation : 100 retourne HeaderVersion (littéral %PDF-X.Y), 101 retourne DetectedFeatures (fonctionnalités détectées au chargement, délimitées par CRLF), 102 retourne AutoBumpedFeatures (fonctionnalités qui ont déclenché EnsureMinVersion côté writer, délimitées par CRLF).
Modifications
- Les documents PDF chargés passent désormais par une passe de détection de version pilotée par le contenu : chaque objet indirect est parcouru à travers la table fonctionnalité-vers-version-minimale utilisée par la porte au moment de la sauvegarde, et FVersion est élevé au-dessus de la valeur d'en-tête littérale %PDF-X.Y lorsque le contenu requiert réellement une version supérieure. Par exemple, une entrée de page /UserUnit élève la version effective à PDF 1.6 même lorsque l'en-tête du fichier dit PDF 1.4.
- La porte au moment de la sauvegarde n'est pas affectée : les documents dont la version effective a été élevée au chargement, puis explicitement rétrogradés avec SetInformation(0, ...), produisent toujours LastErrorCode 602 au moment de la sauvegarde.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 173/173 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.15.0
Modifications
- Les points d'entrée writer qui produisent des fonctionnalités requérant une version PDF minimale particulière élèvent désormais automatiquement la version PDF du document. Appeler SetTransparency sur un document marqué comme PDF 1.3 promeut maintenant l'en-tête à PDF 1.4 au lieu de faire échouer la sauvegarde avec LastErrorCode 602.
- Câblé la même élévation automatique dans SetPageUserUnit (>=1.6), Encrypt avec Strength 1/2/3/4 (>=1.4/1.6/1.7/1.7 respectivement), et les variantes à deux pages de SetPageLayout (>=1.5).
- Changement de comportement par rapport à 3.14.x : les applications qui dépendaient précédemment de la porte v3.12.6 "la cible de sauvegarde rejette les fonctionnalités émises par le writer" réussissent désormais à la version élevée. Les PDF chargés qui contiennent déjà des fonctionnalités de version supérieure passent toujours par la porte existante au moment de la sauvegarde, de sorte que charger un PDF tagged et sélectionner PDF 1.3 échoue toujours avec LastErrorCode 602.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 170/170 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.14.3
Modifications
- La conformité de version PDF au moment de la sauvegarde reconnaît désormais également les autres types de dictionnaire 3D PDF 1.6 (/Type /3DStream /3DRef /3DBackground /3DRenderMode /3DLightingScheme /3DCrossSection /3DNode) et les sous-types d'annotation PDF 1.7 Redact, RichMedia et Projection plus les dictionnaires compagnons /Type /Requirement et /ReqHandler.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 168/168 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.14.2
Modifications
- La conformité de version PDF au moment de la sauvegarde reconnaît désormais également les fonctionnalités PDF 1.5 : formulaires /XFA, /AlternatePresentations, arbre de noms /Renditions, dictionnaires multimédia /Type /Rendition /MediaCriteria /MediaPermissions /MediaPlayers, et le sous-type d'annotation Screen.
- Sauvegarder en PDF 1.4 rejette désormais les documents qui portent ces fonctionnalités avec LastErrorCode 602.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 166/166 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.14.1
Modifications
- La conformité de version PDF au moment de la sauvegarde reconnaît désormais également les fonctionnalités PDF 1.4 : tagged-PDF /StructTreeRoot /MarkInfo et dictionnaires StructElem, entrées /Lang du document et /Tabs de page, dictionnaires /OutputIntents et /OutputIntent, signature de droits d'utilisation /UR3, et les sous-types d'annotation PDF 1.4 Polygon, PolyLine, Caret, Ink, Popup et Watermark.
- Sauvegarder en PDF 1.3 rejette désormais les documents qui portent ces fonctionnalités avec LastErrorCode 602.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 165/165 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.14.0
Modifications
- La conformité de version PDF au moment de la sauvegarde reconnaît désormais également les fonctionnalités PDF 1.3 telles que l'ombrage lisse, les objets fonction, les espaces de couleur ICCBased et DeviceN, les entrées de page /TrimBox /BleedBox /ArtBox, les CMaps /ToUnicode, les annotations de pièces jointes et /Sound et /Movie, les dicts /Type /Filespec et /Type /EmbeddedFile, les clés /Group /EF /Alternates /Mask, et les actions JavaScript.
- Les appelants PDF 1.2 sauvegardent désormais sous le contrat PDF 1.3 : l'en-tête littéral %PDF-1.2 est préservé, mais la porte accepte les fonctionnalités PDF 1.3. Les fonctionnalités PDF 1.4 et ultérieures sont toujours rejetées avec LastErrorCode 602.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 162/162 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.13.0
Modifications
- Refactoré la porte de conformité de version PDF qui rejette les fonctionnalités de version ultérieure au moment de la sauvegarde en un module dédié afin que l'ensemble de règles puisse croître sans agiter le cœur du document.
- Aucun changement de comportement visible par l'utilisateur par rapport à v3.12.7 : les mêmes fonctionnalités hors version sont toujours rejetées avec LastErrorCode 602.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 155/155 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.12.7
Ajouts
- Couverture de tests automatisés étendue pour le workflow de rendu à accès direct PdfToImage dans les suites Delphi DUnitX et C++Builder GoogleTest.
Modifications
- Le runner de tests VCL GUI Delphi enregistre désormais les fixtures Syntax et XRef, correspondant à la couverture du runner console.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 147/147 chacune, et le GoogleTest C++Builder Win64x a passé 57/57.
Version 3.12.6
Modifications
- Sauvegarder en PDF 1.3, 1.4, 1.5, 1.6 ou 1.7 applique désormais la version sélectionnée comme contrat de sortie de sauvegarde complète.
- Les sauvegardes complètes suppriment les remplacements /Version du catalogue, suppriment les entrées d'extension et de métadonnées de catalogue non supportées pour les cibles inférieures, et suppriment les flux de métadonnées XMP PDF 1.4 lors de la sauvegarde en PDF 1.3.
- SaveToFile, SaveToString et SaveToStream échouent désormais avec LastErrorCode 602 lorsque la version cible PDF sélectionnée est inférieure aux fonctionnalités encore présentes dans le document, telles que transparence, contenu optionnel, JPX, UserUnit, 3D ou fonctionnalités de filtre crypto AES.
Version 3.12.5
Ajouts
- Ajouté une couverture de régression pour les échappements de chaîne littérale inconnus et les séquences d'échappement mixtes octales/non octales.
Modifications
- Amélioré l'analyse des chaînes littérales PDF 1.7 afin que les séquences d'échappement inconnues ignorent l'antislash comme requis par le standard.
- Les échappements octaux de chaîne littérale ne consomment désormais que des chiffres octaux et préservent un chiffre non octal suivant comme donnée de chaîne régulière.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 141/141 chacune.
Version 3.12.4
Ajouts
- Ajouté une couverture de régression pour les délimiteurs de nom à accolade droite et les entrées de flux xref à objets compressés éparses.
Modifications
- Amélioré l'analyse lexicale PDF 1.7 afin que les objets de nom s'arrêtent maintenant correctement au délimiteur d'accolade droite.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 139/139 chacune.
Corrections
- Corrigé le chargement SmartAccess des entrées d'objets compressés de flux xref dont le numéro de flux d'objet est plus grand que la longueur en octets du PDF.
Version 3.12.3
Ajouts
- Les nouveaux PDF chiffrés AES écrivent désormais les valeurs Length de filtre crypto comme longueurs en bits, correspondant au contrat de dictionnaire de filtre crypto PDF 1.7.
Modifications
- Amélioré la compatibilité des documents chiffrés PDF 1.7 pour les fichiers du gestionnaire de sécurité standard qui utilisent des filtres crypto StrF, StmF, EFF, Identity, None ou nommés style StdCF.
- Les flux de métadonnées respectent désormais EncryptMetadata=false pendant les workflows de déchiffrement, chiffrement et copie/sauvegarde au lieu d'être traités comme des flux ordinaires.
- Les flux de fichier intégré portent désormais /Type /EmbeddedFile et utilisent le chemin de décision du filtre crypto de fichier intégré lorsque des documents chiffrés sont chargés ou sauvegardés.
- Les flux de fichier intégré externes promeuvent désormais FDecodeParms en DecodeParms lorsque FFilter est promu en Filter, préservant les paramètres de décodage de flux.
- Les valeurs Prev/XRefStm de flux XRef et les grands décalages numériques conservent désormais une précision 64 bits à travers les chemins de parseur et SmartAccess.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 137/137 chacune.
Version 3.12.2
Modifications
- Amélioré la compatibilité de décodage de flux PDF 1.7. Le décodage de flux générique honore désormais /DP comme alias de DecodeParms, résout les entrées de tableau de paramètres de décodage indirectes, et accepte les abréviations de filtre standard /AHx et /LZW.
- La sortie PDF de grands fichiers écrit désormais les décalages xref, startxref, linéarisation et ByteRange de signature numérique via des chemins de formatage 64 bits au lieu de rétrécir ces valeurs à travers des helpers entiers 32 bits.
- Les documents chargés traitent désormais une entrée /Version de catalogue comme la version PDF effective lorsqu'elle est plus récente que la version d'en-tête du fichier.
- Validation : les suites DUnitX Delphi Win32 et Win64 ont passé 134/134 chacune.
Corrections
- Les trailers de flux xref réécrits ne conservent plus les clés DecodeParms spécifiques aux flux lorsque PDFlibPas les sauvegarde comme dictionnaires de trailer classiques.
Version 3.12.1
Modifications
- Les PDF générés s'ouvrent désormais avec la première page dimensionnée à la hauteur disponible de la fenêtre de la visionneuse, de sorte que la première page entière soit visible de haut en bas au plus grand zoom qui tient dans la fenêtre. Configurez un OpenAction personnalisé (SetOpenActionDestination, SetOpenActionMenu, SetOpenActionJavaScript) sur le document pour remplacer ce comportement par défaut.
Version 3.12.0
Ajouts
- Ajouté des stubs CRT malloc/calloc/realloc/free alignés sur 32 octets pour les bibliothèques C statiques et corrigé TPDFJPEGImage.Compress pour libérer les tampons jpeg_mem_dest via le même chemin C free qui les a alloués.
- Notes de validation publiques étendues pour mentionner la couverture automatisée stricte derrière cette version : builds de bibliothèque, aller-retours de compression, sortie /FlateDecode HelloWorld, rendu JPEG, workflows d'image, polices, formulaires, sécurité, signature, impression et workflows dérivés des démos C++Builder.
Modifications
- Les backends statiques Windows incluent désormais les objets SIMD NASM de libjpeg-turbo pour Win32 et Win64, ainsi que les objets de dispatch SIMD x86 zlib-ng pour l'ensemble zlib-ng Win64x.
- Refonte des scripts de reconstruction zlib-ng afin que les builds Win64x bcc64x et MSVC de diagnostic compilent les fichiers source génériques, SSE2, SSSE3, SSE4.1/SSE4.2, PCLMULQDQ et AVX2 avec des drapeaux de fonctionnalité par fichier au lieu de dépendre d'un seul commutateur de compilateur global.
Version 3.11.0
Ajouts
- Ajouté un petit objet pont zlib-ng pour les builds Win64 afin que le code Pascal garde des points d'entrée compatibles zlib stables tandis que Delphi et C++Builder consomment leurs propres ensembles d'objets compatibles avec leurs éditeurs de liens.
Modifications
- Basculé la compression et la décompression Flate Windows vers zlib-ng en mode compatible zlib. Win32, Delphi Win64 et C++Builder Win64x lient désormais des ensembles d'objets statiques zlib-ng à ABI appariée depuis Lib\thirdparty\Win32, Lib\thirdparty\Win64 et Lib\thirdparty\Win64x.
- Mis à jour tous les projets de démo C++Builder pour définir PDFLIB_CPPBUILDER, correspondant au runner GoogleTest et empêchant les démos Win64x de lier les objets zlib-ng Delphi Win64.
Corrections
- Le chemin Win64 ne passe plus par l'unité System.ZLib de Delphi, de sorte que la compression/décompression de flux PDF peut bénéficier du backend zlib-ng tout comme le build 32 bits.
Version 3.10.3
Ajouts
- Étendu la suite GoogleTest C++Builder pour couvrir chaque démo sous Demo\C++Builder. La disposition phase-1 à 7 fixtures est passée à 15 fixtures / 52 cas GoogleTest, tous réussis sur Win64x. Démos nouvellement couvertes : AddFormattedTitle, AddTextImage, AddTrueTypeSubsettedFont, AddWebLink, CanvasText, CaptureToNewSize, CopyPageRanges, CreateWithImage, CreateWithImageToStream, DoInTheStream, DrawWrappedText, EditFormField, EmbeddedFonts, ExtractAnnotAttach, ExtractEmbeddedFonts, ExtractImage, ImageToPdf, ImportEMF, MultiFunction (commutation de moteur de rendu), PageOperations, PdfDecrypt, PdfPermission, PrintPDF, TextMeasure, TextPaging.
Version 3.10.2
Ajouts
- Ajouté un runner GoogleTest C++Builder sous Tests\C++Builder qui exerce Lib\PDFlibrary.pas via les mêmes en-têtes HPP émis par {$JPHNE} utilisés par les démos C++Builder. La première phase reproduit sept scénarios Delphi de base (HelloWorld, DrawShapes, CreateTable, PdfEncrypt, ExtractText, PdfSigning, rendu PdfToImage) sous forme de 17 cas GoogleTest, tous réussis sur Win64x.
- Étendu la suite DUnitX Delphi avec Tests.Print couvrant les démos PrintPDF et ShowPrinterBins (énumération d'imprimante par défaut, configuration d'imprimante personnalisée, options d'impression, tâche d'impression redirigée vers fichier) et un test de commutation de moteur de rendu dans Tests.Render exerçant la sélection de moteur GDI+ / PDFium / Cairo de la démo MultiFunction sur le même PDF source.
Version 3.10.1
Ajouts
- Ajout de 57 tailles de page nommées à SetPageSize afin que les mêmes noms canoniques de taille de page fonctionnent également ici : SIZE8X11, QUADA0, DOUBA0, B0PLUS, ENVB4/B5/C6/DL/MONARCH, ENV9/10/11, ANSIA/B/C/D/E, ARCHA/B/C/D/E1/E, SHIROKU, G1K, USBC/EUBC/ASBC, ID1/ID2/ID3, ONEINCH/TWOINCH/L2INCH/USVISA, P2R..P24R / S8R / P4D photo prints, plus the Chinese / Taiwanese octavo and sextodecimo sheet formats LARGE/STANDARD/CROWN/ROC 8K and the matching 16K halves.
Version 3.10.0
Ajouts
- Ajouté des versions C++Builder natives pour chaque exemple Delphi sous Demo. Les démos de création de PDF, manipulation de page, polices, images, sécurité, signature, rendu et impression peuvent désormais être construites et exécutées depuis C++Builder sans aucun wrapper côté Delphi.
- Ajouté un bref Readme.txt en anglais à chaque dossier de démo Delphi décrivant ce que la démo montre, l'API qu'elle cible et comment l'exécuter ; une vue d'ensemble HTML à Demo\Delphi\index.html lie à toutes ces démos regroupées par sujet.
Modifications
- Chaque nouvelle démo se trouve dans Demo\C++Builder\<Name>\ en tant que projet console qui consomme directement Lib\PDFlibrary.pas et est livrée avec les fichiers d'entrée nécessaires à l'exécution.
- Reproduit le même Readme.txt pour chaque démo C++Builder avec une section Run réécrite pour le workflow console (arguments argv au lieu de Open/SaveDialogs) ; un Demo\C++Builder\index.html correspondant liste chaque démo C++Builder avec les mêmes groupes de sujets.
Corrections
- Corrigé une fuite mémoire dans la démo ImportEMF (l'instance TPDFlib était créée mais jamais libérée).
Version 3.9.14
Modifications
- Rangé les démos de texte enveloppé et de pagination HTML afin que chacune se concentre sur sa propre API et s'exécute à partir d'un seul bouton.
- Renommé deux projets de démo (EmbeddedFonts et PdfPermission) afin que les exécutables compilés correspondent aux noms de dossier au lieu des anciens noms de prototype.
Corrections
- Corrigé la démo de copie de plage de pages afin qu'elle copie réellement les pages au lieu de toujours signaler un échec.
Version 3.9.13
Ajouts
- Introduit une suite de tests DUnitX automatisée (runners console et VCL GUI) couvrant les unités utilitaires — tampon, AES, ZLib, Unicode et hachage de résumé — et les workflows au niveau bibliothèque incluant la création de document, la sauvegarde sur fichier et sur flux, les allers-retours de chargement et le chiffrement AES-128/AES-256.
Corrections
- Corrigé un bogue de position de flux dans le reader de tampon interne : les lectures de mot de deux octets avançaient le curseur de lecture de quatre octets au lieu de deux. Dans les tampons plus longs que deux octets, les lectures suivantes atterrissaient au mauvais décalage et retournaient silencieusement des données incorrectes. L'effet était le plus visible lors de l'analyse de structures de données binaires qui entrelacent les lectures d'octet et de mot.
Version 3.9.12
Modifications
- Le rendu d'image GDI+ utilise désormais par défaut l'interpolation bicubique lisse et de haute qualité lors de la mise à l'échelle d'images matricielles vers une résolution écran ou d'export. Le précédent défaut était le plus proche voisin, ce qui produisait des artefacts d'escalier visibles sur les petites images (logos, vignettes) agrandies pour l'aperçu à l'écran ou l'export haute DPI. Les appelants qui préfèrent le mode plus net du plus proche voisin peuvent restaurer l'ancien comportement via SetGDIPlusOptions.
Version 3.9.11
Corrections
- Corrigé le rendu Cairo des images PDF qui utilisent la transparence par clé de couleur (un tableau de plage de couleurs /Mask dans le dictionnaire d'image). Précédemment, lorsqu'une page contenait une image avec cette forme de transparence, le moteur de rendu Cairo omettait entièrement l'image au lieu de la composer avec l'arrière-plan de la page. La correction dérive un canal alpha par pixel à partir des plages de clé de couleur déclarées et rend le résultat comme une image transparente, produisant une sortie visuellement cohérente avec le moteur de rendu GDI+.
Version 3.9.10
Corrections
- Corrigé une régression de rendu Cairo où tout contenu de page suivant une séquence d'image découpée était incorrectement confiné au rectangle de découpage de l'image. Les pages PDF qui sauvegardent l'état graphique, appliquent un chemin de découpage, peignent une image, puis restaurent l'état — une technique de mise en page courante pour les images encadrées ou bordées — rendaient tous les textes, formes et graphiques suivants à l'intérieur de la région découpée uniquement. La sauvegarde et restauration d'état Cairo correspondent désormais correctement aux opérateurs q/Q PDF, de sorte que la région de découpage est écartée après que l'image est dessinée.
Version 3.9.9
Ajouts
- Ajouté un moteur de rendu PDF basé sur Cairo comme troisième option de rendu aux côtés de GDI+ et PDFium. Appelez SelectRenderer(2) avant le rendu pour l'activer ; le moteur requiert cairo.dll du dossier DLL\Cairo fourni. Le rendu Cairo prend en charge les mêmes modes de sortie que GDI+ : export de fichier bitmap et flux (BMP, JPEG, PNG, GIF, TIFF, G4 TIFF), rendu vers contexte de périphérique et sortie d'imprimante directe.
Modifications
- La démo MultiFunction View/Print expose désormais un sélecteur de moteur de rendu à trois voies afin que les utilisateurs puissent comparer la sortie GDI+, PDFium et Cairo côte à côte sur le même document sans aucun changement de code.
Version 3.9.8
Corrections
- Supprimé deux diagnostics de compilateur fallacieux dans le shim C-runtime Win32 qui apparaissaient sur RAD Studio 13.1 et ultérieur. Un avertissement de dépréciation (W1000) était levé parce qu'un garde de capacité de version de compilateur n'était pas propagé aux compilateurs plus récents que Delphi 2009, les amenant à compiler contre une API de gestionnaire de mémoire dépréciée. Un indice de variable non utilisée (H2164) était levé pour une variable de compatibilité interne uniquement nécessaire pour les builds Delphi 7 ; elle est désormais limitée au bloc conditionnel de cette version. Les deux problèmes étaient uniquement diagnostiques sans impact d'exécution.
Version 3.9.7
Ajouts
- Ajouté le rendu de page basé sur PDFium optionnel sur Windows, incluant le rendu de flux BMP, le rendu de contexte de périphérique, le rendu mémoire et la sortie d'imprimante.
Modifications
- Mis à jour la démo Delphi MultiFunction View/Print avec un sélecteur de moteur de rendu afin que les utilisateurs puissent basculer entre le moteur GDI+ existant et PDFium.
Version 3.9.6
Ajouts
- Ajouté des scripts Inno Setup séparés pour le paquet PDFlibPas complet et le paquet d'essai, avec des exclusions axées sur la version pour les métadonnées de contrôle de source, les sorties de build, les caches IDE, les fichiers d'agent locaux et les arbres source tiers fournis qui ne font pas partie du paquet livré.
Modifications
- L'installeur d'essai construit et empaquette désormais les bibliothèques binaires d'essai pour RAD Studio 11.3, 12.3 et 13.1, plus les démos Delphi d'essai, avant que l'exécutable de configuration ne soit généré.
Version 3.9.5
Corrections
- Corrigé les builds de bibliothèque Win32 sous RAD Studio 9.0 / Delphi XE2. Le script de build transmettait un drapeau de répertoire de sortie DCU qui n'existe qu'à partir de Delphi 2010 ; le compilateur de XE2 interprétait le drapeau différemment, produisant un chemin de sortie incorrect et une erreur fatale avant que tout fichier source ne soit traité. Le script sélectionne désormais automatiquement le drapeau approprié selon la version du compilateur cible.
- Corrigé un garde de version de compilateur connexe dans le code source de la bibliothèque qui appelait une fonction d'exécution qualifiée par nom introduite dans XE4 sous une condition XE2+. Les builds ciblant XE2 et XE3 résolvent désormais l'import de compatibilité correct à la place.
Version 3.9.4
Corrections
- Corrigé la configuration d'imprimante pour les imprimantes réseau et partagées par serveur en appliquant les paramètres de bac à papier, média, recto-verso, qualité et autres paramètres d'impression via le handle DEVMODE de l'imprimante au lieu du handle de contexte de périphérique d'imprimante.
Version 3.9.3
Modifications
- Rafraîchi le backend AES fourni vers les sources AES 2018 de Brian Gladman sur Win32 et Win64. Des scripts de build reproductibles permettent désormais de reconstruire les objets AES statiques depuis la source à tout moment. Un défaut ABI dans les bindings Pascal a été découvert et corrigé dans le processus : les fonctions de chiffrement et déchiffrement AES-CBC manquaient leur déclaration de convention d'appel C, de sorte que les builds Win32 transmettaient silencieusement les arguments dans le mauvais ordre de registres, produisant potentiellement une sortie chiffrée incorrecte. Les builds Win64 n'étaient pas affectés car la plateforme impose une convention d'appel uniforme.
Sécurité
- Durci les scripts de reconstruction tiers afin que les scripts zlib, JPEG et stub CRT basés sur MSVC puissent être lancés depuis la racine du dépôt ainsi que depuis le répertoire thirdparty ; précédemment ils requéraient que le répertoire de travail soit défini sur le dossier thirdparty.
Version 3.9.2
Corrections
- Mis à niveau le backend JPEG 2000 de l'ancien OpenJPEG 1.5 vers OpenJPEG 2.5.4 sur Win32 et Win64. Les deux plateformes utilisent désormais le linkage d'objet statique, de sorte que l'encodage et le décodage JPEG 2000 fonctionnent sans DLL d'exécution supplémentaire. Le codec moderne apporte la gestion d'en-tête JP2/J2K actuelle, une API de flux pilotée par callback et des correctifs accumulés de bogues et de sécurité du projet en amont. L'API publique TJpeg2000Bitmap est inchangée.
Version 3.9.1
Corrections
- Corrigé le rendu de page JPEG et l'export d'image après la mise à niveau libjpeg-turbo, restaurant la conversion JPG PdfToImage et la sortie TPDFJPEGImage.SaveToStream sur Win32 et Win64.
- Corrigé les bindings ABI libjpeg-turbo Win32 afin que les callbacks, l'alignement de structure, les champs booléens et les destinations JPEG soutenues par la mémoire correspondent à libjpeg-turbo 3.1.90.
- Corrigé la décompression de flux FlateDecode Win32 avec le backend zlib 1.3.2 fourni, restaurant le chargement de flux xref PDF pour des fichiers tels que le document échantillon PdfToImage.
Version 3.9.0
Modifications
- Mis à niveau le backend JPEG 2000 fourni de l'ancien OpenJPEG 1.5 vers OpenJPEG 2.5.4. Le chargement et l'enregistrement JPEG 2000 utilisent désormais le codec moderne, l'API de flux pilotée par callback et la gestion d'en-tête JP2/J2K actuelle tout en préservant l'API publique TJpeg2000Bitmap.
Corrections
- La sortie JPEG 2000 sélectionne désormais automatiquement un nombre de résolutions OpenJPEG valide pour les petites images, et le backend statique Win32 ne dépend plus des exports d'aide MSVCRT manquants.
Version 3.8.1
Corrections
- Éliminé les 16 avertissements cosmétiques de l'éditeur de liens W1028 "Bad global symbol definition" sur Win32 et Win64. Les renommages au niveau source suppriment les doublons redondants côté Pascal (jpeg_std_error et les stubs allocateur jmemnobs se résolvent maintenant uniquement depuis la couche obj) ; les trois symboles obj bcc32 / vc64 restants (jpeg_natural_order, jpeg_aritab, jpeg_nbits_table) qui doivent rester résolus par lien contre les données côté Pascal sont désormais dépouillés de leurs noms de symboles COFF via une passe de post-traitement ObjConv durant thirdparty\build-jpeg-vc64.bat. Aucun changement d'API publique ; sortie de l'éditeur de liens propre pour les builds Delphi Win32 et Win64.
Version 3.8.0
Sécurité
- Codec JPEG Win64 mis à niveau de libjpeg style IJG vers libjpeg-turbo 3.1.90, achève la migration JPEG démarrée en v3.7.0 (Win32). Les deux chemins Win32 et Win64 partagent désormais le même codec JPEG moderne, avec les mêmes boucles internes optimisées SIMD et plus de 30 correctifs CVE / fuzz accumulés en amont. L'API publique PDFlibPas est inchangée.
Version 3.7.0
Sécurité
- Codec JPEG Win32 mis à niveau de IJG libjpeg-6b vers libjpeg-turbo 3.1.90. Encodage/décodage JPEG significativement plus rapide grâce aux boucles internes optimisées SIMD, plus les 30+ correctifs CVE / fuzz accumulés en amont de libjpeg-turbo. L'API publique PDFlibPas (classe TPDFJPEGImage, fonctions DumpJPEG) est inchangée ; les chemins de code PDF/JPEG existants s'exécutent plus rapidement sans changements de source requis.
Version 3.6.0
Modifications
- Le chemin zlib Win64 est inchangé dans cette version — il continue d'utiliser l'unité System.ZLib fournie avec Delphi.
- Activé le shim CRT au moment du linkage Win64 PDFlibCLibs.pas (introduit en v3.5.0) pour le chemin zlib Win32, fournissant les symboles memcpy / memset / malloc / free auxquels les nouveaux fichiers obj zlib 1.3.2 font référence.
Sécurité
- zlib Win32 mis à niveau de 1.2.x vers 1.3.2. Inclut les 25+ correctifs CVE / fuzz standard accumulés en amont depuis 1.2.8, plus les nouveaux points d'entrée inflateBack9 / inflateTree9 utilisés par les flux à fenêtre 64 bits. L'API publique PDFlibPas (DeflateStr / InflateStr / InflateStrParms) est inchangée.
Version 3.5.0
Ajouts
- Ajouté une infrastructure de build pour OpenJPEG 2.5.4. L'arbre source OpenJPEG lui-même est récupéré indépendamment par l'utilisateur (git clone uclouvain/openjpeg dans Lib/thirdparty/OpenJPEG/) afin qu'il puisse être mis à niveau sans toucher à la configuration de build de PDFlibPas.
- Ajout de Lib/PDFlibCLibs.pas, une couche CRT de liaison Win64 utilisée par le backend Win64. Elle comble l'écart entre les fichiers obj C compilés avec MSVC et les éditeurs de liens Win64 de Delphi (dcc64 / Win64x ld.lld / BCB ilink64), qui n'intègrent pas automatiquement msvcrt.dll.
Modifications
- Internalisé une infrastructure de build fraîche pour les bibliothèques C d'image / compression fournies : zlib 1.3.2, libjpeg-turbo 3.1.90, libtiff 4.7.1. Les scripts de build pour Embarcadero bcc32 (Win32) et MSVC cl.exe (Win64) vivent dans Lib/thirdparty/ aux côtés des arbres source, de sorte que quiconque a RAD Studio + VS2022 peut reconstruire les fichiers obj statiques depuis une source propre.
Version 3.4.0
Sécurité
- Durci la génération de clé de chiffrement, du vecteur d'initialisation AES et du bloc de permission Perms contre les sources de nombres aléatoires prévisibles. Les PDF chiffrés produits sur des systèmes démarrés près du même temps d'horloge murale ne sont plus trivialement corrélables ; les documents AES-256 conservent désormais leur pleine force de clé.
- Durci l'analyse de dictionnaire d'image contre les PDF mal formés ou hostiles qui déclarent des valeurs Width, Height, BitsPerComponent ou des comptages de composants DeviceN déraisonnables. Les valeurs hors plage sont serrées avant toute arithmétique de tampon de pixels, empêchant les plantages lors de l'ouverture de tels fichiers.
- Durci la traversal de références croisées et de l'arbre de pages contre les documents dont les chaînes xref /Prev ou les liens de page /Parent forment un cycle ou sont excessivement profondes. Le reader rejette désormais proprement les structures mal formées au lieu de récurser jusqu'à épuiser sa pile.
Version 3.3.1
Ajouts
- Ajouté des commentaires inline de justification autour des correctifs de rendu PDFlibRenderer.pas qui étaient déjà présents dans la ligne de base Git initiale. Les commentaires documentent pourquoi SetPen met à l'échelle les largeurs de trait par la transformation de canevas active, et pourquoi les opérateurs CharProc d0/d1 de police Type 3 doivent consommer leurs opérandes. Aucun changement de comportement d'exécution.
Corrections
- Rationalisé les scripts de build Windows par composant. Les dossiers DLL/, OCX/ et Dylib/ ne portent plus de variantes build12-* / build13-* séparées : chaque plateforme a désormais un seul script build-Win32 / build-Win64 qui s'épingle au dernier RAD Studio et accepte un argument optionnel "debug".
Version 3.3.0
Corrections
- Corrigé le rendu de trait transformé dans PDFlibRenderer.pas. SetPen applique désormais l'échelle de transformation de canevas actuelle aux largeurs de ligne PDF avant d'appeler Picasso, empêchant les traits surdimensionnés ou sous-dimensionnés sur les chemins dont les coordonnées ont déjà été transformées. Cela corrige les contours de glyphe Type 3 qui pouvaient se rendre comme des blocs épais et irréguliers.
- Corrigé la gestion CharProc d0/d1 de police Type 3 dans le parseur de flux de contenu. d0 consomme désormais ses deux opérandes de largeur, et d1 consomme ses six opérandes de largeur/boîte englobante avant que les commandes de dessin ultérieures ne s'exécutent, empêchant les opérandes périmées de corrompre la géométrie de glyphe ou de chemin.