PDF Library for Delphi Release Notes
Release history
Version history for PDF Library for Delphi user-visible features, fixes, PDF enhancements, compatibility changes, and documentation changes
Last release
- Latest version: v3.552.2; Release date: 2026-10-10
Version 3.552.2
Fixed
- Restored older Delphi compiler compatibility for invoice validation and OCR providers, including Win32 and Win64 trial library builds
Version 3.552.1
Fixed
- macOS dynamic-library buffers now expose their actual data, preserve embedded zero bytes and report successful releases correctly
- Dynamic-library instance handles remain valid on 64-bit targets without truncating object addresses or reusing released handles
- Library unloading releases outstanding instances and buffers
Version 3.552.0
Added
- Native Free Pascal headless PDF generation, loading, text workflows and Cairo bitmap rendering on Linux x86_64 and macOS arm64, with system fonts and native PNG, JPEG and JPEG 2000 providers
- Native OpenSSL encryption, digests, PKCS12 signing and CMS verification, with explicit certificate trust anchors and checked verification times
- Built-in libcurl HTTP range access and RFC 3161 time-stamp workflows on native Free Pascal targets, including signature time-stamp attributes and document time-stamp verification
- Native XMP metadata parsing and writing preserve namespace-based properties and reject DTDs and oversized or deeply nested XML before DOM construction
Fixed
- Native banded bitmap rendering initializes the page transform and preserves Cairo antialiasing at band boundaries
- Shared time-stamp, validation and tagging declarations no longer require an optional PDFium build
Version 3.551.0
Added
- Exact Unicode content replacement preserves surrounding characters, existing TJ spacing and following text anchors, supports deletion and verified replacement fonts, and reports unsupported mappings before replacing selected page text
- Structured extraction follows tagged reading order, resolves semantic roles and namespaces, detects columns and page furniture, and retains empty, merged and cross-page table cells in JSON, CSV, Markdown and DOCX exports
- Optional Tesseract OCR adapters support hOCR and TSV results, orientation confidence and baselines, with explicit limits and per-stage diagnostics
- OCR text layers can skip existing text or replace only layers previously owned by the library, preserving page pixels and shared content
- New Delphi, DLL and ActiveX controls expose structured analysis options, OCR configuration and exact-replacement diagnostics
Changed
- Structured JSON uses schema version 2 with stable semantic node identifiers, reading-order sources, table spans and inference confidence
- Unicode replacement rejects incomplete mappings, partial glyph clusters and unsupported sources without guessing font bytes
Fixed
- TJ numeric spacing now applies horizontal scaling once in rendering and text geometry
- Font measurement reselects the actual resource when collections are shared and reuses direct-font analysis within each resource scope
- Content fingerprints preserve their hash values with range and overflow checks enabled
Version 3.550.0
Changed
- SVG export now preserves page paint order, nested Form content, exact clipping paths and transformed stroke geometry
Added
- Bounded native raster fallback handles unsupported paint operations when the export settings permit a backdrop snapshot
- GetLastSVGExportDiagnostics reports omitted pixels, approximations and raster fallback, including visible annotation appearances outside the page-content export
Version 3.549.0
Added
- Versioned invoice XML schema and Schematron validation accepts optional providers and returns stage completion, rule identifiers, field paths, severity, and engine diagnostics
- Embedded invoice business validation reads the selected attachment with bounded decoding and rejects missing or ambiguous filenames
- Delphi, DLL, and ActiveX can run xmllint and SaxonJ validation with explicit rule files, time limits, and output limits
Version 3.548.0
Added
- PDF/UA-2 reader checks validate identification, PDF version, namespace references, role mappings, document roots, and structure parents through explicit or automatic profile selection
- Delphi, DLL, and ActiveX APIs select a PDF/UA target within a reusable validation pipeline and expose checked, unverified, and bounded validation coverage
Changed
- Validation and preflight reports identify PDF/UA-2 independently from PDF/UA-1 and disclose that passing implemented checks does not provide full accessibility certification
Version 3.547.0
Added
- Rendered-page visual comparison with channel tolerance, ignored regions, changed areas, pixel counts, difference masks, and overlays
- Document visual comparison aligns identical page images around inserted and removed pages and reports changed or resized page pairs
- File visual comparison through Delphi, DLL, and ActiveX returns a structured JSON report
Version 3.546.0
Added
- Arlington validation coverage reports distinguish complete passes, known failures, incomplete rule support, and operation errors through Delphi, DLL, and ActiveX APIs
Fixed
- Unsupported model expressions now produce explicit diagnostics instead of silently contributing to a successful validation result
Version 3.545.0
Added
- The C# and VB.NET DLL WorkflowWorkbench examples demonstrate multipage report generation, text extraction, page splitting and merging, binary memory transfers, and explicit native resource ownership
- DocumentInspectionWorkbench now provides page inventories and configurable diagnostic severity gates across Delphi, C++Builder, and Lazarus, with generated inputs for a self-contained first run
Changed
- The C++ DLL LinkDemo now creates a complete navigation document with page links and outlines, accepts explicit DLL and output paths, verifies the saved document, and reports failures through process exit codes
- WorkflowGallery verifies its saved document and HTTP response body through round-trip checks and publishes a verification report
- The DocumentLab quick tour includes document inspection, and the native portfolios and package introduction link to a dedicated DLL workflow catalog
Fixed
- Delphi document inspection initializes per-file counters before analysis, including reports for inputs that cannot be loaded; Delphi and C++Builder write locale-independent JSON numbers
- The C++ DLL diagnostic example releases native instances before unloading the library, including its success path
Version 3.544.0
Added
- Nine native domain labs provide scenario selection, guided quick tours, per-scenario logs, and offline HTML experiences that open automatically when the lab is started without arguments
Changed
- The Delphi, C++Builder, and Lazarus example portfolios now focus on Showcase, HelloWorld, and nine labs, with Delphi retaining its interactive Reader
- Specialist demonstrations and focused tutorials are integrated as local scenario modules inside each lab, preserving their original operations without separate example projects or a common demo source directory
- Lab tours execute their own scenarios with isolated output folders and timeouts, so they no longer depend on separately built sibling example executables
- Scenario notes are linked from the domain guides, and optional Delphi report framework integrations are grouped under ContentLab
- Lazarus scan codec matrices identify encoding paths that cannot complete the generated fixture as skipped, and only publish JBIG2 measurements when the requested external encoder is available
Fixed
- Redaction scenarios now generate PDF 1.7 documents so content removal passes the required version checks
- Page-capture scenarios preserve a temporary document page while capturing the last content page, avoiding failed captures of single-page documents
- The C++Builder barcode gallery now accepts successful nonzero document and page handles instead of rejecting handles whose value is greater than one
- The Lazarus navigation scenario now reports failed PDF writes before publishing success reports, including its companion remote-target document
Version 3.543.0
Changed
- The native demo portfolio now foregrounds flagship tours and feature workbenches, with focused API tutorials collected in each platform's Miscellaneous folder
Removed
- Removed the C++Builder Reader metadata adaptation and prerequisites-only ReportBridges executable, the duplicate Lazarus TextExtract example, and the redundant Delphi AddWebLinkConsole entry; use the actual viewer, report bridge, inspection, extraction, and AddWebLink examples instead
Fixed
- The C++Builder LoggerDemo now closes its log writer before reading the completed session log and prints it as UTF-8, avoiding file-sharing errors and long-log console crashes after PDF creation
Version 3.542.0
Changed
- Showcase and AdvancedWorkflowMatrix now contain their implementation units in each Delphi, C++Builder, and Lazarus example folder, so copying a project no longer requires a common demo-unit directory
- The Showcase source guide points to its local builder while retaining the nine-page document, editable forms, switchable layers, and offline exports
Fixed
- The C++Builder workflow suite writes the complete workflow list and console report before exiting
Version 3.541.0
Added
- The nine-page Showcase includes an editable project brief and a layered floor plan, with saved form values and optional design notes
- C++Builder now includes the same flagship Showcase as Delphi and Lazarus
- Console Showcase runs create an offline experience page with full-page PNG previews, the interactive PDF, and UTF-8 text exports
Changed
- The Delphi Showcase opens with a guided preview, direct form editing, a design-note visibility control, edited-PDF saving, and image and text export actions
- All three native Showcase entries share their document builder and offline export implementation
Fixed
- Showcase table sections, annotation samples, and barcode symbols fit their intended areas, and page labels remain readable
- The Delphi Showcase writes to a user-owned output directory and handles preview, export, and save failures explicitly
Version 3.540.0
Changed
- AdvancedWorkflowMatrix shares one workflow launcher across Delphi, C++Builder, and Lazarus, runs the specialist demos with isolated outputs, supports selection and timeouts, and records missing binaries and child failures in CSV and HTML reports
- Lazarus TextExtract and ExtractText share a single read-only extraction session, accept passwords, write UTF-8 output, and retain the minimal console entry and the extraction-mode comparison
- C# ActiveX HelloWorld is a focused create-and-save starter with a headless output option, explicit COM cleanup, and clear deployment diagnostics
Fixed
- C# Table2PDF avoids an extra blank page, uses returned font IDs, and locates the DLL for its process architecture
- The Visual Basic DLL starter includes the native binding it needs to build and handles architecture-specific DLL loading
- The C++Builder report-engine guide reports missing integration and no longer presents a placeholder PDF as a real bridge result
- C++Builder Reader fails explicitly for an unreadable supplied PDF rather than substituting its generated sample
Version 3.539.53
Fixed
- The TextPaging demo stops with an error when required fonts cannot be loaded or its page limit leaves text unrendered, preventing a partial PDF from being saved and opened as a successful result
Version 3.539.52
Fixed
- The ActionNavigationMatrix console demo checks main and companion PDF writes and FDF export before reporting success, and stops with a nonzero exit code when an output operation fails
Version 3.539.51
Fixed
- Name-tree and number-tree lookups ignore reversed limits instead of hiding valid child entries in malformed PDFs
Version 3.539.50
Fixed
- Integer sorting handles the full signed range without overflowing its comparison
- Empty sorted integer and file-position lists return zero for successor queries; sparse integer membership avoids allocating every intervening range while retaining insertion order and duplicate entries
Version 3.539.49
Fixed
- PNG import rejects truncated chunks, malformed headers and palettes, unsupported interlace values, and missing or malformed end chunks before treating the image as usable
- Reloading a PNG clears previous image data and metadata while retaining reader options; metadata-only reads skip image payloads without allocating their buffers
Version 3.539.48
Fixed
- File streams honor the requested length when resized, and long file names expand to complete absolute paths
- Stream insertion preserves 64-bit lengths and cursors, rejects insertion points outside the stream before modifying data, and reports incomplete reads or writes
- Page-number file names append the number before the file extension, preserving directory names and handling names without an extension
Version 3.539.47
Fixed
- HTML text rendering and continuation preserve escaped angle brackets and literal entity spellings instead of interpreting decoded text a second time
- Markdown code spans and blocks preserve ampersands and entity spellings in the generated HTML and rendered PDF; dataset exports preserve the same literal text in cell values
Version 3.539.46
Fixed
- The Delphi ExtractImage demo skips images that cannot be selected, counts successful writes, and reports incomplete extraction instead of showing an unconditional success message
- ExtractImage creates the output directory and removes only the input file extension when naming extracted images; ExtractAnnotAttach stops when loading returns any result other than success
Version 3.539.45
Fixed
- Name-tree and number-tree queries skip cyclic or repeated child nodes, continue to valid siblings, and handle deeply nested trees without overflowing the call stack
- Name-tree enumeration ignores invalid name keys, and lookup and deletion keep the full entry offset in leaves with more than 32,768 name/value pairs
Version 3.539.44
Fixed
- Page-box queries and capture ignore non-inheritable bleed, trim and art boxes on parent page-tree nodes, using the leaf page box or its effective crop box instead
HasPageBoxreports directly inherited media and crop boxes consistently with indirect arrays
Version 3.539.43
Fixed
- EMF vector import starts with the default black pen and white brush, so drawing records without an explicit object selection remain visible
- 32-bit and 16-bit polylines preserve independent figures inside path brackets, and 16-bit multi-polylines defer painting until the path is drawn and honor a null pen
Version 3.539.42
Fixed
- CapturePageEx with the bleed, trim or art box option on a page that does not define that box now captures the crop box, as documented, instead of the whole media box; the box filled in on the page follows the same ISO 32000-1 default
Version 3.539.41
Fixed
- EMF import draws 32-bit PolyBezier records from their first point instead of using it as a control point, so the curves match the 16-bit records
- EMF Polyline records are drawn as open lines with the pen only instead of closed, filled shapes
- EMF PolylineTo records start at the current position and are no longer closed, and a record whose first two points lie on a horizontal line no longer turns off the pen for every shape drawn after it
- 32-bit EMF PolyPolyline records draw every polyline; records with more than one polyline used to be skipped and single polylines drew nothing
Version 3.539.40
Fixed
- ImportAnnotationsFromFDFString and ImportAnnotationsFromFDF return the number of annotations actually added, like the XFDF import; entries skipped because their page is outside the document or they have no /Subtype are no longer counted
Version 3.539.39
Fixed
- EMF import draws PolyDraw records completely: points that close a figure as they draw a line or a curve are no longer dropped, so closed shapes keep their last segment and the curves that follow stay in step; a 16-bit PolyDraw record with several figures keeps all of them, and a figure that does not start with a move begins at the current position
- EMF import skips Polyline, PolyBezier, Polygon, PolyDraw and 16-bit PolyPolyline and PolyPolygon records that declare more points than they contain, instead of reading past the record, which drew stray lines from the following records or could break the conversion
Version 3.539.38
Fixed
- JBIG2 halftone regions whose grid starts left of or above the region, or whose rotated grid places cells at negative coordinates, decode correctly: such cells are cropped at the region edge instead of being dropped or moved, the grid origin is no longer pulled onto the region corner, and cells lying wholly outside are skipped exactly as ITU-T T.88 specifies
Version 3.539.37
Fixed
- JBIG2 images with a halftone region that skips grid cells outside the region now decode correctly when the halftone grid is not square; the skip mask was built with rows and columns swapped, so cells that should have been skipped were decoded and the rest of the region came out garbled
Version 3.539.36
Fixed
- A page moved with MovePage gets its own copies of the page boxes, rotation and resources it inherited from its old Pages node, so calling SetPageBox or drawing text and images on the moved page no longer changes the old node and the pages that still inherit from it
- SetPageBox gives the page its own box when the existing box is an indirect object shared with other pages or with a Pages node, instead of resizing every page that refers to it
- CopyPageRanges no longer leaves the copied source pages sharing their page boxes with the Pages node or their CropBox with their MediaBox, so changing a box on a source page after the copy no longer resizes its sibling pages or both boxes at once
Version 3.539.35
Fixed
- TransformPageElement writes the scale and rotation part of the matrix it wraps around a path or image with six decimal places instead of four, so small rotations and fine scale factors are no longer visibly off on large pages; the translation keeps four decimal places
Version 3.539.34
Changed
- Page edits that rewrite a content layer, including ScalePage, TransformPageElement, DeletePageElement, RedactRegion, ConvertTextToPaths and programs from ParsePageContentLayer written back with WritePageContentLayer, keep the original text of every numeric operand they do not change instead of rounding the whole layer to four decimal places
- TPDFContentProgram has a new CanonicalNumbers property; set it before parsing to rewrite every number in canonical form as NormalizeContentStreams does
Fixed
- A non-zero number smaller than the output precision, such as a 0.00001 scale factor, is written with its significant digits instead of 0, so content normalization, the save-time content optimizer and new PDF objects no longer turn a tiny transformation into a singular matrix that hides the content
Version 3.539.33
Fixed
- RecolorPage and RecolorDocument no longer fail with a conversion error on comma-decimal systems when a page sets a colour with a decimal value such as
0.5 g - DrawSVG, DrawSVGFromFile, GetSVGWidth and GetSVGHeight read decimal SVG lengths such as
width="100.5"on comma-decimal systems instead of falling back to defaults, and ExportPageSVG keeps decimal fill and stroke colours - RenderPageRegionToFile and RenderPageToDCClip accept decimal clip rectangles such as
10.5,20.5,50.5,40.5on every locale; a malformed clip string now fails or renders unclipped instead of raising, and extra values no longer overrun the rectangle - AddPolygonAnnotation, AddPolyLineAnnotation and AddInkAnnotation read decimal vertex coordinates on every locale and reject a malformed coordinate list
- SetOutputIntentMixingHints accepts solidity values such as
0.95on comma-decimal systems, and CheckDocumentPolicy compares decimal feature values such asDocument.Version >= 1.3numerically
Version 3.539.32
Fixed
- AddTagAttribute writes dot-decimal values such as
0.5or2.5 3.5as PDF numbers on comma-decimal systems instead of turning them into PDF names; values written with the system decimal separator are still accepted - SetStructElemBBox, SetStructElemSpaceBefore, SetStructElemSpaceAfter, SetStructElemStartIndent, SetStructElemEndIndent and SetStructElemColor format their numbers independently of the system locale and never in exponent form
- PDF/VCR placeholders created with BeginPDFVCRPlaceholder pass the pre-save GTS_BBox validation on comma-decimal systems
Version 3.539.31
Fixed
- GetSimilarImageDeduplicationReportJSON writes maxAcceptedMeanError as a valid JSON number on comma-decimal systems instead of
0,333333333333333 - GetObjectJSON and ExportObjectJSON write PDF numbers such as
-.25,+3or007.5in JSON number syntax, so the output is valid JSON and SetObjectJSON and ImportObjectJSON accept it back - JSON reports write
nullfor a value that is NaN or infinite instead of+InforNAN, or failing with a floating-point exception: GetDocumentJSON for overflowing PDF numbers, GetAnnotationHitsJSON for non-finite coordinates, and the barcode, deskew, structured text and PDF/VCR reports - Number formatting for PDF content, SVG, HTML and CSV output writes 0 for NaN instead of raising an invalid floating-point operation
Version 3.539.30
Fixed
- ImportAnnotationsFromFDF and ImportAnnotationsFromFDFString create the imported annotations again; previously every entry was counted but none was added because the /Subtype value was never read
- FDF annotation import reads /Rect, /Page, /Contents, /T and /Subj in any key order, keeps each lookup inside its own annotation entry, and parses numbers independently of the system locale, including comma decimals written by earlier versions
- ExportAnnotationsToFDF and ExportAnnotationsToFDFString write each annotation's own /Rect in PDF user space, so an exported file re-imports to the same position instead of shifting the annotation
Version 3.539.29
Fixed
- ExportAnnotationsToXFDF and ExportAnnotationsToXFDFString write rect, opacity, width and dashes values with a dot decimal separator on every system locale, as XFDF requires
- ImportAnnotationsFromXFDF and ImportAnnotationsFromXFDFString read standard dot-decimal XFDF on comma-decimal systems instead of failing with a conversion error, and a malformed number now skips that value instead of aborting the import
- XFDF files written by earlier versions on comma-decimal systems, such as
rect="50,500 80,250 70,750 100,125"oropacity="0,600", import with their intended values
Version 3.539.28
Fixed
- The content stream optimizer no longer removes a
1 0 0 1 0 0 Tmthat resets the text position after Td, TD, T*, an earlier Tm or shown text, which moved the following glyphs when content streams were optimized on save; an identity Tm directly after BT, or one that repeats an earlier identity Tm, is still removed
Version 3.539.27
Fixed
- MovePage, and CollateDocumentsEx when it reorders pages, keep the MediaBox, CropBox and Rotate a page inherited from its parent Pages node, so a page moved under a different parent no longer changes size, crop or orientation; previously only /Resources was carried over
- BalancePageTree keeps an inherited /Resources, /MediaBox, /CropBox or /Rotate that is an indirect object as a reference to that object instead of copying it into every page
Version 3.539.26
Fixed
- Page content written by AddPageMatrix, ScalePage, DeskewPage, TransformPageElement, DeletePageElement, RedactRegion and ConvertTextToPaths always uses a dot decimal separator and plain notation, so on systems with a comma decimal locale these calls no longer produce broken operators such as
0,5 0 0 0,5 0 0 cm, and very small values are never written in exponent form - ExportAnnotationsToFDF and ExportAnnotationsToFDFString write annotation rectangles with dot decimals whatever the system locale
- RecolorPage and RecolorDocument write locale-neutral colour operands for every decimal separator, not only for the comma
- AddPageMatrix, ScalePage and RedactRegion reject NaN or infinite arguments instead of writing them into the page
Version 3.539.25
Fixed
- Form field appearance repair writes /Type and /Subtype onto the appearance stream instead of creating bogus /N appearance states, CMYK border colors no longer read past their four components, and deleting a form field no longer misreads page counts through indirect /Count values
- Checkbox style repair keeps both custom export states when no Off state exists instead of wiping them, and radio button children register their on-state with the same encoding the value setters compare against
- File attachment annotations without an /EF dictionary no longer crash, sound annotation export stops byte-swapping 8-bit audio, markup annotation opacity uses one consistent scale, and SetAnnotRect reports success again
- Annotation appearance rebuilding no longer leaves a freed stream in the structure object table when the document has no indirect-object callback
- The peephole optimizer no longer drops colour setters that a different colour operator of the same side superseded in between, and keeps collapsing plain adjacent duplicates
- Text extraction honours the " operator as word and character spacing instead of corrupting the line leading, and FindInstructionsInRect no longer reports overlapping ranges for multi-subpath paths
- EMF import: PolyDraw reads the point-type flags from the correct offset, POLYTEXTOUTW always reads UTF-16 text and no longer accumulates glyphs across strings, small text-out glyph mapping no longer replaces the whole string with one character, and gradient fills no longer divide by zero on degenerate rectangles
- EMF import clamps every file-supplied bitmap header size, region rectangle count, polygon count and gradient vertex index to the record bounds, and stops truncating record pointers to 32 bits on Win64
- JBIG2 halftone regions place patterns in the correct grid direction, skip-mask tests compare in fixed point, retained arithmetic contexts snapshot the decoder statistics instead of faulting, run-length symbol tables guard a repeat code in first position, MMR reference lines stop at the sentinel, partially off-canvas symbols are cropped rather than shifted, and malformed counts surface as decode failures instead of unrelated runtime errors
- CCITT decoding initialises changing-element lookups and handles bit requests smaller than the remaining bits without negative shifts; the CCITT encoder covers the full vertical-mode range and stops reading one byte past the row buffer
- TIFF loading bounds-checks every IFD read, keeps palette images from decoding as gray ramps, writes StripByteCounts once, and clamps requested page numbers; failed JPEG recompression no longer reports a corrupt stream as success
- Document comparison folds stream data into object fingerprints, matches duplicate objects one-to-one, sorts dictionary keys, separates array elements, and reports comparison failures instead of a false no-modifications verdict
- The parallel render name builder no longer reads past a one-character pattern
- Several more demos were repaired: file-list verdicts pair with the right file, the multi-function viewer actually retries with the entered password, four demos no longer prepend a blank first page, embedded-file and page-operation demos resolve their sample and output paths beside their inputs, and image-strategy helpers check the library results they build on
- The ActiveX control initialises the result of every variant-input method so a rejected variant no longer returns stack garbage
Version 3.539.24
Fixed
- The stamp token &T now expands the document Title instead of the Author in headers, footers and stamps
- PrinterMark annotations write the /PN mark kind as a PDF name object as required by ISO 32000-1 instead of a literal string
- Composite form-field kid index queries release their temporary child field instead of leaking it
- Rebalanced page trees inherit MediaBox, CropBox and Rotate from ancestor nodes instead of only Resources
- XMP CreateDate and ModifyDate keep a valid ISO 8601 shape when the PDF date omits its timezone, and XMP import without an x:xmpmeta wrapper no longer drops subsequent metadata updates
- PDF string octal escapes stop at digit 7, so \0689 now decodes as \06 followed by a literal 89 as the specification defines
- QDF publication reports the original write failure instead of masking it with a file-close error
- FPC builds compress and expand Flate streams larger than one chunk as a single zlib stream instead of concatenated per-chunk members that other consumers truncate
- The EditFormField demos generate their sample form on first run instead of failing to find it, and several demos now report a failed document load instead of silently saving an empty PDF
Changed
- The documentation search index lists the localized selling-points page under each language own title instead of one shared Chinese title for every locale
Version 3.539.23
Added
- Native JBIG2 decoding accepts standalone random-access file organization with known segment lengths, including custom Huffman tables and refinement images
Fixed
- Random-access input validates header order, the required end-of-file header, and total data lengths before decoding, rejecting truncated or trailing data without retaining an old bitmap
Version 3.539.22
Added
- Native JBIG2 decoding supports custom Huffman tables for symbol dictionaries and text regions, with explicit errors for malformed tables and unsupported prefix lengths
Fixed
- Huffman refinement decoding consumes the declared bitmap size and preserves partial-byte symbol pixels, preventing corrupted text in affected JBIG2 images
Version 3.539.21
Fixed
- Flate and LZW decoding honor the per-row PNG algorithm tag for predictors 10 to 14 instead of decoding every row with the algorithm named in the dictionary. Legitimate cross-reference streams compressed with Predictor 12 load again, image rows no longer decode out of place, and rows may switch algorithms within one image
Version 3.539.20
Fixed
- The first document information or standard identifier edit captures the original XMP before the editor object is initialized, so existing author, document identifier and custom properties are no longer overwritten with default metadata; document information changes also reach the XMP under Free Pascal on Windows, and XML without an xpacket wrapper is saved unchanged
Version 3.539.19
Fixed
- Saving an unmodified decimal object keeps the precision it was parsed with instead of rounding it to the default output precision, so calibrated color parameters such as CalRGB gamma and matrix no longer shift page colors on a plain save; newly created or edited numbers keep using the configured precision
Version 3.539.18
Fixed
- Updating document information replaces only the value of the target field: when creation date and modification date reference the same indirect string, refreshing the modification date no longer rewrites the creation date
Version 3.539.17
Changed
- Version detection and the save-time precheck avoid repeated managed string copies while collecting feature rules, cutting the scan overhead on large documents; feature detection, version requirements and the first incompatible-feature diagnostic behave exactly as before
Version 3.539.16
Fixed
SaveQDFToFileandConvertFileToQDFno longer write ordinary compressed Flate content streams as empty streams under Free Pascal and Lazarus; decompression from an explicit start position applies the correct one-based offset and the full input length
Version 3.539.15
Fixed
- The JBIG2 decoder reads local and global profile segments safely and obtains the first bitmap through the standard page number 1
- MMR bitmap decoding realigns its read position to the declared segment boundary after the final pixel, so a trailing EOFB or padding is no longer mistaken for the next segment header
- Custom Huffman tables, random-access organization, unknown or oversized segment lengths fail explicitly; truncated profiles and illegal segment references stop decoding,
TPLJBIG2Decoder.LastErrorreports the reason, and a failure clears the stale bitmap RepairQDFFilepublishes through a temporary file created exclusively in the target directory and replaces the target only after the temporary file is written, flushed and closed; in-place repair and overwrite output keep the old file when writing, flushing or replacing fails and report result 0 with error code 305- Publication preserves the target's existing DACL before the temporary file is written and fails explicitly when permissions cannot be preserved or the target is EFS-encrypted; an exclusively locked or unreadable input reports error code 401 instead of raising the read exception, and file publication supports Unicode and extended-length Windows paths
Version 3.539.13
Fixed
- Repairing a QDF file no longer drops stream content whose body contains whole-line
endstreamorendobjmarkers; the repair selects the last complete end-marker pair before the known object tail - Object-specific tail markers that repeat inside a stream fail the repair before the target stream is cleared, preserving the original bytes, length and position
RepairQDFFilecompletes the entire repair in memory and opens the target for writing only after success, so a rejected input can no longer truncate a file opened withfmCreate- File specification strings keep the documented
/UFfirst,/Ffallback order and give unknown/Pathkeys no name priority
Version 3.539.10
Fixed
- LZW decoding expands its code width on the decoder's own threshold instead of sharing the encoder's, so streams across all code widths and repeated dictionary resets decode correctly, verified against Pillow, libtiff and PDFium
- CMS signature parsing carries parent boundaries through ContentInfo, EXPLICIT wrapping, SignedData, sets and identity fields, so out-of-range data is no longer used for certificate counts or identity matches, while valid padding after the outer object is still accepted
- Updating page labels on a document whose PageLabels use a
/Kidsnumber tree converts the existing entries into root leaf nodes instead of adding a second, mutually exclusive/Numsentry that readers would ignore - The Lazarus MergePDF sample reads its inputs from the second command line argument, treats a single explicit input as a parameter error and no longer prints a success hint before generation fails
Version 3.539.6
Fixed
- Buffer scans stop on a zero
TStream.Readreturn instead of on a short read, and streams that return a few bytes at a time no longer skip the tail of the scanned data - OID encoding merges the first two arcs into one base-128 subidentifier, so
2.999.3encodes as06 03 88 37 03instead of silently becoming1.15.3 - Drawing a preview into a reused image stream clears the old content first, so a smaller rendering no longer keeps the tail of the previous image
CopyPageRangesreleases its document instances in afinallyblock, covering load failure, exceptions and normal completion
Version 3.539.3
Fixed
- Error code 526 no longer means two different things.
PDFLIB_ERROR_TEXT_LOCATION_INVALID,PDFLIB_ERROR_TEXT_LOCATION_STALEandPDFLIB_ERROR_TEXT_LOCATION_READ_ONLYmove to codes 535, 536 and 537, which were unassigned, so callers that branch on 526 see only the JSON export failure it was documented for; code 527 and 528 are no longer used PDFlibErrorMessagedescribes codes 101 to 104 by what actually raises them. The four codes belong to the encryption parameters, not to the parse errors the message table claimed, so an encryption-strength failure no longer reports "Invalid PDF structure"PDFlibErrorMessagereturns a real message for every code the library raises. Byte-range and HTTP open failures, net file open, the raw encryption key size, JSON export, marked-content and clip-path handle rejections, the renumbered text-location codes, the embeddable-font and PDF/VCR and PDF/E compliance codes and the duplicate-field and form-script forms had fallen back to the generic "<segment> error (NNN)" text- The
LastErrorCodereference page lists the complete code set, including the previously missing 705 duplicate-field code, and no longer shows the retired 527 and 528 entries
Version 3.539.2
Fixed
- A TIFF whose directory declares more values than the file holds is now rejected outright. The values were discarded but the count was kept, so the readers that follow took the first element of an array that had none
- A PNG whose header carries a colour type or bit depth outside the format is rejected instead of being decoded with no colour channels, which sent the row filters through an empty buffer
- A PNG resolution chunk shorter than its nine defined bytes no longer reads past the data it was given
- Two-dimensional CCITT Group 3 and Group 4 images decode on Free Pascal and Lazarus; the reference-line lookup returned an array it never created, which that compiler leaves empty
Version 3.539.1
Fixed
- The viewer disk cache now discards rendered bitmaps on every library upgrade. The version marker it compared against was maintained separately from the library version and had fallen behind, so a cache written by an older build could be reused after updating
- Free Pascal and Lazarus builds read 16-bit
BI_BITFIELDSbitmaps correctly again: the channel masks were taken from the wrong offset whenever the file used an extended info header, so colours came out scrambled - Bitmap rows are no longer misread on builds without a device backing: 1- and 4-bit rows were sized by integer division, dropping the last pixels of every row, and saving such a bitmap wrote the pixel block one byte off
- Capturing a drawing into a metafile no longer produces an empty picture when the size is not known in advance; the recorded frame is now taken from the drawing itself, as it is on the VCL
- Reading a bitmap whose declared palette size exceeds its colour depth is rejected instead of being trusted
- Printer job status queries release the spooler handle they open, so polling a print job no longer leaks one handle per call
Docs\index.htmlis the language gateway again. A documentation sync had replaced it with a copy of the Simplified Chinese reference navigation whose entry links pointed at a directory that does not exist
Changed
- The Lazarus package
PDFlibPasLaz.lpknow lists the opt-in LZW encoder, Brainpool, Ed448, ML-DSA, PDF printer and external JBIG2 encoder units together with the metafile declarations, matching the unit set the command-line build ships build-Win64-Demo-Laz.cmdforwards tobuild-Lazarus-Demo.cmd win64, so both entry points place demo executables inbin\x86_64-win64instead of the demo source directory
Version 3.539.0
Added
- Free Pascal and Lazarus now support 32-bit Windows builds alongside Win64, including PDF creation, loading, encryption and JPEG 2000 images
- The Lazarus library, trial, demo and console-test build scripts accept
win32orwin64and support Win32-hosted cross compilers, with separate output directories for each architecture
Changed
- Win32 uses the built-in Pascal JBIG2 encoder when an external encoder is requested; the statically linked external encoder remains available on Win64
- FPC builds include compression through the bundled Pascal zlib implementation and no longer load
zlib1.dllfrom the system search path
Version 3.538.0
Added
- Free Pascal and Lazarus builds can now use the external JBIG2 encoder. Add the
PDFlibJBIG2EncCunit to a project - the same unit Delphi and C++Builder use - andAddImageJBIG2FromStreamExand the other JBIG2 entry points honour the external-encoder request there exactly as they do on Delphi. The encoder is linked into the executable; no extra file has to be shipped with it. Projects that leave the unit out keep falling back to the built-in Pascal encoder and are unaffected - New Free Pascal object set under
Lib\thirdparty\Win64fand the build script that produces it
Version 3.537.0
Added
- Free Pascal and Lazarus builds convert metafiles into vector page content.
ImportEMFFromFile,ImportEMFFromStream, their Ex forms,LoadFromCanvasDCandNewPageFromCanvasDCnow produce real PDF drawing operators with embedded fonts there, as they do on Delphi, rather than reporting that the mode is unavailable. Text stays selectable and searchable, and the output is a fraction of the size of the rasterised import
Version 3.536.7
Fixed
- Printer enumeration returns real names on Free Pascal and Lazarus. Every printer came back as its first character alone, which also made printer selection, custom printer profiles and printing itself reject every installed printer
GetPrinterNamesno longer crashes on builds without the VCL: it now asks the spooler directly, likeGetLatestPrinterNamesalready did
Version 3.536.6
Fixed
- Converting a metafile into vector page content now reports failure on builds that cannot do it, instead of returning a picture whose content is empty.
ImportEMFFromFile,ImportEMFFromStream, their Ex forms andLoadFromCanvasDCall handed back a valid-looking image id there, so the page came out blank with nothing to indicate why. Importing the same metafile as an image is unaffected and carries the identical picture - Canvas capture and metafile import no longer crash when the conversion cannot run: both entry points used the resulting picture without checking that it exists
Version 3.536.5
Fixed
- Rasterised metafile import works on Free Pascal and Lazarus.
ImportEMFFromFile,ImportEMFFromStreamand their Ex forms returned nothing when asked to rasterise, andLoadFromCanvasDCcrashed in the same mode, because the drawing stream handed to the image loader was not one it could read there. The vector paths were unaffected
Version 3.536.4
Fixed
- Metafile capture on Free Pascal and Lazarus reports its physical size again, so
LoadFromCanvasDCand the other canvas capture entry points import the drawing instead of failing on a zero-sized frame - The VCL-free font object now reports a real
PixelsPerInchand copies onAssign. Both were inert, so code that took its render resolution from a font asked for a zero-sized canvas, and handing a prepared font to a canvas quietly kept the old one - Metafiles created on Free Pascal default to the enhanced format, matching every other platform; they previously saved in the legacy 16-bit layout unless the caller set the flag itself
Version 3.536.3
Fixed
- Free Pascal and Lazarus builds now import 4-, 8- and 16-bit BMP images.
AddImageFromFileandAddImageFromStreamsilently returned no image for those depths, including the 16-bitBI_BITFIELDSform that paint programs write, because the VCL-free bitmap reader only understood 1-, 24- and 32-bit input
Version 3.536.2
Fixed
- Classic GDI metafile export works on Free Pascal and Lazarus:
RenderPageToMetafileFileandRenderPageToMetafileStreamraised an access violation formfEMFandmfWMF, because the VCL-free metafile canvas was an empty stand-in with no brush, pen or font. Both formats now record into a real enhanced metafile and are written out,mfWMFwith the placeable header a .wmf file needs
Version 3.536.1
Fixed
- Free Pascal and Lazarus builds now write valid 1-, 4- and 8-bit BMP files: the bitmap stand-in that replaces the VCL one emitted no colour table at all, so palette-indexed bitmaps were rejected by every reader and drew against an all-black palette
- Bi-level image import works on Free Pascal again:
AddImageCCITTFromFile,AddImageCCITTFromStreamand the JBIG2 equivalents can now read the 1-bit bitmaps they are given, instead of failing because only 24- and 32-bit BMP input was decoded
Version 3.536.0
Added
- Free Pascal and Lazarus builds now run the parallel batch paths instead of falling back to serial loops:
RenderPagesToFilesParallel, the optimization batches behind document optimization, and parallel tile rendering all fan out across CPU cores there, matching the Delphi behaviour
Changed
- Parallel page rendering now renders its first page on the calling thread before fanning out, so the rendering engine initializes once rather than being initialized concurrently by every worker
Version 3.535.0
Added
- Free Pascal and Lazarus builds now ship the JPEG 2000 encoder:
EncodeImageToJPXStream,EncodeImageToJPXFile,AddImageJPXFromFile,AddImageJPXFromStreamandAddImageJPXFromStringproduce JPXDecode images there exactly as they do on Delphi, in both lossy and lossless modes - The non-VCL bitmap used by Free Pascal, macOS and FireMonkey builds now loads uncompressed 24-bit and 32-bit BMP streams and reports an alpha format
Fixed
- Image decoding through the Windows imaging backend no longer crashes on Free Pascal builds; streams are now handed to the backend in a form it accepts
- Assigning one bitmap to another on non-VCL builds copies the pixels instead of leaving the target bitmap empty, which silently produced blank output in image conversion paths
Version 3.534.1
Fixed
- The built-in TIFF decoder now rejects unsupported BigTIFF and tiled layouts with explicit diagnostics and bounds decoded dimensions and strip sizes before allocation
Version 3.534.0
Changed
CheckFileComplianceand PDF/UA preflight now validate embedded simple and CID font widths, complete Type 1/CharSetand CID/CIDSetdeclarations, text-bearing Form XObjects invoked outside marked content and text operands that resolve to.notdef
Version 3.533.0
Added
TPDFlibPKCS11Clientcan discover explicitly selected certificate-less ML-DSA keys, report their parameter set and sign original messages through the PKCS #11 3.2CKM_ML_DSAmechanism
Version 3.532.0
Changed
- Large streams using the common
/ASCII85Decodeand/FlateDecodefilter chain now encode and decode through a bounded-memory pipeline without materialising the intermediate representation
Version 3.531.0
Added
AddWebCaptureCommand,GetWebCaptureCommandCount,GetWebCaptureCommandandClearWebCaptureCommandscreate, enumerate and remove standard catalog/SpiderInfoWeb Capture command metadata without performing network retrieval
Version 3.530.0
Added
BPLoadCurve,BPKeyGen,BPSignFixedKandBPVerifyimplement ECDSA over the three RFC 5639 prime-field curves brainpoolP256r1, brainpoolP384r1 and brainpoolP512r1 in pure Pascal: 33-limb radix-2^16 arithmetic shared by all curve widths, bit-serial modular reduction, Jacobian doubling and addition with explicit alias guards, Fermat inversion and a caller-supplied nonce for signing; known-answer vectors generated with an independent implementation and cross-verified in both directions pass on every curve alongside round-trip and tamper-rejection regressions
Version 3.529.0
Added
Ed448PublicKeyFromSeed,Ed448SignandEd448Verifyimplement RFC 8032 PureEdDSA on edwards448 in pure Pascal: 16-limb radix-2^28 Goldilocks field arithmetic with the 2^448 = 2^224 + 1 Solinas fold, strongly unified product-form group addition for a = +1 curves, digest-wide modular reduction modulo the group order for the 114-byte SHAKE256 scalars, and cofactor-4 verification; both RFC 8032 section 7.4 known-answer vectors pass byte-for-byte alongside round-trip, tamper-rejection and length-validation regressions
Version 3.528.0
Added
MLDSA65KeyGen,MLDSA65SignandMLDSA65Verifyimplement FIPS 204 ML-DSA-65 with 1952-byte public keys, 4032-byte secret keys and 3309-byte signaturesMLDSA87KeyGen,MLDSA87SignandMLDSA87Verifyimplement FIPS 204 ML-DSA-87 with 2592-byte public keys, 4896-byte secret keys and 4627-byte signatures
Version 3.527.0
Added
PDFlibMLDSAprovides a pure Pascal FIPS 204 ML-DSA-44 implementation with deterministic seed key generation, hedged or deterministic signing, bounded rejection sampling and signature verificationMLDSA44KeyGen,MLDSA44SignandMLDSA44Verifyuse the standard 1312-byte public key, 2560-byte secret key and 2420-byte signature sizes, support contexts up to 255 bytes and are verified against the official known-answer vector
Version 3.526.0
Added
- Streaming SHAKE XOF context (
PLShakeXOFInit/PLShakeXOFAbsorb/PLShakeXOFFinalize/PLShakeXOFSqueeze) squeezes arbitrary byte counts across Keccak permutations for both SHAKE128 (rate 168) and SHAKE256 (rate 136), with a one-shotPLShakeXOFwrapper; cross-block 200-byte outputs are verified against the reference digests of both variants
Version 3.525.0
Changed
SHAKE256ByteArrayandSHAKE256StreamRangenow accept outputs up to the 136-byte sponge rate (previously 64), enabling single-squeeze digests at the Ed448 hash length of 114 bytes; new known-answer tests cover 114-byte outputs of the empty andabcmessages
Version 3.524.0
Added
DownsampleImagesExclassifies every image as bitonal, grayscale or colour from its declared colour space and bits-per-component and applies a per-class DPI budget and JPEG quality in one pass; bitonal scans re-encode losslessly and an only-if-smaller flag keeps the original bytes when the re-encode grows
Version 3.523.0
Added
CopyForeignObjectdeep-copies one indirect object and its complete reference closure from another loaded document into the selected document, remapping object numbers so shared references stay shared in the copy
Version 3.522.0
Added
SetPagePieceInfo,GetPagePieceInfoandClearPagePieceInfomanage page-level private data dictionaries (ISO 32000-2 14.5) keyed by application nameAddNamedPageandGetNamedPageregister and resolve pages by name through the catalog /Names /Pages name tree
Version 3.521.0
Added
GetImageListItemNativeDataToString,GetImageListItemNativeFormatandSaveImageListItemNativeDataToFileextract the raw still-encoded codec stream of any listed image (JPEG, JPEG 2000, JBIG2, CCITT, Flate or raw) without decoding, preserving the original bytes for passthrough workflows
Version 3.520.0
Added
AnalyzeModificationsclassifies every change since a saved revision against the LTA-update, form-filling and annotation whitelist and returns the overall modification levelGetModificationLevel,GetModificationFindingCount,GetModificationFindingLevel,GetModificationFindingObjNumandGetModificationFindingDetailexpose the classified findings of the most recent analysis
Version 3.519.0
Added
CompareWithperforms a structural comparison between the selected document and a saved revision, classifying every indirect object as added, removed or changed through content fingerprints that ignore object-number shiftsGetCompareFindingCount,GetCompareFindingKind,GetCompareFindingObjNumandGetCompareFindingDetailread the findings of the most recent comparison, including page-count differences
Version 3.518.0
Added
SHAKE256ByteArrayandSHAKE256StreamRangeprovide the SHAKE256 extendable-output digest (ISO/TS 32001, RFC 8702) with byte-range two-segment reads and 1..64 byte outputs, verified against the NIST FIPS 202 known-answer tests
Changed
- The Keccak core now carries a domain-separator byte so SHA-3 and SHAKE share one permutation implementation; within the CMS signing profile SHAKE256 remains reserved as the internal digest of Ed448 and is deliberately absent from the digest selector
Version 3.517.0
Added
AddPageAssociatedFileFromFileandAddPageAssociatedFileFromStringbind embedded file specifications to a single page's /AF array (ISO 32000-2 14.13) instead of the document catalogGetPageAssociatedFileCount,GetPageAssociatedFileEmbeddedIndexandClearPageAssociatedFilesenumerate and remove page-level associated files after save/load round tripsSetOptionalContentConfigInfowrites presentation metadata (configuration name, creator and layers-panel list mode) onto the default optional-content configuration
Version 3.516.0
Added
ApplyContentFilterChainandTPDFContentFilterChainrun instruction-level content filters over every content layer of a page, with ordered chains, early-stop control and user data pass-throughExportDocumentJSONandGetDocumentJSONserialise the complete document object graph, including stream dictionaries with base64 payloads and the trailer, into a qPDF-style JSON structureSetPDFDeclarations,GetPDFDeclarationsURI,GetPDFDeclarationsRole,GetPDFDeclarationsVersion,GetPDFDeclarationsCount,HasPDFDeclarationandClearPDFDeclarationswrite, read and remove machine-readable PDF Declarations conformance claimsAuditPageTree,AuditXRefStructure,AuditObjectReachability,AuditStreamLengths,AuditFontEmbeddingandAuditColorSpacesrun six independent structural diagnostic passes with severity-graded findingsGetAuditFindingCount,GetAuditFindingSeverity,GetAuditFindingItemandGetAuditFindingDetailread the findings of the most recent audit call
Version 3.515.0
Added
ExecuteFormFieldScriptEventandTPDFlibFormScriptEventexecute bounded Keystroke, Format, Validate and Calculate field events with controlled Event, Field and Document propertiesSetFormScriptLimits,GetFormScriptLimitsJSONandGetFormScriptDiagnosticsconfigure and report source, operation, nesting, string and property-access budgets
Changed
- The safe form-script runtime now exposes read-only source and target field metadata, document field lookup and keystroke selection state while retaining value-only compatibility
Security
- Script execution now rejects button value events, object mutation and out-of-range selections, applies independent resource limits to execution and dependency analysis, and reports bounded parser failure locations
Version 3.514.0
Added
SetPDFEModecreates PDF/E-1 engineering documents with PDF 1.6 syntax, synchronized Info and XMP identification, lifecycle metadata and an embedded colour-managed output intentGetPDFEDiagnosticsand compliance test 7 provide save-time, direct-file and shared-pipeline PDF/E-1 validation with bounded object, content and recursion budgets
Changed
- PDF/E-1 saves now enforce identification, lifecycle metadata, permitted encryption, output-intent consistency, XFA exclusions and unsafe-action gates, while preflight additionally audits device colour spaces, content operators, fonts, annotations, forms, optional content, external-file references, graphics states and 3D stream restrictions
Version 3.513.0
Added
SetPDFVCRModeand the template and placeholder scope APIs create PDF/VCR-1 PassThrough replacement templates over a PDF/X-4 foundationGetPDFVCRDiagnostics,GetPDFVCRManifestand compliance test 6 provide save-time, direct-file and shared-pipeline validation plus validated JSON field and placeholder extraction
Changed
- PDF/VCR saves now enforce identification metadata, one direct template root, unique declared fields, valid page selection, leaf replacement placeholders and exact page and MCID bindings across the complete structure tree
Version 3.512.0
Added
SetPDFRModeand the PDF/R raster page APIs create restricted raster exchange documents from raw, CCITT Group 4 or JPEG data without transcoding supported compressed inputsGetPDFRDiagnosticsand compliance test 5 provide in-memory, direct-file and shared-pipeline PDF/R validation
Changed
- PDF/R saves now enforce the required marker, version and encryption profile, generation-zero objects, restricted dictionaries and filters, single content stream, raster-only operators, ordered strip resources, colour and resolution consistency and full page coverage
Version 3.511.0
Added
TPDFlibFormTextDirection,SetTextDirection,GetVisualCaretOrderandMoveVisualCaretadd automatic or explicit paragraph direction and grapheme-safe physical caret navigation for mixed-direction form editsResolvedTextDirectionandVisualCaretPositionexpose the effective paragraph direction and distinguish split caret slots at bidirectional boundaries
Changed
- Shaped text runs now apply embedding-level visual reordering for mixed left-to-right and right-to-left content while field values remain in logical UTF-16 order
Version 3.510.0
Added
MinimumSlotHeightdefers dynamic component composition before cloning or capture when the current region is too shortMinimumFollowingHeightkeeps a final fragment with a caller-defined first region for the following component without constraining intermediate fragmentsTPDFlibDynamicRetryReason,LastRetryReasonandLastRequiredSlotHeightexpose why placement was deferred and the known required height
Changed
- Flow-space retries now preserve committed fragments, component state, composition indexes and page content while discarding only the isolated trial
Version 3.509.0
Added
TPDFlibDynamicPaginationPolicyadds split, one-shot keep-together and strict complete-placement modes with a distinct retry result and observable pending state
Changed
- Deferred dynamic component trials now discard captured content and mutable state atomically, while strict placement accepts proportional scale-down but never partial or clipped output
Version 3.508.0
Added
TPDFlibFormSession.DispatchInputEventaccepts typed platform-independent pointer, wheel, named-key and composed-text events and returns focus, hover, press, selection and value-change state
Changed
- Form input dispatch now enforces ordered Widget
/E,/X,/Dand/Upointer transitions, capture cancellation, grapheme-safe editing, line-aware caret movement, standard selection and history shortcuts, button activation and choice-wheel navigation
Fixed
- Backspace and Delete history now restores the user-visible pre-key caret instead of the temporary grapheme selection used internally for atomic replacement
Version 3.507.0
Added
TPDFlibFormSessionnow provides bounded field-level undo and redo with availability queries, retained-step counts, configurable capacity and explicit history clearing
Changed
- Form edit history stores compact text deltas, restores values and directed selections without redispatching actions or callbacks, discards redo branches after new edits and clears at edit lifecycle boundaries
Version 3.506.0
Added
TPDFlibFormSessionnow provides vetoable selection replacement, cut and caller-supplied paste operations with mutable host text-edit callbacks and grapheme-safe/MaxLenenforcement
Changed
- Form-session commits now run available validation and formatting actions before mutating the field, retain rejected edits atomically and keep the validated raw value separate from the formatted Widget appearance
Version 3.505.0
Added
- Added directed form-field text selection ranges in UTF-16 code units, Unicode code points and extended grapheme clusters, with anchor and caret reporting plus cached boundary conversion
Version 3.504.0
Added
- Added overflow-aware dynamic component placement with reject, clipping and proportional scale-down policies, independent alignment and final page, geometry and transform reporting
Version 3.503.0
Added
TPDFlibDynamicComponentSessionlazily composes one stateful page fragment at a time with page context, used-size reporting, completion status, reset and committed-state snapshotsReleaseCapturedPageinvalidates a Form XObject capture handle after its final placement while preserving page resource references and existing invocations
Changed
- Dynamic component attempts now draw on cloned state inside an isolated Form XObject and commit only after validated placement; rejected callbacks, invalid geometry and exceptions restore the selected page and leave destination content and component state unchanged
Version 3.502.0
Added
TPDFlibFormSessionnow provides rotated visual-CropBox Widget rectangles, topmost hit testing, point-based focus and forward or backward keyboard focus navigation
Changed
- Tab sequences apply page
/Tabsrow, column, structure, annotation-array and PDF 2.0 Widget order with ViewerPreferences direction, stable cross-page ordering and bounded structure-tree traversal SetTabOrderModenow validates all five standard modes and selects PDF 2.0 automatically forAandW
Version 3.501.0
Added
ApplyRepeatedPageFragmentplaces one captured Form XObject across a page range as typed Pagination, Layout, Page or PDF 2.0 Background artifacts while sharing the content stream and resources between every placement
Fixed
- Artifact property dictionaries now use the required
BDCmarked-content operator in public and table-layout paths, and PDF 2.0 artifact types and subtypes select the required output feature version
Version 3.500.0
Added
SetTextFlowPaginationLinesindependently controls the minimum orphan lines retained at the bottom of a text box and widow lines preserved for the next box or column
Changed
- Text flow pagination now moves only the required tail lines forward with bounded look-ahead, while an impossible split leaves the flow unchanged for placement in a larger region
Version 3.499.0
Added
TPDFlibFormSessionprovides platform-independent AcroForm focus, text and choice editing, zero-based UTF-16 selection, commit and cancellation state with typed host callbacks for Widget focus and blur actions
Changed
- Committed session values now enforce text limits and regenerate only the affected dirty appearance and calculation closure before reporting the value change
Version 3.498.0
Added
GetDirtyFormAppearanceCountandRegenerateDirtyFormAppearancestrack changed AcroForm Widget object references and regenerate only the deduplicated current-session calculation closure
Changed
RegenerateFormAppearancesnow traverses hierarchical fields once from their roots, reports the actual number of successful Widget regenerations and retains failed appearances for retryUpdateAppearanceStreamnow reports generation failure accurately and keeps unsuccessful Widgets pending withNeedAppearancesenabled
Version 3.497.0
Added
SetOutputIntentMixingHintswrites PDF 2.0 ink solidities and physical printing order while rejecting invalid values, duplicate names, missing order and colourants already represented by spectral dataSetOutputIntentSpectralDataembeds bounded CxF/X-4 spot-colour characterisation streams, reuses identical data across repeated and cross-colourant assignments and requires exactly one matchingSpotInkCharacterisation;ClearOutputIntentColorantDataremoves both colourant metadata dictionaries
Changed
GetEffectivePageOutputIntentJSONnow reports mixing solidities, printing order, spectral colourants and decoded spectral validity for authored and reloaded documents- PDF/X preflight now audits OutputIntent
MixingHintsandSpectralData, including forbiddenDotGain, solidity ranges, printing-order types, colourant conflicts, stream decoding and unique CxF spot-ink matches
Version 3.496.0
Added
DAOpenFileWithEncryptionKeyandDAOpenFromStreamWithEncryptionKeyopen encrypted documents from an authorised hexadecimal file-encryption key without password derivation, with matching DLL file exports and explicit validation status
Security
- Raw-key file input is always source-read-only, enforces exact revision-specific key lengths and available
/Uor/Permsverifiers, rejects mismatches even when missing-verifier recovery is enabled and clears retained key material when the handle closes
Version 3.495.0
Added
SetXRefLoadPolicyandGetXRefLoadPolicyselect and report strict, compatible or recovery loading for selected-document and Direct Access input
Changed
- Strict loading now requires exact headers, final markers, declared offsets, fixed-width table entries, cross-reference stream metadata and every linked
/Prevor/XRefStmsection - Compatible loading retains controlled offset and structure repairs without entering raw reconstruction, while recovery loading can rebuild top-level and compressed objects and synthesize a missing trailer
- Cross-reference diagnostics now report the selected policy, ordered parser decisions and per-section compatibility flags, including rejected hybrid side chains and Direct Access recovery evidence
Version 3.494.0
Changed
- Full unencrypted deterministic saves without an explicit seed now derive both initial trailer
/IDentries from the first 16 bytes of a streaming SHA-256 digest over the serialized document header and body - The content digest excludes prior trailer identifiers, cross-reference data and offset-dependent trailers, while normalizing generated resource identifiers and XMP instance UUIDs so page, resource, attachment and metadata changes control the result
- Internal resource names and embedded-font subset tags are stable while deterministic mode is enabled, including output that packs dictionaries into compressed object streams; default saves retain randomized identifiers
Version 3.493.0
Added
LoadFromMappedFileandDAOpenMappedFileopen local PDFs through bounded read-only mapped views, with an option to require mapping or permit a portable file-stream fallbackGetMappedFileInfoandDAGetMappedFileInforeport active mapping state, file and window sizes, current view, read volume and remapping activity
Changed
- Mapped sources retain one allocation-aligned window and remap it across large deferred object or stream reads, bounding address-space use independently of file size
- Local mapped and callback-backed sources now share cursor-independent absolute object-slice reads, while existing file-loading APIs retain their previous behavior
Version 3.492.0
Added
GetPageThumbnailDataToStreamandGetPageThumbnailDataToStringexpose encoded or filter-decoded page thumbnail payloads, whileDeletePageThumbnailremoves the page metadata without changing the selected page
Changed
- Thumbnail presence and metadata queries now require an image stream; malformed non-stream entries remain removable instead of being reported as usable thumbnails
- Raw output is copied in bounded chunks and decoded output reuses the streaming filter pipeline, preserving terminal image encodings such as DCT and JPX for callers that need native payloads
Version 3.491.0
Added
InsertPageElementClipPath,ReplacePageElementClipPathandDeletePageElementClipPathadd local clipping to an exact page element or edit a captured source component with non-zero and even-odd fill rules
Changed
- Clipping components now retain their source layer, instruction range, nesting depth and normalized fingerprint so editable sources are distinguished from initial bounds, text outlines, nested Forms, malformed paths and cross-layer path objects
- Local clipping uses balanced graphics-state scopes, including valid text-object reconstruction, while deleting a clip from a path that also paints preserves the original stroke or fill
Version 3.490.0
Added
SetPageElementMarkedContentTextProperty,SetPageElementMarkedContentPropertySourceandDeletePageElementMarkedContentPropertyedit Unicode text, serialized PDF objects and existing properties on an exact enumerated marked-content frame
Changed
- Named property resources are edited through page-local copy-on-write, inline property lists automatically promote when an indirect value requires a resource, and deleting the final property compacts
BDCtoBMC - Marked-content edits validate the captured source instruction and resolved property snapshot before writing, then invalidate all page-element handles after a successful change
Version 3.489.0
Added
GetTextBlockCharContentLocationandDAGetTextBlockCharContentLocationmap each extracted UTF-16 position to its content layer, stream, instruction, operand,TJarray element and encoded source-byte rangeReplaceTextBlockCharSourceBytesperforms fingerprint-guarded local replacement of mapped font-encoded bytes while preserving adjacent strings and kerning values
Changed
- Generated,
/ActualText, nested Form, transcoded and cross-layer locations are explicitly classified as read-only, while ligature expansions retain their shared source-glyph range - Content-span lookup uses binary search and extracted lists retain two independent layer fingerprints to reject stale edits before parsing or rewriting page content
Version 3.488.0
Added
ImportPageAsFormXObjectimports a page from any open document as a reusable captured-page handle without changing either page tree
Changed
- Page-to-Form import copies only decoded page content, the independent inherited resource closure and Form-compatible group, metadata and piece-information entries, excluding annotations, thumbnails and page-only structure
- Selected page boxes use standard fallback rules, inherited quadrant rotation is normalized into the Form matrix and repeated placements share one compressed content stream
Version 3.487.0
Added
- Page-element handles now expose their active outer-to-inner marked-content stack, tags, validated
/MCIDvalues, original property operands and every entry from resolved direct or resource-backed dictionaries
Changed
- Content-state tracing resolves named
/Propertiesresources once per resource scope and retains immutable marked-content frames without reparsing page content for repeated queries - Marked-content nesting is tracked independently of
q/Qand is bounded to each page or Form content stream so malformed unclosed sequences cannot leak into another stream
Version 3.486.0
Added
- Page-element handles now expose every component of their effective clipping intersection, including transformed move, line, cubic and close commands, non-zero or even-odd fill rules, component bounds and combined-region diagnostics
Changed
- Content-state tracing retains immutable clipping chains across page boundaries,
q/Qrestoration and Form boundaries while sharing unchanged components between snapshots - Page-element enumeration collects path mutation targets and graphics states in the same content pass, avoiding the previous extra path-layer parse
Version 3.485.0
Added
GetTextBlockCharUnicodeFlagsandDAGetTextBlockCharUnicodeFlagsexpose per-character Unicode mapping, fallback, missing-map, unmapped-code, invalid-map and replacement diagnostics
Changed
- Text extraction retains Unicode mapping provenance beside every UTF-16 code unit and validates surrogate pairs before accepting
ToUnicodeoutput - Invalid or partial mappings now use an independent font-encoding fallback and emit U+FFFD when no meaningful fallback exists
Fixed
- Identity Unicode maps now return one mapped code unit instead of treating the source code value as an output count
Version 3.484.0
Added
- Selected-document and Direct Access text blocks now expose per-character baseline angles, origins, cell matrices, descent-adjusted quads and axis-aligned boxes
GetTextBlockCharBoxadds a selected-document counterpart to the existing Direct Access box query
Changed
- Text extraction retains baseline, advance and cell-height vectors once per character so geometry queries preserve rotation, shear and reversed baselines in constant time
DAGetTextBlockCharBoxnow derives its result directly from retained character geometry instead of walking every preceding width
Fixed
- Selected-document character widths and text-block dumps now apply the configured coordinate scale exactly once
Version 3.483.0
Added
GetTextBlockCharSourceFlagsandDAGetTextBlockCharSourceFlagsexpose bitwise provenance for generated characters, hyphens and honoured/ActualTextreplacements
Changed
- Text block extraction now retains character source flags beside the existing text and advance arrays, including spaces inferred from large character gaps, without reparsing page content for repeated queries
Version 3.482.0
Added
GetXRefDiagnosticsandDAGetXRefDiagnosticsreturn JSON reports for effective cross-reference types, byte positions, trailer boundaries, entry counts and every table or stream in the revision chain
Changed
- Hybrid-reference links, shifted-header retries and editable-document recovery decisions now remain visible as distinct diagnostic evidence, including raw object scans, compressed-object recovery and synthesized trailers
Version 3.481.0
Added
- Callback-backed and Direct Access byte-range documents can queue background page, form or object dependency prefetch jobs with four scheduling priorities, cancellation, waiting and JSON progress diagnostics
- Dependency prefetch iterates missing-range discovery until the target is ready, with configurable source-byte, read-ahead and planning-pass limits
Changed
- Each byte-range stream now owns a priority-ordered FIFO worker that shares the bounded range cache while using isolated parser state, allowing foreground document work to continue without sharing a mutable reader
- Queued cancellation performs no source reads, running cancellation is checked before every chunk, and stream destruction drains outstanding work before releasing its source
Version 3.480.0
Added
LoadFromRangeSourceaccepts an optional non-fetching availability callback for progressive stores, with selected-document and Direct Access queries for page, form and indirect-object readiness- Availability reports return merged required and missing byte ranges, dependency completeness and object traversal counters as JSON
Changed
- Byte-range streams can test cached and source-available coverage without reading bytes, moving the stream cursor or changing cache statistics
- Page availability follows only the target page-tree path and reachable processing dependencies, while unavailable ranges are reported without invoking the read callback
Version 3.479.0
Added
TByteRangeStream.ReadAtprovides cursor-independent absolute reads with same-chunk single-flight sharing, bounded adjacent-request merging and a configurable collection window- Range-cache diagnostics now report pending requests, the active collection window, requests served by coalescing and physical reads that covered multiple chunks
Changed
- Deferred reads from callback-backed and URL-backed documents now use absolute offsets, serialize source callbacks and combine concurrent adjacent chunks into source reads capped at 16 MiB
- Clearing a range cache during an in-flight fetch now prevents that stale completion from repopulating the cache or post-clear counters while existing waiters still receive their bytes
Version 3.478.0
Added
- Byte-range streams now retain aligned chunks under an explicit least-recently-used byte budget and report window count, retained bytes, hits, misses, evictions, source reads, source bytes and repeated reads
LoadFromRangeSourceand DelphiDAOpenFromURLaccept an initial cache budget, with new selected-document and Direct Access APIs to inspect, resize and clear the active cache
Changed
- Linearized first-page warming now stays within the configured retained-byte budget
Version 3.477.0
Added
LoadFromRangeSourceloads a complete editable document through a caller-supplied random byte-range callback, allowing HTTP, database, object-store and custom inputs to stay remote while the parser fetches only the ranges needed for loading and deferred operations- The new
TPDFlibRangeReadEventcontract receives absolute offsets, destination buffers and bounded counts, with the callback provider remaining caller-owned for the loaded document lifetime
Version 3.476.0
Added
- Added PDF/VT-3 authoring over PDF/X-6, PDF/X-6p and PDF/X-6n bases with synchronized identification metadata, mandatory document-part coverage and dedicated preflight
Changed
- Document-part hierarchies now emit and validate standard 8192-entry child blocks together with stricter XML name and type constraints
Version 3.475.0
Changed
TPDFlibContentGraphicsState.BlackPointCompensationnow reports the effectiveDefault,ONorOFFstate across page content, graphics-state restoration and recursively enumerated Form XObjects- PDF/X-6 preflight now rejects
UseBlackPtCompentries whose type or value is outside the PDF 2.0 black point compensation model
Version 3.474.0
Changed
- PDF/X-6 preflight now validates printable annotation flags, deterministic normal appearances, button appearance states, AcroForm and signature fields, viewer-generated appearance exclusions and safe action placement and chains
- PDF/X-6 authoring permits JavaScript only on directly activated Link annotations, limits named actions to page navigation and rejects unsafe, document-level, page-level and form-field action paths before they mutate the document
Version 3.473.0
Added
SetPDFXModenow accepts mode 5 for PDF/X-6p process-colour exchange and mode 6 for PDF/X-6n n-colourant exchange, both using PDF 2.0 and external output-profile references- New
SetOutputIntentProfileReferenceandAddOutputIntentProfileReferenceURLAPIs create document-level or page-level/DestOutputProfileRefdictionaries, derive the ICC checksum, version and colour-space signature, validate output-device and colourant metadata, and preserve one or more RFC 3986 retrieval locations without embedding the profile bytes
Changed
- PDF/X preflight recognizes the PDF/X-6p and PDF/X-6n XMP identifiers and validates external profile type, metadata lengths, process-colour or n-colourant signatures, colourant tables, and URL file specifications
GetEffectivePageOutputIntentJSONnow reports referenced-profile metadata includingprofileCS,profileName,iccVersion,checkSum,profileURLsandcolorantsafter authoring or round-trip loading
Version 3.472.0
Added
- New
SetPageOutputIntent,ClearPageOutputIntentsandGetEffectivePageOutputIntentJSONAPIs create, remove and inspect PDF 2.0 page-level output intents, including the effective document-level fallback
Changed
- PDF/X-6 preflight now accepts page-level output intents, gives them precedence over the document intent and verifies that every page resolves to an embedded Gray, RGB or CMYK profile
Version 3.471.0
Added
SetPDFXMode(4)authors PDF/X-6 complete-exchange documents with PDF 2.0 syntax, PDF/X-6 XMP identification and an embedded colour-managed output intent
Changed
- PDF/X preflight recognises PDF/X-6, requires PDF 2.0 syntax and verifies that the output intent carries an embedded Gray, RGB or CMYK ICC profile declaration
Version 3.470.0
Added
- HTML layout supports Flexbox direction, wrapping, grow, shrink, basis, gaps, justification and cross-axis alignment
- HTML layout supports explicit CSS Grid tracks, fractional sizing, repeated tracks, spans, row or column auto-placement, gaps and item alignment
- HTML stories support numbered footnotes that reserve the frame bottom, reflow body text and preserve numbering through page continuations
Changed
- HTML measurement and cached replay include Flexbox, Grid and footnote geometry while retaining bounded container and track limits
Fixed
- Bulk PDF dictionary clearing and key renaming invalidate cached key indexes, preventing stale lookups during memory compaction and repeated document processing
Version 3.469.1
Fixed
- EMF import and Canvas DC conversion now preserve Unicode text and glyph mappings for embedded and unembedded TrueType fonts
NewPageFromCanvasDCappends every requested page, whileTPDFlibPrintercommits each canvas exactly once without losing or duplicating pages
Version 3.469.0
Added
SetImageSoftMaskExattaches grayscale image soft masks with optional matte coloursNewSoftMaskGraphicsStatecreates reusable alpha, luminosity, transfer-function and reset graphics states from captured Form XObjectsFlattenTransparencyreplaces selected pages with opaque static content at a chosen resolution and background colour for older PDF versions and archival workflows
Changed
- Transparency flattening processes one page at a time, normalises visual rotation, optionally preserves interactive annotations, supports progress and cancellation, and removes unreachable transparency resources by default
Version 3.468.0
Added
- AVIF, HEIF, HEIC and JPEG XL image inputs can be imported through the existing image APIs or the dedicated
AddModernImageFromFile,AddModernImageFromStreamandAddModernImageFromStringmethods SetModernImageCodecLibrary,ModernImageCodecAvailableand a decoder callback provide deployable in-process codec selection without temporary conversion files
Changed
- Modern image decoding preserves source orientation, alpha, ICC profiles and up to 16-bit channel depth before reusing the native PNG image pipeline
Fixed
- Signature seed key-usage validation now reads the native certificate context with correct pointer alignment on Win64
Version 3.467.0
Added
DeduplicateSimilarImagesconsolidates perceptually similar image XObjects with configurable difference-hash, mean channel error and maximum channel error thresholds, dry-run support and optional orphan collectionGetSimilarImageDeduplicationReportJSONandTPDFlibImageSimilarityDedupStatsreport decoding coverage, indexed candidate work, accepted errors, redirected references and estimated encoded-payload savings
Changed
- Approximate image matching requires identical semantic image dictionaries, confirms decoded 64 × 64 colour samples and uses an eight-band hash index to avoid exhaustive pairwise comparisons
Version 3.466.0
Added
EncodeImageToJPXStreamandEncodeImageToJPXFileencode bitmap input as configurable lossy or reversible lossless JPEG 2000 in a standard JP2 containerAddImageJPXFromFile,AddImageJPXFromStreamandAddImageJPXFromStringadd encoded bitmap input directly asJPXDecodeimage XObjects
Changed
- JPEG 2000 image authoring validates quality and lossless options, restores caller-owned input stream positions, removes partial output on failure, automatically requires PDF 1.5 and retains the existing PDF/A-1 compatibility gate
Version 3.465.0
Added
RenderPageTileToStreamandRenderPageTileToFilerender arbitrary device-pixel regions with clipped overlap and white, transparent-key or custom backgroundsRenderPageTilesToFiles,RenderPageTiledToStreamandRenderPageTiledToFileproduce parallel tile grids or stitch their exact core boundaries into a seam-free page imageSetRenderSurfaceCacheLimit,GetRenderSurfaceCacheInfoandClearRenderSurfaceCacheprovide an opt-in, thread-safe LRU cache with independent entry and byte budgets for fully composited tile surfaces
Changed
- Parallel single-page rendering now prewarms one shared display list before worker fan-out so content streams are parsed once, while unsupported compilers retain a deterministic serial path
Version 3.464.0
Added
GetXFARenderedPageCountand theRenderXFAPageToStream,RenderXFAPageToStringandRenderXFAPageToFilefamily produce static raster pages from XFA templates, bound datasets and explicit page breaks without changing the source documentConvertXFAToAcroFormconverts supported text, password, choice, check-box, push-button and signature controls into editable fields while preserving names, values, options, flags, pages and bounds
Changed
- Large one-shot Flate compression now supplies the native backend with a protected input tail, preventing invalid Adler checksums in high-resolution PNG output while retaining compressed output
Version 3.463.0
Added
RenderPageLayerToStream,RenderPageLayerToStringandRenderPageLayerToFileexport base page content, annotations, form fields, or all interactive objects as independently composable PNG layersFlattenFormFieldTaggedandFlattenFormFieldsTaggedOnPageRangebake field appearances into static page content while retaining or creating accessibleFormstructure semantics
Changed
- Interactive-only rendering skips the base content interpreter, uses one annotation appearance pass and writes a transparent background without changing persistent renderer settings
- Tagged flattening converts a Widget-specific ParentTree
OBJRassociation to pageMCRmarked content, preserves existing alternate and actual text, and leaves fields intact when a safe association cannot be proven
Version 3.462.0
Added
HitTestAnnotationandGetAnnotationHitsJSONfind topmost or all annotations at a page point using subtype-aware geometry, tolerance, visibility and bounding-box optionsMoveAnnotationZOrderreorders existing annotation references in place, andSimplifyInkAnnotationsreduces Ink stroke points with bounded geometric deviation and detailed statistics
Changed
- Annotation interaction now tests markup quadrilaterals, vector paths, ellipse geometry and filled regions after a fast rectangle rejection, while changed Ink appearances are rebuilt automatically unless explicitly deferred
Version 3.461.0
Added
RepairAnnotationAppearancesrebuilds missing, stale, invalid, state-mismatched or invisible normal appearances across every page and returns issue plus annotation-category statisticsGetAnnotationAppearanceAuditJSONreports per-annotation appearance issues and aggregate counts without changing the document
Changed
- Markup, shape, path, free-text and icon appearance generation now shares a single-pass document scanner, incremental output builders and compact source fingerprints for deterministic stale detection
Version 3.460.0
Added
ExecuteFormFieldScriptexecutes a bounded local subset of form validation, calculation and formatting actions without exposing file, network, process, UI or dynamic-code capabilitiesRecalculateFormFieldsperforms full or dependency-scoped incremental calculation, andGetFormCalculationGraphJSONreports field dependencies, calculation-order positions and cycles
Changed
- Form recalculation evaluates into a private value snapshot, orders ready fields by AcroForm calculation order, rejects dependency cycles before mutation and commits values only after the selected graph completes
Version 3.459.0
Added
MergeDocumentExadds explicit duplicate form-field policies for rejecting a merge, preserving a shared name with synchronized values, or assigning deterministic numeric suffixes
Changed
- Duplicate-field rejection is checked before object numbers, page trees or form arrays are changed, so the target and source documents remain reusable after a rejected merge
Version 3.458.0
Added
DrawOpenTypeText,GetOpenTypeTextWidthandGetOpenTypeGlyphRunshape, measure, draw and inspect text directly from an existing TrueType or OpenType font handle without requiring an installed face name- Portable native OpenType shaping and subsetting modules are included for 32-bit and 64-bit Windows, with buildable Linux and macOS sources and an environment override for custom deployment paths
Changed
- Complex-script drawing now prefers font-byte GSUB and GPOS shaping, including substitutions, kerning, cursive and mark attachment, while a bounded Pascal fallback covers Arabic joining and common OpenType layout lookup formats when the native module is unavailable
- Shaped font subsetting now retains glyph IDs and closes over layout, variable-font and colour-font dependencies, including COLR/CPAL and fvar/gvar/HVAR data
Version 3.457.0
Added
CreateOpenTypeFontVariationcreates reusable static CFF fonts from requested CFF2 variable-font axis coordinates
Changed
- OpenType CFF2 import now selects a static default instance for immediate drawing and embedding while retaining the variable program for later instantiation
- CFF2 instantiation evaluates variation stores,
vsindexandblendacross expanded local and global subroutines, applies horizontal and global metric variations, and emits a bounded checksum-correct CFF1 OpenType font for existing CFF embedding and subsetting paths
Version 3.456.0
Added
- Added WOFF2 input for the TrueType, OpenType and collection file entry points on Windows 10 version 1703 or later, including transformed TrueType outlines and metrics, CFF fonts and collection faces
Changed
- Web font containers are unpacked once in memory, use the best available Unicode cmap for character mapping, and embed or export the resulting sfnt rather than the compressed container
Version 3.455.0
Added
GetFontVariationAxesexposes each TrueType variable-font axis with its localized name, design range, default value and hidden state, whileCreateTrueTypeFontVariationcreates a reusable static font from requested axis coordinates
Changed
- Variable TrueType instantiation applies
avar,gvar,HVARandMVARdata, flattens composite outlines, rebuilds horizontal and global metrics, removes stale variation and hinting tables, and emits a checksum-correct sfnt for drawing, embedding, subsetting and glyph inspection SaveFontToFilecan export retained in-memory TrueType programs directly, including newly created variable-font instances before a PDF has been saved
Version 3.454.0
Added
GetFontColorGlyphandGetFontColorGlyphByIndexexpose COLR v0 and v1 paint graphs, CPAL palettes, SVG-in-OT documents and embedded bitmap strikes for direct application inspection and rendering
Changed
- Colour-font table inspection uses lazy bounded sfnt access and participates in the shared font-cache byte budget, avoiding eager outline parsing for large colour fonts
Version 3.453.0
Added
SetFontCacheLimit,GetFontCacheInfoandClearFontCacheprovide a shared byte budget, least-recently-used eviction and hit, miss and occupancy statistics for retained font-face resources, shaped text runs and parsed outline programsGetFontGlyphIndexmaps full Unicode code points through TrueType cmap format 4 and format 12 tables, whileGetFontGlyphOutlinereturns simple and transformed composite paths with raw advance, left side bearing, bounding box and units-per-em metrics
Changed
- Repeated shaped-text measurements and drawing calls reuse deep-copied shaped runs under the shared cache budget, and repeated glyph inspection reuses the parsed font program instead of reparsing it for every glyph
- Binary font programs loaded from strings and WOFF containers retain an owned raw-byte stream, preventing text recoding and expired stream references during deferred table access
Version 3.452.0
Added
soCanonicalEquivalentlets text search, batch search and replacement workflows match canonically equivalent NFC and NFD text while reporting offsets and lengths in the original extracted textsoGraphemeClustersconstrains matches to extended grapheme-cluster boundaries and makes the?wildcard consume one complete cluster, protecting surrogate pairs, combining sequences, emoji ZWJ sequences, flags and Indic conjuncts
Changed
- Unicode normalization and grapheme segmentation use compact generated Unicode 15.1 tables on every supported platform without relying on an operating-system text service
Version 3.451.0
Added
ExternalizeInlineImagesreplaces repeated supported inline images across a selected page range with one shared Image XObject when the estimated serialized size decreases
Changed
- Inline image externalization preserves image masks, interpolation, decode arrays, filters and decode parameters, and opportunistically Flate-compresses unfiltered payloads when smaller
- Exact SHA-256 grouping, deterministic resource names, duplicate-page elimination, progress reporting and cooperative cancellation keep optimization results bounded and repeatable
- Unknown inline dictionary entries and non-device colour spaces remain byte-identical instead of being promoted without complete semantics
Version 3.450.0
Added
NormalizeContentStreamscanonicalizes whitespace and numeric tokens across a selected page range while preserving operators, string values, and inline image payloads
Changed
- Content compression now emits canonical tokens even when peephole optimization finds no redundant instructions
Fixed
- PDF real numbers with an explicit leading plus sign now retain their value during parsing and normalization
- Replaced stream data no longer retains obsolete decode parameters from its previous filter pipeline
Version 3.449.0
Added
SetTempFileQuota,GetTempFileQuota, andCompactDocumentMemoryprovide bounded disk-backed object spooling with automatic in-memory fallback
Changed
- Temporary object data now uses generation-aware indexed lookup and remains available after the spool write handle closes
Version 3.448.0
Added
SetRecoveryModeandGetRecoveryModeselect strict, trailer-based repair, or best-effort recovery before loading damaged PDF input
Changed
SaveToStreamnow writes directly to write-only non-seekable targets while retaining the existing chunked serialization path- Best-effort recovery remains the default, while strict mode disables raw reconstruction and repair mode requires a surviving trailer instead of synthesizing one
Version 3.447.0
Added
SetOptimizationWorkersandGetOptimizationWorkersconfigure bounded worker batches for image optimization and Flate stream recompression, with automatic processor selection by default and a serial compatibility modeOptimizeImages,RecompressStreams,MergeFileList,MergeFileListFastandMergeFileListStrictnow report tracked progress and honor cooperative cancellation throughAbort
Changed
- Flate recompression and self-contained image transcoding run in bounded parallel batches while document mutations remain deterministic and single-threaded
- Image optimization now retains decoded bitmap data for re-encoding, skips stencil and color-key mask images, and removes stale decode parameters when applying JPEG replacements
- Large file-list merges keep only the active source readers open, report progress by input and object count, and remove incomplete output when cancelled or failed
Fixed
- Multi-file merge operations now report successful completion when more than one source was merged
- Image downsampling and optimization now retain the decoded bitmap required by their re-encoding paths
Version 3.446.0
Changed
- The two-parameter
SetDisplayListCacheLimitoverload bounds retained display-list memory as well as entry count, while the existing overload preserves the configured byte budget - Display-list eviction now favours frequently reused content with greater rebuild value per retained byte, and individually oversized lists bypass retention without blocking rendering
- Active capture and replay operations pin their lists, concurrent lookups never observe partially built recordings, and cancelled or failed captures are discarded
GetDisplayListCacheInfoandGetResourceUsageStatisticsJSONreport retained bytes, limits, estimated replay cost, evictions, bypasses, rejected captures and build contention
Fixed
- Display-list replay now releases replaced operand strings instead of retaining one allocation from each prior operator
Version 3.445.0
Changed
- The three-parameter
SetMemoryBudgetoverload adds a decoded-byte budget for each document's compressed object-stream cache - Object-stream cache entries now use least-recently-used eviction by both entry count and decoded payload size, while oversized entries bypass caching without blocking object access
- Memory budgets configured before loading now apply to existing and future documents and can be queried through
GetMemoryBudget GetResourceUsageStatisticsJSONnow reports current object-stream cache bytes, byte limits and eviction counts
Version 3.444.0
Added
- The three-parameter
SetParserLimitsoverload limits tolerated parser errors and stops deterministic recovery withpdsErrorLimitwhen the budget is exhausted SetStreamDecodeLimitsrejects overlong filter chains before decoder allocation and enforces a cumulative decoded-byte budget across streams in one tracked operation- Streaming and in-memory decode paths share the same filter and byte accounting, including object-stream decoding during document loading
GetResourceUsageStatisticsJSONreports structure and stream memory estimates, image and font counts, decoded-byte peaks, failures, and object, object-stream and display-list cache hits and missesResetResourceUsageStatisticsresets diagnostic counters without discarding loaded documents or reusable caches
Version 3.443.0
Added
SetParserLimitsandGetParserLimitsconfigure and inspect hard limits for nested PDF objects and the number of entries in any directly parsed array or dictionary- Parser limits apply before file, stream, string, edit-journal, QDF and integrity-check loading paths consume objects, while the default keeps the existing nesting limit and unrestricted container size
TPDFStructure.DecodeMaxContainerItemsrejects oversized arrays and dictionaries with the distinctpdsContainerLimitstatus and preserves the failure positionRegenerateFormAppearancesrefreshes every top-level and child AcroForm field in one traversal, optionally preserves usable appearances and clearsNeedAppearances
Version 3.442.0
Added
CheckFileComplianceaccepts compliance test 3 for PDF/X and audits a finished document against the ISO 15930 print exchange rules: pdfxid edition identification, part-based syntax level, exactly one GTS_PDFX output intent with an embedded profile and condition identifier, declared trapping state, per-page TrimBox and BleedBox geometry, embedded font programs, forbidden annotation types, document-level JavaScript, embedded files, encryption and LZWDecode filters- Issues surface as PDFX-prefixed lines through the same string-list handle the PDF/A and PDF/UA checkers use
Version 3.441.0
Added
SetPDFXModeselects a PDF/X conformance mode (1 = PDF/X-1a:2003, 2 = PDF/X-3:2003, 3 = PDF/X-4) that enforces the ISO 15930 print-exchange rules at authoring time and writes the pdfxid XMP edition identification- The mode installs a GTS_PDFX OutputIntent (CMYK print default), declares the /Trapped state and bases the save version on the part (PDF 1.4 for X-1a / X-3, PDF 1.6 for X-4)
- Authoring gates: DeviceRGB and ICCBased spaces rejected under X-1a (X-3 / X-4 require an RGB OutputIntent for DeviceRGB), transparency and optional content rejected outside X-4, JavaScript, file attachments, encryption, LZWDecode images and non-embedded fonts rejected in every mode
- Save-time fixes: every page receives a TrimBox (defaulting to the MediaBox), annotation Print flags and AcroForm NeedAppearances are normalised and /Trapped is declared
GetInformation(203)reports the active PDF/X mode
Version 3.440.0
Added
AddWatermarkAnnotationFromImageIDwrites a /Subtype /Watermark annotation with the /FixedPrint /Matrix storage matrix so printing scales the appearance with the page (ISO 32000-1 12.5.6.17)AddPrinterMarkAnnotationFromImageIDwrites a /Subtype /PrinterMark annotation carrying the /PN printer's mark name (ISO 32000-1 12.5.6.18)SetFillColorICCBasedandSetLineColorICCBaseddraw through content-level /ICCBased colour spaces backed by an embedded ICC profile file, with the component count read from the profile header and identical profiles sharing one resource
Version 3.439.0
Added
- WOFF 1.0 web font containers import transparently through every TrueType entry point (
AddTrueTypeFontFromFile, stream APIs); tables inflate from their zlib streams and the flattened sfnt directory is rebuilt before parsing - Documents embed the unwrapped sfnt program in FontFile2, never the WOFF container, keeping embedded fonts valid for all viewers
Version 3.438.0
Added
- Seed-value enforcement extends to
LegalAttestation, acceptable certificateIssuerentries and positionalKeyUsagepatterns (ISO 32000-2 Tables 237 and 238), with matching authoring APIsSetSignatureFieldSeedValuelegal-attestation values,AddSignatureFieldSeedIssuerandSetSignatureFieldSeedKeyUsage SetSignProcessLegalAttestationdeclares the signer attestation validated against a required LegalAttestation constraint at sign timeTPDFlibPKCS11Client.InitializeUserPINandChangeUserPINadminister token PINs over a dedicated read/write session with security-officer login forC_InitPIN
Version 3.437.0
Added
SetSignProcessRSAPSSPaddingsigns RSA detached signatures with RSASSA-PSS padding, emitting the full RFC 4055 parameter set (MGF1 with the signing digest, salt length equal to the digest) inside the CMS signature algorithm identifier- PSS-padded signatures round-trip through the library verifier, which now parses RFC 4055 parameters (explicit and implicit encodings) and validates them through CNG with the declared salt length
Version 3.436.0
Fixed
- Text extraction now decodes AGL supplemental glyph names (
uniXXXXanduXXXXXXforms) carried in /Differences arrays of fonts that ship no ToUnicode map - Encoding slots whose glyph name resolves to nothing now fall back to the font base encoding instead of surfacing raw code points or replacement characters during extraction
- Symbolic embedded TrueType fonts without a ToUnicode map now decode through the embedded font program cmap tables, recovering the real Unicode behind each character code
Version 3.435.0
Added
AddTrueTypeCollectionFontFromFileembeds any face of a TrueType collection (.ttc) by zero-based index; the previous behaviour always took the first faceGetJPEGFileOrientationreads the EXIF orientation tag (1..8, 0 when absent) of a JPEG file andGetJPEGFileICCProfileToFileextracts its APP2 ICC profile without importing the image
Version 3.434.0
Added
- Render options 11..15 map the PDFium quality flags: LCD text rendering on/off, no-smooth text, no-smooth image, no-smooth path and forced halftone; the defaults keep the historical output and the GDI+/Cairo backends ignore the flags
SetDisplayListCacheLimitcaps the parsed-once content-stream display-list cache; a positive limit evicts least-recently-created entries before inserting, zero restores the unbounded behaviour
Version 3.433.0
Added
- Signature time-stamp digest selection accepts the SHA-3 family (codes 5..7 in
SetPAdESSignatureTimeStampDigestAlgorithm), matching the signer digest options SetTimeStampRetryCountconfigures 0..10 extra TSA attempts after transport failures or 5xx replies with a linear backoff between attemptsTPDFlibCertificateInfogainsFriendlyName,ThumbprintSHA1andThumbprintSHA256read from the certificate context properties duringEnumCertificates- The AdES historical validation report gains
BaselineProfile: 0 for non-PAdES subfilters, then 1=B-B, 2=B-T, 3=B-LT, 4=B-LTA derived from the timestamp and DSS evidence
Version 3.432.0
Added
- Page-range strings accept the keywords
odd,also even,firstandlast, also as range bounds (3-last), in every API that takes a range ReversePagesreverses the page order of the loaded documentFlattenAnnotsOnPageRangebakes every annotation of a range into page content in one callGetPageContentBoxreports the union bounds of all text, image and path elements, andAutoCropPagessets each page's CropBox to that box plus a marginAddBatesNumberingstamps sequential zero-padded numbers with prefix and suffix at nine keypad-style positionsExtractDocumentRevisionwrites the document state at any earlier incremental revision to a new file by truncating the revision chainSplitDocumentByOutlinecuts the document at its outline entries up to a level into one file per sectionComparePageTextsWithcompares two documents page by page on extracted text and reports the differing count and first mismatchSanitizeDocumentgainsSANITIZE_XMP_PACKET(value 32) which removes the whole XMP metadata stream and every/PieceInfodictionary
Version 3.431.0
Added
- Extraction option 19 (
SetTextExtractionOptionsand the direct-access variant) drops rendering-mode-3 text such as OCR layers from the extracted output without touching visible content - Extraction option 20 replaces the glyphs of
/Spanmarked-content sequences with their/ActualTextvalue during extraction (ISO 32000-1 §14.9.4), honouring both inline property dictionaries and named property resources DAGetTextBlockCharBoxderives per-character axis-aligned boxes from block quads and advances, for highlight rectangles and hit-region math on individual charactersExportFormValuesToJSONserialises AcroForm field values to a JSON array with proper escaping, optionally skipping empty fieldsGetPageTextStatisticscounts characters, whitespace-separated words and blocks for any pageGetXMPPropertyreads simple values from the document XMP packet (descending throughrdf:Alt/rdf:Bag/rdf:Seqwrappers and resolving XML entities) andSynchronizeXMPToInfocopies XMP metadata back into the Info dictionary- Font inventories report embedded program sizes:
TPDFlibDocumentFontgainsFontFileBytesand the diagnostics record gains a summedEmbeddedBytes
Version 3.430.0
Added
- Text search gained four new options:
soDiacriticInsensitivematches queries through a 1:1 Unicode fold so plain letters find their accented counterparts (Latin-1, Latin Extended-A, Greek and Cyrillic, with case sensitivity still honoured when combined withsoCaseSensitive),soWildcardsinterprets*and?in the query with leftmost-longest semantics compatible withsoWholeWord,soAcrossLinesmatches phrases that span line and block breaks by joining each page's extracted blocks, andsoPreserveStylemakesSearchAndReplaceTextredraw replacements at the replaced block's text size and colour instead of the caller's current settings - Search hits now report the match position and length inside the block text (
MatchStart,MatchLength) plus optional context windows (ContextBefore,ContextAfter) controlled by the newSearchContextCharsproperty AddTextMarkupFromSearchHitsandHighlightTextSearchHitsconvert search hits, or the hits retained by a runningBeginTextSearchsession, into Highlight / Underline / Squiggly / StrikeOut markup annotations on their pages- Literal search needles of four characters or more now use a Boyer-Moore-Horspool skip table with conservative wide-character collation, speeding batch searches over long pages
Fixed
- Embedded TrueType fonts written with a WinAnsi base encoding and a Differences array produced a
/ToUnicodeCMap that listed only the Differences entries, so readers relying on it decoded every other accented WinAnsi code as junk: extraction returned?substitutes, block collection could stop at the affected line, and diacritic-sensitive search missed those documents. The CMap generator now covers the whole base encoding with Differences overrides, batched in spec-compliant sections of 100 entries - Word-merge bookkeeping in the text funnel inserted a phantom advance entry when appending runs without a separator, shifting every later per-character offset by one and corrupting derived data such as search-hit sub-rectangles and gap-inferred spaces
Version 3.429.0
Fixed
- Subsetting through
AddTrueTypeSubsettedFontproduced documents whose text rendered blank in every viewer: the CID-to-GID mapping stream was silently overwritten by a hard-coded/Identityentry, so Unicode-derived CIDs addressed the wrong glyph outlines. The stream is now authoritative and/Identityremains only as a fallback when no mapping can be derived; subsetted documents with CJK and auto-updated glyph sets render correctly again - Axial and radial shader fills rendered as solid black on the internal GDI+ renderer:
GdipCreateLineBrushrejectsWrapModeClamp(a texture-brush-only mode), and the failed brush creation fell through to the black solid fallback. Gradient brushes are now created withWrapModeTileand shader fills render identically to the Cairo backend and external viewers - Creating a
TPDFlibinstance raisedEIntOverflowwhen the library was compiled with overflow checking on (the release flags of the command-line demo build scripts): the FNV-1a name hash, the MD5 state accumulation, and the MD5 bit counters are modular arithmetic by design and now run with local overflow checks disabled. The shippedbuild-Win32-Demo/build-Win64-Demorelease output no longer crashes at startup
Version 3.428.1
Added
- New
Showcaseflagship demo (Demo\Delphi\Showcase): builds a seven page document on startup — gradient cover, vector graphics with shaders and patterns, embedded TrueType typography, styled tables, a barcode gallery, interactive links with review annotations and bookmarks, and a summary page — and previews it live inside the embeddedTPDFlibViewercontrol - The Showcase demo also runs headlessly (
Showcase.exe <output.pdf>) with an optionalrenderargument that exports every page as a PNG, so the full document pipeline can be exercised from build scripts
Fixed
- Content stream parsing no longer mis-reads the stroke colour operator
RG: the indirect-reference lookahead in the object decoder consumed0 0 0 RGas a numeric plus the phantom reference0 0 R, which corrupted stroke colours after content optimization and produced operator syntax errors in strict viewers - The content peephole optimizer no longer drops a repeated
cs(colour space) setter that follows any colour operator:rg/g/kreset the colour space implicitly, so pattern fills (scn) after text colour changes kept their/Pattern csand render correctly again
Version 3.428.0
Added
- Nineteen new Free Pascal / Lazarus console demos under
Demo\Lazarus: OutlineBuilder, WatermarkDemo, NamedDestinations, EmbeddedFiles, XmpMetadata, TextBlockExtraction, AnnotationInspector, BarcodeGallery, TaggedPDF, SearchReplace, Redaction, LinearizeDemo, PatternShowcase, DocumentProperties, SecurityPermissionMatrix, PageStitch, OutputStream, MergePDF, and PdfToImage - An
IOUtilscompatibility shim (TPath / TDirectory / TFile) for FPC builds keeps the ported demos source-identical to their Delphi counterparts
Changed
- The NOVCL graphics stand-in under Windows now materializes real GDI objects: TBitmap allocates a top-down DIB section, TCanvas owns a memory DC and re-selects brush, pen, and font GDI objects on property changes, and TBrush / TPen / TFont rebuild their handles when colors, styles, or font attributes change
- Page rendering under FPC now produces pixel output matching the Delphi build (GDI+ rasterization through the stand-in DC), which also restores
PdfToImageJPEG and BMP export
Fixed
- Encrypted PDF creation under FPC corrupted binary string values (trailer
/IDreadback, encryption/U), making the output fail reload verification; the FPC builds no longer pass-FcUTF8, whose ansistring codepage tagging madeAnsiString + AnsiCharconcatenation replace every byte above $7F with a question mark
Version 3.427.0
Added
- Free Pascal / Lazarus support: the library now compiles under FPC 3.2 (Win64) from the same sources as the Delphi builds, with new
build-Lazarus-Lib,build-Lazarus-Lib-TRIAL,build-Lazarus-Tests, andbuild-Win64-Demo-Lazbuild scripts and thePDFlibPasLazpackage - Flate compression and decompression under FPC run through FPC's bundled static zlib; AES encryption links the same unity object used by the Delphi builds; JPEG images decode through the GDI+ backend
- An FPCUnit console test suite (
Tests\Lazarus) covers document create/save/load round trips, deflate/inflate, AES, and text extraction, and two Lazarus console demos (HelloWorld,TextExtract) are included underDemo\Lazarus
Changed
- Unit scope prefixes (
System.SysUtils,Winapi.Windows, ...) were removed across the library sources so the same units resolve under both compilers; the Delphi command-line library builds now pass the unit scope list explicitly - Fixed two
NO_VCL/NOVCLdirective typos in the renderer and the Cairo bitmap export that only became visible once the NOVCL Windows configuration was actually compiled
Version 3.426.0
Added
- Page rendering can now simulate process and named-ink overprint through configurable Delphi, DLL, and ActiveX APIs
Changed
- Extended graphics states now preserve cumulative
/OP,/op, and/OPMsemantics while bounded pixel composition retains overlapping ink channels on GDI+ and Cairo renderers
Version 3.425.0
Added
- Image extraction now preserves JBIG2 page and global segments in standalone files and keeps CCITT fax payloads inside standalone TIFF wrappers
- A read-only image deduplication manifest groups exact encoded duplicates by digest, object identity, page usage, and reclaimable payload bytes across Delphi, DLL, and ActiveX clients
Changed
- Page image lists now identify native JPX and JBIG2 payloads without forcing bitmap expansion, including image streams reached through nested Form XObjects
Version 3.424.0
Added
- Document-level associated-file APIs now create, enumerate, map, add, and remove catalog
/AFmembership across Delphi, DLL, and ActiveX clients - RichMedia annotations can now reuse an existing embedded or associated file, keeping one media payload shared by the attachment panel and annotation asset graph
Changed
- Associated-file creation accepts files, Delphi streams, binary strings, DLL buffers, and ActiveX byte arrays while preserving checksums, descriptions, relationship metadata, and binary zero bytes
- Removing an embedded file now also removes matching catalog associated-file references so loaded documents cannot retain dangling
/AFentries
Version 3.423.0
Added
- Optional-content APIs now build nested layer-panel labels and group branches across Delphi, DLL, and ActiveX clients
- Radio-group creation, membership, removal, and inspection APIs add mutually exclusive layer controls for CAD and map workflows
Changed
- Locked-layer updates now report success, alternate configurations use their correct one-based identifiers, and malformed layer hierarchies are traversed with bounded cycle protection
- Deleting an optional-content group removes its references from layer order, state, lock, radio, and automatic-state structures in every configuration
Version 3.422.0
Added
- PRC 3D annotation APIs embed models from files, streams, memory strings, DLL buffers, and ActiveX byte arrays with named default views and explicit activation policies
- PRC annotations support PDF/A-4e engineering documents while automatically promoting ordinary output to PDF 2.0
Changed
- PRC and U3D annotations now include a complete 3D view, activation and deactivation dictionaries, printable annotation flags, alternate names, and a normal appearance
- Legacy U3D embedding rejects PDF/A profiles that do not permit 3D annotations and accepts PDF/A-4e
Version 3.421.0
Added
- Document part APIs add PDF 2.0
/DPartRoot, hierarchical/DParts, page-range leaves, record levels, level names, and validated/DPMmetadata across Delphi, DLL, and ActiveX clients - Inspection and lifecycle APIs expose hierarchy validation, reachable part counts, page-to-part lookup, metadata round trips, and complete hierarchy removal
Changed
- Large child sets use bounded array blocks while validation checks parent links, cycles, uniform leaf depth, ordered complete page coverage, reverse page links, XML name tokens, and bounded metadata graphs
- Creating a document part hierarchy promotes output to PDF 2.0 and participates in loaded-document feature detection and save-version locking
Version 3.420.0
Added
DrawHTMLStoryadds high-level styled HTML flow through equal-width columns and automatically generated pages across Delphi, DLL, and ActiveX clients- Finite page limits return a reusable continuation string that preserves the active stylesheet cascade, nested style state, structured blocks, tables, links, font mappings, and image bindings
Changed
- Generated story pages inherit the effective dimensions of the selected start page and each column reuses cached measure-and-replay layout plans
- Story layout rejects invalid geometry, bounds columns and generated pages, and terminates when consecutive frames cannot make progress
Version 3.419.0
Added
TPDFlibPrinteradds a VCL component facade withBeginDoc,Canvas,NewPage,EndDoc, andAbortlifecycle methods for direct PDF creation- PDF printer jobs support configurable paper dimensions, portrait or landscape orientation, canvas DPI, vector import options, document titles, and optional direct file output
Changed
- Each component job owns an independent PDF document, commits the first and subsequent canvases with consistent page semantics, and retains completed output for further library processing
- The component never opens a print dialog or accesses the operating-system spooler, allowing existing VCL canvas drawing code to migrate without a physical printer dependency
Version 3.418.0
Added
RenderPagesToPrintStream,RenderPagesToPrintString,RenderPagesToPrintFile,RenderPagesToPrintData, andRenderPagesToPrintBufferadd driver-independent print output across Delphi, DLL, and ActiveX clients- Selected page ranges can be emitted as PostScript Level 3, single-page EPS, PCL 5c, or PWG Raster with optional monochrome, duplex, tumble, and PCL job framing controls
Changed
- PostScript and EPS preserve page vector content while PCL and PWG Raster use bounded row encoders for direct server and embedded-device delivery
- Print streams are generated without opening a printer, showing a print dialog, or submitting work to the operating-system spooler
Version 3.417.0
Added
ExportPageSVGandExportPageSVGToFileadd scalable page export across Delphi, DLL, and ActiveX clients- SVG output can independently include native painted paths, searchable text, embedded PNG images, clickable annotation links, and a transparent page background
Changed
- Page paths retain their transforms, fill and stroke appearance, opacity, line styles, even-odd rules, and effective clipping bounds without rasterising the complete page
- Each page is processed in bounded passes and produces a self-contained SVG document with no external image dependencies
Version 3.416.0
Added
DrawSVG,DrawSVGFromFile,GetSVGWidth, andGetSVGHeightadd native SVG vector placement and measurement across Delphi, DLL, and ActiveX clients- SVG drawing supports view boxes, aspect-ratio alignment, groups, definitions and reuse, transforms, clipping, simple CSS and inline styles, opacity, paths with elliptical arcs, and the standard rectangle, circle, ellipse, line, polyline, and polygon shapes
Changed
- SVG geometry is written as scalable PDF paths without raster image XObjects, and repeated measurement and drawing reuse the most recently parsed bounded SVG tree
- Untrusted SVG input is bounded by source size, element count, and nesting depth, performs no external resource access, and uses the first colour stop as a deterministic solid fallback for gradient paint servers
Version 3.415.0
Added
DrawFormula,GetFormulaWidth, andGetFormulaHeightadd nested mathematical layout across Delphi, DLL, and ActiveX clients- Formula markup supports stacked fractions, simultaneous superscripts and subscripts, square roots with optional indices, Greek letters, common mathematical symbols, escaped characters, text groups, and bounded nesting
Changed
- Formula text uses the selected font, text size, colour, shaping, and fallback chain while fraction and radical rules remain vector content
- Repeated measurement and drawing reuse the parsed and measured box tree while the document, measurement scale, and complete painter state remain unchanged
Version 3.414.0
Added
MarkdownToHTML,DrawMarkdownText,DrawMarkdownTextBox,GetMarkdownTextHeight,GetMarkdownTextWidth, andGetMarkdownTextLineCountadd direct Markdown conversion, measurement, drawing, and height-limited continuation across Delphi, DLL, and ActiveX clients- Markdown input supports ATX and setext headings, paragraphs, block quotations, ordered and unordered lists, pipe tables with alignment, fenced and indented code, emphasis, strong text, strikeout, links, images, automatic web links, escapes, and hard line breaks
Changed
- Repeated Markdown measurement and drawing reuse the converted HTML and the bounded HTML layout cache, while raw angle brackets remain escaped text
DrawMarkdownTextBoxreturns an opaque continuation token accepted by the same method so partially rendered inline state can continue on another page
Version 3.413.0
Changed
- HTML measurement and drawing now share bounded layout plans that cache parsing, CSS resolution, line and table geometry, images, styled backgrounds, and links
- Matching
GetHTMLTextHeight,GetHTMLTextWidth, orGetHTMLTextLineCountcalls can feedDrawHTMLTextwithout repeating HTML parsing or layout work
Fixed
- Measuring HTML with styled text backgrounds no longer writes rectangle operators into the selected page content stream
Version 3.412.0
Added
BeginDeferredPageLayer,EndDeferredPageLayer,ComposeDeferredPageLayers,CancelDeferredPageLayers, andGetDeferredPageLayerCountprovide deferred z-index composition across Delphi, DLL, and ActiveX clients- Negative layers render beneath existing page content, while zero and positive layers render above it with stable recording order for equal z-index values
Changed
- Deferred layers are retained as page-sized Form XObjects and compose through one placement operation per layer without parsing or replaying their drawing commands
Version 3.411.0
Added
SetPageHeaderFooterVariant,ApplyPageHeaderFooterSet, andClearPageHeaderFooterSetprovide reusable named running-header and footer templates with first-page, odd-page, even-page, and default variants- Header and footer variants can render plain text with the current font or rich HTML with automatic height measurement, per-page variable expansion, alignment, margins, and opacity across Delphi, DLL, and ActiveX clients
Changed
- Generated running headers and footers are pagination artifacts, preserve the caller's page and painter state, and support explicit blank variants that suppress fallback for title or section-opening pages
Version 3.410.0
Added
StartPageNumberChapter,AddPageNumberPlaceholder, andResolvePageNumberPlaceholdersprovide a two-pass workflow for final document and chapter page numbers inside ordinary body text- Pagination templates support physical page numbers, final document totals, chapter names, chapter-relative page numbers, and final chapter totals across Delphi, DLL, and ActiveX clients
Fixed
- Wide-string text boxes now pass their supplied text to the wrapping engine instead of producing an empty box
Version 3.409.0
Added
AutoFitTableColumnsassigns table column widths from styled cell content while honoring an exact table width and caller-defined per-column limits- Delphi, DLL, and ActiveX clients share the same automatic table sizing behavior, including merged-cell constraints
Changed
- Successful automatic sizing invalidates cached row measurements, while infeasible width constraints leave every existing column unchanged
Version 3.408.0
Added
DrawTextFlowColumnsflows a retained passage through one to 64 equal-width columns with configurable gutters and optional final-region balancing- DLL and ActiveX clients can now create, draw, measure, inspect, rewind, and release TextFlow handles through the complete public lifecycle
Changed
- Balanced columns use exact line counts when the remaining passage fits, while overflowing regions retain full column height for maximum page capacity
Version 3.407.0
Added
- HTML text rendering now supports embedded stylesheets, inline CSS, headings, structural blocks, tables with column spans, and document-bound images
SetHTMLImageandClearHTMLImagesexpose matching Delphi, DLL, and ActiveX controls for reusable HTML image sources
Changed
- HTML measurement and drawing now share resolved cascade and layout decisions, table rows continue atomically across text boxes, and continuation state preserves nested CSS formatting
Version 3.406.0
Added
- TextFlow now supports bounded language-aware automatic hyphenation for English, German, Dutch, French, Spanish, Italian, Portuguese, Russian, and Turkish, including language inheritance from the document Catalog
/Langvalue SetTextFlowLanguageandSetTextFlowHyphenationexpose matching Delphi, DLL, and ActiveX controls for language and minimum prefix or suffix lengths
Changed
- TextFlow line breaking now measures complete words, uses a bounded search only for oversized tokens, and renders discretionary soft or automatic hyphens only when the break is selected
Version 3.405.0
Added
- Automatic font fallback now resolves missing CJK, symbol, mathematics, complex-script, and emoji clusters through cached installed faces while preserving shaping and bidirectional run order
SetAutomaticFontFallback,AddFontFallback, and the fallback-chain inspection APIs expose matching Delphi, DLL, and ActiveX controls
Changed
- Text drawing and width measurement now share the same cluster-aware fallback decisions and lazily embed only fallback fonts selected for output
Version 3.404.0
Added
- Missing glyphs are now detected as Unicode scalars in plain and shaped text, retained in a bounded JSON report, and exposed through Delphi, DLL, and ActiveX callbacks
SetMissingGlyphPolicycan preserve compatible drop-and-report behavior or reject a text operation before content is written withLastErrorCode 521
Version 3.403.0
Added
GetAPIScopeReportJSONandClearAPIScopeReportexpose deterministic runtime and content-stream diagnostics through Delphi, DLL, and ActiveX APIs- Invalid path, graphics-state, page-update, marked-content, form, pattern, page, document, and output-finalization transitions now fail immediately with
LastErrorCode 117
Version 3.402.0
Added
AnalyzePageSkewJSON,DeskewPage, andDeskewPageRangedetect and correct scanned-page rotation through Delphi, DLL, and ActiveX APIs- Deskew analysis uses bounded adaptive-resolution rasters and coarse-to-fine line-profile scoring, while correction preserves original PDF content and offers an optional fill-page mode
Version 3.401.0
Added
DetectPageBarcodesJSONrecognizes one-dimensional and two-dimensional barcodes from a full PDF page or a bounded page region and returns text, symbology, orientation, validity, corner points, and bounds as deterministic JSON- Region scans render only the requested pixels, preserve the selected page, support format and decoder option masks, and expose matching Delphi, DLL, and ActiveX APIs
Version 3.400.0
Added
SaveDOCXToStreamandSaveDOCXToFileconvert PDF page ranges into editable WordprocessingML paragraphs, inferred headings, native bullet and numbered lists, detected tables, font styling, page breaks, and positioned PNG images- The deterministic DOCX package writer uses CRC-checked raw Deflate entries without Office automation, writes image data as each page is processed, preserves explicit page order, and restores the selected PDF page
Version 3.399.0
Added
ExportPageMarkdownandExportDocumentMarkdownconvert semantic page content into escaped Markdown paragraphs, inferred headings, ordered or unordered lists, and pipe tables with optional page markers and font stylingSaveMarkdownToStreamandSaveMarkdownToFilewrite UTF-8 one page at a time without buffering the complete document output, while matching DLL and ActiveX entry points expose string and file export workflows
Version 3.398.0
Added
ExportPageHTMLandExportDocumentHTMLcreate self-contained HTML5 with positioned text, embedded PNG images, URI links, and internal page anchors- Document export preserves explicit page-range order, restores the selected page, retains one page extraction model at a time, and exposes matching Delphi, DLL, and ActiveX APIs
Version 3.397.0
Added
ExtractStructuredPageandExtractStructuredDocumentturn page text into paragraph, line, span, table, row, and cell hierarchies and export the same model as JSON, semantic XHTML, or detected-table CSV- Document extraction retains one page hierarchy at a time, restores the selected page, and exposes matching Delphi, DLL, and ActiveX entry points
Version 3.396.0
Added
ApplyOCRTextLayeraccepts provider-neutral OCR JSON and appends confidence-filtered, bounding-box-fitted invisible text that makes scanned pages searchable without changing rendered pixelsOCRPage,OCRDocument, andOnOCRPageprovide a pluggable one-page-at-a-time OCR pipeline with bounded raster memory, while DLL and ActiveX callers can combine existing page rendering withApplyOCRTextLayer
Version 3.395.0
Added
AddImageFromFileandAddImageFromStreamnow accept WebP images; the library detects the RIFF/WEBP container and decodes through GDI+, which ships a built-in WebP codec on Windows 10 1809 and later
Version 3.394.0
Added
SetRenderTargetICClets a caller supply a target ICC profile so the renderer's ICC transforms map source colors through a CMYK proof profile instead of the default sRGB, enabling CMYK soft proofing and gamut preview
Version 3.393.0
Added
OptimizeImagesscans every embedded image, decodes it, re-encodes as JPEG at a caller-specified quality, and replaces the original stream in place only when the JPEG is strictly smaller — automatically shrinking scanned documents and uncompressed images while protecting images that would grow
Version 3.392.0
Added
GetImageInfoJSONscans every image XObject in the document and returns per-image metadata (object number, pixel dimensions, color space, bits per component, filter) as JSON without decoding any pixel data, so auditing image inventories stays O(image count) in memory rather than O(total image bytes)
Version 3.391.0
Added
- JPEG2000 (JPXDecode) images are now extracted with native byte passthrough when the extraction mode supports it, preserving the original compressed stream without decode-and-re-encode, matching the existing JPEG passthrough behavior
Version 3.390.0
Added
NewMultiStopAxialShaderandNewMultiStopRadialShadercreate gradients with any number of interior color stops in any PDF color space (DeviceRGB, DeviceCMYK, DeviceGray, ICCBased), using Type 3 stitching functions to chain one Type 2 exponential interpolation per segment- New
TPDFGradientStoprecord carries a position in[0,1]and per-component color values for each stop
Version 3.389.2
Changed
- Complex-text shaping now caches the Uniscribe SCRIPT_CACHE, HFONT and DC per font for the document lifetime, so the font's parsed cmap/GSUB/GPOS tables survive across
DrawShapedTextcalls instead of being re-created and freed every time
Version 3.389.1
Changed
- Float-to-string conversion in content-stream writing now uses an inline digit loop with a precomputed power-of-ten table instead of the generic
Power+IntToStr+Insertpath, significantly reducing CPU overhead for high-density graphics generation while producing byte-identical output
Version 3.389.0
Added
SetMemoryBudgetbounds the memory consumed by large documents by capping the decoded-stream size threshold and the compressed-object-stream cache, keeping peak memory within a caller-set budget
Changed
- The random-access reader's compressed object-stream cache now defaults to 50 entries instead of growing without limit, so touching many ObjStm streams no longer accumulates decoded content indefinitely
Version 3.388.1
Changed
- PDF name tokens parsed during document loading are now interned into a per-structure hash pool, so the millions of duplicate names in large documents share one refcounted buffer each instead of allocating fresh strings; dictionary key lookups short-circuit to pointer comparisons
Version 3.388.0
Added
- CFF, OpenType-CFF and CID-keyed fonts are now subsetted at save time through the same
CreateFontPackageservice TrueType subsetting uses, embedding only the glyphs the content stream actually drew and significantly shrinking CJK and OTF documents - Subsetted CIDFontType0 outputs now carry a
/CIDSetstream declaring which CIDs are embedded, satisfying PDF/A rule 00032 and conforming reader expectations
Version 3.387.0
Added
SetRenderBandingrenders a page one horizontal band at a time into a short bitmap, compositing the bands into a full-size output, so high-DPI and large-format pages keep a bounded peak memory instead of allocating one giant bitmapGetRenderBandHeightreports the active band height, or 0 when banding is disabled- New Delphi, DLL, and ActiveX banded-rendering APIs expose the workflow across every public surface
Version 3.386.0
Added
SetDisplayListCachingrecords a page's content stream once into a replayable display list, so later renders at any zoom or DPI skip re-tokenizing; Form XObjects and Type 3 glyph procedures cache one list eachGetDisplayListCacheInforeports whether caching is on plus the entry count and hit/miss counters as JSON, andClearDisplayListCachedrops the recordings and reclaims their memory- New Delphi, DLL, and ActiveX display-list APIs expose the workflow across every public surface
Version 3.385.0
Added
StartRenderPageJobrenders a page on a background task through an isolated instance, so a large page can no longer block the host thread while it rendersPauseRenderJob,ResumeRenderJobandCancelRenderJobinterrupt a single in-flight page at content-stream operator boundaries via a cooperative cancel flag and pause gate threaded into the rendererWaitForRenderJob,GetRenderJobStateandGetRenderJobResultreport job progress and outcome through theRENDER_JOB_STATE_*codes- New Delphi, DLL, and ActiveX render-job APIs expose the workflow across every public surface
Version 3.384.0
Added
DAOpenFromURLopens a remote PDF over HTTP using byte-range requests, fetching only the objects the reader actually touches and prefetching the first-page section of linearized documents so page 1 renders firstGetLinearizedURLAccessPlanprobes a remote URL with a single small range request and returns a JSON report of the total length, byte-range support, linearization, page count, first-page object and section end, hint stream span, and the merged list of byte ranges page 1 requires- New
PDF_NET_OPT_NO_WARMINGoption andPDFLIB_ERROR_NET_OPEN,PDFLIB_ERROR_NET_RANGE_UNSUPPORTED, andPDFLIB_ERROR_NET_HTTPerror codes surface network reading across Delphi, DLL, and ActiveX
Version 3.383.0
Added
SaveQDFToFileandConvertFileToQDFcreate human-editable diagnostic PDFs with readable object formatting, original object identity comments, expanded common content streams, and indirect repairable stream lengthsRepairQDFFilerecalculates edited stream lengths and rebuilds cross-reference data, trailers, andstartxref, including in-place repair- New Delphi, DLL, and ActiveX QDF APIs and the
PDF_QDF_OMIT_ORIGINAL_OBJECT_IDSoption expose the workflow across every public surface
Version 3.382.0
Added
PDF_LINEARIZE_OBJECT_STREAMSenables bounded object stream packing and a compressed main xref stream while retaining directly readable first-page cross-reference data
Changed
SaveToFileOptionsnow preserves object stream packing whenLinearizeandPackObjectStreamsare enabled together
Fixed
LinearizeFilenow supports identical input and output paths without truncating source bytes before the linearization pass reads them
Version 3.381.0
Added
ValidateLinearizationFileandGetLinearizationValidationReportindependently audit Fast Web View dictionaries, hint ranges and bit tables, first-page dependencies and byte boundaries, page counts, and the main cross-reference entry
Fixed
- Linearized output now writes deterministic MSB-first page-offset and shared-object hint tables with byte-aligned vectors, accurate page lengths, and hint-relative offsets
- Generated hint tables no longer contain random bit widths, little-endian fields, incomplete shared-group rows, or placeholder content offsets that could make conforming readers reject Fast Web View data
Version 3.380.0
Added
- Large Flate streams can now be compressed and decompressed through bounded chunks, including direct streaming extraction through
GetEmbeddedFileContentToStreamandGetEmbeddedFileContentToFile
Changed
- Saving large RC4, AES-CBC, and AES-GCM encrypted streams now writes ciphertext directly to the destination with exact precomputed lengths instead of materializing and then decrypting full temporary copies
- Large embedded-file imports compress incrementally into their stored stream and repeated encrypted saves preserve the in-memory source bytes and stream metadata
Version 3.379.0
Added
StartEditJournal, explicit transaction boundaries, rollback, undo, redo, history reset, status queries, and crash recovery are available to Delphi, DLL, and ActiveX callers- Persistent journals append independently checksummed PDF state and cursor records, flush complete records to storage, and recover the last complete commit when a trailing write is incomplete or corrupt
Changed
- Undo, redo, rollback, and recovery preserve the selected document handle while invalidating transient handles whose underlying document objects were replaced
- Undo memory is bounded by the configured step count, snapshots are serialized only at transaction boundaries, and document passwords are never written to recovery journals
Version 3.378.0
Added
ConvertTextToPathsconverts outline-font text and Type 3 glyph programs into reusable vector Form XObjects across selected pages and nested Forms- Delphi, DLL, and ActiveX callers can select recursive Form conversion and automatic cleanup of source font resources
Changed
- Converted content retains text positioning, spacing, writing mode, transformations, colours, and stroke settings while removing the original text-showing operators
- Text clipping rendering modes and ambiguous shared resource scopes are rejected before any document object is modified
Version 3.377.0
Added
CopyPageRangesExacceptsPDF_COPY_PAGE_SMART_RESOURCESto reuse equivalent fonts, images, colour spaces, patterns, shadings, and graphics states already present in the target documentPDF_COPY_PAGE_KEEP_ORDERnames the existing ordered duplicate-page option and can be combined with smart resource copying
Changed
- Smart page copying normalises object numbers, dictionary key order, numeric spelling, and stream lengths before hashing, confirms every match structurally, and skips cyclic or identity-sensitive graphs
CollateDocumentsExnow applies semantic resource reuse across its source documents without first allocating duplicate resource graphs
Version 3.376.0
Added
TrimPageContentToCropBoxremoves complete top-level text runs, painted paths, image placements, and Form XObject invocations that lie fully outside a page CropBoxTPDFContentProgram.TraceGraphicsStatePairscaptures before-and-after instruction states in one replay while continuing a caller-owned tracker across content layers- Delphi, DLL, and ActiveX callers can apply signed margins while trimming page bleed and reducing retained content
Changed
- CropBox trimming preserves intersecting or unresolved objects, clipping paths, text clipping modes, and shared Form internals while maintaining relative text advances after removed strings
Version 3.375.0
Added
TPDFStructureexposesDecodeMaxDepth,LastDecodeStatus, andLastDecodePositionfor bounded low-level object parsing and precise limit diagnostics
Changed
- PDF arrays and dictionaries now parse through an explicit bounded state stack, including nested operands in page content streams
Security
- Untrusted direct objects deeper than the default 256-container limit are rejected before they can exhaust the thread stack
Version 3.374.0
Added
AddType3Fontcreates programmable Type 3 fonts with caller-defined matrices and font boundsAddType3Glyphwrites byte-coded glyph graphics programs with automatic metrics, encoding, widths, and Unicode extraction mapsAddType3FontResourceexposes fonts, images, graphics states, shadings, and other indirect resources to glyph programs- Delphi, DLL, and ActiveX callers can create Type 3 symbol, stamp, and special-purpose fonts without installing or embedding an external font program
Changed
- Type 3 glyph updates rebuild compact derived font tables in place while retaining the font handle used by existing page resources
Version 3.373.0
Added
- Structure-tree cursors navigate parents, children, and siblings while retaining element identity across repairs and reordering
ReparentStructTreeCursormoves or reorders structure elements and rejects self-parenting or descendant cyclesNormalizeStructTreecanonicalizes child collections, repairs parent links, promotes direct elements, and removes invalid, duplicate, or cyclic edges
Changed
- Structure-tree repair preserves marked-content ownership and parent-tree mappings while making hierarchy edits safe for subsequent saves
Version 3.372.0
Added
EnumeratePageElementsreturns stable short-lived handles for editable text, image, and path contentDeletePageElementremoves an enumerated object while preserving later relative text positioningTransformPageElementwrites an affine matrix around the selected object without changing unrelated content
Changed
- Editable element handles validate the original content fingerprint and reject stale or ambiguous mutations
Version 3.371.0
Added
ExportObjectJSONstreams the complete trailer and indirect object graph to deterministic, reversible typed JSONImportObjectJSONvalidates and merges object graphs or replaces the complete indirect object setGetObjectJSONandSetObjectJSONexpose atomic per-object inspection and updates through Delphi, DLL, and ActiveX
Changed
- Object graph JSON preserves binary names, dictionary keys, strings, streams, reference generations, scalar types, and object-number ordering without ambiguous JSON coercions
Version 3.370.0
Added
- A compiled Arlington TSV model loader provides stable reusable handles plus definition and rule counts
- Model-driven syntax validation checks object keys, required entries, types, PDF version availability, direct and indirect references, allowed values, and linked object graphs
- Delphi, DLL, and ActiveX APIs validate files or existing shared validation pipelines and return structured diagnostic lists
Changed
- Syntax validation reuses shared parse and object caches, selects ambiguous links by object discriminators, and suppresses repeated object-definition visits
Version 3.369.0
Added
- Reusable validation pipelines open and parse a PDF once, then run PDF/A and PDF/UA tasks or build combined reports against the shared reader and object cache
- Delphi, DLL, and ActiveX APIs expose pipeline creation, task execution, report generation, parse-count inspection, and explicit release
Changed
CreatePreflightReportandCreateValidationReportshare one parse and lazy object cache when multiple compliance checks are selected
Version 3.368.0
Added
AddStructureNamespaceregisters PDF 2.0 structure namespaces and writes shared/Namespacedictionaries throughStructTreeRoot/NamespacesAddRoleMapNSmaps custom structure types within one namespace or across registered namespaces- Default and per-element namespace selectors, namespace queries, DLL exports, and ActiveX methods expose the complete workflow
Changed
- PDF/UA-2 and WTPDF accessibility modes automatically assign the PDF 2.0 standard structure namespace to existing and future unassigned structure elements
GetStructTreeItemTextresolves/RoleMapNSchains and returns the element namespace URI through InfoID 9
Version 3.367.0
Added
SetPDFUA2Modeenables PDF/UA-2 metadata, PDF 2.0 versioning, document language, marked-content safeguards, and title display preferencesSetWTPDFModedeclares the WTPDF 1.0 accessibility level, reuse level, or both while preserving unrelated PDF Declarations- Delphi, DLL, and ActiveX getters expose the active PDF/UA part and WTPDF declaration mask
Changed
- PDF/UA diagnostics recognise part 2, require
pdfuaid:rev=2024, and enforce the PDF 2.0 minimum version
Version 3.366.0
Added
SetCryptFilterConfigurationindependently selects encryption for PDF strings, ordinary streams, and embedded-file streams through/StrF,/StmF, and/EFF- Delphi, DLL, and ActiveX getters expose each pending encryption target while the established embedded-files-only setting remains compatible
Changed
- AES password, public-key, and fingerprint encryption use one crypt-filter policy, reject configurations with no protected target, and prevent selective policies from being applied to RC4 handlers
Fixed
- Encryption fingerprints now restore their complete encryption record and save through the normal object writer without truncating the fingerprint prefix or encrypting object content twice
Version 3.365.0
Added
- PDF 2.0 unencrypted wrappers can carry a complete encrypted PDF as the hidden initial collection document with standard encrypted-payload metadata
- Delphi, DLL, and ActiveX APIs create, identify, inspect, and extract encrypted payloads from file, binary string, stream, or byte-array data
Changed
- Wrapper creation prevents outer encryption and PDF MAC, validates handler names, avoids source-path disclosure, and preserves payload bytes exactly
Version 3.364.0
Added
TPDFlibEUTSLTrustSourceverifies EU LOTL and national TSL XML signatures, exposes trusted-service snapshots, and supplies time-aware CA and TSA anchorsTPDFlibSignatureVerifieraccepts external trust sources and reports qualified certificate, electronic signature, electronic seal, and QSCD status with service provenance
Changed
- Trusted-list loading fails closed on unpinned signers, detached or ambiguous signatures, weak algorithms, digest changes, territory mismatches, stale lists, malformed criteria, and unbounded network or XML input
- Full TSL refreshes are transactional, while certificate-chain engines combine manual and source anchors and reuse them by trusted-list revision and verification time
Version 3.363.0
Added
TPDFlibPKCS11Clientloads PKCS #11 2.x and 3.x modules, enumerates tokens, authenticates users, pairs certificates and private keys, and signs PDF digests without CSP or KSP registration- Token, slot, mechanism, function-table, and callback types support direct module loading as well as application-managed function lists
Changed
- RSA signing constructs the required DER
DigestInfobefore rawCKM_RSA_PKCS, while ECDSA signing converts token P1363 output to DER when requested - Shared module lifetimes, persistent sessions, protected authentication paths, per-operation authentication, bounded hot-plug retries, and pre-operation session recovery improve HSM reliability and throughput
Version 3.362.0
Added
TPDFlibCSCClientdiscovers remote signing credentials, obtains hash-bound or prefetched signature activation data, and submits single or batched digest signatures through the CSC API- The client plugs directly into
OnExternalDigestSign, so remote RSA and DER ECDSA signatures reuse the existing CMS construction, signature sizing, and public-key verification path
Changed
- The built-in HTTP transport accepts caller-supplied request headers for OAuth bearer authentication while retaining response-size and phase timeout limits
- Credential, authorization, and signature responses now reject duplicate or malformed JSON fields, invalid X.509 or Base64 data, unsupported algorithms, inconsistent batch sizes, stale activation data, and SCAL hash-binding violations
Version 3.361.0
Added
VerifyAdESHistoricalandVerifyAdESHistoricalByNameautomatically derive trusted historical control times from signature timestamps and covering document timestampsTPDFlibAdESHistoricalValidationReportexposes requested and effective chain results, proof source and time, archive coverage, timestamp counts, and failure-specific status
Changed
- Historical revocation validation fails closed unless a trusted whole-document timestamp seals the current DSS and VRI evidence
- Certificate and OCSP validation times now convert to Windows file time with exact integer millisecond arithmetic, avoiding boundary drift at certificate validity transitions
Version 3.360.0
Added
SetSignatureFieldSeedValue,AddSignatureFieldSeedCertificate, andClearSignatureFieldSeedValuecreate and manage standard/SVconstraints for unsigned signature fieldsGetSignProcessSeedValueErrorreports the exact required filter, SubFilter, digest, reason, revocation-information, certificate, version, or unsupported constraint that prevented signing
Changed
- Signing now enforces required signature field seed values after opening the selected identity and before changing the field or output destination
- Unsupported required seed-value constraints fail closed, while semicolon-delimited allowed values and exact DER signer certificates are enforced consistently across Delphi, DLL, and ActiveX APIs
Version 3.359.0
Added
AddSignProcessRevocationCRLandAddSignProcessRevocationOCSPembed validation material in the signedadbe-revocationInfoArchivalattribute for traditionaladbe.pkcs7.detachedsignaturesClearSignProcessRevocationInforemoves all archival revocation material from a signing process before the signature is produced
Changed
- Bare
BasicOCSPResponsevalues are normalized to successfulOCSPResponsestructures, and byte-identical CRLs and normalized OCSP responses are deduplicated - Adobe archival revocation attributes are supported by both the Windows CryptoAPI and modern RSA, ECDSA, Ed25519, CNG, and external-digest signing paths
Version 3.358.0
Added
SetSignProcessContentsEstimatesizes signature placeholders from the base CMS, cached certificate chain, planned CRL and OCSP material, an expected RFC 3161 token, and a configurable safety marginGetSignProcessEstimatedContentsBytesreports the aligned raw-byte capacity selected for the most recent signature attempt
Changed
- New sign processes automatically discover additional certificate-chain space from local caches and apply a 15 percent margin before aligning
/Contentscapacity to 256 bytes - CNG, HSM, and external-digest signing now derive RSA, ECDSA, and Ed25519 signature sizes from the public certificate instead of reserving a fixed 16 KiB provider payload
- Automatic estimation performs no network retrieval and does not invoke a private key or external signing callback
Version 3.357.0
Added
SetSignProcessAppearanceTemplatebuilds reusable visible signature layouts from signer, reason, location, contact, date, field, page, and application-defined placeholdersSetSignProcessAppearanceVariableadds case-insensitive custom values to an individual signing process and can remove them without recreating the process
Changed
- Visible signature templates support configurable signing-time formats and escaped literal braces while preserving the existing image and document-time-stamp precedence rules
- Template expansion uses bounded input sizes and an amortised linear output buffer so large reusable layouts do not incur repeated whole-string copies
Version 3.356.0
Added
TPDFlibSignatureVerifiercan add DER or file-based X.509 trust anchors, report their duplicate-free count, and clear them without changing the Windows certificate stores
Changed
- A nonempty custom trust-anchor set now drives both signer-certificate and RFC 3161 timestamp validation through an exclusive in-memory root engine
- Clearing the custom set restores the default system trust engine for subsequent checks
Security
- Custom trust validation excludes the Windows
RootandTrustedPeoplestores, while embedded PDF and DSS certificates remain untrusted chain-building material
Version 3.355.0
Added
SetSignProcessExternalDigestSignerand its file variant build detached CMS signatures around RSA or ECDSA results supplied by an external signerOnExternalDigestSign,DLSetExternalDigestSignCallback, andSetExternalDigestSignCallbackprovide synchronous Delphi, DLL, and ActiveX callback surfaces for HSM and remote-signing integrations- External ECDSA callbacks can return either DER signatures or fixed-width P1363
r || svalues
Changed
- External signers receive only the final digest of the CMS authenticated attributes and are called once after the PDF byte ranges and attributes are complete
- Placeholder sizing uses the configured signature reserve without invoking the external signer
- Empty or oversized non-passthrough signatures now fail the sign process instead of writing an empty or truncated
/Contentsvalue
Security
- Every externally returned signature is verified against the configured X.509 certificate before it can be written into the PDF
Version 3.354.0
Added
SetSignProcessCNGKeyandSetSignProcessCNGKeyFromFilesign with named NCrypt keys from software, TPM, hardware-token, or cloud key storage providers without exporting private-key materialSetSignProcessCNGKeyByHandleaccepts a caller-ownedNCRYPT_KEY_HANDLEfor application-managed key discovery and policy workflowsSetSignProcessPrivateKeyUIcontrols whether certificate-bound providers may display PIN, consent, token, or cloud-approval interfaces
Changed
- Named and borrowed CNG keys use one direct NCrypt signing path for RSA and ECDSA detached signatures across SHA-1, SHA-2, and SHA-3 digest suites
- CNG signature placeholder sizing no longer performs a preliminary private-key operation, avoiding duplicate token prompts, remote approvals, audit entries, or provider charges
- Silent signing remains the default, while interactive mode removes silent acquisition and signing flags so external providers can complete their authentication flow
Security
- Explicit CNG identities are checked for certificate-compatible algorithm groups and the completed CMS signature is verified against the supplied certificate before it is accepted
Version 3.353.0
Added
- Detached PDF signatures can be generated and verified with ECDSA P-256, P-384, and P-521 certificates using SHA-1, SHA-2, or SHA-3 digest suites
- Ed25519 signing accepts a DER X.509 certificate with a raw seed or unencrypted PKCS #8 private key through Delphi, DLL, and ActiveX interfaces
SetSignProcessDigestAlgorithmaccepts SHA3-256, SHA3-384, and SHA3-512 as algorithm codes 5, 6, and 7
Changed
- Modern detached signatures use a canonical CMS builder with standards-aligned digest and signature algorithm identifiers instead of relying on provider-selected identifiers
- Modern-signature verification validates the detached content digest, canonical signed attributes, embedded signer identity, and public-key signature without requiring legacy CryptoAPI algorithm support
Security
- Ed25519 verification rejects non-canonical scalars, non-canonical point encodings, small-order keys, mismatched certificate identities, and modified signed attributes
Version 3.352.0
Added
EncryptPublicKeycreates AES-128 or AES-256Adobe.PubSecdocuments for multiple X.509 certificate recipients without a shared password- Recipients can be loaded from DER, PEM, PKCS #12 PFX, current-user certificate stores, or local-machine certificate stores and can receive independent PDF permission masks
- PFX and certificate-store credentials open public-key encrypted documents through the normal file, stream, and string loading APIs
- Recipient counts, permission-group counts, authentication status, and credential lifecycle controls are available through Delphi, DLL, and ActiveX interfaces
Fixed
- ActiveX type-library generation now retains the existing PDF/UA, tagged-PDF, artifact, document-language, and associated-file methods while appending the public-key APIs without moving established binary interface slots
DecryptFilereaches the direct AES-256 rewrite path without a full-reader preflight for ordinary encrypted documents while still validating PDF MAC signals before protected content is rewritten
Security
- CMS EnvelopedData is validated with bounded DER parsing, recipient permission groups are authenticated with their encrypted seed payload, and ambiguous or malformed envelopes are rejected with dedicated error codes
- Recipients sharing the same permissions are grouped into one envelope to reduce output size and key-derivation work while retaining certificate-specific key transport
Version 3.351.0
Added
SetPDFMACEnabledcreates standalone PDF MAC integrity tokens for AES-256 revision 6 and AES-GCM encrypted documents, including the required key derivation salt, permission signal, byte ranges, and CMS authentication dataGetPDFMACStatusandValidatePDFMACexpose validation results through Delphi, DLL, and ActiveX interfaces
Security
- Protected documents are verified automatically after password authentication and before pages are exposed; missing tokens, malformed DER, unsupported algorithms, incomplete coverage, key unwrap failures, and altered authentication values are rejected with dedicated error codes
EncryptFile,EncryptFileEx, andDecryptFilenow preserve PDF MAC guarantees across file-level encryption and validated decryption workflows
Version 3.350.0
Added
Encrypt,EncryptFile, andEncryptFileExaccept strength 5 to create PDF 2.0 documents with 256-bit AES-GCM authenticated encryption, revision 7 security dictionaries, and the ISO TS 32003 extension declaration- The reader and file decryption paths open AES-GCM documents and expose the new mode through
EncryptionAlgorithm,GetEncryptionLevel, andSecurityInfo
Security
- AES-GCM authentication failures now reject altered strings or streams and cause
DecryptFileto remove any partial output
Version 3.349.0
Changed
LinearizeFilenow orders large object graphs with a stableO(n log n)merge pass and traverses indirect dependencies with an explicit work stack, avoiding quadratic ordering work and one call frame per reachable object
Fixed
- The first-page section now includes annotation dictionaries and their reachable appearances, actions, and resources, allowing Fast Web View clients to display first-page annotations without fetching objects from beyond the first-page boundary
Version 3.348.2
Fixed
- The library now compiles without warnings or hints on the Win64 build. The FNV-1a string-hash initialiser exceeded
Integerrange, so its accumulator moved toCardinalwith a byte-for-byte identical masked result, and ten assignments the compiler proved were never read — plus one unused variable — were removed. No runtime behaviour changed
Version 3.348.1
Fixed
- The viewer control compiles again on Delphi XE5 and XE6. Its per-monitor DPI handler used
WM_DPICHANGED, a message constantWinapi.Messagesdid not carry before XE7, so the trial build matrix — which still targets the older toolchains — halted atPDFlibViewer.paswith an undeclared-identifier error. The constant is now declared locally only on compilers that do not already provide it, leaving the runtime DPI handling unchanged
Version 3.348.0
Added
ConvertToPDFAturns an ordinary document into an archival one in a single call: it removes what the chosen part forbids, adds what the part requires, states the part the document claims, and then checks the result- The claim is only reported as met when the check passes. A file that says it is archival and is not passes through the very systems that would otherwise have caught it, so the verdict comes from the check rather than from the attempt
GetPDFAConversionReportlists what was done and, where the document still falls short, what stands in the way
Version 3.347.1
Fixed
SanitizeDocumentnow really removes the JavaScript it reports removing. It asked the package list for an entry before the first one, got nothing, and stopped before removing a single script — so a document that had been sanitised still ran its scripts when opened- Removing the last script now also removes the empty name tree it leaves behind, which otherwise still told a reader the document carried scripts
Version 3.347.0
Added
RepairDocumentMetadatabrings the two places a PDF says who wrote it into agreement. A validator reads both the document information and the XMP packet and rejects a file where they disagree, and most files that fail on this point simply never had the XMP half written- Where only one half carries a value, the other is filled from it, so nothing already recorded is thrown away
- A document set to a PDF/A mode gets its standards identification restored if it was lost, which happens whenever a caller supplies a packet of its own. Without it a validator reads the file as an ordinary PDF and reports every rule of the claimed part as unmet
- Returns how many entries were repaired
Version 3.346.0
Added
RecolorDocumentnow converts the gradients a document paints. The gradient's colour space and the stops behind it move together, so a converted gradient reads as one colour rather than as a channel mistaken for a grey level- Gradients written inside the pattern that paints them, or inside a page's shading resources, are found as well as those given an object of their own
Changed
- A gradient built from a sampled or PostScript function is left as it stands, and so are the mesh types, which carry their colours in a stream rather than in a function. Rewriting those is a different operation from converting a colour
Version 3.345.0
Added
RecolorDocumentnow converts an indexed image by converting its colour table, leaving every sample holding the index it already held. Such an image converts whatever its samples are packed or compressed as, including the palette images that a screenshot or a chart is usually saved with
Version 3.344.0
Added
RecolorDocumentnow converts the images a page draws as well as the colours it sets, so a document turned grey no longer shows colour pictures on grey pages- Soft masks and stencil masks are left alone. Both are read as coverage rather than as colour, and converting one would leave the page showing the mask as a picture
Changed
- An image is converted when it carries eight bits a component, a device colour space, and either no compression or plain Flate. A JPEG or fax image would have to be re-encoded, which is a different operation from converting its colours, so those keep their own bytes
Version 3.343.0
Added
- Move a whole document, or a single page, into one colour space.
RecolorDocumentandRecolorPagetake 1 for grey, 2 for RGB and 3 for CMYK, and return how many colours were converted - Useful before sending work to a press that expects one space, or for turning a colour document into a grey one without redrawing it. Geometry, text and images are left exactly as they were; only the colour operators change
- A colour already set in the target space is left alone, so a page whose colours need no change keeps its original bytes
- Colours set through an ICCBased, Separation, Indexed or Pattern space are left as they stand. Converting those without reading their profile would change how the page looks rather than preserve it
Version 3.342.0
Added
- PDF/A-4 archiving, the part of the standard built on PDF 2.0.
SetPDFAModetakes three new modes: 9 for PDF/A-4, 10 for PDF/A-4e, which additionally permits 3D and rich media, and 11 for PDF/A-4f, which permits an embedded file of any format - A part 4 document is identified the way the standard asks: by part number and the year its part was published, with no conformance letter for plain PDF/A-4 and the letter E or F for the two extensions
- Every embedded file in a part 4 document states how it relates to the document, as parts 3 and 4 both require
Changed
- The PDF/A check recognises part 4, judges its files against PDF 2.0 rather than 1.7, and reports a part 4 file that does not state its revision year
Version 3.341.2
Fixed
- PDF/A-3 and PDF/UA documents now state how each embedded file relates to the document. The relationship was written only for attachments after the first and never for the last, so a document with a single attachment — the ordinary case — carried none at all and failed validation on that point
- The PDF/UA report no longer overlooks the last embedded file when checking that the relationship is present
Version 3.341.1
Fixed
- The PDF/A check now reads the standards mark a file carries. It could not, so every file was judged against part 1 whatever it declared: a valid PDF/A-2 or PDF/A-3 document was reported as carrying no mark and as being of too high a version, which is the opposite of the truth
- The mark is read whether the producer wrote it as an element or as an attribute. Both are ordinary XMP, so accepting only one form left files from other producers looking unmarked
Version 3.341.0
Fixed
- Vertical text now uses the vertical form of each character. Brackets, the long vowel mark and the small kana are drawn differently when text runs down the page, and a font names those forms itself; until now the horizontal ones were drawn, which left brackets lying across the column instead of standing along it
- The forms are taken from the font's own vertical feature, so each face supplies what its designer drew rather than a substitution guessed from the character
GetVerticalTextHeightmeasures the forms that will be drawn, so a column whose characters change shape is still measured correctly- A face naming no vertical forms is drawn exactly as before
Version 3.340.0
Added
- Vertical writing, for Japanese and Chinese text set down the page.
SetVerticalWritingModeturns it on and ordinaryDrawTextcalls then run downwards;GetVerticalWritingModereports it. Setting text vertically previously meant placing every character by hand - Text drawn this way goes through a Type0 font in vertical writing mode carrying the face's own vertical metrics, so a reader advances each character by the distance its designer intended rather than by a uniform step, and copying the text out returns the original characters
- A face that carries no vertical metrics of its own advances one em per character, which is what a reader would do with the default
GetVerticalTextHeightreports how far a string will run down the page before it is drawn, andDrawVerticalTextdraws one run vertically without changing the mode- The horizontal and vertical forms of one face are kept apart, so a page can carry both without either disturbing the other
Version 3.339.0
Added
- Automatic tagging now covers tables. With the new table bit on,
DrawTableRowscarries the table, its rows and its cells into the structure tree, so a reader can say which column a value sits in instead of reading the whole table out as a run of unrelated text SetTableHeaderRowCountnames how many leading rows are headers, andGetTableHeaderRowCountreports it. Those rows are written as header cells carrying a column scope, which is what lets a reader name the heading of the value it is on- Header rows named this way stay where they are. Repeating them at the top of each page remains a layout decision made with
DrawTaggedTableRows
Changed
AUTOTAG_DEFAULTnow covers tables as well as text, page furniture and figures. Passing the mode as a number keeps whatever it always meant
Version 3.338.0
Added
- Automatic tagging now covers images. With the new figure bit on, a drawn image becomes a figure in the structure tree, so a reader reaches it instead of passing over it in silence
RegisterFiguregives the description the next image carries. A reader reads that description in place of the picture, which is the whole of what a non-sighted reader gets from itRegisterDecorationsays the next image is a rule, border or background that carries no meaning, and it is drawn inside a layout artifact so a reader skips it rather than announcing an image that says nothing- Both settings are spent on one image, so a later one never inherits a description meant for an earlier one
Changed
AUTOTAG_DEFAULTnow covers figures as well as text and page furniture, so asking for the default asks for all three. Passing the mode as a number keeps whatever it always meant- A heading registered with
RegisterHeadingnow waits for the text it names. An image drawn in between becomes a figure and leaves the heading for the text that follows, rather than taking the heading level itself
Version 3.337.1
Fixed
- A document built with
BeginTagalone is now marked as tagged. Until now such a file carried a complete structure tree that no reader looked at, because a reader takes a document to be untagged unless the catalog says otherwise (ISO 32000-1 §14.7.1); assistive technology announced the page as if it had no structure at all - The mark is added only when a structure tree is actually written, so a document with no tags is still reported as untagged, and a
SetMarkInfosetting made by the caller is left as it stands
Version 3.337.0
Added
- Automatic structure tagging.
SetAutoTagModeturns on a mode in which ordinary drawing carries its own structure: text becomes a paragraph, text drawn straight afterRegisterHeadingbecomes a heading of that level, and running headers and footers become artifacts a reader skips. Producing an accessible document previously meant wrapping every drawing call inBeginTagandEndTagby hand - Turning the mode on also marks the document as tagged, which a reader needs before it will treat the structure as present at all
- Automatic tagging stands aside inside a tag opened by hand, so part of a document can be described by the caller and the rest left to the library, without the two nesting into each other
- Nothing is tagged inside an artifact, and empty text opens no element, so neither can produce a structure element that a reader would announce as blank
Version 3.336.0
Added
- Text flow, for running one passage across several boxes, columns or pages.
NewTextFlowtakes the text andDrawTextFlowfills a box with as much as fits, leaving the flow on the first word it could not take, so the next box carries on exactly there MeasureTextFlowreports how many lines the remaining text needs at a given width without drawing anything, so a layout can be sized before it is committed to- A box with no room for a line takes nothing and leaves the flow untouched, so offering one never loses text
SetTextFlowMinLineskeeps a set number of lines together: a box that could only take fewer takes none and pushes them on, rather than stranding a single line at the foot of a columnGetTextFlowRemaining,TextFlowFinishedandRewindTextFlowreport and reset progress; drawing a box previously dropped whatever overflowed with no way to learn what was lost
Version 3.335.0
Added
- Automatic table of contents. Headings are registered with
RegisterHeadingwhile the body is written, andDrawTOClays them out afterwards: each entry indented by its level, a run of dots reaching across to a right-aligned page number, and the whole row linking to the heading - A heading remembers where it points rather than which page number it had, so inserting the contents page in front of the finished body - which renumbers every page it refers to - leaves every entry and every link correct
MeasureTOCreports how many pages the list needs before anything is drawn, andDrawTOCreturns how many entries it placed, so a list longer than one page is drawn by calling again with the count already placedPopulateOutlineFromHeadingsturns the same headings into document bookmarks, nested by level- A title too wide for the space its page number leaves is shortened a character at a time and given an ellipsis, rather than being allowed to run under the number
Version 3.334.1
Fixed
- Selecting a page after inserting pages ahead of it reached the page that held that number before the insert, so drawing front matter into an existing document could write onto the wrong body page. Page selection now follows the new numbering
Version 3.334.0
Added
GetSignatureModificationVerdictanswers the question a reader actually has about a signed document: were the updates appended after this signature ones its certification level allows? A certifying signature carries a permission level, and the verdict checks every later revision against it, so adding validation material reads as permitted while a page rewrite does notGetSignatureEffectiveMDPLevelreports the level in force andGetSignatureModificationDetailnames the revision and the kind of change behind the answer- The verdict distinguishes "nothing was appended", "only permitted changes", "something not permitted", "could not be determined" and "the signature does not end on a revision boundary". The last of these means bytes sit inside the range the signature claims to cover
- Doubt is never reported as approval: a certification whose structure could not be verified, a field lock whose affected fields cannot be traced, a revision holding something unreadable, or bytes past the signed range that form no recognisable revision all report as undetermined rather than as permitted
Changed
- An indirect array that nothing accounts for is now reported as undetermined rather than as bookkeeping. A page's annotation or content list is an array, and rewriting one changes what the document shows while leaving every dictionary untouched
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 catalog, 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 behavior
- 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 PDF Library for Delphi 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 gray color 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 color-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 color-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 afterward, 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 cleanup 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.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 colors now write the stroking pattern color operator instead of updating the nonstroking color 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 artifact 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 behavior
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 serializes 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, color-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 color-space discovery with CSV and HTML timing reports
Version 3.136.0
Added
- Added
GetDocumentFontDiagnosticsandTPDFlibFontDiagnosticsto summarize 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 coordinate/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 coordinate, 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, color, 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, using an overlay replacement model
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