PDFlibPas Release Notes
Release history
Version history of the PDFlibPas library. Entries are listed newest first; each release follows semantic versioning per the project release policy.
Last release
- Latest version: v3.75.6; Release date: 2026-06-23
Version 3.333.0
Added
- Incremental-revision inspection. A signature covers the bytes of the revision it was written into, and everything appended afterwards is a separate update whose contents decide whether the signature still stands for the document as it is now.
GetDocumentRevisionCount,GetDocumentRevisionStartandGetDocumentRevisionEndlay out those revisions, andGetSignatureRevisionIndexsays which one a signature ends at GetDocumentRevisionKindreports what an update did, as the most far-reaching of the objects it touched: bookkeeping, validation material, a document time stamp, a signature, a form field, an annotation, or document content. Adding validation material for long-term validation therefore no longer looks like editing the documentGetDocumentRevisionChangeslists every object an update added, changed or deleted, together with what each one is and, for a changed dictionary, which keys actually differGetDocumentRevisionsCompletereports whether the whole history was recoverable. A chain that is broken, cyclic or longer than the reader will follow leaves the oldest updates unseen, and the counts are then a lower bound rather than an answer- An object whose earlier version cannot be read, or whose stream body was never compared, is reported as undetermined rather than as harmless: an update that rewrites a page while leaving its dictionary untouched is not mistaken for a repack
Version 3.332.0
Added
ApplyPAdESLongTermValidationpromotes an already-signed PDF to PAdES-B-LT in one call. It builds the signer certificate path from the signature itself, gathers OCSP and CRL material for each link through the addresses the certificates name, and writes the certificates and revocation data into the document security store with a VRI entry for the signature, in a single incremental update.ApplyPAdESLongTermValidationToStreamwrites the result to a stream instead of a file- The behaviour is configurable through a
PADES_LTV_*option mask: whether to write the VRI entry, whether to ask OCSP responders, whether to fall back to CRLs, whether to follow issuer addresses to complete the path, and whether to skip revocation for a self-issued root - An empty field name processes every signature into one revision; a named field processes just that one
GetPAdESLTVCertificateCount,GetPAdESLTVCRLCount,GetPAdESLTVOCSPCountandGetPAdESLTVErrorreport what the last call gathered and why it stopped short, so a partial result over an unreachable responder is visible rather than silent- Material identical to something already staged is written once and referenced by every signature that needs it, and a signature that carries no readable certificate is reported rather than passed off as a successful promotion
Version 3.331.0
Added
- A signature carries its own certification path, so the material a long-term validation profile needs can be read from the signed file alone.
GetSignatureSignerCertificateDER,GetSignatureEmbeddedCertificateCountandGetSignatureEmbeddedCertificateDERreturn the certificates a signature embeds, andGetSignatureCertificateChainLengthandGetSignatureCertificateChainDERorder them into a path from the signer outward GetSignatureContentsHashHexreturns the key anAddPAdESDSSVRIentry is addressed by, computed from the signature itself- The signer certificate is matched whether the signature identifies it by issuer and serial number or by subject key identifier, and a path stops at the last issuer the signature actually carries rather than pretending to be complete
Fixed
- The DER reader rejects a declared element length larger than the data instead of letting a near-maximal value wrap its bounds check, and the certificate extension walk no longer reads past the end of a truncated or overlong certificate. Both are reachable from a crafted document, so the accessors above stay safe on untrusted input
- The signature accessors read the document with a shared handle, so they answer while a verifier or viewer already has the file open instead of failing as though the signature were absent
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
CreateValidationReportandSaveValidationReportproduce a structured PDF/A and PDF/UA-1 validation report in XML or JSON. Every finding carries the rule id, the standard that owns it, a short rule name, the ISO clause it enforces, a severity and the number of affected objects, and the report closes with per-standard and document-level pass/fail statistics- A standard that was not requested is reported as
not-checkedrather than as a silent pass, so a partial run cannot be mistaken for a clean bill of health - Build pipelines can now gate on a rule id or an ISO clause instead of matching substrings in prose: the preflight report family renders a human report first and converts that text to JSON, HTML or CSV, whereas the validation report is assembled from the raw check output and keeps the machine-readable fields intact
Version 3.322.0
Added
- The reference now documents the four externally-declared public types used across the
TPDFlibsurface that previously had no dedicated page:TPDFlibProgressEvent,TPDFlibLogger,TPDFlibCertificateInfoandTPDFlibWatermarkBase, completing the coverage of public event, logger, enumeration-result and watermark types
Version 3.321.0
Added
CheckDocumentPolicyevaluates declarative house rules such asFonts.NotEmbedded = 0,Security.Encrypted = noorDocument.Pages <= 500against the document and reports each rule as passed or failed with the actual value, turning an ingest gate for publishers, archives and print shops into configuration instead of hand-written inspection code
Version 3.320.1
Fixed
- Drawing text in a PDF/A mode without loading a font first no longer faults: PDF/A requires every font program to be embedded, so the implicit shortcut to a built-in font was refused and left no font selected, and
DrawTextand the other text calls crashed instead of drawing - The implicit font path now resolves a real embeddable face while a PDF/A mode is active, so text drawn without an explicit
AddTrueTypeFontcall is embedded and stays conforming; a directAddStandardFontcall is still refused under PDF/A - On hosts where no embeddable face can be resolved, drawing falls back to the built-in metrics instead of faulting and reports the conformance shortfall through
LastErrorCode605, so the file can be caught before it is published as conforming
Version 3.320.0
Added
GetDocumentFeatureReportreturns a structured feature report in one call — document metadata, page and object counts, encryption state, font and image inventories, tagging and outlines, form fields, signatures, attachments and the byte breakdown by category — replacing the dozen separate queries a cataloguing or ingest pipeline previously had to assemble
Version 3.319.0
Added
SetCollectionView,AddCollectionField,SetCollectionSortandSetCollectionItemValuebuild PDF portfolios on top of the existing attachments, so a set of embedded files is presented as a browsable package with its own columns, sort order and per-file values instead of a plain attachment listGetCollectionViewandGetCollectionFieldCountreport the presentation mode and the number of declared columns of a loaded portfolio
Version 3.318.1
Fixed
- Text extraction option 12 (ignore rotated text) now drops rotated runs whatever way they turn: a quarter turn clockwise and a quarter turn counter-clockwise used to be treated differently, so sideways margin notes were discarded in one direction and returned in the other
- The same option keeps slanted text that is only sheared, such as a synthetic italic, and the tolerance now scales with the text size and the page transformation, so large slanted headings are no longer discarded as if they were rotated
Version 3.318.0
Added
DecodeAllStreamsexpands the compressed streams of a document in place, so saving it produces a copy whose content streams, metadata and structure can be read directly by diff tools, forensic review and support workflows; images, prediction streams and cross-reference streams keep their encoding, and object streams are materialised first so nothing is lost
Version 3.317.0
Added
SetTrappedandGetTrappeddeclare and read the document trapping state that PDF/X requires, written as the/Trappedname the specification calls for rather than as a text stringSetOutputIntentSubtypeandGetOutputIntentSubtyperetag the output intent, so a loaded colour profile can describe aGTS_PDFXprinting condition instead of theGTS_PDFA1archiving condition that the PDF/A modes create
Version 3.316.0
Added
SetEncryptEmbeddedFilesOnlyandGetEncryptEmbeddedFilesOnlyrestrict AES encryption to embedded files: the document opens and renders in any reader with no password prompt while its attachments stay encrypted, the standard arrangement for invoices, medical records and case files whose cover pages are public but whose payload is not
Version 3.315.0
Added
- Text extraction option 18 rotates runs painted at 90, 180 or 270 degrees into the horizontal reading frame and groups each quarter turn separately, so rotated margin notes, table headers and chart axis labels extract as readable lines instead of interleaving with the upright text or being discarded
Fixed
DASetTextExtractionOptionsaccepts option 16 (dehyphenation) and option 17 (character-gap word splitting) instead of rejecting them, and the direct-access extraction path now forwards options 15, 16 and 17 to the extractor, so underscore-rule removal, dehyphenation and character-gap splitting apply to file handles the same way they apply to a loaded document
Version 3.314.0
Added
GetFontHasToUnicodereports whether the selected font carries a Unicode mapping, and the font inventory gains a matching per-fontHasToUnicodefield plus aNoToUnicodeCountsummary, so documents can be checked for extraction-safe and PDF/A-*u or PDF/UA convertible fonts before processing
Version 3.313.0
Added
SetPDFAModegains mode 8 for PDF/A-2u (ISO 19005-2 Level U), the conformance level that declares Unicode text mappings without allowing embedded files, completing the PDF/A-2 family alongside the existing 2b and 2a modes
Version 3.312.0
Added
GetObjectByPathandGetObjectByPathCountread any node of the object tree through path expressions such asRoot/Pages/Kids[0]/MediaBox[2]orpages[0]/Type— types, scalar values, serialized forms and element counts in one call, replacing hand-written object walking for metadata probes, compliance spot checks and support diagnostics
Version 3.311.0
Added
SetBlackPointCompensationdeclares black point compensation (ON, OFF or Default) for subsequent drawing through the PDF 2.0/UseBlackPtCompgraphics state, letting prepress and proofing output pin down dark-tone ICC conversions that were previously viewer-private; the document version is raised automatically and PDF/A modes reject the state
Version 3.310.0
Added
SetCompressionLevelandGetCompressionLevelexpose the deflate level for every compression the library performs: 0 keeps the default SIMD-accelerated engine, 1 favours throughput and 9 squeezes archives smallestRecompressStreamsre-deflates every plain FlateDecode stream of the selected document at the current level and keeps the smaller encoding per stream, shrinking documents that were originally written at a fast compression setting without touching their content
Version 3.309.0
Added
SetObjectStreamModeandGetObjectStreamModeadd a three-state object stream control: disable, generate (default) or preserve, where preserve keeps the loaded file's original compressed grouping and writes the containers verbatim, making conversions of existing PDF 1.5+ files cheaper because nothing is unpacked or regrouped
Changed
- In preserve mode, members edited since loading are promoted to top-level objects so their changes are saved, and any remaining compressed member automatically selects the binary cross-reference stream form
Version 3.308.0
Added
CheckDocumentStructureruns a one-call structural health check: every object and stream is forced through its decoder, plain Flate streams are strictly verified against the zlib end marker so truncated data is caught, and the report flags missing trailers, unresolvable catalogs and pages, unsupported encryption handlers and byte-scan-repaired files with per-object findings and a summary line
Version 3.307.0
Fixed
- Damaged documents that use cross-reference streams now repair successfully: the raw reconstruction recovers the members of compressed object streams and, when no trailer keyword exists anywhere in the file, synthesizes the trailer from the newest reachable document catalogue, so a broken startxref offset no longer makes such files unopenable
Version 3.306.0
Added
ExportDocumentDatawrites the document information keys, the whole bookmark tree and the page label ranges as editable plain text in the classic dump_data line formatImportDocumentDataapplies the same format back — information keys update, the bookmark tree is rebuilt with nesting levels and destination pages, and page label ranges are replaced — enabling bulk bookmark editing and metadata migration between documents in one call each way
Version 3.305.0
Added
AuditDocumentSpacebreaks the document's byte usage down by category — images, font programs and dictionaries, content streams, form XObjects, object streams, embedded files, metadata, structure tree, annotations, page tree and other — with object counts, byte totals and percentages, answering why a file is as large as it is and which optimisation pays off best
Version 3.304.0
Added
StructTreeItemCount,GetStructTreeItemTextandGetStructTreeItemIntPropertyread the structure tree of a tagged document as a flattened depth-first item list — element types (raw and role-mapped), alternate and actual text, language, titles, marked-content ids, page numbers and parent/child relationships
Changed
- The structure tree reader guards against damaged documents: reference cycles, out-of-range object numbers and trees nested beyond 64 levels are cut off instead of looping
Version 3.303.1
Fixed
- Translucent underlay stamps created by
StampTextandStampImageno longer bleed their opacity into the original page content — the transparency state is now confined to the stamp itself, so the page keeps its full opacity
Version 3.303.0
Added
OverlayDocumentPagesstamps the pages of another open document onto the selected document's pages, one source page per target page, above or underneath the existing content — letterhead paper, continuous page backgrounds and scanned form templates in one call- Source exhaustion is configurable: stop, cycle through the source pages, or keep repeating the last source page; a further option prevents the stamp from being enlarged beyond its natural size
Changed
- Document stamps are fitted to the target page's CropBox and placed upright on pages carrying a
/Rotateentry, and each source page is imported once as a shared Form XObject so repeated templates never duplicate their resources
Version 3.302.0
Fixed
- AES-256 passwords are now processed with SASLprep (RFC 4013) before hashing, so passwords containing non-ASCII spaces, soft hyphens, compatibility characters or combining sequences open correctly in Acrobat and other conforming readers
- Opening AES-256 documents tries the standard prepared password first and falls back to the legacy byte form, so files written by earlier releases with non-ASCII passwords continue to open
Added
- Error code 604 reports an AES-256 password rejected by SASLprep because it contains prohibited code points or violates the bidirectional rules
Version 3.301.0
Added
SplitDocumentToFilesbursts the selected document into a batch of output files with a fixed number of pages each, using a%pfile name placeholder
Changed
- Batch splitting parses the source document once and copies every chunk from the same in-memory structure, replacing the repeated full re-parse that a loop over
ExtractFilePagesperforms for each range
Version 3.300.0
Added
CollateDocumentsmerges pages from several open documents into the selected document in rotation, taking a configurable number of pages from each source per round (A1, B1, A2, B2, …)CollateDocumentsExaccepts a per-source page range list where descending ranges such as3-1reverse a source, so front and reversed back scanner passes merge into reading order in one call
Changed
- Collated merges import each source through a single object map and interleave by page reordering, so fonts and images shared inside a source are written only once regardless of the group size
Version 3.299.0
Added
SetDeterministicDocumentIDandGetDeterministicDocumentIDswitch the trailer file identifier to a reproducible value so identical inputs produce identical output bytes for build caching, content-addressable storage and byte-level regression comparisonSetDocumentIDSeedsupplies an explicit seed for the reproducible file identifier; without a seed the identifier is derived from the document metadata, version header and page count
Changed
- Reproducible file identifiers are refreshed on full saves only; incremental updates and encrypted documents keep their existing identifier so signatures and password-protected files continue to open correctly
Version 3.298.0
Added
AddLinkToArticleThreadandSetOutlineArticleThreadconnect page hotspots and outlines to an article thread or bead with standard Thread actionsAddActionNextArticleThreadandPDF_ACTION_BUILDER_THREADadd Thread actions to chained, form, page and document action workflows
Changed
- Thread action targets use stable indirect thread and bead references and reject invalid indexes without changing the destination container
- Form-field action builders reject additional actions while PDF/A mode is active, preserving the PDF/A prohibition on field and widget
/AAdictionaries
Version 3.297.0
Added
- The
DLflat-DLL reference now documents everyA-suffix ANSI (char) entry point, adding 353 reference pages that mirror their Unicode counterparts with accuratePAnsiCharDelphi andconst char *C signatures - Rebuilt
BufferUtilities,DirectAccessFunctionalityandMiscellaneousFunctionsas clean function-group index pages driven by the shared category scheme, fixing broken markup, mislabelled sections and missing chips - The navigation index and shared search index now cover the full DLL surface for both Unicode and ANSI callers
Fixed
- Removed the stale
SetLoggerentry, which had no matching symbol in source; the documented property isLogger
Version 3.296.0
Added
AddAlternateImage,AlternateImageCount,GetAlternateImageInfoandRemoveAlternateImageprovide typed authoring and inspection of display and printing image variants- Alternate images can be associated with an optional-content group or membership dictionary, while one variant per base image can be selected as the printing default
Changed
- The built-in renderer now selects optional-content alternate images when a base image is hidden and honours the printing default on printer destinations
FindImagesnow registers alternate image XObjects reachable from page resources so imported variants receive usable image handles
Version 3.295.0
Added
AddArticleThreadcreates standards-compliant article navigation with typed metadata, ordered page rectangles, circular bead links and per-page bead arraysArticleThreadCount,GetArticleThreadInfoandGetArticleThreadBeadinspect created or imported article threads with bounded traversal of damaged link cycles
Changed
DeletePagesnow removes article threads that lose every bead and repairs the circular links of surviving threads- Deleted-page tracking now retains stable indirect page references so outline and article cleanup cannot drift as the page-tree cursor moves
Version 3.294.0
Added
SearchTextBatchsearches multiple text queries while each page extraction is resident and returns the originating zero-based query index with every hitSearchTextBatchEachprovides the same single-pass search through a streaming callback with progress reporting and cancellation
Changed
- Single-query and batch text search now share one matching core, preserving case-sensitive, whole-word and page-range semantics while avoiding repeated page extraction, text folding and hit geometry work
Version 3.293.1
Fixed
- Mesh shading rasterization no longer fails to compile on any Delphi version, resolving
E2089 Invalid typecaston real-to-floating-point casts in the GDI+ painter - Parallel batch page rendering now compiles on Delphi XE5 and XE6, where
System.Threadingis unavailable; older toolchains fall back to the serial render path as on non-Windows - Printer capability probing no longer raises an incompatible-types error on legacy Delphi versions by aligning the
SetPrintercall with the rest of the printing code - Certificate store enumeration now builds on RAD Studio 10.3 Rio, which previously aborted with an internal compiler error while optimizing the enumeration routine
Version 3.293.0
Added
- Optional-content membership dictionaries can now be created, updated and enumerated with
AnyOn,AllOn,AnyOffandAllOffcompatibility policies - Nested PDF 1.6
/VEvisibility expressions supportAnd,OrandNotthrough a compact prefix representation shared by Delphi and C++Builder
Changed
- Optional-content scopes, content streams, captured pages, images, form fields and annotations now accept either a group handle or a membership handle
- Rendering evaluates valid
/VEexpressions first and falls back to/OCGsplus/Pfor malformed or unsupported expressions
Fixed
- Nested optional content can no longer make content visible when an enclosing group or membership is hidden
- Membership dictionaries with no effective optional-content groups now leave visibility unchanged as required by the PDF specification
Version 3.292.0
Added
EnumAttachmentsnow reports creation and modification dates, hexadecimal checksums, associated-file relationships, and file specification object numbers for both document and annotation attachmentsValidateAttachmentChecksumverifies an attachment payload against its stored checksum on demand, while newly embedded files now receive checksum metadata automatically
Fixed
SetEmbeddedFileAFRelationshipnow accepts the same 1-based embedded-file indexes as the rest of the attachment API, including single-attachment documents
Version 3.291.0
Added
DeduplicateResourcesnow consolidates exact duplicate image, Form, pattern, shading, function, ICC profile, font program, CMap, Type 3 CharProc, embedded-file, metadata, and PostScript streams across a loaded document- Resource deduplication provides independent type flags, dry-run analysis, optional orphan collection, and detailed hashing, comparison, payload, reference, and per-category statistics
Changed
- Duplicate detection canonicalises complete stream dictionaries independently of key order, hashes every candidate payload once with SHA-256, and confirms matching buckets byte for byte before redirecting references
- Exact-equivalence groups retain the lowest object number and generation for deterministic output, while malformed direct-object cycles and semantic dictionary differences remain unmerged
Version 3.290.0
Changed
PurgeUnusedResourcesnow computes a transitive dependency closure across tiling patterns, Type 3 glyphs, annotation appearance states, ExtGState soft-mask groups, images, shadings, and nested colour spaces- The default cleanup options now enable pattern, Type 3, appearance, soft-mask, and image dependency analysis, with independent flags for callers that need a narrower scan
- Nested content programs and dependency entries are cached, shared resource scopes are privatised before pruning, and malformed cycles are bounded by active-stream and depth guards
Fixed
- Page resources used only through image colour spaces, Indexed bases, Separation or DeviceN alternates, Pattern underlying spaces, ICCBased alternates, or shading dictionaries are no longer removed as unused
- Resources used only by Type 3 CharProcs, tiling-pattern cells, annotation appearances, or transparency soft-mask groups are no longer removed from their own or inherited scope
Version 3.289.0
Added
PurgeUnusedResourcesnow removes named page resources that are not referenced by selected content layers and can return detailed per-category statistics- Resource cleanup now supports page ranges, dry-run reporting, progress and cancellation, recursive Form XObject analysis, deprecated ProcSet removal, and optional orphan-object collection
Changed
- Resource analysis now follows PDF name case sensitivity, inherited Form resources, custom inline-image colour spaces, and all seven standard resource categories
- Repeated Form programs are cached, used-resource sets use sorted lookup, and dictionary entries are removed in descending order for predictable large-document performance
Fixed
- Dictionary entry removal now invalidates large-dictionary key indexes so later lookups cannot return stale entries
- Malformed streams and unknown operators preserve their complete resource scope by default, while shared or inherited resource dictionaries are cloned before mutation
Version 3.288.0
Added
- Digital signatures can now emit complete DocMDP certification and FieldMDP field-lock structures, with structural permission reports for every selected signature
- RFC 3161 document timestamps, signature timestamps, PAdES-B-T token injection, certificate-chain validation, OCSP evidence, and DSS or VRI validation material now have complete authoring and verification workflows
- RichMedia annotations now support embedded assets, activation and deactivation settings, poster appearances, enumeration, extraction, and removal
- Poster printing now supports vector page imposition, overlap and crop marks, hard-margin-aware placement, and reusable tile plans
- Tagged tables now emit semantic Table, TR, TH, and TD structure with stable identifiers, header associations, spans, repeated headers, and artifacted decoration
- The viewer now provides keyboard-accessible AcroForm editing for text, choice, check box, radio, and push-button fields while dispatching actions to the host application
Changed
- Type 1 function-based and Type 4 through 7 mesh shadings now render through native function evaluation and bounded mesh tessellation
- ICCBased colour rendering now shares cached transforms across images and shadings while preserving calibrated colour-space behaviour
- Incremental saves now rebuild object streams and cross-reference streams consistently, and selected signatures are verified against their own signed revision
Fixed
- SHA-1 signature timestamp requests now hash the signer signature value with SHA-1 instead of falling back to SHA-256
- Rejected field-lock replacements no longer discard a previously valid field-lock configuration
- Radio widgets with duplicate appearance-state names now preserve the selected widget and keep sibling widgets off
Version 3.287.0
Changed
- Inline image dictionaries now follow PDF comment, delimiter, literal, hexadecimal, array, and dictionary boundaries with bounded nesting
- Inline image payloads now use format-aware termination for raw, DCT, ASCII85, ASCIIHex, RunLength, and Flate data
- Flate payload discovery now performs one bounded inflate from the content-stream offset with exact compressed-byte accounting, while chained lossless filters share an end-to-end output ceiling
- ASCII85, ASCIIHex, LZW, predictor, colour-profile, and auxiliary image streams now enforce bounded intermediate output without oversized temporary allocations
Fixed
- Malformed or truncated inline images no longer read beyond source data, loop on unterminated values, or retain stale state across decoder reuse
- Packed image rows now calculate component bits before byte rounding, preventing incorrect lengths for low-bit RGB and multi-row images
- Resource colour spaces now preserve their original names while deriving Lab, indirect ICCBased, and DeviceN component counts and decoding Indexed palette streams under strict limits
- Inline image boundaries now reject invalid dimensions, bit depths, unsupported filters, unsafe filter chains, compressed streams, and ambiguous end markers consistently
- Indexed colour rendering now validates every palette access and rejects truncated lookup data instead of reading beyond the decoded table
- PNG predictors 10 through 15 now decode correctly for Flate and LZW streams, reject invalid row filters, and validate all row and state sizes before allocation
- JPEG and JPEG 2000 payloads now verify their encoded dimensions, components, precision, marker structure, box lengths, and decoded storage footprint before image allocation
- Inline image validation now limits both packed and expanded bitmap storage and bounds ICC profiles, JBIG2 globals, and terminal filter parameters
- Binary filter payloads containing embedded end-marker text now continue to the first candidate that passes bounded format validation
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
- Added a Delphi PDF/A guard matrix demo that checks early rejection or allowed-path decisions for PDF/A mode setup, transparency, blend modes, encryption, JavaScript, multimedia, embedded files, and PDF/A-3 associated-file workflows, with generated PDF, CSV, and HTML reports
Version 3.163.0
Added
- Added an explicit ReportAdapter bridge matrix for FastReport, QuickReport, ReportBuilder, DBGrid, and custom canvas export paths, including generated CSV and HTML mapping output plus a PDF page that shows the reusable adapter strategy
Version 3.162.0
Added
- Added an advanced workflow demo matrix that generates concrete outputs for canvas migration, EMF import options, image compression comparisons, AcroForm action workflows, visible empty signatures, security permissions, PDF/A-1b checks, optional content, tiling patterns, Form XObjects, DBGrid-style table export, and large-file peak memory reporting
Version 3.161.0
Added
- Added Delphi helpers for compact open-document action construction, form-field visibility event actions, TColor and grey colour setters, and direct raw content, path, text, and matrix content stream injection
Version 3.160.0
Added
- Added Delphi helpers for bitmap-to-JBIG2 scanned-image compression, one-call image mask and colour-key transparency setup, GoTo action chaining, and readable AcroForm event names for JavaScript or existing action assignment
- Extended
ImportEMFFromFileExandImportEMFFromStreamExso theirOptionsflags can force bitmap import, enable EMF colour-image JPEG recompression, and request GDI+ processing controls
Version 3.159.1
Changed
- Improved
SaveToStreamand bound output stream saving so large PDF stream objects are written in bounded chunks instead of copying each stream object into one intermediate output string
Version 3.159.0
Added
- Added image placement helpers that draw or fit a specified image and release its handle immediately afterwards, with Delphi, DLL, and ActiveX entry points for lower peak memory in one-use image generation workflows
- Added
RenderPageToMonochromeFileExfor 1-bit BMP rendering with threshold conversion and isolated black-pixel clean-up before scanned-image compression workflows
Version 3.158.1
Added
- Added Delphi workflow demos for reusable report-style export, RichEdit-to-EMF rich text import, and combined page-thumbnail, annotation, form XObject, table, compression, JavaScript, and bound-stream output scenarios
Version 3.158.0
Added
- Added metadata encryption control APIs with Delphi, DLL, and ActiveX entry points: SetEncryptMetadata can write Standard-security PDFs with unencrypted XMP metadata streams, while GetEncryptMetadata reports the pending or loaded /EncryptMetadata state
Version 3.157.0
Added
- Added direct tiling-pattern drawing APIs with Delphi, DLL, and ActiveX entry points: BeginTilingPattern creates a temporary pattern cell drawing surface, EndTilingPattern registers it as a reusable pattern, and CancelTilingPattern discards the build without leaving a named pattern behind
Version 3.156.0
Added
- Added Delphi bound-output stream helpers:
BeginOutputToStream,EndOutputStream,CancelOutputStream, andOutputStreamActivelet streaming, web, and report-export code bind a targetTStream, finish it through the existing chunked writer, or cancel the pending target without taking stream ownership
Version 3.155.0
Added
- Added
Abort,Aborted, andResetAbortfor Delphi, DLL, and ActiveX callers so applications can mark an instance as cancelled and prevent save or append output operations from starting until the flag is cleared
Version 3.154.0
Added
- Added page-thumbnail helpers for image import options and in-memory sources, optional-content group lookup and state setters by group name, and
SetOpenActionNamedDestinationfor document-open jumps through named destinations
Fixed
GetDestNamenow resolves explicit destination array handles, including arrays returned from a named document open action
Version 3.153.0
Added
- Added convenience APIs for chained form actions, Hide and ImportData field triggers, initial optional-content group states, optional EMF imports, and colour-key transparent image imports
Version 3.152.0
Added
- Added automatic URL link creation for text drawing, CCITT Group 3/4 image import helpers, JBIG2 direct-image helpers, EMF extended import wrappers, image mask attachment helpers, visible signature field creation, and form-field event/action helpers for JavaScript, SubmitForm, and ResetForm workflows
Version 3.151.0
Added
- Added
DrawPie,DrawChord,DrawEllipticPie, andDrawEllipticChordfor explicit closed circular and elliptic arc drawing with outline, fill, or fill-and-outline modes
Version 3.150.0
Added
- Added
NewGraphicsStateandSetGraphicsStateso callers can create reusable ExtGState resources for combined fill transparency, stroke transparency, line width, line cap, line join, and miter-limit settings
Version 3.149.1
Fixed
- Fixed duplicate ActiveX dispatch IDs for the Form XObject and miter-limit methods so late-bound COM callers resolve each method unambiguously
Version 3.149.0
Added
- Added
SetMiterLimitto control stroke miter-limit ratios for paths that use miter joins - Exposed
BeginFormXObject,EndFormXObject, andCancelFormXObjectthrough the DLL and ActiveX APIs
Version 3.148.0
Added
- Added reusable Form XObject builder APIs:
BeginFormXObject,EndFormXObject, andCancelFormXObjectlet callers draw a reusable template with normal page drawing calls and place it repeatedly through captured-page drawing APIs
Version 3.147.0
Added
- Added
SetTextTilingPatternandSetLineTilingPatternso captured-page tiling patterns can be reused for text, underline, and stroked graphics without duplicating drawing commands
Fixed
- Stroked shader and tiling-pattern colours now write the stroking pattern colour operator instead of updating the nonstroking colour state
Version 3.146.0
Added
- Added
BeginOptionalContentandEndOptionalContentso callers can mark only subsequent drawing commands with an optional content group without rewriting the existing content stream
Fixed
- Scope-closing marked-content operators are now flushed immediately when optional content, tagged PDF or artefact scopes are closed at the end of a content stream
Version 3.145.0
Added
- Added
SetTransparencyExso callers can set separate fill and stroke transparency values for subsequently drawn text and graphics while keeping the existing PDF 1.4 auto-upgrade behaviour
Version 3.144.0
Added
- Added
AddLinkToNamedDestinationso a page hotspot can jump to a same-document named destination without resolving the target page at link creation time
Fixed
- Annotation action readers now return no action for pages without annotations instead of dereferencing an empty annotation cache
Version 3.143.0
Added
- Added form-field action management APIs so callers can bind an existing action to a field trigger, inspect the typed trigger action, and remove primary or additional field actions
Fixed
FormFieldJavaScriptActionnow rejects PDF/A documents and invalid trigger names instead of writing non-conforming field action dictionaries
Version 3.142.0
Added
- Added action chaining APIs so callers can append URI, named, and JavaScript next-actions to an existing annotation, outline, or form-field action and inspect chained actions through
GetActionNextCountandGetActionNextInfo
Version 3.141.0
Added
- Added
AddLinkToSubmitFormandAddLinkToResetFormso page hotspots can submit or reset AcroForm fields through standard PDF actions without JavaScript
Version 3.140.0
Added
- Added
AppendToStreamso incremental update workflows can write directly to a caller-provided stream instead of first materialising the update as anAnsiString
Changed
SaveToStreamnow serialises directly into the target stream, andAppendToString(1)now returns only the incremental update section without copying the original source bytes into a temporary buffer
Version 3.139.0
Added
- Added
GetAnnotReplyToandGetAnnotReplyTypeso threaded annotation replies can be inspected through named read-side accessors instead of generic annotation property tags
Version 3.138.0
Added
- Added the Delphi
DocumentInspectionWorkbenchsample to batch-inspect PDFs with combined font diagnostics, image sampling, colour-space discovery, load timing, and JSON, CSV, and HTML reports
Version 3.137.0
Added
- Added the Delphi
ImageDecodeBenchmarksample to measure page image discovery, decoded image bytes, and page colour-space discovery with CSV and HTML timing reports
Version 3.136.0
Added
- Added
GetDocumentFontDiagnosticsandTPDFlibFontDiagnosticsto summarise document font embedding, subsetting, Standard 14, CID, Type3, and unknown-font counts in one call
Version 3.135.0
Added
TPDFlibSignatureVerifier.VerifySignerCertificateChainnow builds the embedded signer certificate chain with Windows CryptoAPI and returnsvsValidonly when the chain satisfies the Windows base trust policy, while self-signed or otherwise untrusted signer certificates returnvsInvalidwithout changingVerifySignature's content-integrity result
Version 3.134.0
Fixed
TPDFlibSignatureVerifier.VerifySignaturenow validates legacyadbe.pkcs7.sha1signatures, returningvsValidwhen the signed digest matches the covered/ByteRangebytes andvsInvalidafter covered content changes
Version 3.133.0
Added
- Added
RenderPagesToFilesandDARenderPagesToFilesto render arbitrary page ranges to numbered output files while reusing renderer setup across the selected pages
Version 3.132.0
Added
- Added
AddPageHeaderandAddPageFooterconvenience stampers that place text at a fixed top or bottom margin on every page in a range, with left/centre/right alignment and token expansion (&Pcurrent page,&Ntotal pages,&Ddate,&Tdocument title,&&literal ampersand) StampTextandStampImagewithsoUnderlaynow truly place content beneath existing page content by prepending a fresh content layer (previously it drew on top likesoOverlay); backed by a newPrependContentLayerpage-tree method
Version 3.131.0
Added
- Added
ScalePage(ScaleX, ScaleY, Anchor)which scales the selected page's content by wrapping every content layer in aq sx 0 0 sy tx ty cm ... Qgraphics-state block and resizing the MediaBox and CropBox; the anchor keeps the lower-left origin (0), centres the content (1) or keeps the top-left (2) - Extended
EnumPageElementswith a newekPathelement kind: each page now also reports its vector paths with a bounding box, point count, closure flag and paint operator, lifted from the content streams via the structured content model
Version 3.130.0
Added
- Added three file-size optimisation APIs that shrink loaded documents on re-save:
SubsetEmbeddedFontsrewrites every embedded TrueType font program (FontFile2) down to the Unicode characters the document actually renders via the FontSub.dllCreateFontPackageservice;DownsampleImages(MaxDPI, Quality, Filter)decodes each image XObject above the target DPI, resamples it (box or bilinear) and re-encodes as JPEG or PNG;NormalizeLZWStreamsrewrites every stream still filtered with LZWDecode to FlateDecode through the existing LZW decoder and Flate encoder, preserving Predictor parameters
Version 3.129.0
Added
- Added mesh shading creation APIs for the four shading types that previously only had read/parse support:
NewRGBFreeFormTriangleMesh(ShadingType 4, free-form Gouraud triangles),NewRGBLatticeTriangleMesh(ShadingType 5, lattice-form Gouraud),NewRGBCoonsPatchMesh(ShadingType 6, Coons patch mesh) andNewRGBTensorPatchMesh(ShadingType 7, tensor-product patch mesh) — each builds a named mesh shading pattern from a flat vertex or patch list with selectable co-ordinate/colour bit depth and a bounding box, selectable withSetFillShader/SetLineShader/SetTextShaderlike the existing axial and radial shaders
Version 3.128.0
Added
- Added a thumbnail strip for the viewer:
TPDFlibThumbnailBarshows a miniature of every page, rendered lazily as rows scroll into view, with the page number underneath; clicking a thumbnail jumps the attached viewer to that page — completing the viewer control family (viewer, bookmark panel, search panel, thumbnails)
Version 3.127.0
Added
- Added a search panel for the viewer:
TPDFlibSearchPanel.RunSearchsearches the whole attached document and lists one row per hit with its page number and matching text; clicking a hit jumps the viewer to that page
Version 3.126.0
Added
- Added a bookmark panel for the viewer:
TPDFlibOutlineViewerlists the document outline tree with indentation and jumps the attached viewer (viaAttachViewer) to a bookmark's destination page when clicked; it is built on a reusable panel base class that later side panels share
Version 3.125.0
Added
- Added text selection to the viewer control: drag with the left mouse button to select, press Ctrl+C or call
CopySelectedTextto copy the selection to the clipboard; the captured text is available through theSelectedTextproperty, ordered top to bottom with line breaks between bands - Added
GetTextInRegion, which returns the text of a rectangular page region directly — the same block-based lookup the mouse selection uses, available for custom selection interfaces
Version 3.124.0
Added
- The viewer control now pre-renders neighbouring pages on a background thread, so paging forward or backward shows the next page instantly; the worker uses its own document instance and hands finished renderings to the cache without blocking the UI
- Added link interactivity to the viewer: clicking a link annotation fires
OnLinkClickwith the page number and the same typed action summaryGetAnnotActionInfoproduces (web address, document destination, named action and so on);LinkActionAtPagePointexposes the underlying hit test for custom handling
Version 3.123.0
Added
- The viewer control gained continuous scrolling:
SetDisplayModeswitchesTPDFlibViewerbetween single-page display and a continuous vertical scroll through the whole document, with only the pages visible in the viewport rendered and the current page tracking the scroll position (firingOnPageChangeas pages come into view) - Rendered pages are now kept in a least-recently-used bitmap cache, so scrolling back and forth does not re-render; the memory budget defaults to 128 MB and adjusts with
SetCacheLimit, evicting the oldest pages when the budget shrinks or fills - Added mouse-wheel scrolling and keyboard navigation to the viewer: PageUp/PageDown (page steps in single-page mode, viewport steps in continuous mode), arrow keys, Home and End
Version 3.122.0
Added
- Added an interactive PDF viewer control:
TPDFlibVieweris a VCL scrolling control that opens a document from file or attaches to an existingTPDFlibinstance, displays pages through the selected rendering engine (GDI+, Cairo or PDFium), and offers page navigation (GoToPage/NextPage/PrevPagewith anOnPageChangeevent) and zoom control — a fixed percentage, fit-to-width or fit-to-page, recomputed automatically when the control resizes; pages wider than the viewport scroll, narrower pages centre - Added a design-time package (
Package\PDFlibViewerPkg.dpk) that registers the control on the losLab PDF palette page for drag-and-drop use in the IDE
Version 3.121.0
Added
- Automatic complex-script shaping in
DrawText: text containing Arabic, Hebrew, Indic or other complex-script characters is now detected and shaped automatically — contextual letter forms, mandatory ligatures and right-to-left ordering come out correctly with no code changes; the standard-14 names map to their metric-compatible installed faces (Helvetica to Arial, Times to Times New Roman, Courier to Courier New) andGetTextWidthmeasures through the same shaping pass so alignment stays consistent; Latin, Cyrillic, Greek and CJK text keeps its existing drawing path byte for byte - Added
SetTextShapingto toggle the automatic routing (enabled by default; pass 0 to restore the exact pre-shaping behaviour)
Version 3.120.0
Changed
- Shaped-text companion fonts are now subsetted at save time to just the glyphs the document shows, shrinking output files dramatically (a full font program of over a megabyte reduces to the used glyphs); the subsetted font keeps its glyph numbering, carries a subset-tagged
BaseFontname and real per-glyph/Wwidths, and gains a ToUnicode map that translates each shaped glyph back to its source characters — so copying or extractingDrawShapedTextoutput returns the original string, including both letters behind a lam-alef ligature
Version 3.119.0
Added
- Added complex-script text drawing:
DrawShapedTextshapes Arabic, Hebrew and other complex-script strings before drawing them — contextual letter forms, mandatory ligatures such as lam-alef, and right-to-left ordering all come out correctly — and writes the shaped glyphs through a companion Type0 (Identity-H) font embedding the whole font program, so forms without a character code of their own render exactly; one companion font is created per face and reused across calls - Added
GetShapedTextWidth, which measures text through the same shaping pass so ligated text measures at its true drawn width — use it to right-align or centre shaped paragraphs
Version 3.118.0
Added
- Added the foundation for complex-script text shaping: a new Uniscribe (usp10.dll) binding turns Arabic, Hebrew and other complex-script strings into correctly ordered and shaped glyph runs — contextual Arabic forms, mandatory ligatures such as lam-alef, and right-to-left ordering — reporting each glyph's font glyph index, advance and source-character cluster; this is the shaping engine that later versions build the drawing path on, and it is loaded lazily so platforms without Uniscribe simply keep the existing per-character path
Version 3.117.0
Added
- Added ICC profile introspection:
GetOutputIntentICCInfoparses the ICC profile attached to the document's OutputIntent and reports its version, device class, data colour space, profile connection space, rendering intent and component count — useful for inspecting the print condition of PDF/A and PDF/X files; the renderer's ICCBased colour-space handling now also derives the component count from the profile header itself when a shading's colour space carries neither/Alternatenor/N
Version 3.116.0
Added
- Added a table-aware text extraction mode:
GetPageTextoption 10 clusters the left edges of the page's text blocks into global column positions and emits tab-separated rows, so tabular layouts extract as ready-to-import TSV with vertically aligned cells staying aligned across rows
Version 3.115.0
Added
- Added page imposition:
ImposePagesNUplays every page of the document out on new sheets in an n-up grid (2-up, 4-up, 9-up or any Columns x Rows arrangement) with each page aspect-fit and centred in its cell as live vector content, or — with the booklet option — produces saddle-stitch sheets whose page pairing folds into a booklet when printed duplex and stacked
Version 3.114.0
Added
- Extended the typed action readers
GetAnnotActionInfoandGetOutlineActionInfoto four more action kinds — Hide (with the number of hidden targets and the hide/show flag), SubmitForm (submission URL and field count), ResetForm (field count) and ImportData (source file) — and to expose the name payload of Named actions (e.g.NextPage); both readers now share one parser, so annotation links and bookmarks report identical information
Version 3.113.0
Added
- Added form-field formatting helpers:
SetFormFieldNumberFormat(decimal places, separator style, negative style and currency placement),SetFormFieldPercentFormatandSetFormFieldDateFormat(Acrobat date picture strings such asmm/dd/yyyy) each write the standard Acrobat formatting JavaScript pair onto the field's additional actions — a keystroke filter plus a display formatter — so conforming viewers validate input and render formatted values without hand-written JavaScript
Version 3.112.0
Added
- Added Sound annotation creation:
AddSoundAnnotationFromFilereads an uncompressed PCM WAV file (8 or 16 bit, mono or stereo) and embeds its samples behind a speaker-icon annotation as a/Soundstream in the signed encoding the PDF sound machinery expects, completing the round trip with the existingGetAnnotSoundToFile/GetAnnotSoundToStringreaders
Version 3.111.0
Added
- Added threaded annotation replies (ISO 32000-1 §12.5.6.3):
AddAnnotationReplyappends a reply to any existing annotation as a hidden Text annotation whose/IRTreferences the target with the/RTreply relationship, so Acrobat and other viewers show it threaded under the target in the comment panel; combine withAddAnnotationStateand the FDF comment interchange for complete collaborative-review round trips
Version 3.110.0
Added
- Added mesh and function-based shading rendering, completing coverage of all seven PDF shading types: free-form Gouraud triangle meshes (type 4), lattice-form Gouraud meshes (type 5), Coons patch meshes (type 6) and tensor-product patch meshes (type 7) are decoded from their bit-packed data streams — including shared-edge patch flags,
/Decodevalue mapping and optional colour/Functionramps — and painted through the Cairo engine's native mesh gradients; function-based shadings (type 1) are approximated by sampling the shading function over its domain into a fine patch grid; supported colour spaces cover DeviceRGB, DeviceGray, DeviceCMYK and ICCBased alternates (the GDI+ engine has no mesh gradient primitive and leaves mesh-shaded areas unpainted)
Version 3.109.0
Added
- Completed the content editing framework (phase 4) with text-level editing:
TPDFContentProgram.GetTextRunsenumerates the text-showing instructions of a page with the font resource and size active at each one (tracking font state through save/restore nesting), andReplaceTextRunswaps the shown text in place — a true content-stream replacement that keeps the original position, font and colour, unlike overlay-based approaches that mask the old text and redraw on top
Version 3.108.0
Added
- Added an object model for page geometry to the content editing framework (phase 3):
TPDFContentProgram.LiftPathraises a path object (move/line/curve/rectangle construction operators plus the clipping and painting operators that end it) into an editableTPDFPathof subpaths and segments;TPDFPath.Transformapplies an affine matrix to every point (move, scale, rotate or skew existing artwork);LowerPathwrites the modified geometry back over the original instructions, ready forWritePageContentLayer
Version 3.107.0
Added
- Extended the content editing framework (phase 2) with instruction-level conveniences on
TPDFContentProgram:InsertFromSourceparses a content snippet and splices its instructions at any position;SetOperandrewrites a single operand from source syntax (renumber a co-ordinate, recolour a fill);OperandTextreads an operand back;InstructionGroup,FindNextOpandFindNextGroupnavigate the instruction list by operator or by the ISO 32000-1 operator category
Version 3.106.0
Added
- Added the first phase of the structured content editing framework:
ParsePageContentLayerdecodes a page content layer into an editableTPDFContentProgram— a list of instructions, each one PDF content operator (all 73 operators of ISO 32000-1 Table 51) with its decoded operand objects — andWritePageContentLayerserialises the program back into the page, so callers can parse, inspect, delete or reorder drawing instructions and rewrite the page;GetPageContentLayerCountreports the number of content layers, which are edited independently; the emitter is behaviour-preserving (an unmodified round trip renders pixel-identically), unknown operators survive unchanged and inline images are carried verbatim
Version 3.105.0
Added
- Added a reading-order text extraction mode:
GetPageTextoption 9 returns the page text in visual reading order using recursive whitespace analysis (XY-cut), so multi-column layouts come out column by column — a full-width heading first, then the whole left column, then the right column — instead of interleaving the columns line by line as the geometric top-then-left orderings do
Version 3.104.0
Added
- Added signer-certificate introspection to the signature verifier:
GetSignerCertificatedecodes the PKCS#7 payload of the first signature field and returns a typed summary of the embedded signer certificate — subject and issuer display names, the serial number in conventional hex form, the UTC validity window (NotBefore/NotAfter) and a convenience flag reporting whether the certificate is currently within that window; the signer is matched among the embedded certificates by issuer and serial number
Version 3.103.0
Added
- Added
NewRGBRadialShader, the radial counterpart ofNewRGBAxialShader: registers a named two-circle radial gradient (ShadingType 3, ISO 32000-1 §8.7.4.5.3) blending between two RGB colours, with optional colour extension beyond the circles; select it with the existingSetFillShader,SetLineShaderorSetTextShaderto paint circular “glow” fills, strokes and text
Version 3.102.0
Added
- Added radial (ShadingType 3) gradient rendering (ISO 32000-1 §8.7.4.5.4): the page renderer now paints two-circle radial shadings used by
shoperators and shading-pattern fills, in addition to the previously supported axial (ShadingType 2) gradients; supported through both the GDI+ and Cairo raster engines with multi-stop colour functions, DeviceRGB/DeviceCMYK/DeviceN/Separation/ICCBased colour spaces and/Extendhandling
Version 3.101.0
Added
- Added cloudy border effects (ISO 32000-1 §12.5.4):
SetAnnotCloudyEffectturns the border of a Square, Circle, Polygon or FreeText annotation into a “revision cloud” of connected semicircles by writing the/BEborder effect dictionary, with intensity 1 or 2 matching Acrobat's Cloudy styles and 0 removing the effect again;GetAnnotCloudyEffectreads the setting back (0 = no cloud, else the 1..2 intensity)
Version 3.100.0
Added
- Added annotation review states (ISO 32000-1 §12.5.6.3):
AddAnnotationStaterecords a review status change for an existing annotation by appending a hidden Text annotation whose/IRTpoints at the target and whose/State+/StateModelcarry the status, supporting theReviewmodel (None/Accepted/Rejected/Cancelled/Completed) and theMarkedmodel (Unmarked/Marked) used by Acrobat's comment-review workflow;GetAnnotStateandGetAnnotStateModelread the recorded strings back from any annotation (empty when absent)
Fixed
- Fixed a load-time failure that prevented applications built with recent development versions from starting (a Windows certificate-name lookup was bound to a non-existent DLL entry point), and repaired compile regressions in the FDF comment import, page-range rotation and signature-flag paths
Version 3.99.0
Added
- Added document fingerprint and transition read APIs:
GetDocumentFileIDreturns the permanent document identifier from the trailer/IDarray (hex-encoded first element), useful as a stable cache key or document fingerprint;GetPageTransitionis the read-side counterpart ofSetPageTransition, returning the transition style as a typedTPDFlibPageTransitionvalue plus the display duration and transition duration by reverse-mapping the stored/Trans/S,/Dmand/Mentries
Version 3.98.0
Added
- Added page-range rotation and thumbnail introspection:
RotatePageRangeapplies a 0/90/180/270 rotation to every page in a range (wrapping the existing single-pageRotatePageso callers no longer need a per-page loop);HasPageThumbnailreports whether a page carries a/Thumbentry;GetPageThumbnailInforeads the thumbnail image XObject’s width, height and bits-per-component
Version 3.97.0
Added
- Added extended annotation property readers:
GetAnnotColorreads the/Ccolour array (0..1 RGB, with a HasColor flag distinguishing “no explicit colour” from “explicit black”);GetAnnotBorderWidthreads/BS /W, falling back to the legacy/Borderarray;GetAnnotOpacityreads the/CAstroke alpha (default 1.0);GetAnnotCreationDatereads the/CreationDatetimestamp;GetAnnotFlagsreads the/Fvisibility/print flags byte
Version 3.96.0
Added
- Added read-side security introspection APIs:
IsEncryptedreports whether the loaded document carries an/Encryptdictionary;GetEncryptionLevelreturns a typed strength (0=none, 1=RC4-40, 2=RC4-128, 3=AES-128, 4=AES-256, 5=AES-256 Acrobat X) matching the write-side encryption options;GetUserPermissionsreturns the raw/Ppermission word for direct bit testing;IsOwnerPasswordreports whether the document was opened with the owner credential
Version 3.95.0
Added
- Added advanced printing and text replacement:
PrintDocumentAdvanceddrives the full printer DEVMODE (duplex, orientation, colour, print quality, paper size, paper tray) on top of copies/collation through a typedTPDFlibPrintSettingsrecord, applying each non-default field via the existing custom-printer profile mechanism;SearchAndReplaceTextruns a search across a page range and, for each hit, masks the original text block with an opaque white rectangle and redraws the replacement text at the block origin in the caller’s selected font, mirroring the overlay-replace behaviour of PDFtoolkit SearchAndReplace
Version 3.94.0
Added
- Added annotation FDF interchange (Acrobat “Export/Import Comments”):
ExportAnnotationsToFDFStringandExportAnnotationsToFDFwalk every page’s/Annotsand serialise each annotation as a/Type /Annotentry inside an FDF/Annotsarray, carrying/Subtype,/Contents,/Rect, the/Tauthor label,/Subjand the 0-based/Pageindex;ImportAnnotationsFromFDFStringandImportAnnotationsFromFDFparse such an FDF with a small state machine and re-create each entry as a new annotation on the matching page, preserving the full annotation dictionary rather than collapsing it to a sticky note
Version 3.93.0
Added
- Added signature certification and form-field property APIs:
SetSignProcessDocMDPturns the next signature produced by a sign process into a certifying (author) signature by attaching a DocMDP/Referencetransform at level 1/2/3 (no changes / form fill-in / annotations) and setting the AcroForm/SigFlagsAppendOnly bit;GetSigFlags/SetSigFlagsread and write the raw AcroForm/SigFlagsbyte directly;GetFormFieldIsComb,GetFormFieldIsMultiLine,GetFormFieldJustificationandGetFormFieldAllowedValuesexpose the per-field/Ffstyle bits, the/Qtext quadding and the/Optchoice array as typed values
Version 3.92.0
Added
- Added attachment-export and form-field convenience APIs:
SaveAllAttachmentswalks the unified attachment list (document-level/EmbeddedFilesplus per-page/FileAttachmentannotations) and writes every stream to a directory under its file-spec name, disambiguating collisions with a numeric suffix;RemoveFormFieldByNameresolves a fully-qualified field name to its index and deletes it;RenameFormFieldrenames a field by name without a separate index lookup
Version 3.91.0
Added
- Added document-wide enumeration APIs:
EnumDocumentFontswalks every Font dictionary (callingFindFontsfirst if needed) and returns oneTPDFlibDocumentFontper font with its object number,/BaseFontname, type, encoding and embedding/subset status, removing the need toSelectFonteach entry and query scalar getters;EnumAttachmentsunifies the document-level/EmbeddedFilesname tree with per-page/FileAttachmentannotations into a singleTPDFlibAttachmentlist, recording each entry’s source, 1-based source index, file name, MIME subtype, description and byte size
Version 3.90.0
Added
- Added read-only introspection APIs for annotations, bookmarks and the document version:
GetPDFVersionreturns the effective PDF version string (e.g.1.7);GetAnnotType,GetAnnotTitle,GetAnnotSubject,GetAnnotContentsEx,GetAnnotModifiedDate,GetAnnotNameandGetAnnotRectExexpose the per-annotation fields as named wrappers (so callers no longer need magic property Tag numbers) over the existingAnalyseAnnotcache;GetOutlineLevelreturns a bookmark’s depth relative to the outline root andGetOutlineIsOpenreports whether it is expanded in a viewer (negative/Countmeans collapsed), mirroring the layout state a bookmark panel would render
Version 3.89.0
Added
- Added a JBIG2 image encoder unit
PDFlibJBIG2Enc(TPLJBIG2Encoder.EncodeToByteArray), ported from the HotPDF sibling product, with two backends: on Win64 the C++jbig2encarithmetic coder (ITU-T T.88) is linked statically viaPDFlibJBIG2EncC+HPDFCLibs(228 leptonica/jbig2enc objects underthirdparty/Win64x/) and registered as the default backend, matching HotPDF's production path; on other targets, or whenUseExternalEncoderis False, a pure-Pascal MMR fallback compresses bi-level scanlines with the CCITT G4 encoder and wraps them in JBIG2 segment headers (page-info type 48 + immediate generic-region type 38) - Added an LZW encoder unit
PDFlibLZWEnc(TPLLZWEncoder.Compress), the encoder counterpart to the existingPDFlibLZWdecoder: produces a PDF-spec/LZWDecodestream with 9..12-bit variable-width codes, ClearCode/EOI and PDF-default EarlyChange semantics, plus optional TIFF Predictor 2 (horizontal differencing) so a round-trip through the decoder reproduces the original bytes
Version 3.88.0
Added
- 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
Added
- 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
Added
- 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
Added
- 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
Added
- 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
Added
- Added convenience rendering APIs:
RenderPageToMonochromeFilerenders a page to a 1-bit monochrome bitmap (for fax/archive/OCR scenarios), downscaling from 24-bit via GDI halftone dithering without modifying the rendering core;RenderPageRegionToFilerenders only a specified sub-rectangle (“Left,Top,Width,Height”) of a page to a bitmap, reconnecting the previously disconnectedRenderPageToDCClipclipping pipeline
Version 3.82.0
Added
- Added FDF form data export:
ExportFormDataToFDFwrites all form field names and values of the current document to a standalone FDF file (a/Fieldsarray wrapped in%FDF-1.2), andExportFormDataToFDFStringreturns a string with the same structure, facilitating the separate storage or subsequent merging of form data from a PDF; non-ASCII bytes are escaped as 3-digit octal codes according to ISO 32000-1
Version 3.81.0
Added
- Added page and structure convenience APIs:
SetPageTransitionwrites a presentation transition effect (the 17 standard transitions for/Trans, including Split/Blinds/Wipe/Dissolve/Glitter, etc.) and page display duration for a specified page;GetPageFontCountandGetPageFontIDenumerate the fonts referenced by a specified page;SetMeasurementUnitaccepts a typed measurement unit enumeration (adding twips and points to the existing pixels/millimetres/inches), accompanied byConvertToPointsandConvertFromPointsunit conversion helpers;SaveToFileOptionsaggregates compression, linearisation and modification date preservation options into a single record
Version 3.80.0
Added
- Added security and signature convenience APIs:
EncryptFileExaccepts a typed named permission set (TPDFlibUserPermissions, distinguishing between 8 named permission bits such as low-resolution printing and high-resolution printing) instead of a raw integer of permission bits;TPDFlibSignatureVerifier.GetSignatureMetadatadirectly reads the field name, Filter, SubFilter, signing time, reason, location, contact information, signer and ByteRange structure validation from the signature dictionary without requiring PKCS#7 decoding;PrintDocumentExspecifies the number of print copies and collation method in a single call
Version 3.79.0
Added
- Added editing convenience APIs:
MaskRectdraws an opaque filled rectangle over a specified region on a given page (for masking/redaction);SetPageThumbnailFromFiledirectly attaches a/Thumbentry to a page from an image file without polluting the content stream's drawing state;FlattenFormFieldsOnPageRangeflattens all form fields across a page range (baking appearances into static content and removing active fields);InsertAnnotationinserts an already built annotation dictionary at a specified position;NewMarkupAnnotationcreates highlight/strike-through/underline/squiggly mark-up annotations in one step and writes quad points, colours and transparency;StampTextandStampImagestamp watermarks across a page range, supporting transparency, rotation angles and stacking positions
Version 3.78.0
Added
- Added text search and page element enumeration APIs:
SearchTextsearches a specified page range by a query term, returning each matched page number and bounding rectangle, supporting case-sensitive and whole-word matching options;EnumPageElementsenumerates all text blocks and embedded image elements on a specified page, uniformly returning the element type, rectangle, text, font name and image ID;GetTextInAreaExis a version ofGetTextInAreathat includes rectangles, returning each text block within a region and its bounding rectangle
Version 3.77.0
Added
- Added read-only introspection APIs to complete the previous "can write but cannot read" asymmetry:
FindOutlineByTitlefinds bookmarks by title (supporting three depths: same-level only/children only/full subtree),GetOutlineActionInfoandGetAnnotActionInforeturn the action type (GoTo/GoToR/URI/Launch/Named/JavaScript) and URI, JavaScript or filename payload of a bookmark or annotation in a typed structure,GetOutlineDestinationInforeturns the target page, Fit type (XYZ/Fit/FitH/FitV/FitR/FitB/FitBH/FitBV) and co-ordinates, andEnumSignatures,GetSignatureFieldCountandGetSignatureFieldInfoenumerate signature fields and report whether they are already signed
Version 3.76.3
Changed
- The E-Invoice demo’s Factur-X EXTENDED profile now uses the standard conformance value and guideline ID, and the ZUGFeRD 1.0 invoice adds the
ChargeTotalAmountandAllowanceTotalAmountsummation elements; all 6 profiles now produce PDF/A-3b and PDF/A-3u output that passes both veraPDF (PDF/A compliance) and Mustang (e-invoice business-rule) validation
Version 3.76.2
Fixed
- XMP metadata for Factur-X/ZUGFeRD hybrid invoices now declares the PDF/A extension schema (
pdfaExtension:schemas) to describe thefx:invoice properties; the missing declaration previously caused the generated PDF/A-3 to be judged non-conformant by validators such as veraPDF
Changed
- The E-Invoice demo’s invoice XML now includes seller and buyer electronic addresses and the seller’s phone number, allowing more profiles to pass ZUGFeRD/Factur-X business-rule validation
- The E-Invoice demo’s profile catalogue, XML construction and PDF/A-3 generation flow were extracted into a shared unit that the GUI and the new external-validator test tool both reuse
Version 3.76.1
Fixed
- Fixed a crash when clicking Generate in the E-Invoice demo: built-in standard fonts are unavailable under PDF/A mode, so the demo now embeds a TrueType font to render the invoice page
Changed
- The E-Invoice demo removes the PDF/A-3a option (rarely used for e-invoices), and the XRechnung profile now defaults to PDF/A-3u
Version 3.76.0
Changed
- The E-Invoice GUI demo is now data-driven: invoice number, issue date, buyer and seller, net amount, tax rate and currency are editable, and the invoice XML matches the visible page amounts exactly instead of using fixed placeholder content
- The demo generates structurally correct invoice XML per profile: Factur-X, XRechnung and ZUGFeRD 2.0 use the
CrossIndustryInvoicestructure, whilst ZUGFeRD 1.0 COMFORT uses its ownCrossIndustryDocumentstructure with line items, tax totals and payment terms - Amounts are written to XML in a fixed English decimal-point format to avoid localised thousands separators or commas breaking the schema, and user input is escaped before writing
- The demo adds a live XML preview, profile-level content self-checks, parsing of the same-named
.validation.jsonexternal validation report, and explicitly loads the repository’s sRGB ICC output intent at generation time
Version 3.75.6
Added
SetPDFAModeadds mode7, allowing PDF/A-3u metadata while continuing to permit PDF/A-3 associated files; the E-Invoice GUI demo also provides a PDF/A-3u option, and the ZUGFeRD 2.0 BASIC profile now uses PDF/A-3u by default
Version 3.75.5
Added
- Adds a Delphi E-Invoice GUI demo that can choose Factur-X, ZUGFeRD, and XRechnung profiles, generate PDF/A-3 hybrid invoices, embed the matching XML file name and guideline ID, run container validation in the interface, and show XMP invoice information, validation issues, and extracted XML
Version 3.75.4
Added
- Adds PDF/A-3 associated file and e-invoice XML support:
AddPDFA3AssociatedFileFromStringcan create Catalog/AFassociated files directly from in-memory bytes,AddFacturXAssociatedFileFromStringcan write Factur-X, ZUGFeRD, and XRechnung XML, synchronise XMP metadata, and validate the file name, profile, XMP namespace, and XML guideline ID combination, while the reading side adds detection, validation, issue-list, and XML extraction APIs
Version 3.75.3
Fixed
- PDF merge function: local variables
GlobalRootObjNum,GlobalRootGenNum,StructRootGlobalObjNum, andStructRootGlobalGenNumwere previously assigned only inside conditional blocks, causing W1036 “variable might not be initialised” warnings on Delphi Win64 compilers 26 and 29 (RAD Studio 12 and 16); introduced zero-initialisation at function entry
Version 3.75.2
Fixed
- In this release, multi-version build compatibility:
forloop in hex-string parser (PDFlibStruct) used anInt64control variable, which Delphi XE3/XE5 (compilers 26/27) reject as non-ordinal; rewritten as aWhileloop to restore compatibility with RAD Studio 12 and 14 - Reference XObject checker (
PDFlibPDFUA): dictionary pointerDwas previously not initialised on the non-stream/non-dictionary branch, causing a compiler hint on all targets; restructured the branch to always assignDbefore theAssignedcheck - In this release,
CreateFontPackagewrapper (PDFlibFont): suppressed spurious W1035 “return value might be undefined” on Delphi ≤ XE8 while avoiding the complementary H2077 dead-assignment hint on newer compilers, via{$IF CompilerVersion}guard - In this release, BMP DPI writer and PDF incremental-save path: replaced deprecated
TStream.Seek(Longint, Word)calls withPosition :=assignments (PDFlibPDFium,PDFlibDocument)
Version 3.75.1
Fixed
- TIFF multi-page parser: the loop-termination guard against excessively large page counts was previously ineffective because
FPageCountwas previously declared asWord(maximum 65 535), making the> 65535comparison always false; changed toIntegerso the guard currently fires correctly on pathological files - CFF/Type 2 charset parser (Format 1 and Format 2): removed dead
Done := Trueassignments that immediately preceded aBreakand were previously therefore never read, eliminating compiler hints
Version 3.75.0
Security
- In this release, strengthened parsing of untrusted embedded fonts (TrueType, Type 1, CFF and CMap) against out-of-bounds writes, unbounded charstring recursion and oversized memory allocations from malformed font data
- In this release, strengthened the image decoders (PNG, GIF, TIFF, JBIG2 and CCITT Group 3 and 4) against out-of-bounds reads and writes, integer overflow in width and height calculations, and empty-palette dereferences from malicious images
- In this release, strengthened the stream filters (LZW, ASCII85 and Flate predictors) against buffer over-reads, division by zero and non-terminating loops on crafted stream data
- In this release, strengthened cross-reference, document-rebuild and name-tree parsing against out-of-bounds access and infinite loops caused by malformed or circular cross-reference data
- In this release, AES-CBC decryption currently validates ciphertext block alignment and zero-initialises its output buffer, preventing uninitialised heap memory from leaking into decrypted strings and streams
Fixed
- SHA-256, SHA-384 and SHA-512 detached-signature digests are currently produced with the correct cryptographic provider; they previously returned an empty digest and yielded invalid signatures
- In this release, ASCII85 and RC4 decoding no longer return uninitialised data or raise an exception on truncated input or an empty key
- The GIF background colour is currently read with the correct blue channel instead of duplicating the green channel
Version 3.74.1
Fixed
- In this release, resolved an E2010 incompatible-types compile error in the PAdES signature validation data (VRI) support that prevented the library from compiling
- In this release, removed the last compiler warning and unused-variable hints; all Win32 and Win64 trial and release library builds currently compile cleanly
Version 3.74.0
Added
- The direct file paths of
EncryptFileandDecryptFilecurrently read PDFs whose cross-reference data lives in cross-reference streams, including incrementally refreshed chains and hybrid-reference files with an/XRefStmside section, instead of falling back to the slower full reader: AES-256 protection of a 1.25 GB benchmark document dropped from about 4.4 to 2.5 seconds and decryption from about 1.7 to 1.3 seconds - In this release, rewrites that carry objects stored in compressed object streams currently emit a cross-reference stream trailer, keeping those objects addressable in the encrypted or decrypted output
Fixed
- A revision without a document
/IDin an incrementally refreshed file no longer erases the identifier inherited from an earlier revision during a direct rewrite
Version 3.73.2
Changed
DASaveAsFilecurrently aggregates its output writes and locates each object's closing keyword without per-step string allocations, cutting the rewrite of a 2 GB benchmark document with over a million objects from about 57 to 11 seconds
Version 3.73.1
Changed
- The direct file paths of
EncryptFileandDecryptFilecurrently read the source through a sliding window and aggregate output writes, so AES-256 protection of very large PDFs with millions of objects runs several times faster: on a 2 GB benchmark document, encryption dropped from about 123 to 32 seconds and decryption from about 127 to 23 seconds - Object bodies that fit the read window are currently no longer fetched from disk twice during a direct AES-256 rewrite
Fixed
- In this release, direct AES-256 rewrites of hybrid-reference PDFs (files carrying an
/XRefStmtrailer entry) currently fall back to the full reader instead of risking dropped compressed objects - In this release, cross-reference parsing in the direct file path no longer reads everything from the cross-reference section to the end of the file at once, which could exhaust memory on multi-gigabyte files whose
/Prevchain points near the start of the file, and a broken/Prevchain currently falls back to the full reader instead of producing an incomplete document
Version 3.73.0
Added
- The SigningWorkbench demo currently performs full cryptographic digest verification of detached CMS signatures (
adbe.pkcs7.detachedandETSI.CAdES.detached) through the Windows CryptoAPI: the signed byte ranges are re-hashed and checked against the CMS signature, an altered document is currently reported with the new SG203 failure code, and every signature contains a three-statedigestValidfield in the JSON, CSV, and HTML reports - Newly introduced SigningWorkbench automation switches:
--quietprints only the batch summary and report paths,--fail-faststops the batch at the first failing file, and the JSON report currently records the library version
Version 3.72.0
Added
- The ComplianceWorkbench demo gains professional batch workflows:
--policy-fileloads the audit policy from a JSON file so teams can version and share their document rules,--baselinecompares the run against an earlier compliance-report.json and lists new failures, resolved files, and files that keep failing, and--preflight-detailsembeds preflight issue lines into the JSON and HTML reports - Newly introduced ComplianceWorkbench automation switches:
--quietprints only the batch summary and report paths,--fail-faststops the batch at the first failing file, and the JSON report currently records the library version
Version 3.71.2
Fixed
AppendToFileagain appends incremental updates to the same PDF file that was previously loaded withLoadFromFile; the streaming loader currently keeps the source file readable without blocking the write handle needed for the update
Version 3.71.1
Added
- In this release, ComplianceWorkbench and SigningWorkbench reports currently include finding severity labels, highest-severity per-file fields, batch severity frequency summaries, and matching JSON, CSV, HTML, and console output for faster policy triage
Version 3.71.0
Added
- In this release, the SigningWorkbench demo inspection currently reports the revision order and the DocMDP certification level of every signature, flags weak MD5/SHA-1 certificate signature algorithms and the legacy adbe.pkcs7.sha1 SubFilter with
--forbid-weak-digest(SG303/SG405), self-signed certificates with--forbid-self-signed(SG406), documents without a certification signature with--require-certified(SG304), and always checks whether the signing time lies inside the certificate validity period (SG407) - SigningWorkbench sign mode currently uses the sign process API with new
--subfilter(sha1, detached, or cades for PAdES baseline signatures) and--digest(auto to sha512) switches, and modernadbe.pkcs7.detachedwith SHA-256 is currently the new signing default - In this release, new
TPDFlibSignDoc.GetSignatureDocMDPLevelByNameread-side accessor returns the DocMDP certification level of a signature field per ISO 32000-1 §12.8.2.2
Version 3.70.0
Added
- In this release, the ComplianceWorkbench demo currently also enforces permission, metadata, and size policies:
--require-print-allowedand--require-copy-allowedcheck the document permission bits (PC205/PC206),--require-authorand--require-creation-datecheck metadata completeness (PC306/PC307), and--max-pagesand--max-file-sizebound the document scale (PC308/PC309) - In this release, the archive profile currently also requires an author and a creation date, and the accessible profile requires the copy permission that assistive technology relies on
- In this release, ComplianceWorkbench reports currently aggregate a failure-code frequency summary across the batch, and the per-file metrics include author, creation date, file size, and the print and copy permission states
Version 3.69.1
Fixed
DecryptFileagain removes encryption from AES-128 and RC4 protected documents, including documents that only carry an owner password; since v3.67.4 the large-file fast path misreported these documents as having a wrong password (error 404) instead of handing them to the regular decryption path, while AES-256 documents were previously not affected
Version 3.69.0
Added
- New SigningWorkbench Delphi demo: a signature and certificate workbench console tool that inspects the signature fields of one PDF or a whole directory (SubFilter, signing time, ByteRange coverage, and the signing certificate with expiry checks), batch-signs PDFs with a PKCS #12 certificate, and audits PFX files; every violation maps to a stable policy failure code (SG101–SG501) and the results are currently written as JSON, CSV, and HTML reports with localised demo guides for all 18 documentation languages
- Newly introduced signature read-side accessors on
TPDFlibSignDoc:GetSignatureFieldNameslists the signature fields of a document,GetSignatureTextValueByNamereturns the /M signing time, /Name, /Reason, /Location, /ContactInfo, and /Type entries (with decryption on encrypted documents), andGetSignatureValueByNamereturns /Filter, /SubFilter, /Contents, and the ByteRange entries by field name
Fixed
- Resolved the
CertCloseStoreWindows CryptoAPI import, which was previously declared without its flags parameter and could corrupt the caller stack on Win32 when a certificate store was previously closed
Version 3.68.0
Added
- In this release, new ComplianceWorkbench Delphi demo: a batch policy audit console tool that checks one PDF or a whole directory against a configurable compliance policy covering PDF/A and PDF/UA preflight, encryption rules, PDF version range, Tagged PDF, linearisation, and document title, reports every violation as a stable policy failure code (PC101–PC501), and writes JSON, CSV, and HTML reports with automation-friendly exit codes
- In this release, the new demo ships policy profiles that bundle common requirement sets—archive, accessible, secure, and web—with explicit command-line switches overriding profile values, and includes localised demo guides for all 18 documentation languages
Version 3.67.4
Changed
EncryptFileandDecryptFilecurrently use a direct AES-256 rewrite path for large classic-xref PDFs, streaming encrypted data between files instead of loading and reserializing every object; a 2 GB benchmark file currently completes file-to-file AES-256 encryption and decryption through the Direct File API with result code 1 andLastErrorCode0
Fixed
- Resolved direct AES-256 string-token handling so dictionary delimiters are currently not mistaken for hex strings and encrypted empty strings decrypt correctly
Version 3.67.3
Changed
- In this release, broadened the Delphi and C++Builder demos for DrawShapes, CreateWithImage, CreateTable, EditFormField, and EmbeddedFonts so their generated PDFs currently demonstrate practical drawing, image placement, table layout, form-field styling, and font-embedding comparison workflows instead of minimal single-action output
Fixed
- In this release, resolved the CreateTable demo to set an explicit A4 page size before rendering the table, avoiding the previous uninitialised page-size variable in the Delphi sample
Version 3.67.2
Fixed
- Corrected a regression introduced by the v3.67.0 lazy loader-side detection: content feature detection could run during save and replace an explicitly requested save version (SetInformation 0) or a locked version (LockSaveVersion), so a strict lower-version save stopped rejecting higher-version content and a locked version could rise; detection currently runs before any explicit version is set and never runs for newly created documents, restoring the pre-v3.67.0 version-control behaviour while retaining the lazy load-time savings
Version 3.67.1
Changed
- Feature detection currently reads stream objects through a shallow parse that checks only the object dictionary and skips the stream body, because the scan never looks at stream contents; on documents with large image streams this avoids reading the body bytes during detection, reducing the object-read time of a detection pass by roughly 40% (about 13 s rather than 20 s on a 2 GB, 1.6-million-object file), while the detected feature list and effective PDF version stay identical
Version 3.67.0
Changed
- Loader-side content feature detection is currently lazy – instead of scanning the whole document during load, it runs on first use, when the effective PDF version or detected feature list is queried or when the document is saved; read-only workloads such as page count, text or image extraction and rendering that never query the version or re-save skip the scan entirely, cutting load time on very large documents by roughly 80% (about 10 s instead of 56 s on a 2 GB, 1.6-million-object file), while the detected feature set and effective PDF version remain identical once detection runs
Version 3.66.1
Changed
- Loading very large multi-page documents is currently substantially faster: loader-side content feature detection skips rule checks that cannot change the result – both rules that have already matched and rules that cannot apply to a given object – roughly halving load time on huge files while keeping the detected features and effective PDF version identical
Version 3.66.0
Changed
- Loading very large multi-page documents currently uses dramatically less peak memory. Loader-side content feature detection no longer materialises the entire object model at once – it streams through the random-access reader one object at a time – cutting peak working set by roughly 90 % on huge files whilst keeping the detected features and effective PDF version identical.
Version 3.65.0
Added
- Documents larger than 2 GB can currently be opened. The previous in-memory buffer that limited document size to about 2 GB has been removed.
Changed
- In this release, loading a PDF from a file currently reads object data on demand from the source instead of buffering the entire document in memory, sharply reducing peak memory use for large files.
- A document loaded from a file keeps that file open with shared-read access until the document is currently closed or cleared.
Fixed
- In this release, refined robustness when loading documents that contain leading bytes before the %PDF- header and when handling malformed cross-reference data.
Version 3.64.0
Changed
- Direct API operations on very large or object-heavy PDFs – EncryptFile, DecryptFile and DASaveAsFile – are currently dramatically faster and no longer stall. A 2 GB document with about 1.6 million objects that previously could not finish currently encrypts in roughly a minute, and processing time scales about linearly with the document instead of collapsing as the object count grows.
- Encrypting large documents is substantially faster – an operation that previously took many minutes currently completes in seconds to about a minute – with no change to encryption strength, ciphertext compatibility, or output.
Version 3.63.0
Fixed
- Fixed a process crash when loading large PDF files whose internal byte offsets cross the 32-bit (about 2 GB) boundary; the loader currently uses 64-bit offsets throughout, so files approaching 2 GB load reliably and files at or beyond 2 GB report a load error gracefully instead of crashing.
Version 3.62.0
Changed
- AES-256-CBC encryption and decryption currently take the hardware-accelerated AES-NI path on 32-bit Windows as well, not only 64-bit, still with an automatic pure-C fallback on processors without AES-NI. The ciphertext remains unchanged on every platform.
Version 3.61.0
Changed
- AES-256-CBC encryption and decryption currently use a hardware-accelerated AES-NI backend on 64-bit Windows, with an automatic fallback to the portable software implementation on processors that lack AES-NI. The ciphertext is currently identical on every platform; only the speed of password-based AES-256 PDF encryption changes.
Version 3.60.0
Added
MergeFileListcurrently merges the logical structure (Tagged PDF) trees of the input documents into a single, reachable structure tree, instead of only preserving the first document's tree and leaving the others as unreachable objects. Top-level structure elements, the parent tree (with remapped page/StructParentsand annotation/StructParentkeys),/RoleMap,/ClassMapand/IDTreeare combined, and the merged catalogue is marked as Tagged (/MarkInfo /Marked true).
Changed
- In this release, merging documents with conflicting
/RoleMap,/ClassMapor/IDTreekeys keeps the first occurrence. The fast path (MergeFileListFast) continues to drop structure information.
Version 3.59.0
Changed
MergeFileListcurrently merges documents in a single pass (O(N) instead of O(N²)), making large multi-file merges substantially faster; it also gains the multi-document bookmark merging introduced to the fast path.- By default
MergeFileListcurrently skips unreadable or encrypted input files and continues merging the rest, instead of aborting the whole operation on the first bad file. Use the newMergeFileListStrictto restore the previous stop-on-first-failure behaviour. - Logical structure (Tagged PDF) objects from the inputs are currently preserved by
MergeFileList(the fast path continues to drop them).
Added
- In this release,
MergeFileListStrictmerges a file list but stops at the first unreadable or encrypted file, keeping the strict stop-on-failure semantics of earlier releases.
Version 3.58.0
Added
- In this release,
MergeFileListFastcurrently merges document outlines (bookmarks) across all input files, so the fast merge path preserves bookmarks in addition to AcroForm form fields. - In this release, merged bookmarks keep their hierarchy and page destinations; the top-level bookmark count of the merged output equals the sum of the inputs.
Version 3.57.1
Changed
- Direct File API saves (
DASaveAsFile,DASaveToStream,DASaveCopyToStream) are currently significantly faster on very large documents: unchanged objects are copied directly from the source bytes instead of being re-parsed and re-serialised. Re-saving a 60,000-page / 883 MB document dropped from about 33 seconds to roughly 23 seconds.
Version 3.57.0
Changed
- Further optimised
TPDFlib.MergeFileListFastfor multi-document merges: unchanged non-stream objects in the appended documents are currently reused directly from their original source bytes with a byte-level indirect-reference shift, skipping the parse-and-reserialise round-trip and improving throughput on multi-page documents. Merge output remains unchanged, with identical page counts. - Objects that contain streams or belong to the structure tree continue to use the existing decode path, so the faster byte path is currently applied only where it is provably safe.
Version 3.56.44
Changed
- In this release, optimised
TPDFlib.MergeFileListFastby preallocating merge metadata and writing unchanged first-document objects from their original source data, reducing memory churn and avoidable object decode/output work in fast multi-file merges. - In this release, the Delphi
MergePDFGUI currently batches fast-mode result logging and avoids repeated full memo-text scans, keeping large input lists more responsive after a merge completes.
Version 3.56.43
Changed
- In this release, optimised the ordinary
TPDFlib.MergeFileListmerge path by alternating its intermediate temporary files instead of copying the growing merged PDF before every additional input, reducing disk I/O for multi-file workflows while preserving the existing return-count contract.
Version 3.56.42
Added
- In this release, introduced AES regression coverage for input-buffer/result-alias cases used by encrypted stream save rollback, including large 504 KB payloads that previously exposed the failure.
Changed
- The normal API
LoadFromFile,Encrypt,SaveToFile, reload,Decrypt, andSaveToFileworkflow currently completes again on large loaded PDFs while retaining the reduced-copy AES-CBC decrypt optimisation.
Fixed
- In this release, resolved the buffer-based AES-256 decrypt path introduced in v3.56.41 so callers can assign the decrypt result back to the same
AnsiStringthat supplied the ciphertext buffer without access violations.
Version 3.56.41
Added
- In this release, introduced
TPDFlib.DACopyFilefor Direct Access workflows that need a page count and an unchanged file copy without building the full normal object graph. - In this release, the Delphi
HugeFileBenchmarkdemo currently includes adirect-copyrow plus--opsand--skipfilters for focused large-file runs.
Changed
- In this release, optimised AES-256 decryption by adding buffer-based AES-CBC decrypt paths and using them when decrypting loaded strings and streams, reducing extra ciphertext copying on large encrypted streams.
Version 3.56.40
Changed
- In this release, the Delphi and C++Builder
HelloWorlddemos currently create a richer starter PDF with document information, selected standard font output, a styled title block, simple vector drawing, and next-step guidance while keeping the same build-and-run workflow. - In this release, all Delphi and C++Builder demo notes have been replaced with browser-friendly
Readme.htmlpages, including auxiliary password, restricted-file, and signing-result notes, and the demo indexes currently direct users to the HTML notes.
Version 3.56.39
Changed
- In this release, direct file API saves currently build cross-reference lookup tables linearly, making
DASaveAsFileand related direct-save paths much faster on PDFs with very high object counts or dense page trees. - In this release, the optimised writer preserves the same free-object chain semantics while avoiding repeated object-number scans during full xref generation, improving large direct-save workflows without changing the public API or output contract.
Version 3.56.38
Changed
- The normal API
LoadFromFile,Encrypt,SaveToFile, reload,Decrypt, andSaveToFileworkflow currently preserves encrypted state before explicitDecrypt, matching the direct file API behaviour for large legacy PDFs.
Fixed
- In this release, resolved normal API encryption output so
Encryptcreates or preserves the trailer/IDbefore writing AES-256 security data, keeping encrypted PDFs reload-detectable throughEncryptionStatus.
Version 3.56.37
Added
- In this release, introduced
TPDFlib.ComparePreflightReports, a line-by-line comparator for plain-text preflight reports that ignores volatileGenerated:timestamp lines and returns an empty string when stable report content matches. - In this release, the Delphi
PreflightReportdemo currently supports--compare <file>in single-file mode, writing a UTF-8.diff.txtreport and returning exit code 2 when the generated text report differs from the baseline.
Version 3.56.36
Added
- In this release, the Delphi
PreflightReportdemo currently supports batch directory runs with--input-dir,--output-dir, and--recursive, writing one report per PDF as<basename>.preflight.<ext>.
Changed
- In this release, batch mode writes a UTF-8
preflight-summary.csvfile that records each source PDF, pass/fail status, issue count, and generated report path while preserving the existing exit-code contract for automation.
Version 3.56.35
Added
- In this release,
ReportFormat = 3adds CSV output toTPDFlib.CreatePreflightReportExandTPDFlib.SavePreflightReportEx, producing UTF-8 rows for report metadata, each selected compliance check, individual issue codes and messages, and the final summary. - In this release, the Delphi
PreflightReportdemo currently supports--format csvand--csvso command-line preflight runs can feed spreadsheets or simple CI parsers without post-processing JSON or scraping text.
Version 3.56.34
Added
- In this release, introduced format-aware
TPDFlib.CreatePreflightReportExandTPDFlib.SavePreflightReportExAPIs for generating PDF/A and PDF/UA-1 preflight reports as plain text, JSON, or standalone HTML while preserving the existing text-only report APIs. - The Delphi
PreflightReportdemo currently supports--format text|json|htmlplus--jsonand--htmlshortcuts, so the same command-line workflow can produce human-readable reports or machine-readable CI artefacts.
Version 3.56.33
Added
- In this release, introduced
TPDFlib.CreatePreflightReportandTPDFlib.SavePreflightReportso applications can generate reusable plain-text reports from the built-in PDF/A and PDF/UA-1 compliance checks without manually enumerating string-list handles.
Changed
- In this release, the Delphi
PreflightReportdemo currently calls the library-level report APIs directly, keeping the sample focused on command-line workflow, selected checks, first-issue mode, and automation-friendly exit codes.
Version 3.56.32
Added
- In this release, introduced a new Delphi
PreflightReportconsole demo that runs PDF/A and PDF/UA-1 checks withCheckFileCompliance, enumerates issue lists withGetStringListCountandGetStringListItem, and writes a plain-text preflight report.
Changed
- In this release, the demo supports
--input,--output,--pdfa,--pdfua,--both, and--first-issueoptions, plus exit codes for automation-friendly pass, issue-found, and runtime-error results.
Version 3.56.31
Changed
GetCustomKeys(2)currently hides library-managed Catalogue system entries consistently, including/OutputIntents,/Extensions,/Requirements,/Collection, and/NeedsRendering.
Fixed
- PDF/A output intents created by
SetPDFAModeno longer appear as custom Catalogue keys, keeping application metadata enumeration separate from PDF compliance structures.
Version 3.56.25
Changed
- In this release, writer-side GetPDFUADiagnostics gains the matching
MULTIPLE-H-CHILDREN:Nissue, parity with reader10044from v3.56.24. ISO 14289-1 §7.4.4 forbids more than one direct H child per tag tree node — the writer-side check fires whenever the in-memory FStructElems tree contains such a violation. - In this release, a new nested CountMultipleHChildren helper walks the tree depth-first, counting H children at each level. The check runs alongside the existing LIST-STRUCT / LIST-NO-NUMBERING walks and shares the same FStructElems traversal pattern.
Version 3.56.24
Changed
- The PDF/UA-1 audit gains ISO 14289-1 §7.4.4 H-tag uniqueness check.
10044reports any structure node that carries more than one direct H child — the spec forbids that under strongly-structured documents, and the same constraint applies to any tag tree node regardless of overall structure mode. The other §7.4.4 SHALL (a document shall be either strongly or weakly structured, not both) needs document-wide heuristics and is currently intentionally left out of this audit. - In this release, a new pre-order struct-tree walker (UAVisitStructNodeForHUniqueness / ScanStructTreeForHUniqueness) counts direct H children per node and recurses depth-first. Reuses the same K-shape decoder as the existing heading / list / note walkers.
Version 3.56.23
Added
- New
Lib/PDFlibPDFUAFontInspect.pasimplements a tolerant SFNT table-directory walker and cmap subtable directory parser. The 4281-name Adobe Glyph List table introduced as scaffold in the previous infrastructure commit is currently wired in via the Differences check. Programs that don't parse as SFNT (Type 1 PFB / PFA, OpenType collection, arbitrary garbage) are silently skipped — false negatives are preferred over false positives at the audit layer.
Changed
- The PDF/UA-1 audit gains the two ISO 14289-1 §7.21.6 font-program checks that the dictionary-layer checks of v3.56.10 had to defer until a TrueType parser was previously available.
10034reports non-symbolic TrueType programs whose embedded SFNT cmap table contains only the symbolic (platformID=3, encodingID=0) entry — §7.21.6 first paragraph requires at least one non-symbolic cmap subtable so the program can render the codepoints declared by its /Encoding.10035reports non-symbolic TrueType/Encoding /Differencesarrays whose glyph names are not Adobe Glyph List members (.notdefexcepted) — §7.21.6 third paragraph requires every Differences entry to land in AGL.
Version 3.56.22
Changed
- In this release, the PDF/UA-1 audit gains ISO 14289-1 §7.18.6 media clip data checks.
10042reports media clip data dictionaries (identified by/S /MCD, optionally/Type /MediaClip) missing the required/CTcontent-type entry.10043reports the same dictionaries missing the required/Altarray. ISO 32000-1 Table 274 lists both keys as optional, but ISO 14289-1 §7.18.6 promotes them to required so screen readers can announce a meaningful description for embedded multimedia. - This is currently Phase 6 of the PDF/UA deep-audit plan (
.superpowers/plans/2026-05-23-pdfua-deep-audit-plan.md). It runs without any font-program or content-stream parser dependency, so it is the first follow-up sub-class after the v3.56.0..v3.56.13 series.
Version 3.56.21
Added
- New
SetSignProcessCommitmentTypeemits the CAdEScommitment-type-indicationsigned attribute (OID 1.2.840.113549.1.9.16.2.16, ETSI EN 319 122-1 v1.2.1 §5.2.3) inside the PAdES-B-B SignerInfo. Accepts integer codes 1..6 mapping to the well-known ETSI commitment OIDsid-cti-ets-proofOfOriginthroughid-cti-ets-proofOfCreation; pass 0 to clear. Out-of-range codes are currently rejected. - In this release, new
SetSignProcessSignaturePolicyemits the CAdESsignature-policy-identifiersigned attribute (OID 1.2.840.113549.1.9.16.2.15, §5.2.9). Takes the dotted-decimal policy OID, the policy document hash as an uppercase-hex string, and a digest algorithm code (1=SHA-1, 2=SHA-256, 3=SHA-384, 4=SHA-512, 0=auto/SHA-256). The attribute carries theSignaturePolicyIdSEQUENCE withsigPolicyId+sigPolicyHash(OtherHashAlgAndValueSEQUENCE).
Changed
- Both attributes only take effect when the SubFilter is currently
ETSI.CAdES.detached(the PAdES-B-B path); they extend the existingrgAuthAttrarray alongsidecontent-typeandsigning-certificate-v2. PAdES Table 1 row d) forbids combiningcommitment-type-indicationwith the PDF Signature Dictionary/Reasonentry; the caller is responsible for not setting both.
Version 3.56.20
Added
- New
AddPAdESDSSVRIattaches a Signature VRI subdictionary entry to the DSS being assembled, completing the ETSI EN 319 142-1 v1.2.1 clause 5.4.2.3 Validation Related Information structure. The entry is currently keyed by the uppercase-hex SHA-1 of the signature's/Contentsbytes; itsCert/CRL/OCSPsub-arrays are populated by referencing the corresponding parent DSS streams via 0-based indexes supplied as comma-separated lists (e.g."0,2,5").
Changed
- In this release, the underlying
TSmartPDFDocument.AddPAdESDSSWithVRItracks the stream object numbers emitted for each cert / CRL / OCSP and uses them to write the VRI sub-arrays as indirect references back into the same streams the parent DSS arrays already point to, satisfying the spec requirement that VRI entries share storage with the parent DSS dictionary. The originalAddPAdESDSSentry point continues to work unchanged for callers that do not need VRI. - Each per-signature VRI subdictionary carries the optional
/Type /VRImarker so tooling that walks the catalogue byTypetags can recognise the structure without re-resolving the parent path.
Version 3.56.19
Added
- In this release, new PAdES-B-T workflow for attaching an RFC 3161 / RFC 5816 signature-time-stamp (id-aa-signatureTimeStampToken, OID 1.2.840.113549.1.9.16.2.14) to an existing PAdES-B-B signature.
NewPAdESSignatureTimeStampProcessFromFile/FromStream/FromStringopen a signed PDF,SetPAdESSignatureTimeStampFieldnames the field,GetPAdESSignatureValueHashHexreturns the SHA-256 (or 384 / 512) hash of the signer'ssignatureValuefor submission to a TSA,GetPAdESSignatureCMSBytesexposes the existing CMS payload,SetPAdESSignatureCMSBytesaccepts the augmented CMS bytes the caller assembles via its CMS library of choice, andEndPAdESSignatureTimeStampProcessToFile/ToStream/ToStringsplices the new CMS into the original/Contentsplaceholder. - Newly introduced
SetSignProcessReserveContentsByteswidens the/Contentsplaceholder at initial sign time so the post-hoc augmented CMS fits without overflowing the original reservation. Typical TSA-issued TimeStampTokens add 2-6 KB to the SignerInfo; pass 1024-8192 here to leave headroom. Without enough reserve the augmentation call returns13(output overflow).
Changed
BuildPAdESSignatureTimeStampAttributeis currently a stateless helper that wraps a TSA-issued TimeStampToken in the CMS Attribute SEQUENCE thatSignerInfo.unsignedAttrsexpects, so callers that already have a CMS library handy can skip the OID + SET-of plumbing.- The library does not ship a TSA HTTP client; the caller fetches the TimeStampToken (typically 30-50 lines of TSP request + HTTP POST against e.g. FreeTSA or DigiCert). Windows CryptoAPI
CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTRwould in principle automate the CMS injection in-library, but returnsCRYPT_E_INVALID_INDEX(0x80091008) on the detached SignedData shape PAdES emits, so the caller-supplied CMS bytes path is currently used instead.
Version 3.56.18
Added
- Newly introduced ASN.1 helpers
DER_IntegerFromLittleEndian(handles the Win32CRYPT_INTEGER_BLOBbyte order) andDER_ContextTagExplicit(wraps a payload in a constructed context-specific tag) round out thePDFlibASN1micro-encoder. Newly introducedCERT_INFO/CRYPT_ALGORITHM_IDENTIFIER/CRYPT_INTEGER_BLOB/PCERT_CONTEXTdeclarations inPDFlibCryptoAPIgive the sign path access to the parsed certificate fields.
Changed
- The PAdES
signing-certificate-v2attribute currently embeds the optionalIssuerSerialfield defined by RFC 5035 (ESSCertIDv2). The signing certificate's issuer Distinguished Name is wrapped in aGeneralName [4] EXPLICIT directoryNameCHOICE insideGeneralNames, followed by the certificate serial number as an ASN.1 INTEGER. The serial number bytes arrive little-endian from Windows CryptoAPI (CRYPT_INTEGER_BLOB) and are reversed to big-endian with the positive-integer pad byte introduced when the high bit is set, matching how OpenSSL and BouncyCastle emit the same field. - In this release, verifiers that cross-check the issuer name + serial pair against their path-building candidate set (notably EU DSS in strict mode) currently find both identifiers in the signing-cert-v2 attribute; the previous v3.56.17 output supplied only the
certHashreference.
Version 3.56.17
Added
- Newly introduced
PDFlibASN1unit provides a focused DER (X.690) micro-encoder - length prefix, OCTET STRING, SEQUENCE, SET, OBJECT IDENTIFIER - used to build theSigningCertificateV2attribute value. The encoder follows the standard rules for base-128 OID arcs and omits the optionalhashAlgorithmfield when it would only repeat the SHA-256 default, matching what OpenSSL and BouncyCastle emit.
Changed
- The built-in
ETSI.CAdES.detachedsign path currently produces structurally conformant PAdES-B-B signatures. The library builds the CMS authenticated attributes itself -content-type(id-data) andsigning-certificate-v2from RFC 5035 / RFC 5816 with a SHA-256 hash of the signing certificate - and hands them toCryptSignMessageviargAuthAttr. Once that field is currently non-NULL, Windows CryptoAPI stops auto-injecting thesigning-timeattribute that PAdES (ETSI EN 319 142-1 v1.2.1 Table 1) forbids, so the resultingSignerInfocontains the required attributes and only those. ApplySignaturecurrently routesETSI.CAdES.detachedthrough the raw-byte path (the same one used byadbe.pkcs7.detached) instead of feeding a precomputed digest. CryptoAPI currently computes themessageDigestauthenticated attribute over the actual signed content, which is currently what verifiers expect.- SHA-384 and SHA-512 are also honoured when building the signing-certificate-v2 attribute: the
hashAlgorithmfield is currently emitted with the matchingAlgorithmIdentifierrather than relying on the default. SHA-1 is silently upgraded to SHA-256 in this context because PAdES-B-B does not authorise SHA-1 (clause 6.2.1).
Version 3.56.16
Added
- In this release, new
SetSignProcessDigestAlgorithmselects the signing message-digest algorithm:1= SHA-1 (deprecated),2= SHA-256 (modern default),3= SHA-384,4= SHA-512,0= auto (SHA-256 for every SubFilter except the legacyadbe.pkcs7.sha1path, which stays on SHA-1 for byte-stable backward compatibility). ETSI EN 319 142-1 v1.2.1 §6.2.1 forbids MD5 and defers to ETSI TS 119 312 for the recommended cryptographic suites, so PAdES signers should pick SHA-256 or stronger. - Introduced
SHA256StreamRange,SHA384StreamRange, andSHA512StreamRangehash helpers next to the existingSHA1StreamRange; the sign path uses them to digest the PDF ByteRange under the selected algorithm. The PKCS#7SignerInfo.digestAlgorithmOID and the actual hash bytes are currently guaranteed to agree (the previous code always completed successfully the SHA-1 digest regardless of negotiated algorithm).
Changed
- In this release,
TPDFlibPFXFile.SignDatacurrently takes aDigestAlgorithmparameter and chooses the correct OID for each (SubFilter, algorithm) pair:2.16.840.1.101.3.4.2.1/.2/.3for SHA-256/384/512 on detached and custom SubFilters (RFC 5754), and the matchingsha256WithRSAEncryptionfamily OIDs for the legacyadbe.pkcs7.sha1path.
Version 3.56.15
Added
- In this release, new
SetSignProcessDocTimeStampswitches a sign process into PAdES Document Time-stamp mode per ETSI EN 319 142-1 v1.2.1 §5.4.3. The resulting Signature Dictionary carries/Type /DocTimeStampand/SubFilter /ETSI.RFC3161, omits the disallowed/M,/Reason,/Location,/ContactInfo, and/Namekeys, and reserves an 8192-byte (or caller-sized) hex placeholder in/Contentsfor an externally-fetched RFC 3161 TimeStampToken.
Changed
- Passthrough is currently enabled automatically when DocTimeStamp mode is selected because the TimeStampToken comes from an external TSA.
SetSignProcessInfocalls made after switching to DocTimeStamp mode are silently ignored to keep the signature dictionary spec-conformant. - The existing PAdES
/Extensions /ESICauto-injection introduced in v3.56.8 already covers DocTimeStamp because its SubFilter starts withETSI., so a Document Time-stamp PDF declares the required catalogue extension without additional wiring.
Version 3.56.14
Added
- New PAdES Document Security Store (DSS) augmentation API.
NewPAdESDSSProcessFromFile/NewPAdESDSSProcessFromStream/NewPAdESDSSProcessFromStringopen a previously signed PDF,AddPAdESDSSCertificate/AddPAdESDSSCRL/AddPAdESDSSOCSPstage DER-encoded validation material, andEndPAdESDSSProcessToFile/EndPAdESDSSProcessToStream/EndPAdESDSSProcessToStringwrite an incremental update containing a/DSS << /Type /DSS /Certs [...] /CRLs [...] /OCSPs [...] >>dictionary as specified by ETSI EN 319 142-1 v1.2.1 §5.4.2.2. This is currently the building block for promoting a PAdES-B-B / B-T signature to PAdES-B-LT long-term validation.
Changed
- The DSS process auto-bumps the catalogue
/Extensions /ESICentry to at leastExtensionLevel 1when adding validation material, matching the requirement in §5.6, and merges new certificates, CRLs, and OCSP responses into the existing/Certs//CRLs//OCSPsarrays on repeated invocations so revisions accumulate rather than overwrite. - In this release,
GetPAdESDSSProcessResult/ReleasePAdESDSSProcesscomplete the lifecycle, mirroring the existingSignProcessAPI surface.
Version 3.56.8
Changed
- PAdES baseline conformance: when a signature is created with a PAdES SubFilter (
ETSI.CAdES.detachedorETSI.RFC3161), the document catalogue currently automatically receives the/Extensions /ESIC <</BaseVersion /1.7 /ExtensionLevel 2>>entry required by ETSI EN 319 142-1 v1.2.1 §5.6. The entry is introduced through the same incremental update that carries the signature, never downgrades an existing higher/ExtensionLevel, and follows indirect/Extensionsor/ESICreferences when the source PDF already stores them as separate objects. - The Adobe-equivalent extension marker written by SetSignProcessCustomSubFilter for PDFs authored through
TPDFlibis currently/ADBE /BaseVersion /1.7 /ExtensionLevel 8(wasExtensionLevel 5), matching the alternative declaration that PAdES baseline signatures are allowed to use; level 5 only covered ISO 32000-2 forms / 3D / RichMedia features and did not actually identify the PAdES extensions.
Version 3.56.13
Changed
- When SetPDFUAMode is active and the document is saved, any L (list) structure element that lacks an explicit
ListNumberingattribute currently automatically receives/O = List /ListNumbering = None. ISO 14289-1 §7.6 requires every L tag to declare its numbering style; the newApplyPDFUAListNumberingsave-time fix-up joins the existingApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationship/ApplyPDFUAStripTrapNetfamily. - Authors who care about a specific list style should still call SetStructElemListNumbering before EndTag; the auto-fixup only fires when no ListNumbering attribute is currently present at save time, so explicit values are preserved.
- The writer-side
LIST-NO-NUMBERING:Ndiagnostic message currently notes that the auto-fixup will mask the issue at save time, so users understand both the missing attribute and the automatic repair behaviour.
Version 3.56.12
Changed
- The PDF/UA-1 audit gains three new ISO 14289-1 checks.
10031reports Link annotations whose URI action dictionary carries/IsMap = true(forbidden by §7.18.5 unless equivalent functionality is currently provided elsewhere in the content; authors with a legitimate IsMap use case can suppress the diagnostic on their own).10032reportsNotestructure elements missing the/IDentry — §7.9 requires every Note tag to declare a unique ID.10033reports duplicate-pair counts when two or more Note tags share the same/IDvalue. - Note ID collision detection is currently done by collecting the IDs in a sorted TStringList and walking adjacent pairs, so a group of three Notes sharing one ID counts as two duplicate pairs.
- URI action checking walks every page's
/Annotsarray, filters by/Subtype /Link, then inspects/A /S /URIand the/IsMapboolean. Indirect references are currently dereferenced at every step so split-out action dicts behave the same as inline ones.
Version 3.56.11
Changed
- In this release, iSO 14289-1 §7.6 requires every L (list) structure element to carry an explicit
ListNumberingattribute.10030(reader-side) andLIST-NO-NUMBERING:N(writer-side) report L tags that omit it. The reader-side walker decodes both/Ashapes (single attribute dictionary, or an array of dictionaries mixed with revision integers) and looks for the/ListNumberingkey regardless of owner. The writer-side check inspectsTPDFStructElem.Attributesfor the same name across both the finalised structure list and the still-open tag stack. - Valid
ListNumberingvalues per ISO 32000-1 Table 347 areNone,Disc,Circle,Square,Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha. The audit only checks presence of the key, not which value is currently chosen — every L tag needs one of these.
Version 3.56.10
Changed
- The PDF/UA-1 audit gains the ISO 14289-1 §7.21.6 TrueType encoding rules.
10028reports non-symbolic TrueType fonts whose/Encoding(or the/BaseEncodinginside an Encoding dictionary) is currently neitherMacRomanEncodingnorWinAnsiEncoding.10029reports symbolic TrueType fonts that carry an/Encodingentry at all (forbidden by §7.21.6 fourth paragraph). - Symbolic vs. non-symbolic is currently decided from the FontDescriptor
/Flagsbit 3 (mask4), reusing the existingUAFontDescriptorSymbolichelper from sub-class 4. The full §7.21.6 first paragraph (the embedded TrueType program must contain matching cmap entries) requires parsing the TrueType font program and is still pending; the dictionary-level rules above are the practical layer this audit can verify without a TrueType parser. - In this release, differences-array rules in §7.21.6 (AGL-only glyph names, Microsoft Unicode cmap presence) remain out of scope for the same reason — they require font-program inspection.
Version 3.56.9
Changed
- In this release, the PDF/UA-1 audit gains a full ISO 14289-1 §7.18.4 check.
10027reports Widget annotations whose/StructParentresolves through the structure tree's/ParentTreebut does not land on a structure element with/S = Form. The previous v3.56.7 partial check (10026) only caught Widgets that lack/StructParententirely; the new check completes the rule by following the number-tree pointer and verifying the destination tag. - In this release, a new
NumberTreeLookuphelper implements the ISO 32000-1 §7.9.7 number-tree shape (flat/Numsroot, intermediate/Kidsranged by/Limits). Future audits that need to resolve/StructParentspage entries or/PageLabelslabels can reuse it. - The Widget annotation Form-tag verification uses a two-tier model: a Widget without
/StructParentis currently reported as10026; a Widget whose/StructParentexists but does not resolve to/S = Formis reported as the more specific10027. This avoids double-counting the same violation under both codes.
Version 3.56.7
Changed
- When SetPDFUAMode is active and the document is saved, any
TrapNetannotation entries are currently automatically removed from every page's/Annotsarray. ISO 14289-1 §7.18.2 forbidsTrapNetannotations; the newApplyPDFUAStripTrapNetsave-time fix-up joins the existingApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationshipfamily so PDF/UA-mode documents stop silently emittingTrapNetstragglers. - The PDF/UA-1 audit gains a partial §7.18.4 check.
10026reports Widget annotations that lack/StructParent— a Widget without/StructParentcannot be reached from the structure tree and therefore cannot be nested in aFormstructure tag. Full structural verification (resolving/StructParentthrough theParentTreeand confirming the parent/Sis currentlyForm) is left for a follow-up release. - In this release, writer-side GetPDFUADiagnostics gains the matching
WIDGET-NO-STRUCTPARENT:Nissue. The existing TRAPNET-ANNOT message currently also notes that SetPDFUAMode auto-strips these at save time.
Version 3.56.6
Changed
- The PDF/UA-1 audit gains two ISO 14289-1 §7.4.2 heading hierarchy checks.
10024reports when the first heading element in document order is currently not H1 (or H).10025reports the number of heading-level skips in a descending sequence (e.g. H1 followed by H3 without H2). Both checks share a single structure-tree pre-order walk that decodes the nested/Kshapes (single StructElem, array of StructElems / IndRefs / MCRs). - Writer-side GetPDFUADiagnostics gains the matching
FIRST-HEADING-NOT-H1issue, parity with reader10024. The previously-existing HEADING-LEVEL-SKIP writer check currently has a companion that also catches "first heading was previously H2" style problems.
Version 3.56.5
Changed
- When SetPDFUAMode is active and the document is later encrypted, the encryption permission key (
/Pin the encrypt dictionary) currently automatically has bit 10 (mask$200, "Extract text and graphics in support of accessibility") set, even when the caller did not includeppCanCopyAccessin theTPDFExtraPermissionspassed to Encrypt. ISO 14289-1 §7.16 requires every encrypted conforming file to permit accessibility extraction, and the bit is otherwise easy to miss. The bit is always safe to set — it only grants additional access to assistive technology, not to other extract paths. - Writer-side GetPDFUADiagnostics gains a new
ENCRYPT-NO-ACCESSissue that fires when PDFUAMode is currently on and the encrypt dictionary's/Pbit 10 is cleared. This catches the call-order edge case in which the user calledEncrypt()first and SetPDFUAMode only afterwards — the diagnostic tells the user to callEncrypt()again so the encrypt dict is re-emitted with the corrected/P.
Version 3.56.4
Changed
- Writer-side GetPDFUADiagnostics gains five new ISO 14289-1 checks so the in-memory document audit catches the same violations as the reader-side CheckFileCompliance ComplianceTest=2 audit.
SUSPECTS-TRUEflags MarkInfo/Suspects=true (§7.1: PDF/UA conforming files require Suspects=false).ROLEMAP-STANDARD-REMAP:Nflags AddRoleMap calls that would remap a standard structure tag — §7.1 forbids remapping standard tags.DC-TITLE-MISSINGflags an empty XMP dc:title (separate from DOCINFO-TITLE-MISSING, which checks /Info /Title).TRAPNET-ANNOT:Nflags TrapNet annotations (§7.18.2 forbids them).ANNOT-PAGE-NO-TABS-S:Nflags pages carrying annotations whose page dictionary /Tabs is currently not /S (§7.18.3 requires structure-tree tab order on those pages). - Writer-side and reader-side PDF/UA-1 audits are currently roughly in parity: every issue the reader-side audit raises on a saved file is currently also reachable from the in-memory diagnostic, modulo the format conventions of each function (newline-separated text vs. NNNNN-code string list).
Version 3.56.3
Changed
- The PDF/UA-1 audit gains its §7.21 font checks.
10020reports any non-Standard-14 font whose FontDescriptor lacksFontFile/FontFile2/FontFile3(§7.21.4.1: every rendered font must embed its program).10021reports CIDFontType2 descendants without a/CIDToGIDMapentry (§7.21.3.2).10022calls out Standard 14 fonts (Helvetica, Times, Courier, Symbol, ZapfDingbats and bold / oblique variants) that are referenced without an embedded program — §7.21.4 NOTE 5 makes clear there is currently no exemption from embedding for these fonts.10023reports fonts that lack a/ToUnicodeCMap and do not match the §7.21.7 exemption list (predefined MacRoman / MacExpert / WinAnsi encodings, Type 0 with Adobe-GB1 / CNS1 / Japan1 / Korea1 character collections, non-symbolic TrueType). - Composite Type 0 fonts are currently inspected at both layers:
/ToUnicodeon the Type 0 parent dictionary itself, and embedding //CIDToGIDMapon the first descendant CIDFont. Type 3 fonts skip the embedding check (their glyphs are inline CharProcs) but still participate in the/ToUnicodecheck. - The PDFlibPDFA helpers for similar font work were previously intentionally not shared — a half-dozen short routines (subset-prefix stripping, Standard-14 name table, FontFile presence, Symbolic flag) are duplicated locally as
UA*helpers so the PDF/A audit can keep evolving without breaking PDF/UA, and vice versa.
Version 3.56.2
Changed
- The PDF/UA-1 audit gains five more ISO 14289-1 checks covering annotations, embedded files, and optional content.
10015reports Link annotations that lack a non-empty/Contentsalternate description (§7.18.5) so screen readers can announce link targets.10016and10017flag embedded-file FileSpec dictionaries that are currently missing the required/For/UFfile-name keys (§7.11).10018flags optional-content configuration dictionaries that omit a non-empty/Nametext string (§7.10).10019flags optional-content configuration dictionaries that contain the forbidden/ASkey (§7.10). - In this release, the per-page annotation walk that already powered the TrapNet and
/Tabs /Schecks currently also collects Link //Contentsdata in the same pass, keeping the audit O(N) on object count.
Version 3.56.1
Changed
- The PDF/UA-1 audit gains five new ISO 14289-1 checks.
10010verifies the accessibility extract permission (bit 10 of the encryption/Pkey) on encrypted files (§7.16).10011detects dynamic XFA forms via the<dynamicRender>required</dynamicRender>element inside the XFA XDP packet (§7.15).10012flags Form XObjects that carry a/Refentry — reference XObjects are currently forbidden (§7.20).10013flagsTrapNetannotations (§7.18.2).10014walks every page and reports any page carrying annotations whose page dictionary does not set/Tabs /S(§7.18.3) so tab order follows the structure tree. - All five new codes flow through the same CheckFileCompliance + GetStringListItem handle pair the prior release introduced — there is no new public API surface.
Version 3.56.0
Added
- Newly introduced reader-side audit
CheckCompliancePDFUAvalidates an external PDF against ISO 14289-1 (PDF/UA-1). It complements the existing GetPDFUADiagnostics writer-side check by accepting any input PDF (own output, scanner output, third-party content) and listing PDF/UA-1 violations the same way CheckFileCompliance already reports PDF/A problems.
Changed
- CheckFileCompliance currently accepts
ComplianceTest = 2to run the new PDF/UA-1 audit. The PDF/A test underComplianceTest = 1remains unchanged, and the issue list still flows back through the existing GetStringListCount / GetStringListItem handle pair. - The first cut covers the foundational PDF/UA-1 conformance gates from §5 (XMP
pdfuaid:partidentification) and §7.1 (Catalogue/Metadatastream, tagged-PDF marker, structure tree, viewer title preference, document language, XMPdc:title,/Suspectsvalue, and the prohibition on remapping standard structure tags). Eight diagnostic codes are issued —10001through10009— keeping the numeric range visually separate from the PDF/A00xxxcodes. - Deeper PDF/UA-1 clauses (security, annotations, XObjects, font subsetting) are currently tracked for follow-up patch releases on top of the same audit framework.
Version 3.55.6
Changed
- Every freshly-generated XMP packet currently carries an xmpMM:InstanceID property in the format uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. The identifier is generated via Win32 CoCreateGuid and gives each produced document a unique, version-independent fingerprint as recommended by ISO 19005-1 §6.7.2 (Cor2) and PDF/A best-practice guides. The non-Windows builds (where the XMP packet remains empty) are unaffected.
- The xmpMM namespace (http://ns.adobe.com/xap/1.0/mm/) is currently part of the XMP packet's SelectionNamespaces; new SetXMPMM and GenerateInstanceID helpers underpin the InstanceID emission and provide the foundation for future xmpMM:History / xmpMM:DerivedFrom support.
- PDF/A Extension Schema description schema (pdfaExtension / pdfaSchema / pdfaProperty / pdfaType / pdfaField) is not introduced in this release. Authoring a custom extension schema requires multi-step bag / seq / structured-property construction beyond the current SetDublinCore / SetXMPBasic shape; the work is tracked for a future release. Documents that need to declare custom XMP properties continue to fall back to the LoadFromString path.
Version 3.55.5
Changed
- PDF/A documents currently have their annotation /F flags normalised at save time. ISO 19005-1 §6.5.3 requires the Print bit to be 1 and the Hidden / Invisible / NoView bits to be 0 on every annotation; the writer currently applies that mask at save time so callers do not have to remember the bit layout. The /Subtype /Popup case is exempt — popups are children of other annotations and traditionally not printed.
- The AcroForm /NeedAppearances flag is currently force-set to false at save time when the document is in any PDF/A mode. ISO 19005-1 §6.9 requires the flag to be absent or false; previously the writer left whatever value the caller had set, which produced documents that asked the viewer to regenerate appearances at open time and silently violated the spec when the caller had set it to true. The fix also runs for documents that previously had the flag absent — the writer emits an explicit /NeedAppearances false to leave no ambiguity for the validator.
Version 3.55.4
Changed
- AddStandardFont currently rejects calls in PDF/A mode. ISO 19005-1 §6.3.4 revokes the PDF reference's "Standard 14 may be unembedded" exemption: every font program in a conforming file must be embedded, and the library does not bundle the Standard 14 outlines. The facade returns 0 silently; callers should switch to AddTrueTypeFont or AddType1Font with a real font file.
- AddTrueTypeFont currently silently promotes Embed=0 (no embedding) to Embed=1 (embed full font) when PDF/A mode is active. The non-embedded reference path produced PDF that depended on the viewer's font fallback to a system Arial / Times / Courier installation, which violates ISO 19005-1 §6.3.4. Existing callers that asked for embedding (Embed=1 or 2) are unaffected.
- The non-symbolic TrueType /Encoding compliance check (ISO 19005-1 §6.3.7 Cor2 requires WinAnsi or MacRoman as the encoding name or BaseEncoding, with no /Differences) is not introduced in this release because the library already emits /WinAnsiEncoding for non-symbolic TrueType subsets, and the deeper enforcement would require tracking symbolic-vs-non-symbolic dispatch through the subset path. CheckCompliancePDFA 00034 / 00035 (added v3.51.0) flag any non-conforming output at validation time.
Version 3.55.3
Changed
- TrueType-backed CIDFontType2 font dictionaries currently carry /CIDToGIDMap /Identity explicitly. ISO 19005-1 §6.3.3.2 (Cor2) requires the entry to be present for every embedded Type 2 CIDFont; the PDF reference permits the implicit Identity default, but PDF/A demands an explicit value. The writer was previously omitting the key entirely, causing veraPDF (and CheckCompliancePDFA 00033 introduced in v3.51.0) to flag the file. The /Identity name matches the GID-as-CID layout that the writer was previously already producing implicitly, so existing documents render identically.
- FontDescriptor /CharSet (for Type 1 subsets) and /CIDSet (for CIDFont subsets) remain TODO; the writer would need to track which glyph names / CIDs ended up in the subset to populate them accurately. CheckCompliancePDFA 00031 and 00032 (also introduced in v3.51.0) will flag the absence so users see the issue at validation time.
Version 3.55.2
Changed
- AddImageDirectFromString currently rejects PDF/A-incompatible filters at the entry point. Passing Filter = 'LZWDecode' is rejected for every PDF/A part (ISO 19005-1 §6.1.10 plus the equivalent ISO 19005-2 / -3 rules). Passing Filter = 'JBIG2Decode' or 'JPXDecode' is rejected for PDF/A-1 (modes 1 and 2). PDF/A-2 and PDF/A-3 admit JPXDecode under ISO 19005-2 §6.2.8.3 with sub-spec constraints (colour-channel count, bit-depth uniformity, METH/APPROX requirements) that the writer-side gate does not enforce — callers in those modes still need to ensure the JPEG 2000 stream is conformant. The facade returns 0 silently when a forbidden filter is requested.
- TIFF, PNG, JPEG and JPEG 2000 inputs loaded through AddImageFromFile / AddImageFromStream are unaffected: the importer decompresses the source bytes and re-encodes with FlateDecode (or DCTDecode for JPEG payloads), so LZW input never propagates to the output Filter chain. The CheckCompliancePDFA validator introduced in v3.50.0 (00004) and v3.52.0 (00022, 00023) provides a second line of defence at validation time for any indirect path that still slips a forbidden filter into the output.
Version 3.55.1
Changed
- AddLinkToHideField currently rejects calls in PDF/A mode. The previous release left a comment claiming the action was previously PDF/A compatible, but ISO 19005-1 Cor2 introduced /Hide to the forbidden-action list (§6.6.1), and ISO 19005-2 / -3 inherit the restriction. The facade returns 0 silently when called in PDF/A mode, matching AddLinkToJavaScript and AddLinkToImportData.
- AddSWFAnnotationFromFile currently rejects calls in PDF/A mode. SWF / RichMedia annotations wrap Flash media which is forbidden by ISO 19005-1 §6.5.2 (no Movie / Sound subtypes) and reinforced by ISO 19005-2 §6.3.1 (no 3D / Sound / Screen / Movie). The facade returns 0 silently.
- AddEmbeddedFile and AddLinkToEmbeddedFile currently reject calls in PDF/A-1 and PDF/A-2 modes. ISO 19005-1 §6.1.11 forbids /EF, and ISO 19005-2 §6.8 admits only embedded PDF/A files; rather than verify the recursive PDF/A-ness of the attached payload, the writer simply refuses the call in these modes. PDF/A-3 (SetPDFAMode 5 or 6) remains permitted — see v3.55.0 for the automatic /AFRelationship injection.
- SetOpenActionMenu currently rejects MenuItem values outside the {NextPage, PrevPage, FirstPage, LastPage} whitelist when the document is in PDF/A mode. ISO 19005-1 §6.6.1 restricts named actions to that set, so previously the API silently produced non-conforming Find / Print / FullScreen Open-Action dictionaries that veraPDF would reject.
- NewOptionalContentGroup currently rejects calls in PDF/A-1 modes (SetPDFAMode 1 or 2). ISO 19005-1 §6.1.13 forbids the Catalogue /OCProperties key. PDF/A-2 (modes 3/4) and PDF/A-3 (modes 5/6) admit optional content with the constraints in their respective §6.9, so the gate only fires for PDF/A-1.
Version 3.55.0
Changed
- PDF/A-3 documents currently automatically receive an /AFRelationship entry on every embedded file. Previously a PDF/A-3 file created with the library could fail validation because ISO 19005-3 Annex E, Table E.1 requires AFRelationship on every embedded file specification. The writer currently injects the configured default value ('Unspecified' out of the box) on any FileSpec dictionary that lacks the entry at save time, mirroring the PDF/UA AFRelationship auto-injection introduced earlier. Only PDF/A-3 modes (SetPDFAMode 5 = PDF/A-3b or 6 = PDF/A-3a) trigger the auto-injection; PDF/A-1 and PDF/A-2 still reject embedded files outright per ISO 19005-1 §6.1.11 and ISO 19005-2 §6.8.
- SetPDFA3DefaultAFRelationship is currently a new API that overrides the default value written by the writer when an embedded file lacks an /AFRelationship entry. Accepts the ISO 19005-3 Table E.1 values 'Source' (the embedded file is the source material that produced the PDF content), 'Data' (the file is the structured data backing a visual table or chart), 'Alternative' (an alternative rendition such as an audio version), 'Supplement' (a supplementary representation such as a MathML form of an equation), 'Unspecified' (relationship cannot be characterised by the above), or any registered second-class name. Empty string resets to 'Unspecified'. Per-file overrides remain available via SetEmbeddedFileAFRelationship.
- The new APIs are currently exposed on the Delphi facade as TPDFlib.SetPDFA3DefaultAFRelationship and via the DLL as DLSetPDFA3DefaultAFRelationship (PWideChar) and DLSetPDFA3DefaultAFRelationshipA (PAnsiChar).
Version 3.54.0
Changed
- LoadOutputIntentProfile is currently a new API that replaces the bundled sRGB OutputIntent profile with an external ICC profile loaded from disk. Required when producing PDF/A documents in DeviceCMYK or DeviceGray colour spaces, since the library only ships an sRGB profile. Typical use is to call SetPDFAMode first (which initialises the OutputIntent skeleton), then LoadOutputIntentProfile('C:\\path\\to\\FOGRA39.icc', 'DeviceCMYK') to swap the profile bytes and tag the document with the new colour space. Returns 1 on success, 0 on file-not-found or unknown colour space. Exposed on the Delphi facade as TPDFlib.LoadOutputIntentProfile and via the DLL as DLLoadOutputIntentProfile (PWideChar form) and DLLoadOutputIntentProfileA (PAnsiChar form). ISO 19005-1 §6.2.2 allows any registered ICC profile in the DestOutputProfile stream.
- SetFillColourCMYK, SetTextColourCMYK, SetTextHighlightColourCMYK, SetTextUnderlineColourCMYK, AddSeparationColour, SetFillColourSep, SetLineColourSep, SetTextHighlightColourSep and SetTextColourSep currently succeed in PDF/A mode when the document's OutputIntent profile is DeviceCMYK. Previously these APIs rejected every call in PDF/A mode regardless of the OutputIntent, which prevented compliant CMYK documents from being produced. The gate is currently PDFAMode = 0 OR OutputIntentColourSpace = 'DeviceCMYK', matching the ISO 19005-1 §6.2.3.3 rule that DeviceCMYK is permitted when the OutputIntent uses a CMYK profile, and ISO 19005-1 §6.2.3.4 which allows Separation alternates whose base colour space is also compliant.
- SetTextShader currently succeeds in PDF/A mode when the OutputIntent profile is either DeviceRGB or DeviceCMYK. Shaders themselves are not banned by PDF/A; the validator (read side) verifies the shader's internal colour space matches the OutputIntent. The previous strict-reject behaviour denied compliant shader use.
- The CMYK / Separation / Shader unblock depends on the OutputIntentColourSpace tag set by AddOutputIntent and LoadOutputIntentProfile (introduced in v3.53.0). Calling SetPDFAMode without LoadOutputIntentProfile keeps the colour space as DeviceRGB (the bundled sRGB profile), so CMYK calls still reject by default — the new behaviour is opt-in via LoadOutputIntentProfile.
Version 3.53.0
Changed
- OutputIntent dictionary currently carries the full PDF/A skeleton fields recommended by ISO 19005-1 §6.2.2 and Adobe Acrobat preflight: /OutputCondition (human-readable colour-condition description), /Info (long-form identification text), and /RegistryName (registry URL, defaults to http://www.colour.org). The values default to "sRGB IEC61966-2.1" / "sRGB IEC61966-2.1" / "http://www.colour.org" for the legacy single-argument call sites; the new AddOutputIntent overload takes the four custom fields directly so callers can populate them for their own colour conditions.
- AddOutputIntent gains a new five-argument overload: AddOutputIntent(ColourSpace, OutputConditionIdentifier, OutputCondition, Info, RegistryName). The legacy single-argument form keeps working unchanged; it currently delegates to the new overload with the sRGB defaults. The ColourSpace argument also selects the /N component count written into the embedded ICC profile dictionary (3 for DeviceRGB, 4 for DeviceCMYK, 1 for DeviceGray); the embedded profile itself remains the bundled sRGB stream until the upcoming LoadOutputIntentProfile API ships in v3.54.0.
- TPDFDocument exposes OutputIntentColourSpace as a read/write property tracking the colour space of the last AddOutputIntent call. This becomes the gate condition for the CMYK / Separation / Shader writer-side restrictions in v3.54.0, where colour APIs that today reject every call in PDF/A mode will reject only when the colour space is mismatched with the OutputIntent.
Version 3.52.0
Changed
- CheckCompliancePDFA currently audits annotations, graphics-state, actions, and form XObjects, completing the PDF/A read-side validator's coverage of ISO 19005-1 chapters 6.2-6.6 and the equivalent PDF/A-2/-3 differential rules. The validator reports 14 new issue classes (00050-00067): forbidden annotation subtypes (00050; ISO 19005-1 §6.5.2 forbids FileAttachment / Sound / Movie for PDF/A-1, and ISO 19005-2 §6.3.1 forbids 3D / Sound / Screen / Movie for PDF/A-2 and PDF/A-3), annotation /CA other than 1.0 (00051; §6.5.3), annotation /F missing or with Print=0 / Hidden=1 / Invisible=1 / NoView=1 (00052; §6.5.3, with /Subtype /Popup exempted), annotation /AA (00054; §6.6.2), annotation appearance dict with keys other than /N or non-conforming /N value (00055; §6.5.3 Cor2), Widget annotation with /A (00056; §6.9), ExtGState /TR (00058; §6.2.8), ExtGState /TR2 other than /Default (00059; §6.2.8), and in PDF/A-1 only: ExtGState /SMask other than /None (00061; §6.4), /BM other than Normal or Compatible (00062; §6.4), /CA or /ca other than 1.0 (00063; §6.4).
- Action-anywhere audit (00064, 00065) replaces the OpenAction-only check from v3.50.0 with a full sweep that flags forbidden /S action values (Launch, Sound, Movie, ResetForm, ImportData, JavaScript, Hide, SetState, NOP, Trans, GoTo3DView, Rendition, SetOCGState) and named actions whose /N is outside {NextPage, PrevPage, FirstPage, LastPage} regardless of where the action lives (annotation /A, widget /A, outline /A, catalogue /OpenAction, etc.). ISO 19005-1 §6.6.1.
- In this release, xObject audit (00066, 00067) reports PostScript and Reference XObjects, plus forbidden keys on Form XObjects (/OPI, /PS, /Subtype2 = /PS) and Image XObjects (/Alternates, /OPI, /Interpolate true). ISO 19005-1 §6.2.4 - §6.2.7.
Version 3.51.0
Changed
- CheckCompliancePDFA currently audits font and colour-space conformance in addition to the structural checks introduced in v3.50.0. The validator reports nine new issue classes: at least one font program is not embedded (00030; ISO 19005-1 §6.3.4 requires every font program, including the Standard 14 substitutions, to be embedded), Type 1 subset missing /CharSet in its FontDescriptor (00031; §6.3.5), CIDFont subset missing /CIDSet (00032; §6.3.5), CIDFontType2 missing /CIDToGIDMap (00033; §6.3.3.2 Cor2), non-symbolic TrueType with a non-conforming /Encoding (00034; §6.3.7 Cor2 requires WinAnsi/MacRoman directly or as BaseEncoding, with no /Differences), symbolic TrueType that still carries /Encoding (00035; §6.3.7 Cor2), at least one font missing /ToUnicode in PDF/A-Na or PDF/A-Nu documents (00036; §6.3.8 four-class exemption applied), ICCBased colour space that does not embed its profile stream (00037; §6.2.3.2), and a file that uses both DeviceRGB and DeviceCMYK (00038; §6.2.3.3 forbids the mix).
- The /ToUnicode check (00036) is currently scoped to conformance levels A and U because only those levels require Unicode mapping per ISO 19005-1 §6.3.8 and ISO 19005-2 §6.2.11.7. Level B files (PDF/A-1b, PDF/A-2b, PDF/A-3b) are not flagged. The four-class exemption recognises predefined encodings (MacRomanEncoding, MacExpertEncoding, WinAnsiEncoding), Standard 14 Type 1 BaseFonts as a proxy for Adobe Standard Latin / Symbol glyph-name fonts, and Type 0 fonts whose descendant CIDFont uses Adobe-GB1, Adobe-CNS1, Adobe-Japan1 or Adobe-Korea1 registries.
- In this release, the font audit walks every Font dictionary, classifies it by Subtype (Type1, MMType1, TrueType, Type3, Type0 with its descendant CIDFontType0 or CIDFontType2), then dispatches the relevant checks. Type 0 composite fonts delegate embedding and subset checks to their descendant CIDFont while keeping /ToUnicode on the Type 0 wrapper. Subset detection uses the standard six-uppercase-letter prefix convention.
Version 3.50.0
Changed
- CheckCompliancePDFA currently reports 15 additional PDF/A non-conformance issues that the validator previously missed: missing trailer /ID array (00013), missing Document Catalogue /Metadata stream (00014), /Filter applied to the /Metadata stream (00015), stream dictionaries that reference external files via /F, /FFilter or /FDecodeParms (00016), embedded files declared via /EF in any file-specification dictionary or via the Name tree /EmbeddedFiles entry in PDF/A-1 documents (00017, 00018), /OpenAction pointing at a forbidden action type (00019), /AA additional-action dictionaries in the Document Catalogue or any Page (00020, 00021), JBIG2Decode or JPXDecode filters in PDF/A-1 documents (00022, 00023), Crypt filters whose /Name is not /Identity (00024), /Requirements in the Document Catalogue (00025), /Perms with keys other than /UR3 and /DocMDP (00026), and /AcroForm /NeedAppearances set to true (00027). The validator currently flags forbidden Catalogue /OpenAction action types (/Launch, /Sound, /Movie, /ResetForm, /ImportData, /JavaScript, /Hide, /SetState, /NOP, /Trans, /GoTo3DView, /Rendition, /SetOCGState) and named-action /N values outside the {NextPage, PrevPage, FirstPage, LastPage} allowlist per ISO 19005-1 §6.6.1.
- In this release, filter-specific checks (JBIG2Decode, JPXDecode) and embedded-file checks (/EF, /EmbeddedFiles) remain scoped to PDF/A-1 because ISO 19005-2 §6.2.8.3 and §6.8 explicitly relax those restrictions for PDF/A-2 and PDF/A-3. Document-structure checks (/Metadata, /AcroForm /NeedAppearances, /OpenAction, /AA, /Requirements, /Perms) apply to every PDF/A part.
Fixed
- The PDFAID parser accepts the U conformance suffix (PDF/A-2U, PDF/A-3U) alongside the existing A and B variants, so CheckCompliancePDFA no longer raises a spurious "00005 PDFA Mark NOT Found or invalid" warning when scanning a PDF/A-2U or PDF/A-3U file produced by another tool. The Unicode-mapping conformance levels introduced in ISO 19005-2:2011 are currently recognised by the validator.
Version 3.49.0
Changed
- AddLinkToImportData creates a Link annotation whose action is currently a PDF import-data action (/S /ImportData) that populates the document's AcroForm fields from an external FDF file when the user clicks the link (ISO 32000-1 §12.6.4.8, Table 198). The FileName parameter is referenced as a filespec dictionary, with the same path-normalisation rules used by AddLinkToFile / AddLinkToFileEx (backslashes converted to forward-slashes per ISO 32000-1 §7.11.2.1). Options bit 0 toggles the visible border and bits 1–3 select the link highlight mode (Invert, Outline, Push), matching the existing AddLinkTo* conventions. PDF 1.4 or later. NOT permitted in PDF/A because the action references an external resource; the facade silently returns 0 when called in PDF/A mode. Exposed in the Delphi library and the DLL interface as DLAddLinkToImportData / DLAddLinkToImportDataA (PWideChar and PAnsiChar form).
Version 3.48.0
Changed
- AddLinkToHideField creates a Link annotation whose action is currently a PDF hide action (/S /Hide) toggling the visibility of one or more AcroForm fields when the user clicks the link (ISO 32000-1 §12.6.4.10, Table 196). FieldNames accepts one or more fully-qualified field names separated by commas, semicolons, or line breaks; a single name emits /T as a text string and two or more names emit /T as an array, both forms permitted by the spec. HideFlag selects the visibility direction: a non-zero value hides the listed fields (/H true) and zero shows them (/H false). Options bit 0 toggles the visible border and bits 1–3 select the link highlight mode (Invert, Outline, Push), matching AddLinkToWeb / AddLinkToNamedAction. PDF 1.2 or later. PDF/A-compatible because no external resource is referenced. Exposed in the Delphi library and the DLL interface as DLAddLinkToHideField / DLAddLinkToHideFieldA (PWideChar and PAnsiChar form).
Version 3.47.0
Changed
- AddLinkToNamedAction creates a Link annotation whose action is currently a PDF named action (/S /Named) triggering one of the four standardised viewer navigation commands defined in ISO 32000-1 §12.6.4.11, Table 194: NextPage, PrevPage, FirstPage, and LastPage. The NamedActionType parameter selects the command (0=NextPage, 1=PrevPage, 2=FirstPage, 3=LastPage); values outside this range fall back to NextPage so the writer always emits a spec-conforming /N name. Options bit 0 toggles the visible border and bits 1–3 select the link highlight mode (Invert, Outline, Push), matching the existing AddLinkToWeb / AddLinkToPage conventions. The annotation requires PDF 1.1 or later and is compatible with PDF/A because no external resource is referenced. Available in the Delphi library and DLL interfaces.
Version 3.46.1
Changed
- In this release, addCaretAnnotation creates a caret markup annotation (PDF /Subtype /Caret) at the given rectangle, marking a position on the page where text or content has been inserted, omitted, or otherwise needs reviewer attention. Supports two symbol types (None and Paragraph) via SymbolType (0 / 1), configurable colour, opacity, title, contents, and creation/modification timestamps. Defined in ISO 32000-1 §12.5.6.11. PDF 1.5 or later. Available in the Delphi library and DLL interfaces.
- In this release, this entry completes the geometric-annotation backfill that began with v3.44.0 Square+Circle. PDFlibPas currently creates Text, Stamp, FreeText, TextMarkup (Highlight/Underline/Squiggly/StrikeOut), Square, Circle, Line, Polygon, PolyLine, Ink, and Caret annotations, in addition to existing Link, FileAttachment, SVG, U3D, and SWF support.
Version 3.46.0
Changed
- AddInkAnnotation creates an ink markup annotation (PDF /Subtype /Ink) representing handwritten strokes or freeform marks drawn on the page. Strokes are currently supplied as a single string where multiple strokes are separated by '|' or newline, and within each stroke the co-ordinate pairs follow the same space/comma/semicolon/tab format used by AddPolygonAnnotation. For example "100 100 110 105 120 110 | 200 200 210 205" describes two separate strokes. Supports configurable border width, ink colour, opacity, title, contents, and timestamps. Defined in ISO 32000-1 §12.5.6.13. PDF 1.3 or later. Available in the Delphi library and DLL interfaces.
- Each stroke must contain an even number of values (at least four), otherwise the call returns 0 with no annotation written. The /Rect is currently computed automatically from the combined extent of all strokes plus a small padding so the strokes remain inside the annotation bounding box.
Version 3.45.0
Changed
- In this release, addPolygonAnnotation creates a closed polygon markup annotation (PDF /Subtype /Polygon) with vertices supplied as a string of space-, comma-, semicolon-, or tab-separated co-ordinate pairs (e.g. "100 100 200 100 200 200 100 200"). Supports configurable border width, border colour, optional interior fill colour, opacity, title, contents, and timestamps. Defined in ISO 32000-1 §12.5.6.9. PDF 1.5 or later. Available in the Delphi library and DLL interfaces.
- In this release, addPolyLineAnnotation creates an open polyline markup annotation (PDF /Subtype /PolyLine) with the same vertex-string format and configurable end-line styles at each terminal (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash). Defined in ISO 32000-1 §12.5.6.9. PDF 1.5 or later. Available in the Delphi library and DLL interfaces.
- Both annotations require at least two vertex points (four numbers) and an even total count of numbers; the call returns 0 if the vertex string fails to parse to a valid pair list. The /Rect is currently computed from the vertex extent plus a border-width-proportional padding so end decorations remain visible.
- In this release, both annotations bump the document version to PDF 1.5 when emitted under a lower minimum-version lock.
Version 3.44.1
Changed
- In this release, addLineAnnotation creates a line markup annotation (PDF /Subtype /Line) between two endpoints, with configurable border width, line colour, optional interior fill colour, end-line styles for both ends (None, Square, Circle, Diamond, OpenArrow, ClosedArrow, Butt, ROpenArrow, RClosedArrow, Slash), opacity, title, contents, and creation/modification timestamps. Defined in ISO 32000-1 §12.5.6.7. PDF 1.3 or later. Available in the Delphi library and DLL interfaces.
- The annotation /Rect is currently computed from the two endpoints plus a padding proportional to the border width so end-decorations remain inside the annotation bounding box.
Version 3.44.0
Changed
- In this release, addSquareAnnotation creates a rectangle markup annotation (PDF /Subtype /Square) at the given rectangle, with a configurable border width, border colour, optional interior fill colour, opacity, title, contents, and creation/modification timestamps. Defined in ISO 32000-1 §12.5.6.8. PDF 1.3 or later. Available in the Delphi library and DLL interfaces.
- In this release, addCircleAnnotation creates an ellipse markup annotation (PDF /Subtype /Circle) inscribed in the given rectangle, with the same configurable border, fill, opacity, title, contents, and timestamps as AddSquareAnnotation. Defined in ISO 32000-1 §12.5.6.8. PDF 1.3 or later. Available in the Delphi library and DLL interfaces.
- In this release, both new annotations automatic bump the document version to PDF 1.3 when emitted under a lower minimum-version lock and emit a standard markup-annotation field set (/Type /Subtype /Rect /C /IC /BS /Border /CA /F /M /CreationDate /NM /T /Contents /Subj /P) so existing review workflows in Acrobat, Foxit, and Edge can edit them after creation.
Version 3.43.0
Changed
- In this release, setStructElemSpaceBefore and SetStructElemSpaceAfter set the /SpaceBefore and /SpaceAfter attributes (Layout owner) on the currently open structure element, expressing spacing before and after block-level elements in points. Defined in ISO 32000-1 §14.8.5.4.2 Table 340. Available in the Delphi library, ActiveX (Dispids 73008051/73008052), and DLL interfaces.
- In this release, setStructElemStartIndent and SetStructElemEndIndent set the /StartIndent and /EndIndent attributes (Layout owner), expressing indentation from the writing-mode-aware start and end edges of the content rectangle in points. Defined in ISO 32000-1 §14.8.5.4.2 Table 340. Available in the Delphi library, ActiveX (Dispids 73008053/73008054), and DLL interfaces.
- SetStructElemColour sets the /Colour attribute (Layout owner) as an RGB triplet (each component 0.0-1.0), describing the foreground colour of the element for re-flow engines and downstream colour-contrast checkers. Defined in ISO 32000-1 §14.8.5.4.2 Table 340. Available in the Delphi library, ActiveX (Dispid 73008055), and DLL interfaces.
Fixed
- Fixed a serialisation bug in BuildStructElemDictRef: single-token numeric attribute values (such as SpaceBefore, SpaceAfter, StartIndent, EndIndent) were previously being written as PDF names instead of PDF numbers. The fix applies to both single-owner and multi-owner attribute branches.
Version 3.42.0
Changed
- Three new compliance checks added: code 00006 flags encrypted documents (encryption is forbidden in all PDF/A versions); code 00007 flags documents missing an OutputIntents entry in the catalogue (required by all PDF/A versions); codes 00011 and 00012 flag documents missing MarkInfo or StructTreeRoot when the conformance level is -a (accessibility).
Fixed
- CheckCompliancePDFA currently correctly validates all six PDF/A modes (1a, 1b, 2a, 2b, 3a, 3b). The PDFAID check (code 00005) accepts any of the six valid XMP markers instead of only '1B'. The version ceiling check (00002) applies 1.4 for PDF/A-1 and 1.7 for PDF/A-2 and PDF/A-3.
- The OCProperties check (code 00003) is currently conditional: it applies only to PDF/A-1 documents, where optional content (layers) is forbidden. PDF/A-2 and PDF/A-3 permit layers and are no longer flagged.
Version 3.41.0
Changed
- PDF/A mode currently enforces prohibited operations at the API level. When a PDF/A mode is active (any of modes 1-6), calling SetEncryption, AddSeparationColour, SetFillColourCMYK, SetTextColourCMYK, or any other CMYK/Separation/Shader API returns 0 and has no effect, consistent with PDF/A's requirement for a single sRGB output intent.
- Transparency is currently prohibited in PDF/A-1 (modes 1 and 2): SetTransparency, SetBlendMode, and SetPageTransparencyGroup return 0 and are no-ops when the active mode is 1 or 2. PDF/A-2 and PDF/A-3 (modes 3-6) allow limited transparency and are not restricted.
- JavaScript actions are prohibited in all PDF/A modes (1-6): SetOpenActionJavaScript, PageJavaScriptAction, DocJavaScriptAction, AddGlobalJavaScript, and AddLinkToJavaScript all return 0 and are no-ops when any PDF/A mode is currently active. ISO 19005-1 §6.6.1 explicitly bans JavaScript from PDF/A documents.
- File attachment APIs (EmbedFile, AddFileAttachment) are currently blocked in PDF/A-1 and PDF/A-2 modes (1-4). They remain functional in PDF/A-3 (modes 5 and 6), which explicitly permits arbitrary embedded files.
Version 3.40.0
Added
- In this release, setPDFAMode currently supports PDF/A-2 and PDF/A-3 conformance levels. Pass NewMode=3 for PDF/A-2b, 4 for PDF/A-2a, 5 for PDF/A-3b, or 6 for PDF/A-3a. PDF/A-2 targets PDF 1.7 and permits layers, interactive forms, JPEG2000 images, and limited transparency. PDF/A-3 extends PDF/A-2 by allowing arbitrary embedded files (any MIME type). All -a variants automatically write /MarkInfo and the tagged-PDF structure markers required by the accessibility conformance level.
Changed
- In this release, getInformation(201) returns '1' through '6' matching the active PDF/A mode, consistent with the new mode numbering.
Fixed
- Fixed: SetPDFAMode(1) (PDF/A-1a) was previously a no-op due to an internal routing bug introduced in v3.20.0. It currently correctly writes /MarkInfo and /OutputIntents and sets XMP pdfaid:part=1/conformance=A.
Version 3.39.0
Changed
- SetStructElemWritingMode sets the /WritingMode attribute (Layout owner) on the currently open structure element. Valid values are currently LrTb (left-to-right, the default for Latin scripts), RlTb (right-to-left, for Arabic and Hebrew), and TbRl (top-to-bottom right-to-left, for traditional CJK vertical text). Defined in ISO 32000-1 §14.8.5.4.2 Table 340. Available in the Delphi library, ActiveX (Dispid 73008049), and DLL interfaces.
- SetStructElemListNumbering sets the /ListNumbering attribute (List owner) on the currently open structure element. Supported values include None, Disc, Circle, Square (unordered markers) and Decimal, UpperRoman, LowerRoman, UpperAlpha, LowerAlpha (ordered numbering). The attribute is currently set on the L (list) element and enables assistive technology to announce the list type correctly. Defined in ISO 32000-1 §14.8.5.3.2 Table 336. Available in the Delphi library, ActiveX (Dispid 73008050), and DLL interfaces.
Version 3.38.0
Changed
- In this release, setStructElemColSpan sets the /ColSpan attribute (Table owner) on the currently open structure element, indicating how many columns the cell spans. Defined in ISO 32000-1 §14.8.5.7.2 Table 337. Available in the Delphi library, ActiveX (Dispid 73008047), and DLL interfaces.
- In this release, setStructElemRowSpan sets the /RowSpan attribute (Table owner) on the currently open structure element, indicating how many rows the cell spans. Defined in ISO 32000-1 §14.8.5.7.2 Table 337. Available in the Delphi library, ActiveX (Dispid 73008048), and DLL interfaces.
- Both functions are currently convenience wrappers equivalent to calling AddTagAttribute with Owner='Table' and the respective attribute name. They complement SetStructElemScope for fully described table cells in complex or spanning-header tables.
Version 3.37.2
Changed
- GetPDFUADiagnostics currently reports FORM-NO-TOOLTIP:N when N interactive form fields (Widget annotations) are missing a TU (tooltip / accessible name) entry. ISO 14289-1 §7.18.4 requires all interactive form fields to carry a TU entry so assistive technology can announce the field's purpose to the user when the field receives focus. /TU is the accessible name that screen readers speak aloud; it is distinct from /T, which is the partial field name used for programmatic access and form submission.
Version 3.37.1
Changed
- In this release, getPDFUADiagnostics currently reports LIST-STRUCT:N when N LI or LBody structure elements appear outside their required parent element. ISO 32000-1 §14.8.4.4 requires LI to be a direct child of L (list) and LBody to be a direct child of LI (list item). Malformed list nesting prevents assistive technology from correctly traversing and announcing list content, and can cause document structure validation failures in PDF/UA-1 validators.
Version 3.37.0
Changed
- BeginTagEx2 is currently a new API that opens a structure element and sets all main element properties in a single call. In addition to the TagType, AltText, ActualText, and Lang parameters of BeginTagEx, BeginTagEx2 accepts Title (/T, for the Tags navigation panel), ElemID (/ID, unique element identifier), and Expansion (/E, full text of an abbreviation or acronym). Passing an empty string for any of these three additional parameters is equivalent to omitting the corresponding setter. BeginTagEx2 reduces boilerplate for well-described elements — rather than calling BeginTagEx followed by SetStructElemTitle, SetStructElemID, and SetStructElemExpansion separately, all seven properties can be set in one call. The function is available in the Delphi library, ActiveX (Dispid 73008046), and DLL interfaces.
Version 3.36.1
Changed
- GetPDFUADiagnostics currently reports TABLE-TH-NO-SCOPE:N when N TH (table header cell) structure elements are missing a Scope attribute. ISO 32000-1 §14.8.4.3.4 Table 337 defines Scope (Row, Column, or Both) as the attribute that describes which data cells a header cell applies to. Without it, screen readers and other assistive technology cannot reliably associate header cells with data cells in complex or multi-header tables, which is required by ISO 14289-1 §7.5. Call SetStructElemAttr('Table','Scope', 'Column') (or 'Row' / 'Both') immediately after tagging each TH element.
Version 3.36.0
Changed
- SetStructElemExpansion is currently a new API that sets the /E (expansion text) entry on the currently open structure element (ISO 32000-1 §14.9.5). The expansion text is the fully spelled-out form of an abbreviation or acronym contained in the element — e.g. "World Wide Web" for a Span whose text is "WWW". Screen readers speak the expansion instead of attempting to pronounce the abbreviated characters, which is critical for accessibility of technical and scientific content. PDF/UA-1 (ISO 14289-1 §7.2) requires that natural language be unambiguously determinable; /E is the standard mechanism for abbreviations and acronyms. The function is available in the Delphi library, ActiveX, and DLL interfaces.
Version 3.35.1
Changed
- GetPDFUADiagnostics currently reports DOCINFO-TITLE-MISSING when the document information dictionary /Title entry is absent or empty. PDF/UA-1 (ISO 14289-1) requires a document title so screen readers can announce it when the document is opened. The existing DISPLAYDOCTITLE-FALSE check confirms that the title is shown in the viewer title bar; DOCINFO-TITLE-MISSING is complementary — it confirms the title value itself is set. Call SetDocumentInfo('Title', ...) to supply the value.
Version 3.35.0
Changed
- SetStructElemTitle is currently a new API that sets the /T (title) entry on the currently open structure element (ISO 32000-1 §14.7.2 Table 324). The title is a human-readable label that identifies the specific element instance — for example "Chapter 1", "Summary Table", or "Figure 3: Quarterly Sales" — and is shown in the Tags navigation panel of PDF viewers and used by accessibility remediation tools. /T is distinct from /Alt (alternative text for rendering-impaired users) and /ActualText (glyph-level text correction); it is most useful on non-text container elements such as Table, Figure, Form, Sect, and Div. Pass an empty string to clear a previously set value. The function is available in the Delphi library, ActiveX, and DLL interfaces.
Version 3.34.0
Changed
- SetStructElemAltText is a new API that sets the /Alt entry on the currently open structure element (ISO 32000-1 §14.9.3). It is equivalent to passing AltText to BeginTag but allows the alternative text description to be set or refreshed after the element has been opened — useful when the description is computed separately from the element type. PDF/UA-1 (ISO 14289-1 §7.5) requires Alt text on Figure and Formula elements; GetPDFUADiagnostics already reports FIGURE-NO-ALT:N for missing values. The function is available in the Delphi library, ActiveX, and DLL interfaces.
Version 3.33.1
Added
- GetPDFUADiagnostics currently includes a ROLEMAP-UNMAPPED:N check that detects custom structure element type names used in the document that have no entry in the /RoleMap dictionary. ISO 14289-1 §7.1 and ISO 32000-1 §14.7.3 require every non-standard structure type to be mapped to a standard PDF type (such as P, Span, or Figure) so assistive technology can determine how to handle the element. When N unmapped types are found the issue description includes the list of type names so callers know which AddRoleMap entries are needed. All 49 standard structure types defined in ISO 32000-1 Table 333 (PDF 1.7) are recognised and excluded from the report.
Version 3.33.0
Changed
- SetStructElemLang is currently a new API that sets the /Lang entry on the currently open structure element (ISO 32000-1 §14.9.2). The language tag overrides the document-level language declared by SetDocumentLanguage or SetPDFUAMode for the element and all its descendants, enabling mixed-language documents to mark each span with its correct BCP 47 language tag (e.g. 'en-US', 'fr', 'zh-Hant-TW'). Screen readers use the element-level /Lang to select the appropriate text-to-speech engine or voice when reading the document aloud. The function is available in the Delphi library, ActiveX, and DLL interfaces.
Version 3.32.0
Changed
- SetStructElemActualText is currently a new API that sets the /ActualText entry on the currently open structure element (ISO 32000-1 §14.9.4). Use it to specify the exact Unicode text that a glyph sequence represents when content-stream extraction would yield incorrect results — the most common cases are OpenType ligature glyphs (U+FB00 ff, U+FB01 fi, U+FB02 fl) and abbreviations with non-obvious expansions. ActualText supplements, rather than replaces, the rendered content; it overrides what assistive technology and text extractors read out for that element without suppressing visual rendering. The function is available in the Delphi library, ActiveX, and DLL interfaces.
Version 3.31.1
Changed
- GetPDFUADiagnostics currently checks Formula structure elements in addition to Figure elements when reporting missing Alt text (FIGURE-NO-ALT:N). ISO 32000-1 §14.9.3 requires alternative descriptions for both graphical figures and mathematical formulas; previously only Figure elements were previously scanned.
- GetPDFUADiagnostics currently reports PDF-VERSION-LOW when the document's PDF version is below 1.7. PDF/UA-1 (ISO 14289-1) is defined against PDF 1.7 (ISO 32000-1:2008); documents at PDF 1.5 or 1.6 would not satisfy the base specification requirements. Call SetPDFUAMode to automatically raise the version to 1.7.
Version 3.31.0
Fixed
- Structure element IDs and table header association are currently supported. SetStructElemID assigns a unique string identifier (/ID) to the currently open structure element; IDs are collected into an /IDTree name tree on the structure tree root when the document is currently saved, enabling accessibility tools and cross-references to locate elements by ID (ISO 32000-1 §14.7.4). SetStructElemHeaders associates the current table cell (TD or TH) with one or more header cells via a comma-separated list of previously assigned IDs, writing the /Headers array in the Table attribute owner dictionary (ISO 32000-1 §14.8.5.7.2). Together these two functions support complex table markup for PDF/UA-1 (ISO 14289-1 §7.10) and WCAG 2.x SC 1.3.1. Both functions are available in the Delphi library, ActiveX, and DLL interfaces. AddTagAttribute also currently correctly handles the /Headers attribute with comma-delimited values written as PDF text string arrays.
Version 3.30.1
Added
- GetPDFUADiagnostics currently includes a HEADING-LEVEL-SKIP:N check that detects heading level jumps in document order (e.g. an H1 immediately followed by an H3 without an H2 in between). The check performs a pre-order traversal of the entire structure element tree and counts each occurrence where the next heading level exceeds the previous by more than one. Generic H elements are treated as H1. Going back to a higher-level heading (H3 → H1) is currently not counted as a skip. WCAG 2.x Success Criterion 1.3.1 and ISO 14289-1 §7.1 require headings to nest without gaps.
Version 3.30.0
Changed
- Structure element attributes are currently supported for tagged PDF and PDF/UA documents. Three new API functions allow attributes to be attached to the structure element currently being built on the tag stack: AddTagAttribute (general-purpose, any owner/name/value), SetStructElemScope (convenience wrapper that sets the /Scope attribute under the Table owner, for TH header cells — ISO 32000-1 §14.8.5.7.2), and SetStructElemBBox (convenience wrapper that sets the /BBox attribute under the Layout owner, for figures and other visually-positioned elements — ISO 32000-1 §14.8.5.4). When the document is currently saved, attributes are written as /A attribute dictionaries in each structure element; multiple attributes from the same owner are grouped into one dict, and attributes from different owners are written as an array of dicts. All three functions are available in the Delphi library, ActiveX, and DLL interfaces.
Version 3.29.1
Added
- GetPDFUADiagnostics currently includes two additional checks: whether any Figure structure elements in the document are missing an Alt text value (reported as FIGURE-NO-ALT:N, per ISO 14289-1 §7.5 and ISO 32000-1 §14.9.3), and whether any structure elements are still open because EndTag was previously not called (reported as STRUCT-UNCLOSED:N). The figure check performs a full recursive walk of the structure element tree, covering elements at all nesting depths.
Version 3.29.0
Changed
- GetPDFUADiagnostics is a new diagnostic API that checks a document for potential PDF/UA-1 (ISO 14289-1) compliance issues and returns a newline-separated list of findings. Six checks are performed: whether MarkInfo/Marked is set (tagged PDF), whether the document catalogue has a /Lang entry, whether ViewerPreferences/DisplayDocTitle is true, whether the XMP metadata contains a pdfuaid:part identifier, the count of non-exempt annotations lacking a Contents entry, and the count of embedded files lacking an AFRelationship entry. Each finding is identified by a short code (e.g. LANG-MISSING, ANNOT-NO-CONTENTS:3) followed by a human-readable description. Returns an empty string when no issues are found. Available in the Delphi library, ActiveX, and DLL interfaces.
Version 3.28.5
Changed
- PDF/UA-1 annotation accessibility improvement: when a FileAttachment annotation has no Contents entry and no /T field, the filename from the annotation's embedded file specification (/FS /UF or /F) is currently used as the fallback accessible description. This completes the annotation Contents fallback chain: /T → Link URI → Stamp name → FileAttachment filename. Screen readers receive the name of the attached file rather than silence, satisfying ISO 14289-1 §7.18.1 for the most common annotation types.
Version 3.28.4
Changed
- PDF/UA-1 annotation accessibility improvement: when a Stamp annotation has no Contents entry (or an empty one) and no /T field, the stamp type name from the annotation's /Name entry is currently used as the fallback accessible description (e.g. "Approved", "Draft", "Confidential", "Final"). This extends the annotation Contents fallback chain introduced in v3.28.3 to cover stamp annotations, which are common in workflows involving reviewed or approved documents and frequently lack an explicit Contents value.
Version 3.28.3
Changed
- PDF/UA-1 annotation accessibility improvement: when a Link annotation has no Contents entry (or an empty one) and no /T field, the URI from the annotation's URI action is currently used as the fallback accessible description. This applies only during SetPDFUAMode processing and only to Link annotations that carry a /URI action. Screen readers receive the URL as a last-resort label, satisfying ISO 14289-1 §7.18.1 in the common case where authors create hyperlinks without providing a human-readable description.
Version 3.28.2
Changed
- SetEmbeddedFileAFRelationship is currently a new API for explicitly setting the AFRelationship value on an embedded file's file specification dictionary. Required by ISO 14289-1 (PDF/UA-1) §7.11, this allows callers to specify the semantic relationship of an embedded file to the document content by choosing from the five valid values: Source, Data, Alternative, Supplement, or Unspecified. When SetPDFUAMode is active, any embedded file without an AFRelationship key is automatically assigned Unspecified; use this function to override that default before saving. Available in the Delphi library, ActiveX, and DLL interfaces.
Version 3.28.1
Changed
- When SetPDFUAMode is called on a document whose XMP metadata carries the generic library-default title rather than a document-specific one, the title is currently automatically replaced with the value from the document's /Info Title entry (if one is present). This ensures that the pdfuaid:part-1 XMP packet reflects the actual document title rather than a placeholder, satisfying PDF/UA-1 verifier expectations.
- The XMP parser (LoadFromString) currently reads the dc:title value from existing XMP metadata when a document is currently loaded, so round-tripping a PDF that already has dc:title correctly preserves that title instead of reverting to the default placeholder.
Version 3.28.0
Changed
- BeginArtefactEx(ArtefactType, ArtefactSubtype) is a new tagged-PDF API that extends BeginArtefact to express both the artefact /Type and the Pagination /Subtype in a single call. When both parameters are non-empty the operator written is /Artefact << /Type /T /Subtype /S >> BMC, enabling fully specified Pagination artefacts such as headers and footers per ISO 32000-1 §14.8.2.2.1. If only one parameter is non-empty the corresponding single-key form is used. DLL entry points DLBeginArtefactEx and DLBeginArtefactExA are also exported.
Version 3.27.2
Fixed
- BeginArtefact currently correctly distinguishes artefact types from pagination subtypes. When the argument is Pagination, Layout, or Page (artefact types per ISO 32000-1 §14.8.2.2.1 Table 330), the marked-content operator writes /Type rather than /Subtype. Other values such as Header, Footer, and Watermark continue to be written as /Subtype. This corrects the previously incorrect output that would write /Subtype /Pagination when the caller intended to mark a pagination artefact.
Version 3.27.1
Changed
- When PDF/UA mode is active and the document contains embedded files, each file specification dictionary that lacks an AFRelationship entry currently receives one automatically at save time. The value written is /Unspecified, satisfying the ISO 14289-1 §7.11 requirement that every embedded file carry an AFRelationship key. This applies both to files introduced via EmbedFile and to embedded files already present in a loaded document.
Version 3.27.0
Changed
- AddRoleMap(CustomType, StandardType) is currently a new tagged-PDF API that registers a mapping from a custom (non-standard) structure element type name to a standard PDF structure type. When saved, the mappings are written to the RoleMap dictionary in the structure tree root, satisfying the ISO 14289-1 §7.1 requirement for documents that use application-specific tag names. Multiple mappings may be registered; duplicate keys are overwritten by the last call. DLL entry points DLAddRoleMap and DLAddRoleMapA are also exported.
Version 3.26.0
Changed
- BeginTagEx(TagType, AltText, ActualText, Lang) is currently a new tagged-PDF API that extends BeginTag with an explicit natural-language attribute. When Lang is non-empty it is written to the structure element's /Lang attribute, enabling per-element language annotation required by ISO 14289-1 §7.2 for multilingual documents. Pass an empty Lang string to behave identically to BeginTag. DLL entry points DLBeginTagEx and DLBeginTagExA are also exported.
Version 3.25.1
Changed
- Non-subsetted TrueType fonts loaded with the default Windows code page (WinAnsiEncoding) currently receive a ToUnicode CMap stream, enabling reliable Unicode text extraction and copy/paste for these fonts. Previously a ToUnicode stream was previously only written when an explicit code-page override or Differences array was previously present; the common default-encoding path was previously missing it.
- In this release, the same fix applies to TrueType fonts loaded with an explicit non-default code page but no Differences array, and to fonts loaded via the packaged-font format.
Version 3.25.0
Changed
- When PDF/UA mode is active, non-exempt annotations (all types except Widget, PrinterMark, and TrapNet) that lack a non-empty Contents entry currently receive one automatically at save time. The annotation's /T (title / author) value is used as the fallback, satisfying ISO 14289-1 §7.18.1 for annotations that carry a title but no explicit accessible description.
Version 3.24.0
Changed
- When PDF/UA mode is active, interactive form fields that lack a TU (tooltip / alternate description) entry currently receive one automatically at save time. The field's partial name (/T entry) is used as the fallback value, ensuring screen readers can identify every field. Push buttons are correctly excluded from this requirement per ISO 14289-1 §7.18.4.
Version 3.23.1
Changed
- GetInformation(200) returns '1' when PDF/UA-1 mode is currently active on the selected document, enabling callers to query conformance mode status at runtime.
- GetInformation(201) returns '1' for PDF/A-1a, '2' for PDF/A-1b, or an empty string when PDF/A mode is currently off.
- GetInformation(313) reports the PDF version string at which the save target is currently locked, or an empty string for documents that can version freely
Fixed
- In this release, getInformation(311) and GetInformation(312) currently correctly return the version requirement string and feature name from the most recent version-lock conflict (previously advertised in the v3.20.3 entry but not yet implemented).
Version 3.23.0
Changed
- SetMarkInfo(Marked) is currently a public API, allowing the MarkInfo.Marked flag to be set independently of the full PDF/UA-1 setup performed by SetPDFUAMode. When Marked is 1, MarkInfo.Suspects is also set to false as required by ISO 14289-1 §7.18.6.
- When PDF/UA mode is currently active, all pages automatically receive a /Tabs /S entry at save time, satisfying the structure-based tab-order requirement of ISO 14289-1 §7.18.4.
- HTML reference documentation introduced for SetPDFUAMode, SetDocumentLanguage, SetMarkInfo, BeginTag, EndTag, BeginArtefact, and EndArtefact, with full syntax tables and usage examples.
Version 3.22.0
Changed
- BeginTag(TagType, AltText, ActualText) opens a tagged-PDF structure element in the current content stream, writing a BDC operator with an auto-assigned MCID and registering the element in the document structure tree. TagType is currently any PDF standard structure type (P, H1, Figure, Table, etc.). AltText and ActualText are optional accessibility strings encoded as PDF text strings (UTF-16BE).
- In this release, endTag closes the most recently opened structure element, writing the matching EMC operator to the content stream.
- BeginArtefact(SubType) marks a content region as a PDF artefact (pagination artefact, background, etc.), writing a BMC operator. SubType is optional; when provided it is written as /Artefact << /Subtype /SubType >>.
- EndArtefact closes the artefact region with an EMC operator.
- In this release, at save time, when any tagged structure elements have been registered, the library automatically builds the complete StructTreeRoot, assigns StructParents keys to affected pages, and writes the ParentTree number tree, satisfying ISO 32000-1 §14.7 requirements for tagged PDF.
- In this release, standard Type 1 fonts (Helvetica, Times, Courier family, Symbol) and embedded Type 1 fonts with WinAnsi encoding currently receive a ToUnicode CMap stream, enabling reliable Unicode text extraction and copy/paste for these font types.
Version 3.21.0
Changed
- SetPDFUAMode(Language) activates PDF/UA-1 (ISO 14289-1) conformance mode: automatically bumps the document to PDF 1.7, writes MarkInfo.Marked and MarkInfo.Suspects, enables DisplayDocTitle in ViewerPreferences, sets Catalogue.Lang when Language is non-empty, and writes the pdfuaid:part = 1 XMP namespace entry required by ISO 14289-1 Section 6.7.11.
- SetDocumentLanguage(Language) writes the Catalogue /Lang entry directly, allowing the document language to be declared independently of PDF/UA mode.
- MarkInfo.Suspects is currently set to false whenever MarkInfo.Marked is set to true, satisfying the ISO 14289-1 tagged-PDF structure requirement (Section 7.18.6).
- Encrypt currently forces the CanCopyAccess (content copying for accessibility) permission flag when the document is currently in PDF/UA mode, as required by ISO 14289-1 Section 7.17.
Fixed
- Choice (dropdown) form fields no longer carry a meaningless hardcoded tooltip value; TU is currently left unset so the caller can assign a meaningful label via the form field property API.
Version 3.20.3
Changed
- Encrypt and AddSWFAnnotationFromFile currently return 0 immediately with LastErrorCode 602 when the save version is currently locked below the minimum required by the selected encryption strength or annotation type, instead of silently proceeding and failing only at save time.
- In this release, getInformation(311) and GetInformation(312) currently reflect the conflicting version requirement at write time when a locked version blocks extension-level features such as AES-256 or RichMedia annotations.
Version 3.20.2
Changed
- AddU3DAnnotationFromFile currently auto-bumps the document version to PDF 1.6 when a 3D annotation is introduced to a lower-version document, consistent with the version auto-bump behaviour of all other PDF 1.6+ API entry points.
Version 3.20.1
Changed
- PDF 1.2 save targets are currently enforced as strict PDF 1.2 contracts. Saving PDF 1.3+ objects such as page TrimBox data under a PDF 1.2 target fails before output is currently written instead of emitting a mixed-version file.
- PDF 1.7 Adobe extension-level compliance is currently part of save preflight. AESV3, AES-256, RichMedia, Projection, geospatial dictionaries, and ETSI signature subfilters are checked against the required ExtensionLevel.
- In this release, aES-256 encryption, RichMedia annotations, geospatial dictionaries, and ETSI signature subfilters currently declare the matching Adobe Extensions entry when PDFlib automatically bumps a document to PDF 1.7 extension content.
- In this release, append saves currently follow the same version-compliance gate as full saves.
- In this release, bundled optional PDFium runtime DLLs have been refreshed for Win32 and Win64. GDI+ remains the default renderer; PDFium stays opt-in via SetPDFiumFileName and SelectRenderer(3).
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 207/207 each, and C++Builder Win64x GoogleTest completed successfully 61 tests with 2 existing sample-dependent tests skipped.
Version 3.20.0
Changed
- Eight more PDFlib writer entry points currently go through Phase 3 EnsureMinVersion so the document version automatically bumps to the minimum required by the feature being emitted: SetDocumentMetadata (PDF 1.4 - /Metadata XMP stream) SetPDFAMode(1 or 2) (PDF 1.4 - /MarkInfo + /OutputIntents) PageJavaScriptAction (PDF 1.5 - Page /AA + JavaScript) DocJavaScriptAction (PDF 1.4 - Catalogue /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)
- In this release, combined with the v3.15.0 set (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout) and the v3.17.0 set (eight JavaScript / embedded-file / XFA / SWF entries), PDFlib currently automatically bumps FVersion across twenty-one writer entry points.
- NewOptionalContentGroup previously bumped FVersion directly; it currently goes through EnsureMinVersion so LockSaveVersion is honoured and the bump is recorded in AutoBumpedFeatures.
Version 3.19.0
Changed
- Save-time and load-time PDF version compliance currently also recognises four previously deferred features: Btn /Ff bit 15 NoToggleToOff (radio-button-only) -> PDF 1.4 DeviceN /Subtype /NChannel (colour-space refinement) -> PDF 1.6 FontFile3 /Subtype /OpenType (font program type) -> PDF 1.6 Sig /SubFilter ETSI.CAdES.detached or ETSI.RFC3161 -> PDF 1.7
- In this release, the NChannel rule matches the DeviceN colour-space array form [/DeviceN names alternateSpace tintTransform attributes] when the attributes dictionary at index 4 carries /Subtype /NChannel.
- The FontFile3 OpenType rule fires only when the stream is currently reached through a parent key named 'FontFile3', so unrelated streams that happen to carry /Subtype /OpenType are not flagged.
- In this release, the PDFFeatureRules table currently contains 103 rules (99 + 4 new).
Version 3.18.6
Changed
- Save-time and load-time PDF version compliance currently recognises /AA (additional actions) with container-type awareness: Catalogue /AA (document-level triggers) -> PDF 1.4 Annot /AA (annotation triggers) -> PDF 1.4 Page /AA (page triggers) -> PDF 1.5
- Form-field /AA (PDF 1.2) remains covered by the existing PDF 1.3 save contract; no separate rule is currently needed.
- In this release, the PDFFeatureRules table currently contains 99 rules (96 + 3 new).
Version 3.18.5
Added
- New rule: AcroForm /NeedAppearances is currently recognised as a PDF 1.5 feature per PDF 1.5 Table 218.
Changed
- In this release, the PDFFeatureRules table currently contains 96 rules (95 + 1 new).
Fixed
- Save-time and load-time PDF version compliance currently correctly classify Page /Tabs as a PDF 1.5 feature; it was previously misclassified as PDF 1.4. PDF 1.4 spec changes document (Adobe TN #5409) does not list /Tabs, and PDF 1.5 Table 8.10 introduces "Tabs (Optional; PDF 1.5)".
Version 3.18.4
Added
- In this release, the zlib-ng regression coverage currently includes boundary-sized payloads, PNG-like scanline data, stored multi-block streams, and known zlib streams across Delphi and C++Builder test runners.
Changed
- In this release, pDFlibZLib currently always uses the bundled static zlib-ng object backend on normal library builds, removing the last System.ZLib fallback path.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 194/194 each, and C++Builder Win64x GoogleTest completed successfully 58 tests with 2 existing sample-dependent tests skipped.
Version 3.18.3
Changed
- In this release, delphi and C++Builder demos that generate PDF or text output currently open the generated document straight away after a successful save.
- Installer packaging keeps build artefacts out of demo folders and makes C++Builder samples plus DLL and ActiveX/OCX modules optional components; their matching files are installed only when the component is currently selected.
Version 3.18.2
Changed
- In this release, the Delphi and C++Builder EditFormField demos currently clear /NeedAppearances before updating field values, so every edited text field gets a refreshed normal appearance stream in the saved PDF.
- That keeps the saved /AP stream in sync with the stored /V value and avoids viewer-dependent differences where focusing the field reveals text that was previously missing from the static field appearance.
Version 3.18.1
Changed
- Save-time and load-time PDF version compliance currently also recognises bit-level form-field /Ff flags and the AcroForm /SigFlags AppendOnly bit: /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
- Inheritance through /Parent is currently ignored: only dictionaries that explicitly carry /Ff or /SigFlags trigger the rules.
- In this release, the PDFFeatureRules table currently contains 95 rules (87 + 8 new bit-level).
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 191/191 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.18.0
Changed
- Save-time and load-time PDF version compliance currently also recognises nine more sub-key and bit-level features: bit-level annotation flags (/F mask): Locked (128) -> PDF 1.4 ToggleNoView (256) -> PDF 1.5 LockedContents (512) -> PDF 1.7 distinctive catalogue and page sub-keys: /BoxColourInfo (page) -> PDF 1.4 /Permissions, /Legal, /PresSteps -> PDF 1.5 /VP (page geospatial viewport) -> PDF 1.6 /Collection (catalogue portable collection) -> PDF 1.7
- In this release, the PDFFeatureRules table currently contains 87 rules (78 chapter-level + 9 sub-key / bit-level).
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 189/189 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.17.0
Changed
- In this release, eight more PDFlib writer entry points currently go through Phase 3 EnsureMinVersion so the document version automatically bumps to the minimum required by the feature being emitted: AddLinkToJavaScript, SetOpenActionJavaScript, AddGlobalJavaScript, FormFieldJavaScriptAction (PDF 1.3 - JavaScript actions) AddEmbeddedFile, AddFileAttachment (PDF 1.3 - file attachments) SetXFAFromString (PDF 1.5 - XFA forms) AddSWFAnnotationFromFile (PDF 1.7 - RichMedia annotation)
- In this release, combined with the v3.15.0 set (SetTransparency, SetPageUserUnit, Encrypt, SetPageLayout) PDFlib currently covers thirteen high-version writer entry points end-to-end.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 187/187 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.16.3
Added
- Newly introduced PDFlib API: LockSaveVersion(Version) pins the document at Version and stops Phase 3 writer-side EnsureMinVersion from auto-bumping above it. UnlockSaveVersion clears the lock.
Changed
- In this release, the save-time gate remains unchanged: writer-emitted features above the locked version still produce LastErrorCode 602 at save time, instead of silently bumping the header.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 184/184 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.16.2
Changed
- Loaded PDFs currently expose a contributor-only view of the load-time feature detection through GetInformation(103) ("ContributorFeatures"). The list contains only features whose minimum required version is strictly greater than HeaderVersion (key 100), so it directly answers "why is the effective version higher than the file header?".
- GetInformation(101) ("DetectedFeatures") remains unchanged and still lists every matched feature regardless of contribution.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 181/181 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.16.1
Added
- Broadened loader-side detection test coverage with six additional synthetic fixtures: in-page transparency ExtGState (no version bump), Catalogue /MarkInfo (PDF 1.3 -> PDF 1.4), /OCProperties + OCG content (PDF 1.4 -> PDF 1.5), /Type /3DStream (PDF 1.5 -> PDF 1.6), a multi-feature combination fixture, and a snapshot-stability check.
Changed
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 179/179 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.16.0
Added
- Newly introduced GetInformation keys: 100 returns HeaderVersion (literal %PDF-X.Y), 101 returns DetectedFeatures (CRLF-delimited features matched on load), 102 returns AutoBumpedFeatures (CRLF-delimited features that triggered writer-side EnsureMinVersion).
Changed
- Loaded PDF documents currently go through a content-driven version detection pass: every indirect object is currently walked through the feature-to-minimum- version table used by the save-time gate, and FVersion is bumped above the literal %PDF-X.Y header value when content actually requires a higher version. For example a /UserUnit page entry bumps the effective version to PDF 1.6 even when the file header says PDF 1.4.
- The save-time gate remains unaffected: documents whose effective version was previously bumped on load, then explicitly downgraded with SetInformation(0, ...), still produce LastErrorCode 602 at save time.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 173/173 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.15.0
Changed
- Writer entry points that produce features requiring a particular minimum PDF version currently auto-bump the document's PDF version automatically. Calling SetTransparency on a document marked as PDF 1.3 currently promotes the header to PDF 1.4 instead of failing the save with LastErrorCode 602.
- In this release, hooked the same automatic bump into SetPageUserUnit (>=1.6), Encrypt with Strength 1/2/3/4 (>=1.4/1.6/1.7/1.7 respectively), and the two-page variants of SetPageLayout (>=1.5).
- Behaviour change versus 3.14.x: applications that previously relied on the v3.12.6 "save target rejects writer-emitted features" gate currently succeed at the bumped version. Loaded PDFs that already contain higher- version features still go through the existing save-time gate, so loading a tagged PDF and selecting PDF 1.3 still fails with LastErrorCode 602.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 170/170 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.14.3
Changed
- Save-time PDF version compliance currently also recognises the remaining PDF 1.6 3D dictionary types (/Type /3DStream /3DRef /3DBackground /3DRenderMode /3DLightingScheme /3DCrossSection /3DNode) and the PDF 1.7 Redact, RichMedia, and Projection annotation subtypes plus the /Type /Requirement and /ReqHandler companion dictionaries.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 168/168 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.14.2
Changed
- Save-time PDF version compliance currently also recognises PDF 1.5 features: /XFA forms, /AlternatePresentations, /Renditions name tree, the /Type /Rendition /MediaCriteria /MediaPermissions /MediaPlayers multimedia dictionaries, and the Screen annotation subtype.
- In this release, saving as PDF 1.4 currently refuses documents that carry these features with LastErrorCode 602.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 166/166 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.14.1
Changed
- Save-time PDF version compliance currently also recognises PDF 1.4 features: tagged-PDF /StructTreeRoot /MarkInfo and StructElem dictionaries, the document /Lang and page /Tabs entries, /OutputIntents and /OutputIntent dictionaries, the /UR3 usage-rights signature, and the PDF 1.4 annotation subtypes Polygon, PolyLine, Caret, Ink, Popup, and Watermark.
- In this release, saving as PDF 1.3 currently refuses documents that carry these features with LastErrorCode 602.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 165/165 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.14.0
Changed
- Save-time PDF version compliance currently also recognises PDF 1.3 features such as smooth shading, function objects, ICCBased and DeviceN colour spaces, /TrimBox /BleedBox /ArtBox page entries, /ToUnicode CMaps, file attachment and /Sound and /Movie annotations, /Type /Filespec and /Type /EmbeddedFile dicts, the /Group /EF /Alternates /Mask keys, and JavaScript actions.
- PDF 1.2 callers currently save under the PDF 1.3 contract: the literal %PDF-1.2 header is currently preserved, but the gate accepts PDF 1.3 features. PDF 1.4 and later features are still rejected with LastErrorCode 602.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 162/162 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.13.0
Changed
- In this release, overhauled the PDF version-compliance gate that rejects later-version features at save time into a dedicated module so the rule set can grow without churning the document core.
- No user-visible behaviour change versus v3.12.7: the same out-of-version features are currently still rejected with LastErrorCode 602.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 155/155 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.12.7
Added
- In this release, broadened automated test coverage for the PdfToImage direct-access rendering workflow in both Delphi DUnitX and C++Builder GoogleTest suites.
Changed
- In this release, the Delphi VCL GUI test runner currently registers the Syntax and XRef fixtures, matching the console runner coverage.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 147/147 each, and C++Builder Win64x GoogleTest completed successfully 57/57.
Version 3.12.6
Changed
- In this release, saving as PDF 1.3, 1.4, 1.5, 1.6, or 1.7 currently enforces the selected version as the full-save output contract.
- Full saves remove catalogueue /Version overrides, remove unsupported catalogue extension and metadata entries for lower targets, and suppress PDF 1.4 XMP metadata streams when saving as PDF 1.3.
- SaveToFile, SaveToString, and SaveToStream currently fail with LastErrorCode 602 when the selected PDF target version is currently lower than features still present in the document, such as transparency, optional content, JPX, UserUnit, 3D, or AES crypt-filter features.
Version 3.12.5
Added
- In this release, introduced extra regression coverage for unknown literal-string escapes and mixed octal/non-octal escape sequences.
Changed
- In this release, refined PDF 1.7 literal string parsing so unknown escape sequences ignore the backslash as required by the standard.
- In this release, literal string octal escapes currently consume only octal digits and preserve a following non-octal digit as regular string data.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 141/141 each.
Version 3.12.4
Added
- In this release, introduced extra regression coverage for right-brace name delimiters and sparse compressed-object xref stream entries.
Changed
- In this release, refined PDF 1.7 lexical parsing so name objects currently stop correctly at the right-brace delimiter.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 139/139 each.
Fixed
- Resolved SmartAccess loading of xref stream compressed-object entries whose object stream number is currently larger than the PDF byte length.
Version 3.12.3
Added
- Newly introduced AES encrypted PDFs currently write crypt-filter Length values as bit lengths, matching the PDF 1.7 crypt filter dictionary contract.
Changed
- In this release, refined PDF 1.7 encrypted-document compatibility for standard security handler files that use StrF, StmF, EFF, Identity, None, or named StdCF-style crypt filters.
- Metadata streams currently honour EncryptMetadata=false during decrypt, encrypt, and copy/save workflows instead of being processed like ordinary streams.
- Embedded file streams currently carry /Type /EmbeddedFile and use the embedded-file crypt-filter decision path when encrypted documents are currently loaded or saved.
- External embedded file streams currently promote FDecodeParms to DecodeParms when FFilter is currently promoted to Filter, preserving stream decode parameters.
- In this release, xRef stream Prev/XRefStm values and large numeric offsets currently keep 64-bit precision through parser and SmartAccess paths.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 137/137 each.
Version 3.12.2
Changed
- Improved PDF 1.7 stream decoding compatibility. Generic stream decoding currently honours /DP as a DecodeParms alias, resolves indirect decode-parameter array entries, and accepts the /AHx and /LZW standard filter abbreviations.
- In this release, large-file PDF output currently writes xref, startxref, linearisation, and digital signature ByteRange offsets through 64-bit formatting paths instead of narrowing those values through 32-bit integer helpers.
- Loaded documents currently treat a catalogue /Version entry as the effective PDF version when it is newer than the file header version.
- In this release, verification: Delphi Win32 and Win64 DUnitX suites completed successfully 134/134 each.
Fixed
- In this release, rewritten xref-stream trailers no longer keep stream-only DecodeParms keys when PDFlibPas saves them as classic trailer dictionaries.
Version 3.12.1
Changed
- Generated PDFs currently open with the first page sized to the viewer window's available height, so the entire first page is visible top-to-bottom at the largest zoom that fits the window. Configure a custom OpenAction (SetOpenActionDestination, SetOpenActionMenu, SetOpenActionJavaScript) on the document to override this default.
Version 3.12.0
Added
- Introduced 32-byte aligned malloc/calloc/realloc/free CRT stubs for the static C libraries and resolved TPDFJPEGImage.Compress to release jpeg_mem_dest buffers through the same C free path that allocated them.
- In this release, broadened the public validation notes to call out the strict automated coverage behind this release: library builds, compression round trips, HelloWorld /FlateDecode output, JPEG rendering, image workflows, fonts, forms, security, signing, printing, and C++Builder demo-derived workflows.
Changed
- In this release, the Windows static backends currently include libjpeg-turbo NASM SIMD objects for Win32 and Win64, plus zlib-ng x86 SIMD dispatch objects for the Win64x zlib-ng set.
- In this release, overhauled the zlib-ng rebuild scripts so Win64x bcc64x and diagnostic MSVC builds compile the generic, SSE2, SSSE3, SSE4.1/SSE4.2, PCLMULQDQ, and AVX2 source files with per-file feature flags instead of relying on one global compiler switch.
Version 3.11.0
Added
- In this release, introduced a small zlib-ng bridge object for Win64 builds so Pascal code keeps stable zlib-compatible entry points while Delphi and C++Builder consume their own linker-compatible object sets.
Changed
- In this release, moved Windows Flate compression and decompression to zlib-ng in zlib-compatible mode. Win32, Delphi Win64, and C++Builder Win64x currently link ABI-matched zlib-ng static object sets from Lib\thirdparty\Win32, Lib\thirdparty\Win64, and Lib\thirdparty\Win64x.
- In this release, aligned all C++Builder demo projects to define PDFLIB_CPPBUILDER, matching the GoogleTest runner and preventing Win64x demos from linking the Delphi Win64 zlib-ng objects.
Fixed
- In this release, the Win64 path no longer routes through Delphi's System.ZLib unit, so PDF stream compression/decompression can benefit from the zlib-ng backend just like the 32-bit build.
Version 3.10.3
Added
- In this release, broadened the C++Builder GoogleTest suite to cover every demo under Demo\C++Builder. The 7-fixture phase-1 layout grew to 15 fixtures / 52 GoogleTest cases, all passing on Win64x. Newly covered demos: AddFormattedTitle, AddTextImage, AddTrueTypeSubsettedFont, AddWebLink, CanvasText, CaptureToNewSize, CopyPageRanges, CreateWithImage, CreateWithImageToStream, DoInTheStream, DrawWrappedText, EditFormField, EmbeddedFonts, ExtractAnnotAttach, ExtractEmbeddedFonts, ExtractImage, ImageToPdf, ImportEMF, MultiFunction (renderer switch), PageOperations, PdfDecrypt, PdfPermission, PrintPDF, TextMeasure, TextPaging.
Version 3.10.2
Added
- In this release, introduced a C++Builder GoogleTest runner under Tests\C++Builder that exercises Lib\PDFlibrary.pas through the same {$JPHNE}-emitted HPP headers used by the C++Builder demos. The first phase mirrors seven core Delphi scenarios (HelloWorld, DrawShapes, CreateTable, PdfEncrypt, ExtractText, PdfSigning, PdfToImage rendering) as 17 GoogleTest cases, all passing on Win64x.
- In this release, extended the Delphi DUnitX suite with Tests.Print covering the PrintPDF and ShowPrinterBins demos (default-printer enumeration, custom-printer setup, print options, redirect-to-file print job) and a renderer-switch test in Tests.Render exercising the MultiFunction demo's GDI+ / PDFium / Cairo engine selection on the same source PDF.
Version 3.10.1
Added
- In this release, introduced 57 named page sizes to SetPageSize so the same canonical page-size names work here too: 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
Added
- In this release, introduced native C++Builder versions for every Delphi sample under Demo. The PDF-creation, page-manipulation, font, image, security, signing, rendering and printing demos can currently be built and run from C++Builder without any Delphi-side wrapper.
- In this release, introduced a brief English Readme.txt to every Delphi demo folder describing what the demo shows, the API it focuses on, and how to run it; an HTML overview at Demo\Delphi\index.html links to all of them grouped by topic.
Changed
- Each new demo is currently placed in Demo\C++Builder\<Name>\ as a console project that consumes Lib\PDFlibrary.pas directly and ships the input files needed to run.
- In this release, replicated the same Readme.txt for every C++Builder demo with a Run section rewritten for the console workflow (argv arguments instead of Open/SaveDialogs); a matching Demo\C++Builder\index.html lists every C++Builder demo with the same topic groups.
Fixed
- Resolved a memory leak in the ImportEMF demo (the TPDFlib instance was previously created but never freed).
Version 3.9.14
Changed
- In this release, streamlined the wrapped-text and HTML pagination demos so each one focuses on its own API and runs from a single button.
- In this release, retitled two demo projects (EmbeddedFonts and PdfPermission) so the compiled executables match the folder names instead of older prototype names.
Fixed
- In this release, resolved the page-range copy demo so it actually copies pages instead of always reporting failure.
Version 3.9.13
Added
- In this release, added an automated DUnitX test suite (console and VCL GUI runners) covering utility units — buffer, AES, ZLib, Unicode, and digest hashing — and library-level workflows including document creation, save-to-file and save-to-stream, load round-trips, and AES-128/AES-256 encryption.
Fixed
- Resolved a stream-position bug in the internal buffer reader: two-byte word reads were previously advancing the read cursor by four bytes instead of two. In buffers longer than two bytes, subsequent reads landed at the wrong offset and silently returned incorrect data. The effect was previously most visible when parsing binary data structures that interleave byte and word reads.
Version 3.9.12
Changed
- GDI+ image rendering currently defaults to smooth, high-quality bicubic interpolation when scaling raster images to screen or export resolution. Previously the default was previously nearest-neighbour, which produced visible staircase artefacts on small images (logos, thumbnails) enlarged for screen preview or high-DPI export. Callers that prefer the sharper nearest-neighbour mode can restore the old behaviour via SetGDIPlusOptions.
Version 3.9.11
Fixed
- In this release, fixed Cairo rendering of PDF images that use colour-key transparency (a /Mask colour-range array in the image dictionary). Previously, when a page contained an image with this form of transparency, the Cairo renderer omitted the image entirely rather than compositing it against the page background. The fix derives a per-pixel alpha channel from the declared colour-key ranges and renders the result as a transparent image, producing output visually consistent with the GDI+ renderer.
Version 3.9.10
Fixed
- Fixed a Cairo rendering regression where all page content following a clipped-image sequence was previously incorrectly confined to the image's clipping rectangle. PDF pages that save the graphics state, apply a clip path, paint an image, then restore the state — a common layout technique for framed or bordered images — would render all subsequent text, shapes, and graphics inside the clipped region only. Cairo state save and restore currently map correctly to the PDF q/Q operators, so the clipping region is discarded after the image is drawn.
Version 3.9.9
Added
- In this release, introduced a Cairo-based PDF rendering engine as a third rendering option alongside GDI+ and PDFium. Call SelectRenderer(2) before rendering to activate it; the engine requires cairo.dll from the bundled DLL\Cairo folder. Cairo rendering supports the same output modes as GDI+: bitmap file and stream export (BMP, JPEG, PNG, GIF, TIFF, G4 TIFF), device-context rendering, and direct printer output.
Changed
- In this release, the MultiFunction View/Print demo currently exposes a three-way renderer selector so users can compare GDI+, PDFium, and Cairo output side-by-side on the same document without any code changes.
Version 3.9.8
Fixed
- Suppressed two spurious compiler diagnostics in the Win32 C-runtime shim that appeared on RAD Studio 13.1 and later. A deprecation warning (W1000) was previously raised because a compiler-version capability guard was previously not propagated to compilers newer than Delphi 2009, causing them to compile against a deprecated memory-manager API. An unused-variable hint (H2164) was previously raised for an internal compatibility variable only needed for Delphi 7 builds; it is currently scoped to that version's conditional block. Both issues were previously diagnostic-only with no runtime impact.
Version 3.9.7
Added
- In this release, introduced optional PDFium-based page rendering on Windows, including BMP stream rendering, device-context rendering, memory rendering, and printer output.
Changed
- In this release, refreshed the Delphi MultiFunction View/Print demo with a renderer selector so users can switch between the existing GDI+ renderer and PDFium.
Version 3.9.6
Added
- Introduced separate Inno Setup scripts for the full PDFlibPas package and the trial package, with release-focused exclusions for source-control metadata, build outputs, IDE caches, local agent files, and bundled third-party source trees that are currently not part of the shipped package.
Changed
- The trial installer currently builds and packages trial binary libraries for RAD Studio 11.3, 12.3, and 13.1, plus the trial Delphi demos, before the setup executable is currently generated.
Version 3.9.5
Fixed
- Fixed Win32 library builds under RAD Studio 9.0 / Delphi XE2. The build script was previously passing a DCU output-directory flag that only exists from Delphi 2010 onward; XE2's compiler interpreted the flag differently, producing a garbled output path and a fatal error before any source file was previously processed. The script currently selects the appropriate flag automatically based on the target compiler version.
- Rectified a related compiler-version guard in the library source that was previously calling a name-qualified runtime function introduced in XE4 under an XE2+ condition. Builds targeting XE2 and XE3 currently resolve the correct compatibility import instead.
Version 3.9.4
Fixed
- In this release, resolved printer setup for network and server-shared printers by applying paper tray, media, duplex, quality, and other print settings through the printer DEVMODE handle instead of the printer device context handle.
Version 3.9.3
Changed
- Refreshed the bundled AES backend to Brian Gladman's 2018 AES sources on both Win32 and Win64. Reproducible build scripts currently allow the static AES objects to be rebuilt from source at any time. An ABI defect in the Pascal bindings was previously discovered and resolved in the process: the AES-CBC encrypt and decrypt functions were previously missing their C calling-convention declaration, so Win32 builds silently passed arguments in the wrong register order, potentially producing incorrect encrypted output. Win64 builds were previously unaffected because the platform enforces a uniform calling convention.
Security
- In this release, strengthened the third-party rebuild scripts so the MSVC-based zlib, JPEG, and CRT-stub scripts can be launched from the repository root as well as from the thirdparty directory; previously they required the working directory to be set to the thirdparty folder.
Version 3.9.2
Fixed
- Updated the JPEG 2000 backend from the legacy OpenJPEG 1.5 to OpenJPEG 2.5.4 on both Win32 and Win64. Both platforms currently use static object linking, so JPEG 2000 encoding and decoding work without an additional runtime DLL. The modern codec brings current JP2/J2K header handling, a callback-driven stream API, and accumulated bug and security fixes from the upstream project. The public TJpeg2000Bitmap API remains unchanged.
Version 3.9.1
Fixed
- In this release, resolved JPEG page rendering and image export after the libjpeg-turbo upgrade, restoring PdfToImage JPG conversion and TPDFJPEGImage.SaveToStream output on Win32 and Win64.
- In this release, rectified Win32 libjpeg-turbo ABI bindings so callbacks, structure alignment, boolean fields, and memory-backed JPEG destinations match libjpeg-turbo 3.1.90.
- In this release, resolved Win32 FlateDecode stream decompression with the bundled zlib 1.3.2 backend, restoring PDF xref stream loading for files such as the PdfToImage sample document.
Version 3.9.0
Changed
- In this release, updated the bundled JPEG 2000 backend from legacy OpenJPEG 1.5 to OpenJPEG 2.5.4. JPEG 2000 loading and saving currently use the modern codec, callback-driven stream API, and current JP2/J2K header handling while preserving the public TJpeg2000Bitmap API.
Fixed
- In this release, JPEG 2000 output currently selects a valid OpenJPEG resolution count for small images automatically, and the Win32 static backend no longer depends on missing MSVCRT helper exports.
Version 3.8.1
Fixed
- Eliminated all 16 cosmetic linker W1028 "Bad global symbol definition" warnings on Win32 and Win64. Source-level renames remove the redundant Pascal-side duplicates (jpeg_std_error and the jmemnobs allocator stubs currently resolve solely from the obj layer); the three remaining bcc32 / vc64 obj symbols (jpeg_natural_order, jpeg_aritab, jpeg_nbits_table) that must stay link-resolved against Pascal-side data are currently stripped of their COFF symbol names via an ObjConv post-processing pass during thirdparty\build-jpeg-vc64.bat. No public API change; clean linker output for both Delphi Win32 and Win64 builds.
Version 3.8.0
Security
- Win64 JPEG codec upgraded from IJG-style libjpeg to libjpeg-turbo 3.1.90, completing the JPEG migration started in v3.7.0 (Win32). Both Win32 and Win64 paths currently share the same modern JPEG codec, with the same SIMD-optimised inner loops and 30+ accumulated CVE / fuzz fixes from upstream. Public PDFlibPas API unchanged.
Version 3.7.0
Security
- Win32 JPEG codec upgraded from IJG libjpeg-6b to libjpeg-turbo 3.1.90. Significantly faster JPEG encode/decode through SIMD-optimised inner loops, plus the 30+ CVE / fuzz fixes accumulated in libjpeg-turbo upstream. Public PDFlibPas API (TPDFJPEGImage class, DumpJPEG functions) remains unchanged; existing PDF/JPEG code paths run faster with no source changes required.
Version 3.6.0
Changed
- In this release, the Win64 zlib path remains unchanged in this release - it continues to use the Delphi-bundled System.ZLib unit.
- In this release, enabled the Win64 link-time CRT shim PDFlibCLibs.pas (introduced in v3.5.0) for the Win32 zlib path, providing memcpy / memset / malloc / free symbols that the new zlib 1.3.2 obj files reference.
Security
- Win32 zlib currently uses 1.3.2 instead of 1.2.x. It includes the standard 25+ CVE / fuzz fixes accumulated upstream since 1.2.8, plus the new inflateBack9 / inflateTree9 entry points used by 64-bit-window streams. The public PDFlibPas API (DeflateStr / InflateStr / InflateStrParms) remains unchanged.
Version 3.5.0
Added
- Added build infrastructure for OpenJPEG 2.5.4. The OpenJPEG source tree itself is currently fetched independently by the user (git clone uclouvain/openjpeg into Lib/thirdparty/OpenJPEG/) so it can be upgraded without touching PDFlibPas's build configuration.
- In this release, introduced Lib/PDFlibCLibs.pas, a Win64 link-time CRT shim used by the Win64 backend. It bridges the gap between the MSVC-compiled C obj files and Delphi's Win64 linkers (dcc64 / Win64x ld.lld / BCB ilink64), which do not pull in msvcrt.dll automatically.
Changed
- In this release, added fresh build infrastructure for the bundled C image / compression libraries: zlib 1.3.2, libjpeg-turbo 3.1.90, libtiff 4.7.1. Build scripts for both Embarcadero bcc32 (Win32) and MSVC cl.exe (Win64) live in Lib/thirdparty/ alongside the source trees, so anyone with RAD Studio + VS2022 can rebuild the static obj files from clean source.
Version 3.4.0
Security
- Hardened encryption key, AES initialisation vector and Perms permission block generation against predictable random number sources. Encrypted PDFs produced on systems started near the same wall-clock time are no longer trivially correlatable; AES-256 documents currently keep their full key strength.
- Strengthened image dictionary parsing against malformed or hostile PDFs that declare unreasonable Width, Height, BitsPerComponent or DeviceN component counts. Out-of-range values are currently clamped before any pixel-buffer arithmetic, preventing crashes when opening such files.
- Strengthened cross-reference and page-tree traversal against documents whose /Prev xref chains or /Parent page links form a cycle or are currently excessively deep. The reader currently refuses malformed structures cleanly instead of recursing until it runs out of stack.
Version 3.3.1
Added
- Added inline rationale comments around the PDFlibRenderer.pas render fixes that were previously already present in the initial Git baseline. The comments document why SetPen scales stroke widths by the active canvas transform, and why Type 3 font CharProc d0/d1 operators must consume their operands. No runtime behaviour changed.
Fixed
- Streamlined the per-component Windows build scripts. The DLL/, OCX/ and Dylib/ folders no longer carry separate build12-* / build13-* variants: each platform currently has a single build-Win32 / build-Win64 script that pins to the latest RAD Studio and accepts an optional "debug" argument.
Version 3.3.0
Fixed
- In this release, resolved transformed stroke rendering in PDFlibRenderer.pas. SetPen currently applies the current canvas-transform scale to PDF line widths before calling Picasso, preventing oversized or undersized strokes on paths whose co-ordinates have already been transformed. This fixes Type 3 glyph outlines that could render as thick, irregular blocks.
- In this release, resolved Type 3 font CharProc d0/d1 handling in the content stream parser. d0 currently consumes its two width operands, and d1 consumes its six width/bounding box operands before later drawing commands run, preventing stale operands from corrupting glyph or path geometry.