HotPDF Release Notes

Version history for HotPDF user-visible features, fixes, compatibility updates, and documentation changes

Note: Only the latest 800 change records are kept

Last release

  • Latest version: 2.974.0; Release date: 2026-10-11

Version 2.974.0

Added

  • Remove page annotations by exact page and Unicode name, including popup and reply cascades, through bounded native APIs, Windows transactions, JSON jobs and versioned callbacks with authenticated permissions and publication rollback

Version 2.973.0

Added

  • Exchange binary FDF annotations with preserved appearance resources, shared object graphs and local action destinations through native APIs, Windows interchange and versioned callbacks

Version 2.972.0

Added

  • Render annotation default appearances with preserved text state, automatic fitting, rich-text spacing and text clipping, including rendering modes 4 through 7

Version 2.971.1

Fixed

  • Prevent range-check failures in the public shaped-run cache on FPC 3.3.1 Windows builds by preserving explicit 32-bit modular hash multiplication, exact cache-key isolation and LRU eviction

Version 2.971.0

Added

  • Match root :scope and admit static hover, active and focus pseudo classes with inactive interaction state, preserving negation, logical and relative selectors, support queries and saved FDF/XFDF appearances

Version 2.970.0

Added

  • Evaluate native rich-text @supports groups and supports() imports with supported declaration and selector queries, bounded nested conditions, namespace-aware probes, cancellation recovery and computed saved FDF/XFDF appearances

Version 2.969.0

Added

  • Evaluate finite calc, min, max and clamp expressions, root-relative and explicit viewport lengths, and final-font line and spacing metrics in native rich-text decoding, saved field appearances and rich FDF/XFDF imports

Fixed

  • Admit exact minimum media dimensions, resolution and initial font sizes consistently across compiler targets while continuing to refuse values below the supported bound

Version 2.968.0

Added

  • Evaluate explicit rich-text color scheme, reduced motion, transparency and data preferences, contrast, forced and inverted colors, and scripting availability while preserving unknown omitted preferences and computed saved appearances

Version 2.967.0

Added

  • Apply caller-supplied linked and imported rich-text style sheets with shared preferred or alternate title sets, bounded URI and document-base resolution, and transactional native, Windows and Linux FDF/XFDF publication

Version 2.966.0

Added

  • Evaluate native rich-text media queries with explicit print/screen profiles, nested conditions and bounded feature ranges, retaining computed styles in saved appearances and transactional FDF/XFDF imports

Version 2.965.0

Added

  • Create, clone and edit native XFA form trees transactionally, preserving surviving node identities, event rollback, supported empty-merge occurrences and saved form packets independently of authored templates

Version 2.964.0

Added

  • Generate native plain, rich, shaped and family appearances from complete OpenType CFF2 fonts at default variation coordinates, preserving glyph identity, Unicode, widths and embedding permissions in bounded static CID-keyed CFF 1 output

Version 2.963.0

Added

  • Apply scoped CSS namespace declarations and qualified selectors to native rich-text fields and Windows/Linux form transactions, preserving computed appearances, bounded namespace lookup, exact no-op publication and checked-build compatibility

Version 2.962.0

Added

  • Wrap generated raw-font annotation text at space and hyphen boundaries across style runs, preserving complete encoded characters, hard breaks, automatic sizing and bounded cancellation

Version 2.961.0

Added

  • Render missing annotation text appearances with original Type1C, CIDFontType0C and bare Type1 font programs, preserving Unicode mappings, automatic sizing, spacing, line height and bounded immutable resources

Version 2.960.0

Added

  • Transport standard XFDF Stamp normal, rollover and down Form appearances with embedded font and image resources, bounded acyclic graphs, authenticated native transactions and existing Windows/Linux callbacks

Version 2.959.0

Added

  • Apply complex not lists, forgiving is and where lists, anchored has relations and filtered nth-child positions to native internal rich-text style sheets, preserving selector specificity, computed values, fonts and transactional FDF/XFDF appearances

Version 2.958.0

Added

  • Access live native Data DOM child collections through read-only numeric indices in JavaScript and FormCalc, preserving current child order, retained script-object references, independent clones, saved values and PDF appearances

Fixed

  • Reject numeric assignment, deletion and property definition both on current collections and inside retained lexical script objects, with bounded event rollback and retry

Version 2.957.0

Added

  • Apply attribute selectors, sibling combinators, structural and positional pseudo classes, inherited language matching and compound negation to native internal rich-text style sheets, preserving actual computed values, fonts, saved appearances and transactional FDF/XFDF imports

Version 2.956.1

Fixed

  • Resolve FormCalc nodes child-list paths through the actual event compiler, preserving live form/property collections, Data DOM item access, bounded replay, saved native values and PDF appearances

Version 2.956.0

Added

  • Generate native plain, rich and shaped field appearances from complete OpenType CFF fonts, preserving name-keyed glyph identities, actual CID-keyed charsets, Unicode mappings, embedding permissions and shared font resources; render missing FreeText appearances using embedded OpenType defaults

Fixed

  • Bound CFF parsing and glyph metrics, retain cancellation and immutable per-style readers, and preserve TrueType behavior across six native compiler targets

Version 2.955.1

Security

  • Reject all-zero X25519 and X448 shared secrets after canonical byte serialization, including low-order inputs whose weak field limbs are nonzero, and keep the agreement result false with an empty secret and a fresh diagnostic

Fixed

  • Preserve portable SHA3/SHAKE constants and intentional modulo-2^64 key-agreement arithmetic when integer overflow and range checks are enabled, including full-width P-256, P-384 and P-521 exchanges on 32-bit Free Pascal

Version 2.955.0

Added

  • Add live JavaScript form/property child collections with length, indexed reads, item, namedItem, iteration and independent clones; retain owner identity across events, repeated-instance edits and implicit property creation, with saved native values and PDF appearances

Fixed

  • Keep retained live lists attached to their current event owner, reject removed owners without retargeting another instance, and preserve native values, retained state and journal rollback under collection allocation, operation and deadline failures

Version 2.954.0

Added

  • Apply internal XHTML style sheets to native rich-text fields and FDF/XFDF imports with type, class and ID selectors, descendant and child combinators, grouped selectors, Unicode identifier escapes, specificity, importance and source order

Fixed

  • Preserve computed styles in actual saved values and widget appearances, with bounded scanning and matching, cancellation, exact committed no-op bytes and transactional callback rollback

Version 2.953.0

Added

  • Add independent XFA query node collections with all, classAll, classIndex, clone and membership operations, stable retained references, bounded transactional replay and native saved-PDF consumption

Fixed

  • Keep retained queried instance managers attached to the current event graph and evaluate ordinary SOM paths and predicates within the original default-stack and operation limits

Version 2.952.0

Added

  • Preserve remote GoToR annotation destinations through native, ordinary Windows and versioned callback XFDF exchange, including exact coordinates, Unicode file specifications and optional window behavior

Fixed

  • Authenticate ordinary loaded-document annotation imports against original encryption permissions, signatures and field locks while retaining permitted caller edits and independent source lifetime; read signature ByteRange integers without Single rounding and detach shared RC4 string storage before encryption

Version 2.951.0

Added

  • Render bounded cloudy borders for Square, Circle, Polygon and FreeText annotations without normal appearances, preserving width, dash, opacity and source graphs; share immutable generated font bytes across FreeText views without repeated decoded-byte charges while retaining parsing budgets and cancellation

Version 2.950.0

Added

  • Create, clone, rename, insert and remove native XFA Data DOM nodes with bounded ownership, inherited namespaces, stable imported references, binding refresh and complete event rollback; preserve UTF-8 attributes and retained FormCalc references through saved XML and native PDF consumers

Version 2.949.0

Added

  • Preserve the distinction between no selected choice options and a selected empty export value through native, Windows and Linux XFDF exchange, with exact no-op publication, bounded validation and checked encrypted-document loading

Version 2.948.0

Fixed

  • Render filled glyph masks with captured fractional clip coverage while preserving PDF paths, patterns, alpha and blend operators, and check raster working-memory capacity before allocation

Version 2.947.1

Fixed

  • Preserve explicit empty default XML namespace declarations during XFA parsing and serialization, preventing unqualified data subtrees from inheriting an ancestor namespace after save and reload

Version 2.947.0

Added

  • Render beveled and inset rectangular annotation borders and measured Unicode or rich line captions, preserving opacity, endpoint offsets, existing appearances, bounded font resources and annotation clipping

Version 2.946.3

Fixed

  • Apply xfa.host.resetData through native events without misreading it as a Data XML import, preserving template defaults, bound values, repeated scopes, pending edits and transactional rollback

Version 2.946.2

Fixed

  • Fix SHA-1, SHA-256, SHA-384 and SHA-512 word arithmetic with compiler range and overflow checks enabled, preserving valid digests and AES-256 password authentication without changing public interfaces

Version 2.946.1

Fixed

  • Preserve present-empty XFA attributes and UTF-8 names, values, namespaces and indexed queries through native XML serialization, persistent property defaults, repeated script events and transactional rollback

Version 2.946.0

Added

  • Render temporary rich annotation text with explicit read-only Preview/Print font permissions and unchanged full-font bytes, preserving editable embedding policies and existing Screen appearances without implicit media placeholders

Version 2.945.0

Added

  • Preserve local annotation page and named destinations through native and legacy XFDF exchange, with exact bounded decimal tokens, qualified Adobe XML, duplicate-attribute validation and transactional Windows/Linux callback publication

Version 2.944.0

Added

  • Manage live XFA choice display and export items through JavaScript and FormCalc, preserving surviving aliases, exact duplicate or empty selections, native per-instance lists and saved native or legacy PDF appearances under bounded mutation limits

Version 2.943.1

Fixed

  • Preserve exact loaded PDF bytes when native mixed scalar and typed rich-text transactions or empty batches make no changes, retaining pending graph edits, authenticated signature and encryption policies, resource limits and atomic publication

Version 2.943.0

Added

  • Exchange mapped annotation XFDF through Windows file jobs and original V1 callbacks with authenticated append transactions, bounded binary and Unicode data, exact no-op bytes and atomic publication

Version 2.942.0

Added

  • Render supported annotations without normal appearances through bounded temporary geometry, line endings, icons and Unicode FreeText, retaining source resources, rich text, view/print flags and cancellation

Version 2.941.1

Fixed

  • Validate native XFA choice selection uniqueness with bounded cancellable sorting while preserving exact case-sensitive export values, original selection order and transactional failure behavior

Version 2.941.0

Added

  • Apply independently cascaded native CSS and original typed letter and word spacing to shaped runs, physical lines, fitting and saved appearances, with computed point serialization, exact decimal rounding and transactional Windows/Linux JSON publication

Version 2.940.0

Added

  • Exchange eighteen mapped annotation types through bounded native XFDF and Linux V1 JSON operations, preserving Unicode rich contents, callouts, transparent colors, binary attachments, popup and forward-reply links, authenticated permissions and transactional append publication

Version 2.939.0

Added

  • Create legacy XFA combo and list fields with exact repeated-instance exports, display labels, selected indices, scroll positions and styled Unicode appearances, preserving high field flags and per-field rollback with a supplied-font detached choice factory and metadata-only mode

Version 2.938.0

Added

  • Render the four standard color intents across graphics states, forms, images, shadings, patterns and transparency groups with image overrides, relative fallback for unknown names and bounded cancellable ICC transform caching

Version 2.937.0

Added

  • Create independent legacy XFA radio groups from actual repeated instance scopes, preserving exact exports, selected states and styled Unicode captions with whole-group adoption rollback and a detached supplied-font native member appearance API

Version 2.936.1

Added

  • Parse valid PDF dictionaries and trailers with arithmetic overflow checking enabled by explicitly retaining the low32 bits of the FNV hash multiplication

Version 2.936.0

Added

  • Bind explicit typed JSON rich-text line heights to Windows and Linux saved appearances, preserving authored runs, supplied parent metrics, bounded aggregate planning and transactional mixed-field updates

Version 2.935.1

Added

  • Count supplementary Unicode characters once in portable XFA password appearances, retain original values and enforce aggregate glyph budgets before allocating masks with scalar-granular cancellation

Version 2.935.0

Added

  • Preserve rich-text line height, computed CSS lengths, inherited factors and parent font metrics across native layout, saved appearances, Windows file jobs and callbacks, and Linux FDF/XFDF JSON imports with bounded metric-font planning

Version 2.934.0

Added

  • Create real Unicode legacy XFA text, numeric, date and password appearances with effective per-instance font family and style, editable embedded font resources, scalar password masking and transactional resource adoption

Version 2.933.0

Added

  • Evaluate multidimensional sampled cubic color functions with the existing four-knot scalar convention, short-dimension linear fallback, bounded tensor work, cancellation and unchanged scalar interpolation

Version 2.932.0

Added

  • Decode signed and unsigned JPEG 2000 components through26 bits with mixed precision, subsampling and opacity, normalize bounded samples and ignore JPX image BitsPerComponent declarations before rendering

Version 2.931.0

Added

  • Preserve legacy XFA checkbox on, off and neutral export states, styled Unicode captions and native appearance bundles, encode special PDF names consistently, and restore direct page resources after cancelled widget adoption

Version 2.930.0

Added

  • Evaluate automatic optional-content usage applications with explicit zoom, language and user context, persistent native manual selections and bounded Linux JSON operation state; invalidate borrowed rendering contexts after document changes

Version 2.929.0

Added

  • Build scalar text, comb cells, choice labels and button marks from ordered supplied regular font families across native setters, Windows jobs and versioned Windows/Linux callbacks; preserve ordinary scalar metadata and distinguish an empty choice selection from a selected empty export

Version 2.928.0

Added

  • Render ExtGState dash arrays and phases with bounded typed PDF array scanning, preserving comments, strict operand validation, inherited stroke geometry, cancellation and ordinary text arrays

Version 2.927.0

Added

  • Paint original Windows ApplyXFAAsAcroForm push-button scalar and rich captions with actual installed family/style programs, persistent per-instance overrides and native normal/down/rollover appearance bundles, registering genuine AcroForm font resources

Version 2.926.0

Added

  • Expand bounded inline CSS font shorthand into independently cascaded size, weight, italic and supplied-family candidates, preserving inherited relative sizing, omitted-style resets, important component priorities and actual saved font appearances

Version 2.925.0

Added

  • Select ordered caller-supplied font families for complete styled rich-text graphemes through Windows file jobs and V1 callbacks, preserving CSS and typed candidates, genuine empty-value transactions and aggregate font budgets

Version 2.924.0

Added

  • Render default document optional-content groups and membership expressions across marked page content, form XObjects and annotations, preserve hidden graphics and text state, and expose explicit view or print usage through the native Linux V1 JSON interface

Version 2.923.0

Added

  • Preserve ordered rich-text font candidate lists through native appearances and Linux V1 JSON, and bind mixed scalar and original typed runs to Windows file jobs and unchanged V1 callbacks with precise paint, supplied style programs and two-phase publication

Version 2.922.0

Added

  • Select native annotation view or print visibility with PDF 2.0 Invisible rules, recognize RichMedia and Projection static appearances and implicit Text transforms, and retain bounded cancellable Windows PNG atomic replacement with actual OS error diagnostics

Version 2.921.0

Added

  • Render native XFA push-button scalar and XHTML captions with genuine supplied family and style programs, preserved inline separators and authored padding, actual normal/down/rollover appearances, caption visibility and persistent repeated-instance overrides

Version 2.920.1

Fixed

  • Keep successful native Linux C ABI PDF mutations aligned with their committed source snapshot, so following same-value FDF or XFDF imports preserve the exact published form values, typed appearances, drawn text and imported pages instead of restoring stale input bytes

Version 2.920.0

Added

  • Save mixed scalar fields and original typed rich-text runs in one independent atomic document transaction, retain precise appearance values and supplied font programs, preserve authenticated policies and current graph edits, and recognize genuine read-only appearance no-ops

Version 2.919.0

Added

  • Resolve complete styled Unicode graphemes through explicitly supplied candidate font families, preserve authored values and precise appearance styles, expose opt-in native Linux JSON fallback through unchanged V1 callbacks, and retain the actual aggregate font allowance while loading configured programs

Version 2.918.0

Added

  • Render native XFA Boolean captions from effective XHTML and supplied named style fonts, preserve repeated-instance overlays and saved runtime XML, and measure automatic caption reserves with final logical text-line extents

Version 2.917.0

Added

  • Select genuine named family and style programs for Windows FDF and XFDF imports through nested file paths or existing versioned font callbacks, and isolate synchronized random source reads from sequential transaction publication

Version 2.916.0

Added

  • Decode and render 182 built-in legacy CMaps with bounded one-to-four-byte codes, exact parent and child writing modes, Unicode mappings, deterministic malformed-code recovery, cancellable inheritance and bundled redistribution notices

Version 2.915.0

Added

  • Keep selected native XFA list options visible through font-metric selection windows and persisted top indices, preserve complete option and value arrays, and retain repeated-instance font changes and event rollback with bounded visible glyph preparation

Version 2.914.1

Fixed

  • Overlap foreground memory-cache hits with cooperative prefetch cancellation after acquiring the real memory reservation, preserve operation cache telemetry and recheck cancellation after cache-lock or reservation waits while retaining strict miss ordering and thread joins

Version 2.914.0

Added

  • Create native XFA Boolean appearances with six custom marks, round or square borders, mark colors and sizes, five caption placements and shared embedded caption fonts; preserve reversible Unicode export aliases and distinct legal neutral states through event execution and saved PDF reload

Version 2.913.2

Fixed

  • Decode complete rotated matrix barcodes before disconnected fragments and reject exact QR finder mismatches before full-grid sampling, retaining tighter grouping, original linear-bar behavior, atomic scan budgets and the unchanged two-second deadline

Version 2.913.1

Added

  • Resolve existing implicit XFA values through bounded live data contexts without repeating selector parsing charged to the script operation allowance, preserving original transaction deadlines and explicit binding behavior

Version 2.913.0

Added

  • Select configured native rich font families through unchanged Linux V1 JSON callbacks for typed fills and FDF or XFDF imports, load actual required family and style programs with aggregate budgets, and advertise both implemented rich profiles

Version 2.912.0

Added

  • Import and export real FDF or XFDF through Windows file jobs and V1 callbacks with immutable owned input, current unsaved graph preparation, actual four-font rich appearances, authenticated signed AES policies and context commit only after both output callbacks succeed

Version 2.911.0

Added

  • Create native XFA rectangle, line and arc draws and inline PNG or JPEG images with actual sample decoding, alpha masks, fitted aspect and rotated placement, bounded preparation and transactional ownership under cancellation

Version 2.910.0

Added

  • Fit NoZoom and NoRotate annotation appearances around the transformed upper-left rectangle anchor, preserving UserUnit, fitted form geometry, opacity and the actual page clip across scale and rotation

Version 2.909.0

Added

  • Select actual supplied named TrueType families per rich run and bounded XHTML font-family declaration, preserve per-family style metrics and mark caches, and import real FDF or XFDF rich values with family-aware canonical comparison

Version 2.908.1

Fixed

  • Apply valid inline rich-text declarations with independent important priority, enclosing computed font-size bases and explicit inherited properties, preserving CSS comment and quoted/function declaration boundaries

Version 2.908.0

Added

  • Create genuine native XFA combo boxes, list boxes, multi-selection fields, checkboxes and structurally scoped radio groups directly from saved runtime data, with paired display/export labels, per-instance items, access flags and independent native appearance states

Version 2.907.1

Fixed

  • Decode actual PDF hexadecimal escapes and UTF-8 bytes in name-valued and inherited form fields, preserving spaced, punctuated and Unicode button export states through native saved-document reload

Version 2.907.0

Added

  • Render real CID-keyed CFF glyph identities and bounded notdef substitutions through actual font CID-to-GID mappings, preserving independent text extraction and cancellation checks throughout escaped CMap parsing

Version 2.906.0

Added

  • Position cross-style combining marks using actual selected glyph bounds and canonical combining classes when attachment anchors are absent, with independent font scales, same-side stacking and actual resolved item directions for double marks

Version 2.905.1

Fixed

  • Resolve escaped predictor parameters within the actual DecodeParms dictionary and locate the real stream token after balanced outer dictionary syntax, preserving whitespace-valued binary xref payloads in ordinary Windows loading

Version 2.905.0

Added

  • Create native PDF page trees, repeated editable fields, push buttons and Unicode static text directly from XDP and saved runtime values on Linux and Windows, with genuine embedded appearances and bounded candidate preparation before caller output

Version 2.904.2

Fixed

  • Read actual outer cross-reference stream dictionaries without confusing nested encryption settings, resolve escaped entry names and preserve direct encryption dictionaries in ordinary Windows incremental revisions

Version 2.904.1

Fixed

  • Preserve complete paragraph direction controls and paired brackets through automatic standalone shaping and plain multiline field wrapping, with physical-line joining contexts, immutable paragraph caching and bounded total glyph output

Version 2.904.0

Added

  • Execute the native XFA JavaScript, event journal, Data DOM, XML, FormCalc and ICU locale runtime on Linux with owned shared-module leases and real monotonic clocks while preserving existing Windows Unicode initialization

Version 2.903.1

Fixed

  • Keep Unicode directional-only shaping clusters at zero character-spacing advance while retaining logical controls, glyph identities and normal visible-cluster and word spacing

Version 2.903.0

Added

  • Preserve directional embeddings, overrides, isolates and paired-bracket paragraph context across wrapped rich style lines, expose bounded paragraph-derived and cached physical-line ordering APIs and shape actual line items with resolved levels and scripts

Version 2.902.0

Added

  • Import and export styled FDF and XFDF through real Linux JSON C ABI callbacks, embed configured genuine font faces, preserve signature policies and exact private source bytes for no-op imports, and publish current document state only after both callback outputs succeed

Version 2.901.0

Added

  • Render Coons and tensor patch mesh shadings with bounded cubic geometry, source-space color interpolation, continuation edges, fold handling and transactional resource and cancellation limits

Version 2.900.0

Added

  • Load and save namespace-aware native XFA Data DOM XML transactionally, preserve ordered mixed content and data binding identities, quote host values in linear time and retain an exact per-session JavaScript module lease through bounded engine replay

Version 2.899.0

Added

  • Attach styled combining marks to actual GPOS base, ligature and mark anchors with independent font scales, preserve negative-origin glyph outlines inside rich widget clips and reserve fitting line extents for visible stacked marks

Version 2.898.0

Added

  • Read and write bounded FDF and XFDF rich text, decode native XHTML style spans into four genuine embedded font styles and transactionally import real appearances into signed or encrypted PDFs, including canonical comparison of existing read-only rich values

Version 2.897.0

Added

  • Shape selected Unicode style spans with genuine surrounding HarfBuzz context, expose native paragraph order and direction APIs and place typed rich items within actual wrapped physical lines while preserving logical styles and object ownership

Version 2.896.0

Added

  • Resolve native XFA binding SOM through repeated data scopes with bounded descendant traversal, escaped names, Unicode matching, per-instance missing-leaf fallbacks and transactional runtime value synchronization

Version 2.895.1

Fixed

  • Compile static native XFA event support once per owned JavaScript engine and replay complete compact dynamic event arguments, preserving closures, recorded host responses, instance isolation, original journal budgets and transaction deadlines during rollback

Version 2.895.0

Added

  • Import and export actual FDF and XFDF bytes through existing versioned native Linux JSON callbacks, preserve Unicode field values, AES security and authenticated signature policies, and roll back the current document after failed output or result publication

Version 2.894.0

Fixed

  • Wrap overwide typed rich text at complete Unicode grapheme boundaries across font and color styles, measure actual styled ranges before line assignment and preserve indivisible oversized clusters, mixed point sizes and explicit character spacing

Version 2.893.1

Security

  • Authenticate required Adobe signed CRL and OCSP evidence inside genuine RFC3161 document timestamps before accepting signature policy protected form updates, preserving transactional refusal for missing, revoked, expired or untrusted evidence

Version 2.893.0

Added

  • Read and write bounded native FDF and XFDF scalar field data and transactionally import real Unicode, choice and button appearances into independently published PDFs, preserving authenticated signature policies and AES encryption

Version 2.892.0

Added

  • Render bounded free-form and lattice triangle mesh shadings with genuine coordinate, flag, function, color and transparency semantics, and decode hexadecimal Indexed palette streams exactly once

Version 2.891.0

Added

  • Preserve ordered native XFA XML comments and processing instructions through event import, serialization, cloning and transactional rollback, while excluding them from scalar text, rich text and SOM element selection

Version 2.890.1

Fixed

  • Recover transient Windows atomic publication locks with at most eight cancellable replacement attempts while preserving exact targets, prepared bytes, permanent operating-system errors and owned staging cleanup

Version 2.890.0

Added

  • Preserve legal Unicode word, nonbreaking-space, punctuation and numeric groups across typed rich style runs, fit whole groups with real styled font advances, retain mixed-size baselines and coalesce CRLF across style seams

Version 2.889.0

Added

  • Synchronize materialized hidden and invisible XFA scalar aliases after visible field commits while preserving native repeated data scopes, explicit empty values and exact transactional rollback

Version 2.888.0

Added

  • Apply complete Unicode 17 properties and contextual line breaking through existing document APIs, expose raw or LB1-resolved portable property queries, preserve established enum ordinals and tailoring contracts, and honor soft-hyphen prohibitions

Version 2.887.0

Added

  • Import and serialize persistent native XFA exData XML with immediate script reads, namespace and mixed-content preservation, retained repeated-instance identities, transactional rollback and genuine saved XHTML rendering

Version 2.886.0

Added

  • Create and authenticate standalone RFC3161 PDF document timestamps with bounded streaming, SHA256, SHA384 or SHA512 imprints, trusted TSA identity and nonce binding, required ESIC extension declarations and authenticated certification or field-lock exceptions

Version 2.885.0

Added

  • Expose Unicode 17 default line-break opportunities and consume them in actual native rich fields, preserving nonbreaking-space, hyphen and punctuation groups and Unicode explicit separators with exact original V and RV values

Version 2.884.0

Added

  • Expose portable Unicode 17 default extended grapheme boundaries and wrap overwide rich words at complete clusters, retaining actual Unicode appearance content and correcting joining-form width changes after substring shaping

Version 2.883.0

Added

  • Create persistent native XFA image and geometric value children and render real PNG alpha, image DPI and aspect geometry, preserving repeated-instance isolation and transactional rollback; correct FPC image pixels that previously rendered black

Version 2.882.0

Added

  • Inherit actual child-stream font resources and PDF text parameters in Form, Type3 and Pattern rendering, preserve graphics-state text saves, honor invisible Type3 text and reset independent annotation appearance defaults

Version 2.881.0

Added

  • Automatically authenticate standard detached CAdES signatures with required signing-certificate binding and read genuine hexadecimal or escaped literal Contents strings consistently for verification, permitted form updates and long-term validation evidence

Version 2.880.2

Fixed

  • Retain rich paragraph alignment across empty initial runs, inline style changes and explicit line breaks, and paint requested rectangle or circle borders and measured highlighted rows instead of silently omitting them

Version 2.880.1

Fixed

  • Observe cancellation before page renderer allocation and context installation and during initialization, preserve an active caller color context when construction is initially rejected, and release borrowed display lists without publishing partial bitmaps

Version 2.880.0

Added

  • Render actual native XFA scalar draw and caption values after script creation, preserve explicitly empty values and repeated-instance isolation, and retain exact rollback when later native drawing exhausts its budget

Version 2.879.0

Added

  • Create persistent native XFA scalar value children with immediate field, data and shared-alias synchronization, typed form persistence, widget commits, repeated-instance isolation and exact transactional rollback

Version 2.878.0

Added

  • Generate actual Windows signature appearance profiles with embedded Unicode fonts for merged and separate widgets, rotation, encryption and certification workflows, and enforce required AppearanceFilter against the profile actually generated

Version 2.877.0

Added

  • Render actual colored and uncolored PDF tiling and shading patterns with inherited pattern origins, nested cells, overlap, stroke and stencil paints, transparency and bounded cancellation across native Linux and Windows targets

Version 2.876.1

Fixed

  • Preserve complete XFA SOM binding and actual emitted-instance data selection while applying missing-instance form and template defaults, without borrowing values from another repeated occurrence

Version 2.876.0

Added

  • Embed authenticated CRL and OCSP evidence in signed Windows Adobe RevocationInfoArchival attributes, enforce actual seed policies and validate trusted status, response authorization and freshness before publishing signatures

Version 2.875.0

Added

  • Resolve actual XFA field defaults without manufacturing data while reading, preserve explicit empty instance values and ensure edits write independent instance data without modifying shared templates

Version 2.874.0

Added

  • Edit native rich-text fields with typed Unicode style runs, actual embedded regular, bold, italic and bold-italic fonts, measured mixed-size appearance baselines, decorations and synchronized V/RV values across widgets and encrypted output

Version 2.873.0

Added

  • Create persistent per-instance XFA UI choices through native scripts and consume actual text, password and choice widgets with multiline and measured long-word appearances

Version 2.872.0

Added

  • Create actual Windows DocMDP certification signatures with P1, P2 or P3 permissions and authenticated Unicode legal attestations, honor required seed policies and FieldMDP locks, and permit subsequent signatures only where the signed policy allows them

Version 2.871.1

Fixed

  • Execute XFA event bodies in their own lexical and strict scope while preserving field aliases in the outer scope, the event this value, explicit returns and exact failure rollback

Version 2.871.0

Added

  • Create missing XFA font, paragraph, fill, color, border, edge and corner properties through actual native event scripts, persist stable per-instance form bindings with exact rollback, and regenerate optional widget appearances after effective style changes

Version 2.870.0

Added

  • Render actual native Windows Cairo output with explicit GDI standard-font outlines and correct Win32 OpenJPEG calling conventions, using reproducible pinned native dependencies and independent output acceptance

Version 2.869.0

Added

  • Sign Windows documents with real synchronous C ABI RFC 3161 transport callbacks and SHA256, SHA384 or SHA512 imprints, authenticated TSA trust and CRL checks, required timestamp seed constraints and bounded transactional publication

Version 2.868.0

Added

  • Generate masked password and literal file-select field appearances with preserved Unicode values and AES-256 policies, carry escaped supplementary Unicode through the native JSON ABI, retain subnormal PDF decimal source tokens, and create RGB prefetch buffers without a screen DC

Version 2.867.0

Added

  • Wrap XFA rich text across inline styles with measured word boundaries, explicit line breaks, shared line baselines and alignment, actual justified word gaps and fragment link geometry, preserving native repeated-instance XDP persistence

Version 2.866.1

Added

  • Authenticate raw-signature RFC 3161 tokens using their actual supported SHA256, SHA384 or SHA512 message imprint algorithm while retaining the existing SHA256 request default and full token trust and revocation checks

Version 2.866.0

Added

  • Align mixed-size XFA rich text runs to a common saved-PDF baseline, preserve the caller text-position mode, and apply the larger adjacent paragraph margin including empty paragraph transitions

Version 2.865.0

Added

  • Request and authenticate RFC 3161 timestamps for explicit SHA256, SHA384 and SHA512 message imprints without hashing the imprint again, preserving strict digest lengths, fresh nonces, bounded transport, trust chains and revocation validation

Version 2.864.0

Fixed

  • Preserve the original barcode scan deadline by prioritizing complete linear rasters and quiet-zone candidate groups, and reject invalid DataMatrix projective finder borders before sampling interior modules without changing finder tolerances

Version 2.863.0

Added

  • Honor valid inherited Windows signature seed and certificate constraints with actual digest and CAdES selection, Unicode signature information, normalized indirect field locks, authenticated historical lock permissions, permitted second signatures and encrypted form policies

Version 2.862.0

Added

  • Render actual native function, axial and radial PDF shadings with bounded geometry and function evaluation, inherited clipping, Domain, Matrix, Extend and BBox semantics, calibrated and special colors, transparency, soft masks, blending and knockout groups

Version 2.861.0

Added

  • Export actual native annotated contract review PDFs and explicit Unicode highlights with visible normal appearances, preserving source content and incremental signature revisions, enforcing authenticated P3 annotation permissions and encrypted user rights, and preparing bounded outputs before callback publication

Version 2.860.0

Added

  • Bind native Linux signing and verification options to actual digest selection, Unicode signature metadata, named appearance profiles, explicit trust bytes, timestamp transport identity and authenticated revocation evidence, with bounded private preparation before publication

Version 2.859.0

Added

  • Apply live per-instance XFA font, paragraph and scalar body overrides to actual rich text drawing and measurement, preserve inline CSS precedence and explicit empty content through native XDP persistence, and retain exact transactional rollback

Version 2.858.0

Added

  • Decode escaped PDF font, encoding, glyph, color and resource names exactly once in native rendering and shared text extraction, preserve literal hash resource keys and keep equivalent names aligned with actual outlines and glyph metrics

Version 2.857.0

Added

  • Compare native documents by page and object counts, Unicode text, normalized structural graphs and actual rendered RGB or luminance pixels, with semantic stream equivalence, authenticated encrypted inputs and bounded preparation before callback publication

Version 2.856.0

Added

  • Select actual native signature appearance presets by registered profile name, generate distinct approval, certification and compact layouts, preserve authenticated profile metadata and encrypted policies, and reject unknown profiles before publication

Version 2.855.0

Added

  • Apply native XFA property schema defaults and preserve explicit empty values, per-instance styles and fractional point font, border and draw measurements through actual AcroForm and flattened PDF output

Version 2.854.0

Added

  • Expose native XFA property and attribute objects with persistent per-instance form bindings, synchronized value/data writes and actual font, border, paragraph and UI layout effects, preserving transactional rollback and scriptless focus budgets

Version 2.853.0

Added

  • Embed genuine Adobe revocation evidence as authenticated CMS signed attributes, validate complete certificate and timestamp chains against explicit trust and current CRL or OCSP evidence before publication, and enforce required signature seed revocation embedding

Version 2.852.0

Added

  • Write authenticated Unicode legal attestations in certification signatures, honor certification-only Legal seed requirements, preserve existing legal statistics and catalog permissions, and retain encrypted string policies

Version 2.851.0

Added

  • Render physical Lab ICC source colors and bounded XYZ compatibility inputs in paths, text, packed images and Indexed palettes, preserve calibrated and ICC alternate tints through RGB or CMYK groups, and apply embedded JPX profiles with separate or associated alpha

Version 2.850.0

Added

  • Convert compatible missing-font documents to searchable text and vector PDF/A-4 with explicit bounded Ghostscript font embedding, genuine veraPDF validation and atomic publication, and select native Unicode TrueType fonts consistently across distributions

Version 2.849.0

Added

  • Render embedded simple Type1 and Type1C fonts with exact declared or built-in Adobe glyph encodings, keep ToUnicode extraction separate from displayed outlines, and accept validated neutral stroke-adjustment and relative colorimetric graphics state

Version 2.848.0

Added

  • Resolve complete XFA descendant path suffixes within each wildcard context, preserve local occurrence boundaries and execute predicates in the current event scope with exact transactional rollback

Version 2.847.0

Added

  • Enforce inherited native signature seed and certificate constraints with real issuer chains, subject and key usage policies, selectable CMS digests, encrypted Unicode signature metadata and locked-document transforms

Version 2.846.0

Added

  • Expose native XFA datasets and data nodes with bidirectional form bindings, dynamic instance data mirroring, stable retained references, independent unbound form values and transactional script replay

Version 2.845.0

Added

  • Emit authenticated FieldMDP references from existing or inherited signature field locks, preserve encrypted Unicode field names and certification references, and apply lock permission levels without weakening original signed policies

Version 2.844.0

Added

  • Render Separation and DeviceN alternate tints with bounded vector functions, packed images and CMYK group blending, preserve None knockout geometry and map All registration colors consistently

Version 2.843.0

Added

  • Resolve dynamic XFA SOM paths with inferred and relative occurrences, scoped predicates, class and descendant selectors, wildcard collections and transactional script-object property assignments

Version 2.842.0

Added

  • Provide native two-document C ABI and Pascal semantic contract comparison through a shared portable core, with source glyph geometry, encrypted and nested-content inputs, prepared JSON or HTML review output and stable concurrent lock ordering

Version 2.841.0

Added

  • Authenticate original CMS and CAdES revisions before native form updates, enforce original DocMDP and FieldMDP permissions and locked fields, preserve signed content and resources, and synchronize push-button caption metadata atomically

Version 2.840.0

Added

  • Render calibrated CalGray, CalRGB and Lab source colors, calibrated group and page blending, Indexed bases, 16-bit image samples and XYZ luminance soft masks with bounded conversion and safe gamma evaluation

Version 2.839.0

Added

  • Implement FormCalc value copying and stable node references with assignment-through-reference, rebinding and null detachment, numeric identity equality, retained handles and transactional rollback

Version 2.838.0

Added

  • Execute runtime-generated FormCalc Eval programs with isolated calculation scopes, nested evaluation, Unicode source, bounded compilation retries and transactional host response replay

Version 2.837.0

Added

  • Generate embedded Unicode appearances through native Linux JSON form filling for text, choice and multiselect fields, checkbox and radio states, and push-button captions, retaining transactional publication and encryption

Version 2.836.0

Added

  • Provide synchronous RFC 3161 timestamp transport through a compatible extended native signing operation record, with bounded responses, shared cancellation and explicit TSA trust and revocation validation

Version 2.835.0

Added

  • Execute transactional XFA host state, page and lifecycle flags, per-instance focus changes, pending-edit validation and reset operations with stable identity and lexical-state replay

Version 2.834.0

Added

  • Validate CAdES signing-certificate identifiers against the actual signer independently of optional certificate trust, and resolve embedded Encoding CMap streams through the native font adapter

Version 2.833.0

Added

  • Render vertical Identity-V and Unicode predefined CMaps with real W2/DW2 origins, matrices, text movement and clipping, and correctly decode embedded Encoding CMap streams

Version 2.832.0

Added

  • Sign through the native Linux callback ABI with PEM or bounded PFX identities, new Unicode appearance fields and certification, and retain the prepared signed document as the current context after successful publication

Version 2.831.0

Fixed

  • Apply signing seed, lock and read-only constraints consistently to encoded PDF names, reject semantic duplicate keys and validate inherited policy dictionaries

Version 2.830.0

Added

  • Execute advanced XFA numeric, calendar, text and compound picture clauses through real form events, preserving input precision, locale semantics and transactional script replay

Version 2.829.0

Added

  • Import native page resource graphs and transformed annotation appearances into plain or encrypted documents and convert compatible inputs to searchable text and vector PDF/A-4 with genuine validation before atomic publication

Version 2.828.0

Added

  • Render four-component CMYK and ICC transparency groups and page groups with all blend modes, nested knockout geometry and shared color-profile budgets

Version 2.827.0

Added

  • Execute locale-aware XFA date, time, numeric and text pictures with embedded locale sets, bounded transactional locale queries and protected JavaScript IEEE arithmetic

Version 2.826.0

Added

  • Read and write Unicode array-valued choice selections, maintain sorted option indices and generate matching appearances for visible and scrolled list-box selections

Version 2.825.0

Added

  • Sign encrypted documents through Windows JSON and C ABI jobs while preserving the original revisions, AES security settings, document IDs and signature permissions

Version 2.824.0

Added

  • Create native Linux HTML documents, insert visible or fitted searchable Unicode text, run bounded cancellable Tesseract OCR, and author independently validated raster PDF/A-4 output through Pascal and callback APIs
  • Render graphics-state Alpha/Luminosity masks, bounded transfer functions, additive transparency and page groups, knockout shapes, and extended JPEG 2000 samples, embedded color and alpha
  • Validate supplied certificate, OCSP and CRL evidence before incremental DSS/VRI publication while preserving existing signatures and AES encryption
  • Execute explicit typed XFA host and FormCalc transport callbacks with bounded requests, recorded responses and transactional replay

Fixed

  • Preserve Unicode values and exception diagnostics returned by the Free Pascal QuickJS API

Version 2.823.0

Added

  • Embed validated RFC 3161 timestamps in headless CMS signatures with message-imprint, nonce, TSA authorization, trust and supplied revocation-evidence checks, preserving destination files when a required timestamp fails
  • Retain XFA script-object lexical state, nested closures and independent repeated-instance modules with deterministic bounded transactional replay
  • Apply explicit character and word spacing to measured and generated headless Unicode text appearances

Fixed

  • Use specification-correct FormCalc At source/search argument order and return the first position for an empty search string

Version 2.822.0

Added

  • Execute general QuickJS and compiled FormCalc XFA events with live repeated-instance DOM operations, transactional standard form-packet persistence, automatic initialize/calculate/validate/ready lifecycle, bounded execution and cancellation

Fixed

  • Apply specification-correct XFA financial function parameters and cash-flow formulas, Gregorian date origins and negative remainder behavior, preserving double precision across Delphi and Free Pascal

Version 2.821.0

Added

  • Expand native headless document workflows with a versioned Linux C ABI, real callback-based text/form/render/sign operations, bounded cancellation and failure rollback, multiline/comb/rotated/choice/button appearances with HarfBuzz/FriBidi shaping, PFX identities, new visible signature fields and DocMDP certification
  • Render bounded image masks, soft masks, Indexed/ICC colors, PDF blend modes, isolated RGB transparency groups, Type3 glyphs and text clipping, and decode JPEG, JPEG 2000, CCITT, JBIG2 and RunLength image streams through the authenticated native document path

Version 2.820.0

Added

  • Fill supported native headless single-line Unicode AcroForm fields with genuine embedded TrueType appearances, exact glyph widths and CIDToGID/ToUnicode mappings, transactional multi-widget updates, preserved AES security, controlled font embedding and bounded atomic saving on Linux and Windows

Version 2.819.0

Added

  • Render supported PDF paths, horizontal text, images, Forms and existing annotation appearances to PNG with native Cairo/FreeType CPU surfaces on Linux, enforce bounded work and cancellation, preserve sources, and publish PNG files atomically

Fixed

  • Use canonical Adobe AFM advances for twelve standard Helvetica/Times/Courier styles when PDF widths are absent, preventing cumulative text-position drift from substitute font metrics while preserving explicit and embedded font widths

Version 2.818.0

Added

  • Publish genuine native headless incremental CMS/CAdES PDF signatures on Linux and Windows using existing unsigned fields and explicit PEM credentials, preserve prior revisions and AES-256 security, verify exact signed bytes, and protect existing destinations through bounded atomic publication

Version 2.817.0

Added

  • Complete bounded JSON and C ABI document jobs with validated incremental PFX signing, existing signature fields, two-document comparison, six native comparison modes and two-sided contract JSON/HTML/annotated-PDF review, including cooperative cancellation, resource limits and atomic file publication

Version 2.816.0

Added

  • Verify native headless PDF signatures with exact ByteRange/Contents binding and streaming OpenSSL 3, generate genuine detached CMS/CAdES signatures from explicit PEM credentials, and report certificate trust separately from integrity on Linux and Windows

Version 2.815.0

Added

  • Use the bounded XFA instance-presentation helper for conditional events, explicit repeated binding, independent instance presence and access, stable persisted identity, transactional reflow, host canvas painting and accessibility records

Version 2.814.0

Added

  • Open native headless AES-256 R5/R6 documents on Linux and Windows, authenticate owner/user permissions, decode encrypted compressed objects, and save encrypted incremental form values with exact source-prefix preservation and bounded atomic output

Version 2.813.0

Added

  • Reflow text in bounded page rectangles across baselines and selected shared Form invocations, change fonts and width, inspect conservative collision reports, and use sealed previews with transactional commit or rollback

Fixed

  • Preserve loaded-document edits in repeated saves after object serialization, including stream-to-file saves and retries after an output failure

Version 2.812.0

Added

  • Convert compatible loaded documents to PDF/A-4 while preserving original text, vectors, images and embedded resources, compose visible annotation/widget appearances, retain or add searchable OCR, report explicit losses, and validate preservation before atomic file publication

Version 2.811.0

Added

  • Load cross-reference streams, hybrid reference sections and compressed object streams through the native headless document API, validate bounded member indices and revision precedence, preserve exact wide numeric source values, and save source-preserving independent incremental output on Linux and Windows

Version 2.810.0

Added

  • Correct scan orientation, continuous-angle skew, shadows, borders and explicit perspective quads with bounded reversible geometry, use trusted Tesseract orientation evidence, and map OCR words, baselines, page quadrilaterals and semantic layout back to the original scan for editable structured output

Version 2.809.0

Added

  • Configure local Tesseract and RapidOCR CLI or DLL engines in JSON and C ABI OCR jobs, retain Unicode searchable text and scan pixels, discover supported adapters, validate explicit settings, and enforce rendering/recognition budgets with atomic output and failed-publication rollback

Version 2.808.0

Added

  • Load classic-xref PDFs in native Linux console applications, extract Unicode page and nested Form text with inherited resources, inspect and fill AcroForm text values, and publish source-preserving incremental output with typed diagnostics, cancellation, resource budgets, and atomic replacement

Version 2.807.0

Added

  • Locate multiple separated native barcodes in one raster, retain repeated payloads at distinct positions, decode rotated and projective ECC 200 Data Matrix symbols with four-corner geometry, and enforce aggregate scan budgets with cancellation and atomic result publication

Version 2.806.0

Added

  • Compare contract paragraphs and word or sentence edits with insert, delete, replace and move records, two-sided page locations, repeated-clause preservation, explicit boilerplate exclusions, bounded HTML review, and source-checked annotated PDF output

Version 2.805.0

Added

  • Import HTML business templates with nested flex/grid panels, wrapping rows, grid column spans, images and form controls in parallel boxes, plus explicitly supplied font-face resources retained through deferred embedding and a separate decoded-image cache budget

Version 2.804.0

Added

  • Build the shared PDF object, Direct File I/O, content and font decoding, compression, cryptography, and writer core as native Linux code with POSIX mapping and synchronization, preserving Windows APIs and correctly serializing classic xref entries

Version 2.803.0

Added

  • Register versioned invoice profile and country-rule layers, validate explicit CII XML or hybrid invoices with scope-aware reports, and execute official XRechnung 3.0.2 and French CTC invoice rules through an explicitly configured Saxon engine, with published profile selection and failure-closed diagnostics

Version 2.802.0

Added

  • Export typed tables to Office-independent XLSX workbooks through native APIs, JSON jobs, and the C ABI, preserving value types, currency and percentage formats, merged cells, exact large integers, and optional source metadata with bounded staging and failure-safe publication

Version 2.801.0

Added

  • JSON jobs and the C ABI can export selected loaded pages as semantic HTML, XHTML, XML, or JSON and typed tables as CSV or JSON, with native options, bounded staging, cancellation, signature-field compatibility, source-state preservation, and atomic file publication

Version 2.800.2

Fixed

  • Invalidate loaded form relationship caches before graph rollback so signing jobs and failed document edits leave the original document safe to query and reuse

Version 2.800.1

Fixed

  • Ordered parallel rendering now admits memory reservations in input order so later pages cannot exhaust the budget while delivery waits for an earlier page, preserving cancellation and bounded output on Delphi and FPC

Version 2.800.0

Changed

  • SVG text, loaded FreeText appearances, and loaded text replacements now preserve document shaping features, script auto-shaping flags, and GSUB script and language selections, using each selected font's OpenType data and retaining Unicode mappings across font changes

Version 2.799.0

Changed

  • SVG vector imports now retain inherited dash arrays, dash offsets, and miter limits for solid and gradient strokes, while native rendering preserves phased and zero-length dash patterns

Version 2.798.0

Changed

  • Styled Unicode text now retains bold and italic fonts through fallback layout; style-aware ResolveFontForCodePoint and AnalyzeUnresolvedGlyphs overloads match preflight to output, and FPC XML character references preserve Unicode scalars instead of corrupting text

Version 2.797.0

Fixed

  • SVG imports now composite object and group opacity through isolated vector transparency Forms, preserve independent fill and stroke alpha, and retain nested resource, clip, mask, and link behavior under explicit budgets

Version 2.796.0

Added

  • Expose bounded PDF/A-4 raster archival conversion through JSON jobs and the C ABI, with explicit information-loss acceptance, structured budget failures, cooperative cancellation, source-state restoration, and atomic file output

Version 2.795.0

Added

  • Loaded PDFs can now be normalized into validated PDF/A-4 raster documents with strict native rendering, verified sRGB color, bounded decoding and raster resources, cancellation, source alias protection, and atomic file publication; the conversion report identifies deliberately removed interactive and attached content

Version 2.794.0

Changed

  • HTML5 import now uses measured mixed-direction text lines, widow and orphan pagination, optional hyphenation, bounded flex and grid layouts, and observable CSS diagnostics; FPC native bitmaps synchronize direct GDI drawing with LCL image caches

Version 2.793.0

Changed

  • Add bounded dynamic XFA instance-manager add/remove and template presence events with layout rebinding, edit-state preservation, atomic rollback, resource limits, and persistent XDP output

Version 2.792.0

Changed

  • Expand SVG import with measured embedded Unicode fonts, PNG/JPEG resources, gradient strokes, and true Alpha and Luminosity soft masks, and correct native group alpha and FPC bitmap surface compositing

Version 2.791.0

Changed

  • Add previewable loaded Unicode text replacement with embedded fonts, wrapping and width policies, per-match diagnostics, stale-plan detection, bounded resources, atomic commits, and JSON/C ABI preview and apply operations

Version 2.790.0

Changed

  • Implement standard CFF Type 2 stack and transient-array operations in glyph rendering and preserve arithmetic-derived local and global subroutine dependencies during font subsetting

Version 2.789.0

Changed

  • Expand built-in barcode decoding with Code 128, EAN/UPC, perspective-aware QR recovery, Data Matrix ECC 200, and PDF417 with Reed-Solomon correction and bounded payload decoding

Version 2.788.0

Changed

  • Windows FPC now supports native TIFF, JPEG/JPX, ICC conversion, JBIG2 and Zopfli through an ABI-validated codec bridge, and uses actual worker threads for page, ordered-page, tile, band and JPEG 2000 tile rendering with budgets, ordered callbacks, cancellation and deterministic pixels

Version 2.787.0

Changed

  • The C ABI and JSON job processor now share schema-versioned document operations for capabilities, rendering, Unicode text and forms, OCR layers, redaction, and PFX signing, with explicit resource budgets, callback failure rollback, and atomic file outputs; multi-page callback inputs are loaded correctly

Version 2.786.0

Changed

  • Loaded FreeText editing now rebuilds embedded Unicode and rich-text appearances atomically, with wrapping, alignment, opacity, rotation, callouts, insets, and explicit overflow policies; rewritten stream payloads are captured before mutation so transaction rollback restores original text

Version 2.785.0

Added

  • The SearchableOCR console demo adds built-in OCR and Tesseract DLL or CLI engines alongside RapidOCR, generates a three-page scan sample, and exposes page selection, confidence filtering, recognition budgets, and detailed conversion statistics

Version 2.784.0

Changed

  • FDF and XFDF batch imports now roll back earlier field and annotation updates after an import failure, preserve caller-owned transactions, and clear failed interchange result metadata

Version 2.782.0

Added

  • The local Tesseract OCR adapter accepts configurable page segmentation, recognition engine mode, pixel limits, and timeouts through THPDFTesseractOptions for single-line, single-word, sparse-text, and vertical-block recognition

Fixed

  • The native Tesseract adapter uses the cross-text box dimension for predominantly vertical baselines, preventing vertical word lengths from inflating searchable PDF text sizes

Version 2.781.0

Changed

  • The Delphi and C++Builder demo collections now include a multi-page barcode field guide with business labels and a complete navigation handbook with hierarchical bookmarks, named destinations, and working companion-document links; the minimal PDF/A recipes move to Miscellaneous, and redundant standalone outline and metadata projects are retired

Version 2.780.1

Fixed

  • The Showcase annotation page separates content preview captions from live free-text and stamp appearances, preventing overlapping labels in PDF readers while keeping the examples identifiable when annotation appearances are hidden

Version 2.780.0

Changed

  • The demo catalogs now prioritize complete workflows and separate seventeen minimal, focused, or legacy examples into Miscellaneous subfolders; the redundant ImageCompression and AddDelPages projects have been removed, with their functionality retained in the main demos and regression suites

Version 2.779.0

Added

  • The Delphi and C++Builder Showcase demos now open a complete ten-chapter document studio with embedded preview, search highlighting, personalized covers, one-click review watermarks, verified page export, and AES-256 R6 protected copies that retain edits; both use the same document engine and support a window-free generation command

Version 2.778.1

Removed

  • The redundant Delphi and C++Builder TestNumeric GUI demos have been retired in favor of automated numeric regression tests that verify fractional page dimensions and drawing operands after saving and reloading uncompressed and Flate-compressed PDFs, with persisted numeric-array coverage

Version 2.778.0

Changed

  • The page and customer-report demos now provide practical workflows: PageOperations edits real PDFs through extract, delete, move, insert, and append commands with reload verification, while DBTable uses the table engine for wrapped rows, repeated headers, and automatic pagination with a database-free default sample

Version 2.777.1

Fixed

  • OCR rejects malformed UTF-8, unsupported control characters, and incompatible native detection-model outputs before publishing text, and accounts for discarded recognition results when enforcing cross-page word limits

Version 2.777.0

Fixed

  • Built-in OCR accepts blank or unrecognized pages as successful empty results so scanned-document batches can continue, preserves Windows FPC bitmap pixels, and checks cancellation and time limits throughout image analysis
  • Native RapidOCR angle classification preserves short-line aspect ratios and requires confident upside-down predictions before rotating text crops
  • The local Python RapidOCR adapter preserves recognized line spacing and punctuation instead of publishing individual characters that can gain unwanted spaces, and the Tesseract DLL adapter rejects C1 control characters before text publication

Version 2.776.0

Added

  • Scanned PDF text layers can atomically replace marked HotPDF OCR streams after saving and reloading, retain existing layers on failed or empty recognition, report replaced pages, and use a native multilingual RapidOCR console example for conversion without overwriting existing files

Fixed

  • Adjacent Latin and Cyrillic OCR words with a same-line word gap receive explicit Unicode spaces for stable phrase search and copying, while adjacent CJK words remain unseparated
  • Windows FPC JPEG scan rendering retains decoded pixels when converting to the OCR bitmap format, preventing blank recognition input from an LCL pixel-format change

Version 2.775.0

Added

  • Native RapidOCR gains local model presets for Simplified and Traditional Chinese, English, French, German, Spanish, Portuguese, Italian, Dutch, Turkish, Japanese, Korean, Russian, Arabic, and Hindi, with matched character dictionaries, verified model installation, horizontal reading order, and multilingual Unicode output in Delphi, C++Builder, and Windows FPC/Lazarus

Fixed

  • Local process OCR adapters retry temporary output cleanup when diagnostic files remain briefly locked after worker termination

Version 2.774.0

Added

  • A native RapidOCR DLL adapter keeps local ONNX models in process, recognizes bitmap snapshots without Python, supports optional angle classification and Unicode searchable PDFs, and validates output budgets with cooperative cancellation in Delphi, C++Builder, and Windows FPC/Lazarus builds

Version 2.773.0

Added

  • The local RapidOCR adapter gains explicit ONNX model configuration, optional angle classification, local character dictionaries and fonts, CPU thread controls, offline preflight, and recognition budgets for Unicode searchable PDFs in Delphi, C++Builder, and FPC/Lazarus builds

Version 2.772.1

Fixed

  • Tesseract DLL and CLI adapters now work in Windows FPC/Lazarus Win32 and Win64 builds, preserving Unicode OCR words and reading current LCL image pixels for searchable PDF text layers

Version 2.772.0

Added

  • An optional native Tesseract DLL adapter adds multilingual OCR with configurable page segmentation and engine modes, Unicode words, confidence, word bounds, and baselines, plus cooperative cancellation, recognition deadlines, and output budgets for searchable scanned PDFs

Version 2.771.1

Changed

  • Built-in OCR recognizes regular, bold, italic, and bold italic ASCII text on light or predominantly dark backgrounds, accepts faded lettering with sufficient grayscale contrast, and omits words containing uncertain retained glyphs instead of silently dropping characters

Version 2.770.175

Fixed

  • LoadedDocInspector and SignatureValidator return a failure exit code for unreadable PDFs and reject invalid command arguments instead of reporting a successful empty inspection

Version 2.770.174

Fixed

  • LoadedImageExport validates every image destination before exporting any page, preventing path aliases from overwriting the input PDF or another selected page, and rejects unsupported format names

Version 2.770.173

Fixed

  • The rendered-page disk cache skips linked document folders during recovery, lookup, storage, invalidation, and eviction, preserving files outside the cache

Version 2.770.172

Fixed

  • JSON jobs reject malformed syntax, trailing content, numbers outside the finite Double range, and excessive nesting before running any operation, releasing partially parsed values on failure

Version 2.770.171

Fixed

  • PreflightCLI checks the complete report output plan before writing, protecting input PDFs from file aliases and rejecting conflicting report destinations; recursive scans skip linked child directories to avoid cycles

Version 2.770.170

Fixed

  • CopyPage checks file identities before exporting, rejects conflicting output aliases, and keeps automatically named outputs beside extensionless inputs in directories containing periods

Version 2.770.169

Fixed

  • JSON job values preserve escaped null characters, serialize finite numbers outside the signed 64-bit range without integer overflow, and return defaults for out-of-range integer parameters without changing the process locale

Version 2.770.168

Fixed

  • Simple-object parser recovery finishes on stray closing brackets in unbracketed array bodies and preserves valid numbers and dictionary keys immediately after malformed delimiters

Version 2.770.167

Fixed

  • HotPDFCLI rejects output paths that alias input files and checks all generated paths before starting batch export, preventing commands from truncating or replacing their source data

Version 2.770.166

Fixed

  • The ExtractText example protects its input PDF when an output uses a directory junction or hard link, and LoadedImageExport reports failure for unreadable documents or incomplete page exports

Version 2.770.165

Fixed

  • Direct file reads invalidate incomplete cache refills after an I/O failure and safely bound read-ahead ranges near the signed 64-bit offset limit

Version 2.770.164

Fixed

  • RunLength decoding allocates only the decoded payload size and validates malformed runs before allocating output, avoiding excessive memory reservations for streams with early terminators

Version 2.770.163

Fixed

  • The Delphi and C++Builder examples locate bundled images, metafiles, color profiles, and optional signing fixtures from both project folders and nested build output directories

Version 2.770.162

Fixed

  • The HugeFileBenchmark examples reject generated PDF paths that match any input document before starting a benchmark batch
  • The C++Builder example preserves relative input subdirectories for generated PDFs, preventing recursive inputs with the same name from sharing an output file
  • Failed operations, memory-limit violations, and invalid zero-page loads now produce a nonzero exit code while retaining the benchmark report

Version 2.770.161

Fixed

  • The Delphi and C++Builder Preflight CLIs reject report and aggregate output paths that match an input PDF, preventing reports from overwriting source documents

Version 2.770.160

Fixed

  • ASN.1 parsing rejects high-tag-number encodings that exceed the supported 32-bit tag range instead of accepting a wrapped tag number

Version 2.770.159

Fixed

  • The C++Builder Preflight CLI preserves relative subdirectories for recursive reports and dashboard links, so PDFs with the same name no longer overwrite each other
  • The Delphi and C++Builder Preflight dashboards encode report links correctly for special characters and non-ASCII directory names
  • C++Builder standard-validation failures now return exit code 3 and appear as invalid in the dashboard for every report format, including inputs that fail to load

Version 2.770.158

Fixed

  • The C++Builder PDF merge example resolves relative input paths from the executable directory and keeps file dialogs from changing the working directory
  • Each generated bookmark now targets the first page copied from its own input document

Version 2.770.157

Fixed

  • The object parser normalizes unescaped CR and CRLF line endings inside PDF literal strings to LF while preserving escaped carriage returns and line continuations

Version 2.770.156

Fixed

  • LZW stream compression reports the actual number of bytes written for empty input
  • LZW compression and decompression round-trip correctly with InitialCodeSize set to 2, and compression rejects literals outside a reduced alphabet before writing output

Version 2.770.155

Fixed

  • In Win64 builds, importing SVG or XPS path data with a number that has an exponent close to 100, such as 1e-100 or 5e99, no longer raises a floating-point overflow when the application unmasks floating-point exceptions
  • Such numbers are now read as their actual value, so a long mantissa with a large negative exponent imports correctly

Version 2.770.154

Fixed

  • DecodeLoadedPageBarcodes now reports correct barcode bounds on pages whose CropBox differs from the MediaBox when no decode region is set; previously the positions were shifted by the crop box offset, or scaled against the wrong page height
  • Face findings from DetectLoadedRedactionFindings (with face detection enabled) now land on the detected faces on such pages, instead of being offset from them
  • Both features render the visible page area (the CropBox clipped to the MediaBox) and now map detected positions back through that same area; the page box passed to a custom IHPDFFaceDetector now matches the bitmap it receives
  • Barcode decoding with an explicit region, and pages without a CropBox or whose CropBox equals the MediaBox, are unchanged

Version 2.770.153

Fixed

  • ApplyLoadedOCRTextLayer now places the invisible text layer correctly on pages whose CropBox differs from the MediaBox; previously the searchable text was shifted by the crop box offset, or scaled against the wrong page height, so selections and search hits did not line up with the visible words
  • The OCR raster is rendered from the visible page area (the CropBox clipped to the MediaBox), and recognized word positions are now mapped back through that same area
  • The page box handed to a custom IHPDFOCREngine in THPDFOCRRequest is now the rendered visible area, matching the bitmap it receives
  • Pages without a CropBox, or whose CropBox equals the MediaBox, are unchanged

Version 2.770.152

Fixed

  • GetLoadedInvoiceSummary now returns the buyer name (BT-44) as decoded text, so names with non-ASCII letters such as "Müller & Söhne" no longer come back as raw UTF-8 bytes with the XML escape still in place
  • The buyer name is now always read from the buyer trade party itself, matching the seller name and the other summary fields
  • ValidateVisualXmlConsistency benefits as well: a buyer name with accented letters or escaped characters is now compared with the visible page text as written

Version 2.770.151

Fixed

  • THPDFTable now keeps rows tied together by a RowSpan on one page: when the group does not fit in the remaining space, the whole group moves to the next page together with the repeated header
  • A cell spanning several rows no longer runs past the bottom margin while the rows it covers continue on the next page
  • A row-span group taller than a whole page is still split row by row, with its spanning cells cut at the bottom margin of each page
  • TotalHeightRendered reflects the moved group on the last page

Version 2.770.150

Fixed

  • THPDFTable cells with a ColSpan or RowSpan of zero or less are now drawn as single cells, as the table grid already placed them, instead of pushing the following cells into the wrong columns
  • Negative spans no longer make the table read outside its grid, and spans running past the last column or row are cut at the table edge when measuring and drawing too
  • A cell whose first word is wider than the column no longer starts with an empty line, so its row is no taller than the wrapped text needs

Version 2.770.149

Security

  • XFA forms that declare an internal entity in their DOCTYPE can no longer blow up memory by referencing a large entity many times: the text substituted for internal entities is capped at 16 MB per document
  • A single internal entity value longer than 1 MB is rejected
  • Documents exceeding either limit fail to load with an EHPDFXFAError instead of expanding to gigabytes of text; ordinary entity use is unaffected
  • Text containing many entity or character references is also decoded in linear time

Version 2.770.148

Fixed

  • RecalculateLoadedFormFieldsIncremental now treats every field passed as changed the same way, whatever order the names are listed in
  • A calculated field that was written directly together with one of its source fields keeps the written value instead of being recalculated only when listed after that source
  • Fields that depend on the changed fields are still recalculated once, in calculation order

Version 2.770.147

Fixed

  • GS1-128 barcodes with start code A (THPDFBarcode type 20) now encode their data in code set A, as Code 128 A does
  • Lower-case letters in such barcodes are now written with a SHIFT to code set B instead of a set B codeword that scanners read as a control character in set A
  • Scanned GS1-128 A symbols containing lower-case text therefore return the original text

Version 2.770.146

Fixed

  • EAN-2 and EAN-5 add-on barcodes (THPDFBarcode types 18 and 19) no longer append a computed digit to Text when Checksum is enabled
  • Drawing such a barcode repeatedly now produces the same symbol each time instead of growing the text by one digit per redraw and changing the bar pattern
  • The add-on symbols carry no check character by definition, so Checksum is ignored for them; the parity pattern is still derived from the value as before

Version 2.770.145

Fixed

  • XFDF export now decodes form field values and annotation text as PDF text strings (ISO 32000-1 7.9.2.2): UTF-16BE values, hexadecimal strings and PDFDocEncoding characters such as the bullet are written as the actual Unicode text instead of hex digits or code-page garbage
  • Annotation contents, author, subject, state and overlay text exported to XFDF keep non-Latin characters, for example Chinese or Cyrillic comments
  • Rich text (/RC, /RV) that starts with an XML declaration is now embedded without it, so the exported XFDF stays well-formed XML
  • XFDF import no longer converts text through the system ANSI code page: values PDFDocEncoding can represent are stored as such, anything else as a UTF-16BE text string, for both form fields and annotation text
  • Exported XFDF files now round-trip characters outside the ANSI code page through ImportLoadedFormFromXFDF and ImportLoadedAnnotationsFromXFDF without turning them into question marks

Version 2.770.144

Fixed

  • Names and other text in the invoice summary are now decoded from the UTF-8 invoice XML, so a seller such as "Müller GmbH" no longer comes back as garbled multi-byte characters
  • Escaped markup characters and character references are resolved, so "A & B" in the XML is reported as "A & B"
  • ValidateVisualXmlConsistency no longer reports a seller name with accented letters or an ampersand as missing from the visible page text when it is printed there
  • Summary text is returned in the system ANSI code page, as the summary record's fields are ANSI strings; characters that code page cannot represent become question marks

Version 2.770.143

Fixed

  • GetLoadedInvoiceSummary now reports the invoice-level net total (BT-106) from the header monetary summation instead of the first line item's amount
  • Tax total, grand total and amount due are likewise read from the header summation, including for ZUGFeRD 1.0 invoices
  • The issue date (BT-2) is now returned as the plain date value, for example 20260305, instead of including the nested DateTimeString markup
  • HPDFFacturXXMLElementText now returns the character data of the whole element with child tags removed, and no longer matches elements whose name merely starts with the requested name

Version 2.770.142

Fixed

  • XFDF export now writes characters outside the Basic Multilingual Plane, such as emoji or rare CJK ideographs, as valid four-byte UTF-8 instead of encoding each surrogate half separately, so strict XML readers accept the file
  • XFDF import now decodes character references above U+FFFF, such as 😀, to the full character instead of truncating it to an unrelated BMP character
  • Character references that do not name a Unicode scalar value, and unpaired surrogates on export, now become U+FFFD instead of corrupting the text
  • XFDF files written by earlier versions still import correctly

Version 2.770.141

Fixed

  • Field values and annotation text containing backslashes, such as Windows paths like C:\Data\2024\001, now survive an XFDF export and import unchanged instead of having digit sequences turned into control characters
  • When a backslash would otherwise be read back as an escape, XFDF export now writes it as the octal escape \134, as in a PDF literal string (ISO 19444-1 5.8.2)
  • XFDF import only decodes the octal escapes that the format uses for control characters and backslashes; other backslash sequences from third-party files are kept literally
  • SVG text read through the same lightweight XML reader no longer loses backslash sequences either

Version 2.770.140

Fixed

  • The persistent rendered-page cache enabled by RenderCacheFolder now works for documents opened with LoadFromFile, LoadFromStream and LoadFromRandomAccessSource; before, the disk tier was skipped for ordinary loads, so no page was ever written to or read from the folder
  • Documents loaded from a file are identified by their size, last-write time and leading and trailing bytes, so reopening an unchanged file reads its pages from the cache without hashing the whole file
  • Documents loaded from a stream or a random-access source are identified by the SHA-256 of their content; set RenderCacheFolder before the load for these documents to use the disk tier
  • A document edited after it was loaded no longer reads or writes disk entries for the rest of that load, so edited pages are never served from, or stored as, the cached pages of the original file
  • Disk entries now also depend on the page render backend and the ICC proofing workflow, so a different backend or output profile does not reuse pages rendered with other settings; encrypted documents are never written to the disk cache

Version 2.770.139

Fixed

  • Importing large XFDF files no longer slows down with the square of the file size: a file with thousands of fields or annotations now parses in milliseconds instead of seconds or minutes
  • Field values with many line breaks or other character references are decoded in linear time
  • Peak memory while parsing XFDF no longer grows with the number of elements times the file size
  • SVG input read through the same lightweight XML reader benefits from the same speed-up

Version 2.770.138

Fixed

  • When DecodeLoadedPageBarcodes retries a page turned by 90 or 270 degrees, the raster handed to the decoder is now turned clockwise, as AttemptRotationDegrees documents
  • Symbols found only in those retries are now reported at their real position on the page instead of the point-mirrored position
  • The orientation reported for such symbols now matches their reading direction on the page rather than being off by 180 degrees
  • Custom barcode decoders that rely on the documented clockwise turn now receive correctly turned rasters

Version 2.770.137

Fixed

  • Copying pages between documents (CopyPageFromDocument, CopyPageByPhysicalIndex, page import and merge methods) no longer turns text strings that contain "<<" and ">>" or "[" and "]" into dictionaries or arrays; an annotation comment such as "Read <<this>> [now]" was copied as a broken dictionary
  • Hexadecimal strings, such as annotation names and identifiers, are copied in hexadecimal form instead of being written as literal strings of their hex digits

Version 2.770.136

Fixed

  • Annotations created on new pages (AddStampAnnotation, AddTextAnnotation and the other THPDFPage annotation methods) now write /Rect with the lower-left corner first, [llx lly urx ury]; several of them wrote the top edge before the bottom one, for example [395 712 575 652], which viewers accept but PDF/A validators and some processing tools reject or misread

Version 2.770.135

Changed

  • THotPDF.RenderCacheFolder is now a string (UnicodeString in Delphi 2009 and later, UnicodeString in C++Builder) instead of an AnsiString, so a cache folder whose path contains characters outside the system code page, such as a Chinese user name on an English Windows, is used as given instead of being turned into question marks
  • Code that assigns an AnsiString to the property keeps compiling; the value is converted to Unicode on assignment

Version 2.770.134

Fixed

  • SetOptionalContentGroupUsage with the Zoom category now writes the zoom range as the numbers /min and /max, as the PDF specification defines them; the whole value was written as a text string under /Min, which viewers ignore, so the layer's zoom range had no effect
  • The Zoom value is the minimum magnification optionally followed by the maximum, separated by a space (for example '0.5 4'); a value that does not start with a number now raises an exception

Version 2.770.133

Fixed

  • Subsetting embedded CFF/OpenType fonts no longer drops subroutines that glyphs still use; glyphs with more than eight hints, hstemhm hints or counter masks were scanned incorrectly, so a used subroutine could be replaced by an empty one and the glyph rendered with missing or broken outlines

Version 2.770.132

Fixed

  • RegisterNChannelColorSpace (the overload with spot colourant definitions) now writes colourant names that contain spaces or delimiters, such as "PANTONE 185 C", correctly as keys of the /Colorants, /Solidities and /DotGain dictionaries; the raw name broke the file syntax
  • AddPDFX6ExternalOutputIntentSpotData writes its solidity and spectral data colourant keys the same way

Version 2.770.131

Fixed

  • The XMP metadata written with EnableXMPMetadata now carries Title, Author, Subject and Keywords as valid UTF-8 when they hold text in the system code page (for example accented or Chinese characters assigned as AnsiString); the raw code-page bytes made the packet invalid XML, which PDF/A validators and XMP readers reject
  • Control characters that XML 1.0 does not allow are left out of these XMP values

Version 2.770.130

Fixed

  • JBIG2 images written with JBIG2Options.AccumulateGlobalsAcrossPages decode correctly again when a later page adds symbols that earlier pages did not use; such pages kept referring to the globals stream of the first page, which lacks the new symbols, so viewers showed them garbled or not at all
  • Whenever a page adds symbols, a globals stream holding the whole dictionary up to that page is written and used from then on; pages that add no symbols keep sharing the latest one

Version 2.770.129

Fixed

  • Saving a loaded document whose objects have a generation number other than 0 now writes consistent object numbers: a full rewrite (SaveLoadedDocument and related methods) writes every object, reference and cross-reference entry with generation 0, where object headers and the trailer used to keep the old generation while references and the cross-reference table used 0
  • Incremental updates (SaveIncrementalUpdate and related methods) now refer to existing objects with their real generation number; references were always written with generation 0 and therefore pointed at objects that do not exist when the original used another generation

Version 2.770.128

Fixed

  • THPDFPage.TextOutHTML with a MaxWidth no longer loses formatting at a line wrap: when several differently styled runs moved to the next line together, they were merged into one run drawn with the style in effect at the wrap, so their colour, bold or italic style, font, size, sub/superscript offset and link were lost. Each run now keeps its own formatting on the new line

Version 2.770.127

Fixed

  • InvalidateRenderedPageCache now also drops the Type 3 glyph and halftone entries shared by parallel rendering; after a whole-document invalidation the next parallel render could reuse glyphs cached for the previous content
  • PreflightLoadedPAdES no longer empties the shared rendering cache as a side effect of checking a signature's PAdES level, so renders after a preflight keep their cached glyphs

Version 2.770.126

Fixed

  • Revision and modification analysis of signed documents now reports field names correctly when the name contains parentheses or ends with one, for example "Total (net)"; the last character was cut off
  • Field names written with octal escapes or with a backslash line continuation are decoded as well

Version 2.770.125

Fixed

  • SplitPDFToFiles no longer opens each output file in the default PDF viewer when it is written; the internal documents it creates now have AutoLaunch turned off

Version 2.770.124

Fixed

  • GetLoadedTrailerID now returns the document's permanent file identifier from the trailer /ID array, as hexadecimal text; it looked for /ID in the document catalog, where it never is, and so reported no identifier for virtually every file

Version 2.770.123

Fixed

  • SetLoadedOpenActionPage now writes a destination that names the requested page; the page reference was written as 0 0 R, so viewers could not open the document at that page
  • The destination keeps the current view position (null left and top) instead of forcing 0 0, which jumped to the bottom-left corner of the page

Version 2.770.122

Fixed

  • SetLoadedViewerPreferences now writes HideToolbar, HideMenubar, FitWindow and DisplayDocTitle as boolean values; they were written as the names /true and /false, which viewers do not treat as booleans, so the preferences had no effect

Version 2.770.121

Fixed

  • CheckLoadedSignatureSeedValue now enforces a signature field's /Reasons seed value when the field's /Ff flags mark it as required (bit 4, value 8); an unlisted reason used to pass
  • Reasons are compared exactly, as text strings are in PDF; "approved" no longer satisfies a seed value that lists "Approved"

Version 2.770.120

Fixed

  • Stamping a loaded page more than once with StampLoadedPageText or StampLoadedPageShape now gives each stamp its own opacity, and each text stamp its own standard font; the second and later stamps reused the transparency and font of the first stamp on the page
  • A stamp with the same opacity and font as an earlier one still shares its resources, so repeated identical stamps do not grow the page resources

Version 2.770.119

Fixed

  • ExtractLoadedPageStructureText now follows structure elements whose /K entry is a plain marked-content number (for example /K 3 or /K [0 1]), the most common form in tagged PDFs; such elements were ignored, so the method reported no structure order for many tagged documents or returned their text in drawing order
  • The method no longer reads an invalid catalog entry when a document has no usable root object

Version 2.770.118

Fixed

  • StampLoadedPageText, StampLoadedPageImage, StampLoadedPageShape, StitchLoadedPage and FlattenLoadedAnnotations no longer break pages that inherit their resources from the parent /Pages node; they gave such a page a new, empty /Resources dictionary, which hid the inherited fonts and images so the page's original text and pictures no longer displayed
  • The page now receives its own copy of the inherited resources before the new font, image or form is added

Version 2.770.117

Fixed

  • ComposeLoadedPagesNUp, ImposeLoadedPagesNUp, ImposeLoadedPagesBooklet and the page stitching methods now carry over resources that a source page inherits from its parent /Pages node; such pages were placed without their fonts and images, so their text and pictures were missing or wrong on the composed sheet

Version 2.770.116

Fixed

  • SaveIncrementalUpdateAuthenticated can now write back to the file the incremental update was started from; the accepted update could not replace the target because the document still held the source open, and the call always failed with an access-denied commit error
  • As with an in-place SaveIncrementalUpdate, the source is released before the replacement, reopened if the replacement fails, and BeginIncrementalUpdate must be called again before another incremental save

Version 2.770.115

Fixed

  • RepairPDFUA2Structure no longer takes exponential time on structure trees whose elements are listed by more than one parent (or form a cycle); language inheritance repair, heading order repair and the marked-content scan behind alternate-text repair now walk each structure element once. A crafted tree of 24 elements each listing the next one twice previously took about 40 seconds

Version 2.770.114

Fixed

  • HPDFPaginateTable no longer adds pages until memory runs out when an unsplittable row does not fit below the repeated header rows; on a page that holds only repeated headers the row is now split (or, when the headers fill the page, placed and allowed to overflow)
  • HPDFLayoutFootnotes and HPDFLayoutEndnotes no longer loop forever when the separator leaves no room on a page or a note's minimum fragment height cannot be met on an empty page; the note is placed on that page instead

Version 2.770.113

Fixed

  • HPDFBalanceColumns no longer hangs when a splittable item has a line taller than the column height; it moved on to the next column forever. Such a line is now placed alone at the top of an empty column, overflowing it, and the layout continues

Version 2.770.112

Fixed

  • Documents encrypted with the standard security handler revision 4 (RC4 or AES-128 crypt filters) open again when their encryption dictionary omits the optional top-level /Length entry; loading failed with "Unsupported legacy Standard security handler V=4 R=4 Length=40"
  • Any top-level /Length value is accepted for such documents, since the file key is always 128 bits

Version 2.770.111

Fixed

  • ProcessObjectStreamsForDecompression and ExtractRawObjectFromStream no longer trust an object stream's declared /N count: a count above ten million is rejected and the count is limited to the object-number pairs the stream header can actually hold, so a crafted file can no longer make them allocate or walk millions of empty entries

Version 2.770.110

Fixed

  • The Direct File API (DADirectEncryptFileAES256, DADirectDecryptFileAES256 and related methods) now reads /Root, /Info, /Encrypt, /Prev and /XRefStm of a classic cross-reference section only from that section's own trailer dictionary; on incrementally updated files it could pick up a /Prev from a later revision's objects (for example an outline item) or trailer and fail or read the wrong revision
  • A /Prev chain that loops back to a section already read now stops instead of reading the same sections again

Version 2.770.109

Security

  • ApplyLoadedRedactions now removes the text under a redaction area on pages whose content is split over several streams; when one stream ended with an operator and the next began with one (for example ET followed by BT), the text after the join was matched to the wrong operands and stayed readable in the saved file although the area was painted over
  • Content streams without data are skipped consistently, so the remaining streams line up with the text that was located on the page

Version 2.770.108

Changed

  • GetLoadedOCGCount, GetLoadedOCGName, GetLoadedOCGVisibility and SetLoadedOCGVisibility now all use the same index: the position of the optional content group in the document's /OCProperties /OCGs array. Count and name used the position in the default configuration's /ON array, visibility used the position in /OFF and the setter used /OCGs, so one index could name three different groups; documents without /OCGs still fall back to the /ON array
  • GetLoadedOCGVisibility now reports a group as hidden when it is listed in /OFF, or when it is in neither array and the default configuration's /BaseState is /OFF

Fixed

  • SetLoadedOCGVisibility no longer puts the same reference object into both /OCGs and /ON or /OFF (it was released twice when the document was freed) and no longer leaks the entries it removes

Version 2.770.107

Fixed

  • CopyLoadedPage no longer makes the source and target page dictionaries share the same /Contents and /Resources entry objects; the shared objects were released twice when the document was freed or the target entry was replaced, which could corrupt memory
  • The target page now gets its own reference to the source content and resources (direct values are copied), and its rendered-page cache entry is refreshed

Version 2.770.106

Fixed

  • Loading a damaged PDF no longer leaks memory for every stream object that cannot be read, for example a stream with neither a /Length entry nor an endstream keyword, or one whose dictionary or data cannot be loaded; repeatedly opening such files made the process grow without bound

Version 2.770.105

Fixed

  • Numbers written with an empty fraction such as "21." (allowed by the PDF specification) no longer make loading fail; an indirect stream /Length written that way used to drop the whole stream, leaving the page blank
  • Numbers with a leading plus sign, an empty integer part such as ".5", or an integer part beyond the 32-bit range are read correctly as well

Version 2.770.104

Fixed

  • PDFmerge demo: with bookmarks enabled, each per-source bookmark now opens the first merged page of that source; previously every bookmark pointed at the first page of the merged file
  • PDFmerge demo: the default sample sources and output name, and any relative names typed into the form, resolve against the demo folder; adding files or choosing the output in a dialog no longer changes the current directory and breaks the relative entries

Version 2.770.103

Fixed

  • TextOut demo: the generated TextOut.pdf now really uses compressed content streams, as the demo comments promise; it sets Compression to cmFlateDecode instead of relying on the BeginDoc argument, which does not control compression

Version 2.770.102

Fixed

  • Images drawn with AlphaBlend in an enhanced metafile now keep their recorded opacity when the metafile is converted with THPDFEmfPatcher.RenderEmfDirect; they were blended with zero opacity and disappeared
  • The recorded alpha format is honoured as well, so images without an alpha channel are blended with their constant opacity instead of failing
  • Bitmap records whose header or pixel data point outside the record, or whose pixel data is shorter than the declared bitmap, are now skipped instead of being read past the record
  • Bitmaps larger than 32768 pixels on a side or 64 megapixels in total are skipped instead of being allocated in full

Version 2.770.101

Fixed

  • StitchLoadedPage, StitchLoadedPageSideBySide and StitchLoadedPageSideBySideEx now draw the source page through a Form XObject that carries the page's content, page box and resources; the page dictionary itself was registered as an XObject, which viewers cannot paint, so the stitched page did not show
  • Stitching more than one page onto the same target keeps every stitched page: each gets its own XObject name instead of all sharing one name that replaced the previous page

Version 2.770.100

Fixed

  • Form XObjects are now clipped to their /BBox when rendered, as ISO 32000-1 requires; content that a form draws outside its bounding box no longer shows on the page
  • Form XObjects nested more than four levels deep are now drawn; they were dropped as if they recursed. Nesting is allowed up to 32 levels
  • A form XObject that draws itself, directly or through other forms, is detected and the repeated call is skipped, with a recursion entry in the render diagnostics

Version 2.770.99

Fixed

  • PDFOptimize demo: the row of small rectangles on each text page is now stroked, so the bars are visible and the content stream ends every path with a painting operator as ISO 32000-1 8.5.2 requires; the reported text-PDF sizes change slightly as a result

Version 2.770.98

Fixed

  • Literal strings that contain balanced parentheses without backslashes, such as /Title (Report (draft) v2), are now read in full when a document is loaded; the string used to end at the first closing parenthesis and the rest of the dictionary was misread
  • Escaped parentheses keep working as before

Version 2.770.97

Fixed

  • Loading no longer mistakes a dictionary object for a stream when one of its string or name values contains the letters "stream" at the end of a line, such as an Info dictionary with /Title (Livestream); the object was read as a stream and its entries were lost
  • The stream keyword is now recognised only as its own token after the dictionary's closing >> and at the end of a line, as the PDF specification lays out stream objects

Version 2.770.96

Fixed

  • Stamp demo: PNG and BMP files offered by the image picker can now be used as the image stamp; previously only JPEG worked and other files failed with an invalid-bitmap error
  • Stamp demo: the rubber-stamp annotation is placed in the top-right area of each page as intended, below a top-corner image stamp, instead of the bottom-right corner where it overlapped a bottom-right image stamp
  • Stamp demo: the default input, output and image paths resolve against the demo folder, and picking a file in a dialog no longer changes the current directory, so relative names keep pointing at the same files

Version 2.770.95

Fixed

  • Timestamp requests built with a policy OID (HPDFRFC3161BuildRequest, and signing with a time stamp authority policy) now encode the requested policy as the plain object identifier that RFC 3161 specifies
  • The policy used to be wrapped in a context tag that RFC 3161 reserves for request extensions, so a strict time stamp authority rejected the request or ignored the policy
  • Requests without a policy OID are unchanged

Version 2.770.94

Fixed

  • ViewerPref demo: leaving Initial Zoom unchecked now really means "None (Default)"; the generated PDF no longer opens at fit-height, which was the component default the demo did not reset

Version 2.770.93

Fixed

  • FileAttach demo: the page-level attachment annotations are now created when the demo runs from a folder whose name has characters outside the system ANSI code page; the attached file is passed by its plain file name instead of an absolute path

Version 2.770.92

Fixed

  • HTMLText demo: an output path containing characters outside the system ANSI code page (for example a Greek or Cyrillic folder name) is now written correctly instead of failing
  • HTMLText demo: the generated PDF is no longer opened in an external reader automatically, matching the other console demos

Version 2.770.91

Fixed

  • SVG and XPS path import no longer raises EOverflow on numbers with hundreds of digits, or on long numbers combined with a large exponent; such values are rejected like any other out-of-range number
  • Affects SVG images placed through the SVG import APIs and XPS path geometry, on compilers whose floating-point exceptions are not masked
  • Ordinary numbers, including long mantissas with negative exponents, are read as before

Version 2.770.90

Fixed

  • EmfDraw demo: a failed conversion (for example a missing input metafile) now ends with exit code 1 instead of 0, so scripts and build steps that run the demo detect the failure

Version 2.770.89

Fixed

  • CJKAnnotations demo: when Arial Unicode MS is not installed, the demo now actually falls back to Microsoft YaHei; it checks the installed fonts instead of waiting for an exception that a missing font never raised, so the CJK text no longer ends up in a substituted font without CJK coverage

Version 2.770.88

Fixed

  • Content streams that nest more than 32 q operators no longer lose the enclosing graphics state: deeper saves were ignored while their matching Q still restored, so text and graphics after the nested block used the state from before an outer q
  • Affects text extraction through the content device interface and SVG export of such pages
  • Saved states now grow with the nesting depth; very deep nesting is still paired correctly

Version 2.770.87

Fixed

  • ImageDemo: the "Image zoom" bookmark now jumps to the IMAGE ZOOM heading instead of a point near the bottom of the first page

Version 2.770.86

Security

  • Opening a PDF encrypted for a recipient certificate with an elliptic-curve key (ECDH key agreement) now wipes the raw shared secret and the intermediate key derivation buffers as soon as they are no longer needed, including on the retry with the alternate byte order and on every early failure path
  • Signing with a certificate from the Windows certificate store no longer leaves crypt32.dll and advapi32.dll loaded when a required CryptoAPI function cannot be found

Version 2.770.85

Security

  • Outlining a Type 1 glyph whose charstring uses sbw with too few operands no longer reads before the operand stack; the malformed operator is ignored
  • A Type 1 charstring that ends with the escape byte of a two-byte operator no longer reads past the end of the charstring

Version 2.770.84

Fixed

  • The byte length of character codes in a CMap codespace range now comes from the length of its hex strings, as ISO 32000-1 9.7.6.2 specifies; a range such as <0000> <00FF> was treated as one-byte because its upper bound fits in a byte, which split two-byte codes when rendering and extracting text
  • Codespace ranges loaded from built-in CMaps carry their code length too

Version 2.770.83

Fixed

  • Embedding a subset of an installed TrueType font keeps every component of composite glyphs (accented letters and similar) whose components carry a scale or a 2x2 transform; the component after such a transform was misread, so it could go missing from the subset or have its glyph reference written over the transform bytes
  • Composite glyphs whose components refer to each other in a cycle, refer past the font's glyph count or point at an empty glyph no longer crash or hang font subsetting
  • In a subset, a composite glyph nested inside another composite has its component references renumbered once instead of twice

Version 2.770.82

Fixed

  • Real numbers in CFF font dictionaries (FontMatrix, FontBBox, blue values and similar) are read correctly when a byte holds a sign, decimal point or exponent next to a digit; the digit in the same byte used to be dropped, so -2.25 became -0.5
  • These values are parsed with a period as decimal separator whatever the Windows regional settings; on systems that use a decimal comma they failed with a conversion error

Version 2.770.81

Fixed

  • Text extraction and ToUnicode lookups no longer return a stale multi-character string for codes in a beginbfrange array entry that follows another array entry with multi-character targets; such codes now map to their own single character

Version 2.770.80

Fixed

  • Instantiating a TrueType variable font at chosen axis values (for example through SetVariableFontAxis) no longer distorts glyphs whose gvar data has a sparse tuple after another tuple; the sparse tuple started from the previous tuple's deltas and moved those points twice
  • Points a sparse tuple leaves out are now interpolated only from the points that tuple lists, as the OpenType gvar rules require

Version 2.770.79

Security

  • AddTiffFromFile now refuses a TIFF page whose width times height needs a raster of more than 2 GB, raising an exception instead of allocating a buffer whose size had wrapped around and letting the decoder write past its end (heap overflow)
  • A TIFF page with zero width or height is refused the same way
  • Tall TIFF pages (1200 rows or more) now report an allocation failure instead of decoding into a nil buffer

Version 2.770.78

Fixed

  • Type 3 font glyphs now follow horizontal scaling (Tz): a run drawn at 200% horizontal scale is drawn twice as wide instead of at its natural width
  • Type 3 font glyphs now follow text rise (Ts), so superscripts and subscripts set in Type 3 fonts are raised or lowered instead of staying on the baseline
  • Glyph advances were already scaled; the glyph shapes now line up with them

Version 2.770.77

Fixed

  • RFC 3161 timestamp requests built by HPDFRFC3161BuildRequest always encode the nonce as a minimal DER INTEGER; when the random nonce started with a zero byte the request carried a redundant leading zero, which strict timestamp servers reject as malformed
  • The returned nonce keeps the requested length, so callers that compare it with the timestamp response are unaffected
  • Encrypted PDF 2.0 files (AES-256-GCM) whose object streams decrypt to empty content no longer fail to load with a GCM authentication error; an empty object stream with a valid authentication tag is now accepted, while a tampered tag is still rejected

Version 2.770.76

Fixed

  • Hyperlink demo: link captions and URLs containing characters outside the system ANSI code page (for example Greek, Cyrillic or accented text) are no longer turned into question marks; captions are drawn as Unicode text with a URI link laid over them
  • Hyperlink demo: non-ASCII characters in a URL are percent-encoded as UTF-8 before they are stored in the link action, so readers open the intended address

Version 2.770.75

Fixed

  • CalRGB colours with components outside 0..1 no longer raise a floating-point exception (EInvalidOp) while rendering; the components are clipped to their valid range before the gamma is applied
  • Such colours now render as the nearest in-range colour instead of an undefined one on compilers whose floating-point exceptions are masked

Version 2.770.74

Fixed

  • Direct File API rewrites (for example DADirectEncryptFileAES256 and DADirectDecryptFileAES256) running on several threads at the same time no longer corrupt each other's output; the byte-range copy they share used one process-wide buffer

Version 2.770.73

Fixed

  • The shared revocation cache of THPDFSignatureValidationBatch now finds OCSP responses for signer certificates whose serial number has its top bit set; such responses were stored under a serial without the leading zero byte and looked up with it, so every later signature missed the cache
  • OCSP responses signed by a delegated responder, or identifying the responder by key, are now stored under the certificate issuer and can be reused by later signatures in the batch; before, they were stored under the responder name or not at all
  • Signatures that rely on evidence cached by an earlier signature in the same batch now reach a trusted verdict instead of an unknown revocation status in these cases

Version 2.770.72

Fixed

  • Looking up an embedded file by name (GetLoadedEmbeddedFileSpec, ExtractEmbeddedFileBytes, SaveLoadedEmbeddedFileToDisk and related methods) no longer overflows the stack when the document's /EmbeddedFiles name tree has nodes that list each other or themselves as /Kids
  • Each name tree node is searched once, so names reachable through a shared node are still found

Version 2.770.71

Fixed

  • PageSizes demo: the Chinese 8K and 16K format pages now print their full description on every system; the Chinese format names are given in pinyin because the descriptions are drawn in Arial, which has no CJK glyphs, and non-ASCII text turned into question marks on non-CJK code pages

Version 2.770.70

Fixed

  • Axial (Type 2) shadings now cover the whole painted area when the shading axis lies far from it, for example a gradient defined off the page edge with /Extend [true true]; such areas were left unpainted
  • Applies to the sh operator and to shading patterns used as fill or stroke colour

Version 2.770.69

Fixed

  • Navigation demo: the named destinations chapter-1 and chapter-2 now open their pages at the top, 60 points below the top edge, instead of scrolling to the bottom of the page; destination coordinates are PDF default user space with the origin at the bottom-left

Version 2.770.68

Fixed

  • Text extraction from a PDF with an embedded TrueType font no longer stalls for minutes when the font's cmap is truncated but claims thousands of segments or groups; the table length is now checked before the segments and groups are read
  • Building the glyph-to-Unicode map for an embedded TrueType font walks each cmap subtable once by segment or group instead of looking up all 65,535 BMP code points one by one, which also speeds up extraction with large CJK fonts
  • Glyph lookups through a truncated format 4 or format 12 cmap subtable stop at the end of the font data instead of scanning segments that are not there

Version 2.770.67

Fixed

  • Exponential (Type 2) and stitching (Type 3) functions now honour a one-input /Domain such as [0 0.5]; it was ignored and replaced by [0 1], so inputs were clipped to the wrong interval
  • An exponential function without /C1 now uses the default [1.0]; Separation colours and shadings defined that way rendered black
  • Exponential functions now evaluate C0 + x^N (C1 - C0) with the input itself instead of rescaling it into 0..1, matching ISO 32000-1 for domains other than [0 1]
  • Exponential function outputs are clipped to /Range only when it is present; spot colours with a Lab alternate space (L* up to 100) were clipped to 0..1 and rendered almost black
  • An exponential function whose input lies outside the values it is defined for is rejected instead of raising a floating-point exception

Version 2.770.66

Fixed

  • PKCS#12 / PFX files exported without a password by tools that derive their keys from a zero-length password now open with an empty password in HPDFParsePFX, HPDFParsePFXByLocalKeyID, HPDFEnumeratePFXIdentities and the PFX signing methods; they used to fail with an authentication error
  • With an empty password the standard encoding of RFC 7292 is tried first and the zero-length form second, for both the integrity check and the key decryption, so files that already opened keep opening the same way

Version 2.770.65

Fixed

  • The page header of the C++Builder DBTable demo now reads "Page 1" instead of "Page1"
  • An error while the C++Builder DBTable demo writes its table now closes the half-built document, so the next click starts from a clean state

Version 2.770.64

Fixed

  • The C++Builder console demos AnnotationInteraction, FormFields, CanvasDraw, EmfDraw, FormXObject, GraphicDraw, ImageDemo, ImageMask, LineGraphicsState and RtLTextOut switch to the executable folder when started without arguments, like the Delphi demos, so their input files are found and their PDFs are written there even when they are run from another directory
  • The C++Builder Graphic demos no longer send a close message to every window whose title contains the name of their output PDF, which could close unrelated windows
  • The C++Builder ImageMask demo now works like the Delphi version: it checks that Mask.bmp and Image.jpg exist, compresses its output, does not open a viewer and reports errors instead of ending with an unhandled exception
  • The C++Builder EmfDraw demo reports an error, for example a missing Sample.emf, and returns a non-zero exit code instead of ending with an unhandled exception
  • The C++Builder AddDelPages demo resolves relative input and output file names against the executable folder, like the Delphi version

Version 2.770.63

Fixed

  • The C++Builder FileAttach demo writes FileAttach.pdf next to the executable, the name the Delphi version and the readme use, instead of Output.pdf in the working directory, and keeps its FileAttach.txt attachment in the same folder

Version 2.770.62

Fixed

  • The Direct File API (DADirectEncryptFileAES256, DADirectDecryptFileAES256 and the other direct rewrite methods) now reads cross-reference stream offsets beyond 2 GiB correctly; such offsets were truncated and turned negative, so objects in the upper part of a large file could not be found
  • /Prev and /XRefStm offsets beyond 2 GiB in the trailer or cross-reference stream are followed instead of being read as 0, so older revisions and hybrid cross-reference sections of large files are no longer skipped
  • The same applies when loading a large file and when inspecting its revisions
  • New HPDFDirectReadUIntBE64 and HPDFFindNameInt64 helpers return the full 64-bit value

Version 2.770.61

Fixed

  • A cross-reference stream whose /W field widths are negative or larger than 8 bytes is now rejected instead of decoded; loading falls back to scanning the file for its objects
  • The Direct File API methods (for example DADirectEncryptFileAES256) no longer read memory outside the decoded table, and can no longer crash, on such a file; they refuse it instead

Version 2.770.60

Fixed

  • Text extraction, search and glyph positions now read the " text operator correctly: its first operand is the word spacing and its second the character spacing; the two were swapped
  • Lines written with " and a non-zero word or character spacing no longer report shifted glyph positions, which could merge or split words in extracted page text and misplace search hits
  • Page rendering was not affected

Version 2.770.59

Fixed

  • Table demo: the rows covered by the "Group A" rowspan now show their item and note in the Item and Notes columns; previously the note text was shifted one column and dropped
  • Table demo: the generated PDF is no longer opened in an external reader automatically, matching the other console demos, and output paths outside the system ANSI code page are kept intact

Version 2.770.58

Fixed

  • Decompressing Flate data into a stream no longer leaks the decoder state (about 40 KB each time) when the source or target stream raises an exception part way through, for example when a write fails or a stream reaches its size limit
  • Compressing a string no longer leaks its temporary buffer if compression raises an exception
  • Successful compression and decompression behave exactly as before

Version 2.770.57

Fixed

  • Certificates whose name constraints extension is not marked critical are no longer rejected as unreadable during signature certificate validation; a CA certificate of that kind used to make every chain through it fail to build
  • The constraints of such a certificate are now applied to the rest of the chain like critical ones, so signer names outside the permitted subtrees are still reported as a name constraint violation

Version 2.770.56

Fixed

  • PostScript calculator (Type 4) functions with deeply nested if or ifelse procedures no longer overflow the stack while rendering; such a function is treated as unusable and the colour falls back as for any other invalid function
  • Nesting is limited to 64 levels, well beyond what real calculator programs use; ordinary Type 4 tint transforms and shadings render as before
  • Evaluating calculator functions needs less stack per nesting level

Version 2.770.55

Fixed

  • E-Invoice demo: the extracted Factur-X / ZUGFeRD XML is decoded as UTF-8, so accented and other non-ASCII characters in names and addresses no longer show up garbled in the XML pane
  • E-Invoice demo: on Delphi XE2 and later the combined e-invoice verdict now decides the business-rule step, so a rule file or engine failure fails validation instead of passing silently
  • E-Invoice demo: a visible-text versus XML mismatch from the heuristic consistency check is reported as a warning and no longer fails the overall validation on its own

Version 2.770.54

Security

  • CMS signature verification (HPDFVerifyCMSSignature, HPDFVerifyCMSSignatureEx and loaded PDF signatures) now reports a malformed signature when the signed attributes lack the content-type attribute or name a content type different from the signed content, as RFC 5652 requires; such signatures used to verify as valid, which let signed attributes made for one content type be presented as signing another
  • Signatures with the content-type attribute repeated are rejected as before
  • Countersignatures, which by definition carry no content-type attribute, and RFC 3161 timestamp tokens keep verifying as before

Version 2.770.53

Fixed

  • Clicking the button of the C++Builder Annotations demo a second time no longer writes the previous document out again before the new one is started
  • An error while the C++Builder Annotations demo builds its PDF now closes the half-built document, so the next click starts from a clean state

Version 2.770.52

Fixed

  • Several documents or THotPDF instances in one process that use the same disk render cache folder now share a single cache index; previously each instance kept its own index and overwrote the others' on every save, losing the recently-used order
  • The document-count and total-size limits of the disk render cache are enforced across all instances that share a folder, so the folder no longer grows past its budget when several viewers or render threads use it at the same time
  • The same folder is recognised regardless of letter case or a trailing path delimiter

Version 2.770.51

Fixed

  • Resampling a bitmap with the bicubic or Lanczos3 kernel now works for every source pixel format; a 32-bit, 8-bit or 1-bit source used to be read as if it held 3-byte pixels, which mixed up its colour channels or read past the end of its rows
  • Such sources are converted to 24-bit first, so the resampled image has the same colours as the source; the result stays a 24-bit bitmap as before
  • 24-bit sources and the halftone kernel are unaffected

Version 2.770.50

Fixed

  • PreflightCLI demo: -d on a single PDF now writes the dashboard index even when the file fails preflight
  • PreflightCLI demo: files that raise an error during preflight are listed as failed in the dashboard index, and the exit code reflects every failed file
  • PreflightCLI demo: with -r, reports for same-named PDFs in different subdirectories are written to matching subfolders instead of overwriting each other, both with -o and in the dashboard
  • PreflightCLI demo: -f json and -f csv now produce the same schema with or without --profile / --preset / --aggregate, including the CSV spec column
  • PreflightReport demo: CSV reports generated with a profile now fill the spec column like reports without one

Version 2.770.49

Fixed

  • The C++Builder LargeFile demo now generates the benchmark input set its readme describes, like the Delphi version: LargeFile-Text.pdf, LargeFile-Image.pdf, LargeFile-Mixed.pdf and the AES-256 encrypted LargeFile-Encrypted.pdf in a BenchmarkInputs folder next to the executable; it only wrote a single 200-page LargeFile.pdf
  • The C++Builder LargeFile demo accepts the --output-dir, --scale (small, default, large, huge) and --pages options and prints the HugeFileBenchmark command for the generated folder

Version 2.770.48

Fixed

  • The C++Builder Outlines demo now writes Outlines.pdf next to the executable, the file the readme names, instead of Output.pdf in the working directory, and reports where it was saved instead of opening a viewer
  • The C++Builder Outlines demo now builds the same 10-page document with Arial page labels as the Delphi version; the page-bottom labels at y = 830 were cut off at the page edge and the "Bottom" bookmarks of the last page pointed below them
  • An error while the C++Builder Outlines demo writes the PDF no longer leaves the demo unable to create another document

Version 2.770.47

Fixed

  • The persistent disk render cache now works under folders whose names contain characters outside the system ANSI code page (for example a user profile folder with non-Latin characters); previously every page write failed there and the cache never produced a hit
  • THPDFDiskPageCache takes its root folder as a Unicode string and keeps all cache paths in Unicode, including the atomic replacement of page files and of the cache index

Version 2.770.46

Fixed

  • Region and tile rendering (RenderLoadedPageRegionToBitmap, RenderLoadedPageTiles, progressive region rendering) no longer leaves a tile blank when its only content comes from a form XObject placed away from the origin; a form now counts as covering its /BBox as placed by its /Matrix and the current transformation
  • Text placed with TD, T*, ' or " now lands on the right line when deciding which tiles contain it, so later lines of a paragraph are no longer culled from the tiles they appear in
  • Td offsets are scaled by the text matrix and measured from the start of the line, matching how the text is actually drawn
  • Character spacing, word spacing, horizontal scaling and text rise are taken into account when estimating where a text run ends, and glyphs are no longer assumed to be narrower than one em

Version 2.770.45

Fixed

  • The C++Builder MemStream demo writes MemStream.pdf next to the executable, the name the Delphi version uses, instead of Memory.pdf in the working directory
  • The C++Builder MemStream demo now reloads the in-memory PDF with LoadFromStream and checks that it has one page before saving it
  • An error while the C++Builder MemStream demo writes the PDF no longer leaves the demo unable to create another document

Version 2.770.44

Fixed

  • The C++Builder HelloWorld demo no longer sends a close message to every window whose title contains HelloWorld.pdf when it starts, which could close unrelated windows such as an editor or a file manager
  • The C++Builder HelloWorld demo writes HelloWorld.pdf next to the executable and opens it only when --open is given; like the Delphi version it accepts an output file name or --output <file>

Version 2.770.43

Fixed

  • Loading a PDF whose page tree has intermediate /Pages nodes no longer drops the pages below those nodes; such documents previously reported only the pages listed directly under the root of the tree
  • The pages keep their page tree order, so page indexes, page boxes and content match what other viewers show
  • A page whose /Type is stored as an indirect object is recognised as a page during this ordering step

Version 2.770.42

Fixed

  • Loading a PDF whose page tree refers back to itself (a /Pages node listed among its own /Kids, or two nodes listing each other) no longer crashes with a stack overflow; each page tree node is walked once and absurdly deep trees are cut off
  • A page tree node whose /Kids array or /Type name is stored as an indirect object now loads its pages instead of failing or reading invalid memory

Version 2.770.41

Fixed

  • THPDFPage.LastAnnotation now returns the link created by AddGoToLink, AddURILink, AddNamedDestinationLink, AddGoToRLink, AddLaunchLink, AddStructureDestinationLink and AddGoToRStructureDestinationLink
  • Calling SetAnnotationFlags, SetAnnotationBorderStyle or AddPopupAnnotationFor with LastAnnotation right after adding a link no longer silently does nothing or changes the previously created annotation instead

Version 2.770.40

Fixed

  • Job JSON passed to THPDFJobProcessor.Execute, HPDFDocRunJob and HPDFDocRunJobWithCallbacks is now read as UTF-8 throughout: \uXXXX escapes no longer collapse into the ANSI code page, and escaped surrogate pairs such as 😀 produce the intended character instead of two broken ones
  • Input and output file names in merge, split, optimise, encrypt and validate jobs keep characters outside the system code page, whether written as raw UTF-8 or as \u escapes, so such files are found and written under their real names
  • A malformed \u escape with fewer than four hex digits is dropped without swallowing the following characters or the closing quote
  • A UTF-8 byte order mark at the start of the job text is ignored

Version 2.770.39

Fixed

  • Object identifiers supplied by the caller when building signatures and timestamp requests (signature policy, commitment type, claimed role, timestamp policy and similar OIDs) are now encoded correctly when the first arc is 2 and the second arc is 48 or larger; the combined first value used to be cut to a single byte, producing a different, wrong identifier
  • An object identifier arc too large to represent is now rejected with an error instead of silently wrapping around to another value

Version 2.770.38

Fixed

  • HugeFileBenchmark demo: with --recursive --keep-output, PDFs that share a file name in different subdirectories no longer overwrite each other's generated files; the work directory now mirrors the input folder tree

Version 2.770.37

Security

  • Rendering a PDF with an embedded TrueType font whose composite glyphs list many components, each again a composite, can no longer hang the renderer or text-to-path export; one glyph now expands to at most 1024 components across all nesting levels
  • A composite glyph component that refers back to its own glyph is skipped instead of being expanded down to the nesting limit

Version 2.770.36

Fixed

  • A stitching (Type 3) function that refers back to itself, directly or through other functions, no longer recurses until the stack overflows; it is treated as an unusable function
  • Affects Separation and DeviceN tint transforms, shading functions and transfer functions in malformed or hostile PDFs rendered with RenderLoadedPageToBitmap and the other render paths
  • Function nesting is limited to 16 levels; legitimate documents nest far less deeply

Version 2.770.35

Fixed

  • The C++Builder PageOperations demo now runs the same workflow as the Delphi version: it also inserts a custom-size blank page with InsertLoadedBlankPage and prints the text of pages 1-3 with ExtractLoadedPagesText
  • The reordered and extracted files of the C++Builder PageOperations demo now contain the same pages as the Delphi version's, moving the last page to page 2 and extracting pages 2 and 5

Version 2.770.34

Fixed

  • The C++Builder Hyperlink demo continues on a new page when the link list does not fit on one page; links past the bottom of the first page were written outside the page
  • Add, Remove and Make PDF in the C++Builder Hyperlink demo are disabled while the PDF is written, so the link list can no longer change, and the document cannot be started a second time, in the middle of generation

Version 2.770.33

Fixed

  • The C++Builder Stamp demo now places the text watermark and the rubber-stamp annotation relative to each page's size; on landscape and other non-A4 pages the stamp annotation fell outside the page and the watermark drifted off-center

Version 2.770.32

Fixed

  • Each button of the C++Builder ViewerPref demo now starts from a fresh document; the reading direction, initial zoom and other viewer preferences of an earlier click stayed in effect, so for example Create PDF after Test Direction still wrote right-to-left text and preferences that were no longer selected
  • The C++Builder PDF_INFO demo now writes PDFInfo.pdf next to the executable, the file name the Delphi version and the readme use

Version 2.770.30

Security

  • Certificate path validation (HPDFValidateCMSCertificatePath, the online variant and signature batches) can no longer be stalled by a signature that embeds many certificates sharing one name and key; such a set used to make the path search try every possible ordering, which grows factorially and could keep a validation busy for hours
  • Each issuer signature in a candidate chain is now verified once per validation and its result reused, instead of being verified again for every path that passes through it
  • The path search is capped at a fixed amount of work; when the cap is reached the validation reports that no valid path reaches a trust anchor, and ordinary chains stay far below it

Version 2.770.29

Fixed

  • ImportLoadedInterchangeFromFDF now matches whole key names when it reads annotations and the FDF status: /T no longer stops at /Type or /Text, /F no longer at /FreeText, and /Status no longer at a longer key that starts the same way, so imported annotations keep their author and flags
  • Keys of nested dictionaries inside an imported annotation, and key-like text inside strings, are no longer taken for the annotation's own entries
  • Literal strings in imported FDF annotations and status decode all escapes defined by ISO 32000-1: \t, \b, \f, octal \ddd and backslash line continuations, in addition to \n, \r and escaped parentheses

Version 2.770.28

Fixed

  • In builds made with Delphi versions before XE2, which use the bundled PNG reader, loading a PNG file with a compressed text (zTXt) chunk no longer reads past an internal buffer; text longer than 256 bytes came out corrupted and far too long, and large chunks could crash
  • The compression method of a compressed text chunk is now read from the correct byte, so chunks with an unsupported method are ignored instead of being decoded as if they were deflate data
  • Truncated or malformed compressed text no longer risks an endless decoding loop
  • Builds with Delphi XE2 and later use the system PNG reader and are unaffected

Version 2.770.27

Changed

  • The C++Builder SearchAndSelect demo now works like the Delphi version: it creates a sample PDF, loads it, finds the search term with SearchLoadedDocumentText and adds a highlight annotation over every match with AddLoadedHighlightAnnotation
  • The C++Builder SearchAndSelect demo accepts an input PDF, a search term, an output file and the --case-sensitive and --whole-word options, and checks the saved copy for the new annotations

Fixed

  • The highlights of the C++Builder SearchAndSelect demo now cover the matched words; they were placed one line too high because the text position was taken as the baseline instead of the top of the text

Version 2.770.26

Fixed

  • The C++Builder DigiPrint demo now starts on systems whose decimal separator is a dot; the comma decimals in demo.xml were parsed with the system locale and raised an error while the form was created
  • The DigiPrint demo reads demo.xml and its two JPEG icons from the executable folder and writes demo.pdf there, and the project now places the executable in the demo folder next to those files
  • The footer page icons of the DigiPrint demo are drawn inside the footer row instead of below the page's bottom rule, and the title, year and footer text use the report style's font sizes
  • Clicking the DigiPrint button more than once no longer shifts the left margin further to the right with every click
  • An error while the DigiPrint demo builds the PDF, such as a missing image file, no longer leaves the demo unable to create another document

Version 2.770.25

Fixed

  • Showcase demo: header bands, the cover background, the gradient swatches and the back-page accent now line up with the shapes they fill; gradient coordinates are given in PDF default user space (origin bottom-left), so the colours are no longer shifted or flipped
  • Showcase demo: Save Copy no longer switches the working file, so Regenerate and Open External keep using the main gallery instead of the last copy written
  • Showcase demo: when generating the gallery fails, the viewer is rebound and keeps showing the last gallery that loaded instead of staying blank
  • Showcase demo: output paths with characters outside the system ANSI code page are passed through unchanged

Version 2.770.24

Fixed

  • Loading a JPEG 2000 image with four components (RGB plus alpha, or YCC plus alpha) into a TJpeg2000Bitmap now puts red, green, blue and alpha into the right bytes of the 32-bit bitmap; previously the colour channels were shifted by one byte and the alpha channel overwrote one of them
  • This also fixes a round trip of a 32-bit TJpeg2000Bitmap through SaveToStream and LoadFromStream, which came back with mixed-up colours
  • Three-component colour images, grayscale images and four-component CMYK images load as before

Version 2.770.23

Security

  • A text string whose value starts with << and ends with >> (for example a title, author, form field value or annotation text such as "<<URGENT>>") is now always saved as a string; it was written out verbatim, which broke the file syntax and let crafted text inject a dictionary such as an action into the saved document
  • Applies to new documents and to loaded documents saved with SaveLoadedDocument and related methods

Version 2.770.22

Fixed

  • The C++Builder Barcodes demo writes Barcodes.pdf next to the executable instead of into the current working directory, and accepts an optional output file name as its only argument
  • The C++Builder Barcodes demo no longer opens a PDF viewer after it runs, and like the Delphi version compresses its page content and opens at fit-height zoom
  • Errors in the C++Builder Barcodes demo are reported with their message text; the console showed a memory address instead

Version 2.770.21

Fixed

  • In the stable C ABI, calling hpdf_document_destroy while another call on the same handle is still running (from another thread, or from inside a read, write, progress or cancellation callback) no longer frees the document under that call
  • The handle becomes invalid as soon as hpdf_document_destroy returns; the document itself is released when the last running call on it finishes
  • Calls that look up a handle concurrently with its destruction get HPDF_STATUS_INVALID_HANDLE instead of touching freed memory

Version 2.770.20

Security

  • Shaping text with a TrueType/OpenType font whose GSUB contextual lookups reference themselves no longer overflows the stack and crashes; the nesting depth now really accumulates across levels
  • A contextual rule that fires many nested lookups can no longer multiply them into a near-endless loop: each top-level match runs at most 1024 nested lookups

Fixed

  • A chaining contextual substitution (GSUB lookup type 6) reached from another contextual lookup is now applied; it was read with the plain contextual layout and never matched, so some ligatures and contextual forms were missing
  • A reverse chaining substitution (GSUB lookup type 8) referenced from a contextual rule is skipped as the OpenType specification requires, instead of being misread as a contextual subtable

Version 2.770.19

Fixed

  • RenderLoadedPageToDC no longer raises an access violation when the page contains an image XObject or an inline image; the images are drawn into the caller's device context
  • GetLoadedPageMetafile no longer fails on pages with images, and the images are recorded in the returned metafile
  • Image clipping against the visible surface now uses the size passed to RenderLoadedPageToDC when the device context has no clip region

Version 2.770.18

Fixed

  • JBIG2 halftone regions with grid skipping enabled no longer drop grid cells that start left of or above the region but still overlap it; such cells were treated as lying far outside, their gray values were skipped, and the remaining cells of the region were decoded out of step
  • Negative grid coordinates that are not whole pixels are now rounded toward minus infinity as the JBIG2 specification requires, so partly visible cells land on the correct pixel
  • Halftone regions whose grid lies entirely at non-negative coordinates are unaffected

Version 2.770.17

Fixed

  • OCSP responses whose responder is identified by key hash in the standard RFC 6960 form (an explicit [2] tag around the key hash) are accepted again; certificate path validation used to discard them, so revocation stayed unknown for every responder that names itself by key
  • Both direct responders (the issuing CA) and delegated OCSP signing certificates identified by key are matched, and the older implicitly tagged form keeps working
  • HPDFDescribeValidationEvidence now keys OCSP descriptors by the DN of the certificate issuer named in each response, resolved from the response's issuer name hash, instead of by the responder DN; responses from delegated responders and responses identified by key now produce descriptors that a lookup by certificate issuer can find
  • Added an HPDFDescribeValidationEvidence overload that takes the CMS signature and extra issuer certificates, for responses that identify the responder by key and embed no certificate

Version 2.770.16

Fixed

  • Viewer demo: the form no longer raises an access violation on startup; the status bar now exists before the viewer is bound to the document and starts reporting page changes
  • Viewer demo: pressing Enter in the search box now activates the first match instead of skipping straight to the second one
  • Viewer demo: bookmarks without a resolvable destination page are listed without a bogus "(p0)" suffix, and clicking them no longer raises a range error

Version 2.770.15

Fixed

  • The decryption step of the C++Builder Security demo now really opens the encrypted sample with the user password "user"; the password argument was taken as the automatic-decryption flag, so the sample was loaded without its password and Security-Decrypted.pdf was not a decrypted copy

Version 2.770.14

Fixed

  • A clipping path set with W or W* now takes effect after the path is painted, as ISO 32000-1 requires, instead of before it
  • Stroking a path that also sets the clip (re W S) now paints the whole line width; the outer half of the stroke was cut away by the path's own clip
  • Fill-and-stroke with an even-odd clip (W* B) now fills with the painting operator's own winding rule; the even-odd clip used to punch holes into the fill
  • B* and b* now always fill with the even-odd rule, independent of the fill rule left over from an earlier operation

Version 2.770.13

Fixed

  • JBIG2 halftone regions whose gray-scale planes are MMR-coded now decode; previously the planes came out inverted, only every eighth column was read, and the end of each plane was located at the wrong byte, so the following planes were decoded from the wrong position
  • The end-of-block marker after each MMR plane is recognised whether it follows the last row directly or after byte padding, and every plane now starts on the byte boundary that follows
  • Arithmetic-coded halftone regions are unaffected
  • Applies to PDF images with the JBIG2Decode filter that are loaded, extracted or rendered with the built-in decoder

Version 2.770.12

Fixed

  • JSON produced by the job processor (THPDFJobProcessor.Execute, HPDFDocRunJob, HPDFDocRunJobWithCallbacks) and by the document comparison now escapes quotes and backslashes as \" and \; the previous \x22 / \x5C forms are not valid JSON and made standard parsers reject results that contained a quote or a Windows path
  • Control characters are written as \uXXXX escapes and the output is always well-formed UTF-8: bytes that are not valid UTF-8 are replaced with U+FFFD instead of being copied into the result
  • Error messages in job results and in the comparison error object are encoded as UTF-8, so non-English exception text and file names no longer arrive in the ANSI code page

Version 2.770.11

Fixed

  • RedactLoadedRect, StampLoadedPageText, StampLoadedPageImage, StampLoadedPageShape, StitchLoadedPage and FlattenLoadedAnnotations no longer throw away a page's existing content when its /Contents is an array of streams; the new operators are added as an extra stream at the end of the array, or at the front for an underlay
  • Underlay stamps on a page whose content is split over several streams keep every original stream
  • Pages whose single content stream uses a filter other than plain FlateDecode (ASCIIHex, ASCII85, LZW, RunLength, filter chains or Flate with a predictor) are now decoded before new operators are appended, so the stamp, redaction box or flattened appearance is actually painted and the original content stays readable
  • When a page's content stream cannot be decoded at all it is left untouched and the new operators are written to a separate stream instead of being appended to the encoded bytes

Version 2.770.10

Security

  • Rendering a PDF whose embedded CFF font (FontFile3, Type1C or CIDFontType0C) stores an INDEX offset of 0x80000000 or more no longer reads memory outside the font data; such offsets were treated as negative and passed the bounds checks
  • Embedded TrueType fonts get the same treatment for glyph locations and table lengths of 0x80000000 or more: the glyph or the font is skipped instead of being read from the wrong place
  • A CFF glyph whose subroutines call each other many times over can no longer hang rendering or text-to-path export; each glyph now has a fixed budget of charstring operations, far above what real fonts use

Version 2.770.9

Fixed

  • JBIG2 images whose text regions use Huffman coding together with symbol refinement in the 13-pixel template now decode; the refinement adaptive-pixel bytes in the region header were skipped, so the instance count and every following field were read from the wrong offset and the image was rejected
  • Text regions with arithmetic coding, or with the 10-pixel refinement template, are unaffected and decode exactly as before
  • Applies to PDF images with the JBIG2Decode filter that are loaded, extracted or rendered with the built-in decoder

Version 2.770.8

Security

  • With codec isolation enabled, the size of a decoded image returned by the isolated codec worker is now checked against the configured output limit and the shared memory the host process allocated, instead of a capacity field the worker itself can overwrite
  • A compromised or faulty worker can no longer make the host copy past the end of the shared memory block; such a reply is rejected as a protocol error and the image is not drawn from it
  • The worker's reply is copied once and validated from that copy, so its header cannot change between the checks and the pixel copy

Version 2.770.7

Fixed

  • OCSP requests built for live revocation checking (HPDFCollectCMSRevocationRequests and the online certificate path validation) now encode the SHA-256 algorithm identifier of the CertID correctly; before, the first two object identifier arcs were written as separate bytes, so the hash algorithm was invalid
  • OCSP responders that reject malformed requests now answer these requests with a normal status instead of an error, so online revocation checks no longer fall back to offline evidence because of the request encoding

Version 2.770.6

Fixed

  • Rendering a Type 3 font now paints every occurrence of a glyph; previously a glyph repeated in the same text run, or anywhere else on the page with the same size and orientation, was painted only the first time and left blank afterwards
  • Affects RenderLoadedPageToBitmap, RenderLoadedPageToDC, page metafiles and the image export paths, with or without the shared render cache
  • Repeated Type 3 glyphs keep using the glyph cache, so the fix does not re-read the glyph procedure for each occurrence

Version 2.770.5

Fixed

  • The stable C ABI no longer frees the input source twice when hpdf_document_load_from_io fails while the document is being parsed, for example when the read callback reports an error or the operation is cancelled midway; such a load could corrupt the heap or crash the host process
  • A failed load now returns the callback or cancellation status instead of an internal error, and the same document handle can be loaded again afterwards
  • Loading a new document into an existing handle releases the previous input source only once the new load has taken over

Version 2.770.4

Fixed

  • Barcode results from DecodeLoadedPageBarcodes on pages with /Rotate 90 or /Rotate 270 now report bounds at the symbol's real position instead of a position mirrored across the page
  • The reported barcode orientation on those pages now matches the direction the symbol actually reads in page space
  • The invisible text placed by ApplyLoadedOCRTextLayer on quarter-turned pages now lies over the recognised words, so selection and search highlight the right place
  • Face findings from redaction detection on quarter-turned pages are mapped back to the right page area as well
  • Unrotated and upside-down pages are unaffected

Version 2.770.3

Fixed

  • In 32-bit builds, loading or writing a TIFF image compressed with PixarLog no longer crashes with a stack overflow; selecting the codec builds its companding tables, which hit an endlessly recursive exponent helper
  • SGILog (LogLuv) TIFF images in 32-bit builds go through the same corrected math helpers
  • The 32-bit rounding-down helper used by the TIFF codecs now rounds negative values toward minus infinity and accepts large magnitudes without an overflow error, matching the 64-bit builds

Version 2.770.2

Changed

  • When rendering, an image drawn at half its pixel size or less is shrunk to exactly the drawn size by area averaging right after decoding, instead of being kept at full size and stretched while drawing
  • The shrunk image fits the decoded-image cache: a transparency group that is drawn twice, on black and on white, to recover its alpha now decodes such an image once instead of once per pass, and so does rendering the same page again
  • An image with a soft mask is combined with its mask pixel for pixel at the drawn size, where the mask is also shrunk; this avoids building and premultiplying a full-size copy of a large image and its mask, and the mask edge is no longer sampled by nearest neighbour
  • On a sample page with a 4229 x 4629 masked image drawn at about a quarter of its size inside such a group, rendering took about 1.8 seconds instead of 4.5
  • Stencil image masks keep their full resolution, and the public region-decoding methods keep returning the sizes they document

Version 2.770.1

Fixed

  • In 64-bit builds, rendering a page with a transparency group failed with a list index error whenever the group set no soft mask of its own, a regression of version 2.769.3; such pages now render again

Version 2.770.0

Added

  • New RenderColorimetricLuminosityMasks property chooses how a luminosity soft mask turns colour into mask values when its group has a CIE-based blending space (CalGray, CalRGB, Lab, or ICCBased)
  • Setting it to true takes CIE Y as ISO 32000-1 11.5.3 describes; bitmaps rendered under the two settings are cached separately

Changed

  • By default a luminosity mask now weights the resolved colour of its group like DeviceRGB whatever the blending space, as common PDF viewers do. CIE Y is measured on a linear scale, so a mid-grey in an ICC or calibrated group masked only about a fifth, and drop shadows and fades came out much lighter than in other viewers
  • The /BC backdrop colour of a mask follows the same setting as the paint inside the mask group
  • Masks whose group uses a device colour space render as before

Version 2.769.3

Fixed

  • A transparency group painted with a blend mode other than Normal, such as the Multiply drop shadows that design tools export, now blends its own colour and alpha with the backdrop (ISO 32000-1 11.3.6 and 11.4.8). Where the group was partly transparent its pixels already held the backdrop, which was then blended with itself: a Multiply shadow came out too dark and in the backdrop's hue
  • The content of a transparency group starts from the Normal blend mode, as the blend mode applies to the group as a whole (11.6.6). It kept the mode the group was painted with, so an isolated group multiplied its content into its empty start and painted black
  • A soft mask set in the same graphics state as a blend mode draws its mask group with Normal blending (11.6.5.2); the blend mode turned a white mask group black and hid what the mask should have shown
  • To find the alpha of a group that is not isolated, the group is drawn twice, on black and on white, when its own graphics states blend normally; such pages render somewhat slower

Version 2.769.2

Changed

  • An image with a soft mask is decoded at the size it is drawn, as an image without one already was, and its mask is decoded at that size too; a JPEG mask goes through the reduced-size JPEG decoder instead of being decoded in full
  • The image and its mask are always decoded whole, so the mask cannot shift against the image, and clipping keeps what is drawn to the visible part
  • On a page with a 4229 x 4629 shadow image and a 2114 x 2314 JPEG mask drawn about 1000 pixels wide, rendering at 72 dpi took 1.6 instead of 3.7 seconds
  • DecodeLoadedImageRegionAtResolution returns a whole image of a format without a region decoder as decoded, without copying it once more

Version 2.769.1

Changed

  • Soft masks are built faster: building a mask no longer keeps a second copy of the whole page to compare against, which pages with many masks, such as the gradients and drop shadows that design tools export, paid once per mask
  • Luminosity masks over a calibrated or ICC-based blending space look the sRGB curve up instead of computing it for every channel of every pixel, and grey mask content, the common case, is converted through a single table
  • A 1125 x 1600 page with about twenty soft masks renders roughly a fifth faster; the rendered pixels are unchanged

Version 2.769.0

Changed

  • Setting a page's Width or Height no longer hides errors: a failure now raises an exception instead of leaving the size silently unapplied, and setting the size of a page whose canvas has already been closed raises the new EHPDFPageClosedError with a message that says why
  • After such a failure the page no longer stays in a state where later size changes only update its MediaBox and not the page size used for drawing

Fixed

  • Resizing a page of a loaded PDF no longer overwrites other objects: a MediaBox whose numbers are separate objects, or a MediaBox array shared by several pages, is copied for the page being resized, so other pages keep their size
  • Resizing a loaded page whose MediaBox has fewer than four numbers now writes a complete MediaBox with the new size; the new size was ignored before

Version 2.768.20

Fixed

  • Text extraction no longer enters a Form XObject that paints itself, directly or through other forms; such a form was read again at every nesting level, repeating its text up to twelve times, and one that painted itself twice took 4,096 passes
  • Text of a Form XObject that falls outside the form's bounding box, which clips it, is no longer part of the page text

Version 2.768.19

Changed

  • Large documents load faster again: walking the page tree no longer searches all loaded objects for every page, and the encryption check of LoadFromFile with AutoDecrypt reads the file through the same buffer as the load. The 56 MB PDF Reference 1.7 now loads in about 8 seconds instead of 22

Version 2.768.18

Fixed

  • Page rendering now finds installed fonts that Windows reports under a localized name, such as Microsoft YaHei on Chinese Windows or Yu Mincho on Japanese Windows; text in such fonts was drawn in a substitute font when the PDF did not embed them
  • Font names written without spaces now match Windows families that keep some words joined, such as MicrosoftYaHei for Microsoft YaHei, MicrosoftJhengHei for Microsoft JhengHei and MSPGothic for MS PGothic; they were looked up with a space before every capital letter and never found
  • The renderer remembers which font names are installed, so documents with many fonts that are not installed no longer probe Windows for each name on every page

Version 2.768.17

Changed

  • Large documents load much faster: operation telemetry now samples memory at most once every 10 ms within an operation instead of at every object the parser reads, a sample that walked every block of the memory manager. The 1,236-page PDF Reference 1.6 loads in about 2.5 seconds instead of 30, and the 56 MB PDF Reference 1.7 in about 22 seconds instead of over four minutes
  • The slowdown grew with the size of the application's own heap, so applications holding much memory benefit most
  • UpdateOperationTelemetrySample gains an optional Force parameter that takes a sample regardless of the interval; the end of every operation still takes one

Version 2.768.16

Fixed

  • Loading an empty file no longer hangs; LoadFromFile used to loop forever reading backwards from the start of the file
  • A file in which no page can be found, such as an empty file, plain text or random bytes, no longer loads as one or three blank pages guessed from its size; LoadFromFile now returns 0 or raises an exception, as for other unreadable files
  • An encrypted file whose pages lie in encrypted object streams now raises an exception saying the password is needed when it is loaded without one, instead of loading as a blank page; load it with the password overload

Version 2.768.15

Fixed

  • Page text no longer repeats characters that are painted again over themselves, as in overprinted logos and in bold faked by drawing the text twice with a small offset; such text was extracted twice, for example "Bold wordsBold words", and searches for it could fail
  • The text, column, layout and semantic text extraction all read such a character once; the glyph list still reports every painted glyph

Version 2.768.14

Fixed

  • Glyph names of the full Adobe Glyph List now resolve in text extraction and rendering, among them the ligatures fi, fl, ff, ffi and ffl and the afii names that older Cyrillic, Hebrew and Arabic fonts use; a font encoding that named such glyphs gave the wrong characters, for example "defined" was extracted as "deÞned"

Version 2.768.13

Changed

  • LoadFromFile reads files below LocalFileMappingThreshold (8 MB by default), and every file when mapping is off or unavailable, through a 64 KB read buffer; files with many objects and a classic cross-reference table load far faster, for example the 912-page PostScript Language Reference Manual in about 1 second instead of close to 3 minutes

Version 2.768.12

Fixed

  • Text extraction now places the glyphs of CID-keyed (Type 0) fonts whose /W width array is not ordered by CID; most glyphs got the default full-em width, so lines ran past the page edge and their ends were dropped from the extracted text and search

Version 2.768.11

Fixed

  • Accented letters of embedded CFF (Type 1C) fonts that are built from a base letter and an accent, as in many fonts converted from Type 1, now render; letters such as ü and é were left blank, so words like "München" showed a gap
  • The same letters are now complete in SVG export with embedded fonts

Version 2.768.10

Fixed

  • Composite glyphs of embedded TrueType fonts now place each part at its own offset: accented letters such as é and Å lost their accent, and curly double quotes showed as a single quote followed by a gap
  • The same glyphs are now complete in SVG export with embedded fonts

Version 2.768.9

Fixed

  • Images marked /Interpolate false are now averaged when drawn smaller than their own resolution; they were sampled one pixel in several, so charts placed as images showed jagged, dark axis labels and broken thin lines where other viewers show them smooth
  • Enlarged images with /Interpolate false keep their hard pixel edges as before

Version 2.768.8

Fixed

  • Text drawn with a stroke narrower than a pixel, as documents use for fake bold, now renders at that width; the stroke used to be a whole pixel wide, so such headings looked smeared and much heavier than in other viewers
  • Small glyphs of embedded and installed fonts are stroked with antialiasing in text rendering modes 1 and 2, in the stroke colour, after the fill

Version 2.768.7

Fixed

  • Calling ProcessObjectStreamsForDecompression on a loaded document no longer discards the object streams the load had read: compressed objects stay available to ExtractRawObjectFromStream and ExtractObjectFromStream afterwards, where before none could be read
  • When the method scans the file itself, as for a document with a classic cross-reference table, it now finds an object stream that directly follows another stream and reads its object count and offsets from its own dictionary
  • ExtractRawObjectFromStream decodes an object stream again when the object stream cache has released it, instead of returning an empty result

Version 2.768.6

Fixed

  • The Stamp demo now builds successfully for Win64

Version 2.768.5

Fixed

  • On Chinese, Japanese and Korean editions of Windows, documents with cross-reference streams whose dictionaries hold binary strings, such as the checksums of attached files, now load in a fraction of a second; a 4 MB portfolio with nine attached PDF files took two minutes to open
  • The parser now looks for its keywords in the raw bytes of the file rather than in text converted through the Windows code page, so binary data next to a keyword can no longer hide it or shift its position

Version 2.768.4

Fixed

  • Content inside a Form XObject now renders with the opacity, soft mask and blend mode it sets for itself; before, everything inside a form painted at full opacity, so translucent watermarks and stamps came out solid
  • A form painted with an opacity of its own is still composited once as a whole, as before

Version 2.768.3

Fixed

  • Page text now includes text that the page paints through Form XObjects, such as page headers and footers, watermarks and stamps; before, only text in the page's own content was returned
  • Form text appears where the form is painted, placed through the form's matrix and read in the form's own fonts, and forms nested inside forms are followed too
  • This applies to plain, layout, column and semantic page text; the glyph-level extraction still returns only the glyphs of the page's own content, whose positions point into that content

Version 2.768.2

Fixed

  • EncryptFile and DecryptFile with AES-256 no longer damage embedded font files whose dictionary lists /Length1 before /Length, as Ghostscript and other tools write them; such fonts were encrypted as a single byte, which left the output unreadable
  • Streams whose length is stored in a compressed object stream keep all their data through AES-256 encryption and decryption; before, the last byte of such a stream could be lost

Version 2.768.1

Fixed

  • Documents whose stream lengths are stored inside compressed object streams, as Ghostscript writes them, now load completely; before, every page content stream of such a file was dropped, so the pages rendered blank and gave no text
  • A stream whose length refers to an object that does not exist, or that has no length at all, is now read up to its end marker instead of being dropped

Version 2.768.0

Added

  • BuildLoadedPageSVG and SaveLoadedPageAsSVG take an optional EmbedFonts parameter; it is off by default, and the existing calls export exactly as before
  • With EmbedFonts set to True, text in fonts whose TrueType or CFF program is embedded in the PDF is drawn from the font's own glyph outlines, so the SVG looks the same on systems where those fonts are not installed
  • Each glyph outline is written once and reused wherever the character appears, which keeps the file size down on text-heavy pages
  • The text stays in the SVG as transparent text over the outlines, so it can still be selected, searched and read by screen readers
  • Fill, stroke and fill-and-stroke text, line widths, rotated or scaled text and text used as a clipping path come out as they do in the rendered page
  • Fonts that are not embedded, Type 1 font programs and vertical CJK text stay ordinary SVG text

Version 2.767.4

Fixed

  • Outlined and fill-and-outline text (text render modes 1 and 2) in fonts that are not embedded now honours the line width when rendered; before, every outline came out one pixel wide whatever the line width was
  • Such outlines are now drawn from the installed font's exact glyph shapes at their exact positions, as filled text already was
  • Characters the installed font lacks, which Windows takes from a fallback font, also keep the line width when outlined

Version 2.767.3

Fixed

  • Text in fonts that are not embedded is now drawn with the characters its encoding names. The character codes went to the installed font unchanged, and the installed font reads them in its own character set, so every /Differences entry and the codes where StandardEncoding or MacRomanEncoding differ from the Windows character set drew the wrong characters, for example straight instead of curly quotation marks in Type 1 fonts without an encoding
  • On Chinese, Japanese and Korean editions of Windows, accented letters, curly quotation marks, the copyright sign and other characters above code 127 in fonts that are not embedded were drawn as question marks since version 2.766.83; they are read in the installed font's character set again
  • Symbol fonts keep their own code mapping

Version 2.767.2

Fixed

  • Large glyphs of embedded fonts are now rendered with antialiasing as well. Glyphs larger than 64 pixels, such as headings and titles at print resolutions, were filled without it and showed jagged edges; they are now antialiased up to 256 pixels, while larger text of installed fonts keeps the system's antialiased text output

Version 2.767.1

Fixed

  • Layout text, column text and semantic text extraction now measure the page in page units. They compared positions with the font size given to Tf and with text-space advances, which are a fraction of the real distances in the many documents that size text through the text matrix, so layout text spread each letter over several columns, column text lost all word spaces and semantic text put almost every word on its own line
  • All three now return only the text inside the visible box and separate words that a document spaces apart by moving the text position, like the plain page text
  • Layout text keeps the letters of a word together, where wide letters such as m or W used to push a space into the word
  • Semantic text no longer puts a blank line after every line of a single-column page: a run of full-width lines forms one zone, and a zone change separates lines only when they are set apart by more than a line spacing
  • The help pages for these methods describe what they return, and the column method shows its full syntax

Version 2.767.0

Added

  • LoadFromFile and LoadFromStream have overloads with an AutoDecrypt parameter. With AutoDecrypt True, a document encrypted with an empty user password, as documents that only restrict printing, copying or editing are, opens decrypted in memory the way viewers open it, so its text can be extracted and its pages rendered and exported without supplying a password
  • Documents that need a password, and unencrypted documents, load exactly as the plain overloads load them, and whether the empty password opens the document is checked from a few small ranges of the file before it is loaded
  • As with the password overloads, a document opened this way is no longer encrypted in memory, and saving it writes an unencrypted copy

Version 2.766.83

Changed

  • Small text in fonts that are not embedded, such as the standard 14 fonts and installed Office and Chinese fonts, is now rendered from the unhinted glyph outlines at its exact position, with the same antialiasing as embedded fonts. The system text output used before placed every glyph on a whole pixel and adjusted its shape to the pixel grid, so small text was spaced unevenly and looked blotchy; rendered pages now match the shapes and spacing of other viewers much more closely
  • Glyphs that the installed font lacks and large glyphs are still drawn with the system text output, which can take missing characters from linked fonts

Fixed

  • Small glyphs of embedded fonts are drawn faster, because the bitmaps behind their antialiasing are reused instead of being created for every glyph

Version 2.766.82

Fixed

  • Text drawn with installed fonts in rendered pages now uses grayscale antialiasing. It followed the system's ClearType setting, so black text in rendered bitmaps carried red and blue fringes that depended on the machine and remained in saved, printed or scaled images

Version 2.766.81

Fixed

  • Small text in embedded CFF and OpenType CFF fonts is now rendered with antialiasing, as TrueType text already was. These glyphs were filled without antialiasing, so at small sizes and normal screen resolutions stems narrower than a pixel disappeared and body text broke up into fragments; forms and documents set in fonts such as Helvetica Neue are now legible at 72 DPI

Version 2.766.80

Changed

  • Page text extraction returns only the text the page shows. Glyphs that lie outside the visible area, the crop box within the media box, are left out, so printer's marks, slug lines and other content outside a trimmed page no longer appear in the extracted text. The glyph-level extraction still returns every glyph with its position

Version 2.766.79

Fixed

  • Page text extraction no longer breaks a line at a raised superscript or a slightly shifted baseline in text that is sized through the text matrix. A new line was started whenever the text moved up or down by half the font size given to Tf, which is often 1 in such documents, so a move of half a point was enough
  • Rotated text, such as labels running up the side of a page or diagonal watermarks, no longer puts every character on its own line. Lines are now told apart by the movement across the direction the text runs, compared with half the text height on the page

Version 2.766.78

Fixed

  • When the SVG export falls back to a generic font family for a font that is not installed, it now names a common face of that kind first: Times New Roman before serif, Arial before sans-serif and Courier New before monospace. A browser picks the face for a bare generic family from its own language settings, and Chinese or Japanese browsers chose CJK fonts whose wide Latin letters overlapped at the positions taken from the PDF

Version 2.766.77

Fixed

  • The SVG export now names installed Chinese font families for fonts known by their legacy GB2312 names, such as KaiTi_GB2312 or its Chinese spelling. Windows applications reach these fonts through the system's font substitutes, but browsers do not, so such text was shown in the browser's default font
  • A font named in only one language also gets the installed family's other name, for example SimHei together with its Chinese name, and a generic family that matches its style

Version 2.766.76

Added

  • THPDFGlyphRecord has GlyphEndX and GlyphEndY, the page-space end of the glyph's own width along the baseline, without character and word spacing

Fixed

  • Page text extraction now separates words that a document spaces apart by moving the text position instead of showing a space character. Many producers write [(PDF)-240(Reference)] or place each word with its own positioning operator, and such words used to run together as PDFReference
  • A space is added where the gap after a glyph's own width exceeds 0.15 of the text height, measured in page units so that text sized through the text matrix is treated the same as text sized through the font size
  • Kerning, slightly loosened spacing, tightened character spacing that position adjustments give back, overprinted text and real space characters are left as they are, and no space is added between two Chinese, Japanese or Korean characters however far apart justification sets them

Version 2.766.75

Fixed

  • Text extraction, the SVG export and rendering now recognize the glyph names of the Symbol font, such as copyrightsans, registerserif, trademarksans and the pieces of large brackets and braces (parenlefttp, braceex, integralex, ...). Subset Symbol fonts commonly re-encode these names, and the characters came out as raw control codes
  • All ITC Zapf Dingbats glyph names (a1 to a206) are recognized as well, so check marks, crosses, arrows and circled numbers that a font selects through these names, as form fields and bulleted lists often do, are extracted as their Unicode characters
  • Looking up a glyph name for a character still prefers the common name, such as arrowright or spade, over a ZapfDingbats name

Version 2.766.74

Fixed

  • HPDFExtractGlyphsViaDevice no longer fails with an invalid pointer operation. The text-extraction device it creates is reference counted, and the function freed it explicitly as well, so every call ended by freeing the device a second time

Version 2.766.73

Fixed

  • Text extraction now restores the text state with Q as the specification requires (ISO 32000-1 9.3.1). Before, only the transformation was restored, so a font, character spacing or leading set inside q ... Q stayed in effect for the text that followed
  • When the font selected inside q ... Q used two-byte codes and the font outside it one-byte codes, the text after Q was decoded as two-byte codes and lost. Word and similar producers write pages this way, typically losing table-of-contents leaders and Latin words between Chinese runs
  • The fix covers both the page text API and the device-based text extraction interface

Version 2.766.72

Fixed

  • Text drawn after RestoreState now always has its font selected. The page skips a font selection that repeats the last one written, but it did not take into account that RestoreState (the Q operator) returns the reader to the font in effect before SaveState. Text shown after RestoreState in the font chosen inside the pair came out with no font or the wrong font, so viewers could drop it and text extraction could not read it
  • Character spacing, word spacing, horizontal scaling and leading follow SaveState and RestoreState in the same way, so a value set again after RestoreState is written out instead of being skipped while the reader has already returned to the earlier value
  • Selecting a Type 3 font no longer causes the next selection of the previous font to be skipped
  • XPS documents converted to PDF were affected, because each glyph run is drawn inside its own saved graphics state

Version 2.766.71

Fixed

  • Text extraction and the SVG export read the codes of a simple font (Type 1, TrueType or Type 3) as two bytes when its /ToUnicode CMap declared a two-byte codespace, as some producers write for every font. Codes of simple fonts are always single bytes (ISO 32000-1 9.6.6), so each pair of characters was taken as one unknown code and most of the text disappeared, leaving only strings of a single character

Version 2.766.70

Fixed

  • The SVG export moved text by the operands of Td, TD, T*, ' and " in page units instead of text space (ISO 32000-1 9.4.2). Text whose size comes from the text matrix, with 1 Tf and a scaled Tm as word processors often write it, had its lines stacked on top of each other near the first baseline; it is now laid out as in the PDF
  • The same correction applies to the content-device text extractor THPDFTextExtractDevice

Version 2.766.69

Fixed

  • The page renderer passed font names that use #xx escapes to Windows with the escapes, so non-embedded fonts named that way, common for CJK fonts such as KaiTi_GB2312 written in Chinese characters, matched no installed font and were drawn in a substitute face. Escapes are now decoded; UTF-8 names keep their characters and other bytes are read in the system code page

Version 2.766.68

Fixed

  • The SVG export wrote font names that use #xx escapes as the escapes themselves, so CJK font names stored as UTF-8 bytes (such as the KaiTi_GB2312 name in Chinese characters) reached font-family as #e6#a5#b7... and never matched an installed font. Escapes are now decoded; a name that is valid UTF-8 is kept, and bytes of other encodings are dropped as before

Version 2.766.67

Fixed

  • The SVG export did not restore the text state at Q: font, size, spacing, scaling, leading, rise and render mode set inside q ... Q carried over to the text after it. Pages that embolden a heading with 2 Tr inside a saved state drew all the following body text stroked and heavy. The text state is now saved and restored with the rest of the graphics state (ISO 32000-1 9.3.1)

Version 2.766.66

Fixed

  • The SVG export stroked text in the stroking render modes (1, 2, 5 and 6) without a stroke width, so SVG's default of one text-space unit applied; text that PDF producers embolden with a thin stroke, such as 2 Tr 0.25 w, came out much heavier. The line width is now converted from user space into the text element's space, a zero width gives a one-pixel line, and the line join is kept

Version 2.766.65

Fixed

  • Documents whose trailer gives /Encrypt as a direct dictionary instead of a reference, as some PDF writers produce, were loaded as unencrypted: even with the right password their pages rendered blank and text extraction and the SVG export returned nothing, and SaveLoadedDocument wrote a damaged file that dropped /Encrypt but kept the encrypted streams. They now open, decrypt and save like documents with an indirect encryption dictionary
  • The cross-reference loader cut a trailer at the first >>, so entries after a nested dictionary in the trailer were lost; it now reads the trailer up to its matching closing delimiter

Version 2.766.64

Fixed

  • Rendering, the SVG export, the viewer and printing showed a loaded page's whole /MediaBox. A page is displayed and printed through its /CropBox, clipped to the /MediaBox (ISO 32000-1 14.11.2), so pages with a crop box came out too large, offset and with content meant to be hidden
  • RenderLoadedPageToBitmap, the tile, band, metafile and device-context renderers, BuildLoadedPageSVG, the viewer's page geometry, highlights and region snapshots, and printing now cover the visible box; pages without a /CropBox are unchanged

Added

  • THotPDF.GetLoadedPageVisibleBox returns a loaded page's visible box, its /CropBox clipped to its /MediaBox
  • THPDFPageDisplayList.CropBox gives the same box for a compiled display list

Version 2.766.63

Fixed

  • The built-in glyph list was searched up to a count 13 entries short of the table, so the glyph names that sort last (y, z, zero, zeta, yen, ydieresis, zcaron and others) were never found. Text extraction ignored a font's /Differences entries that named them, and the page renderer drew y, z and 0 of embedded CFF fonts with WinAnsiEncoding or MacRomanEncoding in a substitute system font
  • Looking up the glyph name of an accent such as U+0060 returned the small-capital name of MacExpertEncoding (Gravesmall) instead of grave, so those accents were also missed in embedded CFF fonts

Version 2.766.62

Fixed

  • The page renderer used the line width and dash lengths as device pixels instead of user-space units (ISO 32000-1 8.4.3.2 and 8.4.3.6); lines kept the same pixel width at every resolution and ignored any scaling cm. Slides exported through macOS Quartz, which stroke shapes with a width in EMUs under a 1/12700 scale, were covered entirely by the stroke color
  • The stroke width and dashes now follow the scale of the CTM in effect when the path is stroked, also for text drawn in a stroking render mode

Version 2.766.61

Fixed

  • The SVG export left out Type 1 function-based shadings (ISO 32000-1 8.7.4.5.2), whether painted with sh or used in a shading pattern; it now samples the shading's function over its /Domain into an embedded PNG image placed through the shading's /Matrix, clipped to its /BBox, with the pattern's background color under it

Version 2.766.60

Fixed

  • The page renderer painted the /Background color of a mesh shading shown with the sh operator, which PDF ignores (ISO 32000-1 8.7.4.5.1), so the whole clipping area around the mesh took that color
  • The background color of function-based, axial and radial shading patterns was not painted by the page renderer; it now fills the pattern's area before the shading, so it shows wherever the shading does not reach
  • The SVG export now paints the background color of shading patterns in the same way and, like the renderer, ignores it for sh

Version 2.766.59

Fixed

  • The page renderer ignored the /BBox of function-based, axial and radial shadings (ISO 32000-1 8.7.4.5.1); an extended shading painted with sh or used in a shading pattern covered the whole clipping area instead of stopping at its box. Mesh shadings already honored it

Version 2.766.58

Fixed

  • The SVG export wrote text in Type 3 fonts as SVG text in an installed font, so pages that draw their text or symbols with glyph procedures showed the wrong shapes; it now draws each glyph's procedure, placed through the font's /FontMatrix, the font size and the text matrix (ISO 32000-1 9.6.5)
  • Type 3 glyphs that start with d1 are painted in the current fill color, and glyphs that set their own colors keep them

Version 2.766.57

Fixed

  • Text extraction and the SVG export took the /Widths of a Type 3 font as thousandths of an em, although they are in glyph space and scaled by the font's /FontMatrix (ISO 32000-1 9.6.5); glyphs of a font with a [0.01 0 0 0.01 0 0] matrix were placed a tenth of their advance apart, which also merged words in extracted text

Version 2.766.56

Fixed

  • Rendering a loaded page read every Type 0 font as if it used Identity-H, two bytes per code and each code its own CID. Fonts encoded with the predefined UCS2 and UTF16 CMaps of the Chinese, Japanese and Korean collections, such as UniGB-UCS2-H, or with an embedded CMap now map their codes to CIDs, so /W widths and embedded glyphs are looked up at the right CIDs; before, for example, lowercase Latin letters in a STSong-Light text were spaced a full em apart
  • Codes are read by the CMap's codespace ranges, so one-byte and four-byte (surrogate pair) codes are read whole, and names ending in -V select vertical writing

Version 2.766.55

Fixed

  • Rendering a loaded page drew fonts that are not embedded and carry a style part or a PostScript spelling in their name, such as TimesNewRoman,Bold, TimesNewRomanPS-BoldMT, Arial,BoldItalic or SegoeUI-Semibold, in a substitute face; the family part of the name is now looked up among the installed fonts, also with spaces between its words (Times New Roman, Segoe UI), and the style comes from the name and the font descriptor

Version 2.766.54

Fixed

  • Standard fonts without a /Widths array, which ISO 32000-1 9.6.2.2 allows for the standard 14 fonts, were laid out at a fixed half-em advance when rendering a loaded page, exporting it to SVG or extracting its text, so letters crowded together; the Helvetica, Times and Courier families, also under the names Arial, TimesNewRoman and CourierNew, now take their widths from the installed Arial, Times New Roman and Courier New, which share their metrics
  • A standard Type 1 font with no /Encoding now decodes through its implied StandardEncoding, so for example code 39 reads as a right single quotation mark

Version 2.766.53

Fixed

  • Rendering a loaded page ignored a font's /Widths array when it was an indirect object, as many producers write it, and laid the text out at a fixed half-em advance; such text is now spaced by its widths
  • Font descriptors given as indirect objects are now read when rendering, so the ForceBold and Italic flags and the italic angle of non-embedded fonts take effect
  • The SmallCap flag no longer makes text bold: bold now follows the ForceBold flag (ISO 32000-1 Table 123)

Version 2.766.52

Fixed

  • Rendering a loaded page now clips to text shown in render modes 4 to 7 (ISO 32000-1 9.3.6): the glyphs become part of the clipping path at the end of the text object, until the graphics state is restored. Before, mode 7 text was ignored and a shading or image meant to show through the letters covered the whole area, and modes 4 to 6 painted the text without clipping
  • Clip text is taken from the same glyph outlines as painted text, embedded fonts and Type 3 glyphs included

Version 2.766.51

Fixed

  • SVG export now clips to text shown in render modes 4 to 7 (ISO 32000-1 9.3.6): the glyphs become an SVG clipping path from the end of the text object to the end of the graphics state, so a shading or image drawn through text appears only inside the letters
  • Text in render mode 7 is no longer lost with nothing clipped, and modes 4 to 6 still fill or stroke the text as modes 0 to 2 do

Version 2.766.50

Fixed

  • Axial, radial and function-based shadings whose /Function is an array of one-output functions, one per color component (ISO 32000-1 8.7.4.5.1), were not drawn when rendering a loaded page; they are now drawn, with the array's functions given directly or as indirect objects
  • SVG export writes such axial and radial shadings as gradients, including when they fill a path through a shading pattern

Version 2.766.49

Fixed

  • SVG export wrote bold and italic text in the regular style: text now gets font-weight="bold" and font-style="italic" from the style part of the font name, such as Arial-BoldMT, Helvetica-Oblique or MinionPro-It, and from the font descriptor's weight, flags and italic angle
  • Fonts outside the standard 14 families were written with their style part in the family name (SegoeUI-Semibold), which matches no installed font; the family is now named on its own and with spaces between its words (SegoeUI, Segoe UI), followed by a generic family from the descriptor flags or the name

Version 2.766.48

Fixed

  • SVG export drew the content of form XObjects in black instead of the fill and stroke colors in effect where the form is painted (ISO 32000-1 8.10.1); a Q inside the form now restores those colors too
  • Content devices can start nested content from the caller's colors through the new IHPDFContentInheritedColorDevice interface

Version 2.766.47

Added

  • SVG export now fills paths that use a tiling pattern with an SVG <pattern> that repeats the pattern cell at its XStep and YStep spacing, clipped to the cell's /BBox; before, such paths were filled black or kept the previous color
  • Uncolored tiling patterns (PaintType 2) paint the cell in the color given with the pattern, such as the components in /CS0 cs 0 0 1 /P1 scn
  • Paths filled with a shading pattern get the axial, radial or mesh shading of the pattern, clipped to the path
  • The pattern matrix is applied in the space of the page or of the form that uses the pattern (ISO 32000-1 8.7.2), so patterns do not scale or move with the current transformation matrix, and Q brings back a pattern saved with q
  • Content devices can receive pattern selections through the new IHPDFContentPatternDevice interface

Version 2.766.46

Added

  • Images with a color-key /Mask array (ISO 32000-1 8.9.6.4) are now masked when a loaded page is rendered: pixels whose components all fall inside the key ranges are left unpainted, so the page shows through
  • SVG export applies the same color-key masks and writes such images as PNG images with an alpha channel
  • The key is compared with the samples as stored, so an Indexed image masks by palette index even when two entries share a color, and images at 1, 2 and 4 bits per component are covered
  • New DecodeLoadedImageColorKeyMask method returns the mask of a loaded image as a white-and-black bitmap; it covers Flate, LZW and unfiltered images, since lossy codecs do not keep exact sample values

Version 2.766.45

Changed

  • CompressDocument and CompressLoadedDocument let each object stream hold up to 250 objects instead of 100; fewer, larger containers compress better and need fewer dictionaries
  • Loaded PDFs that were already written compactly with object streams now come out about the size of the original, most of them slightly smaller, instead of slightly larger
  • A limit set through ConfigureAdaptiveObjectStreamPacking is kept, CompressDocument restores the limit at EndDoc, and plain object-stream saves keep 100 objects per container

Version 2.766.44

Changed

  • The cross-reference stream of files written with object streams uses the smallest field width each column needs, so offsets in files below 16 MB take 3 bytes instead of 4 (ISO 32000-1 7.5.8.2), and its dictionary is written compactly
  • Files written with a cross-reference stream but without object streams are unchanged

Version 2.766.43

Changed

  • Unencrypted files written with object streams now pack the document catalog and the document information dictionary into object streams as well, where they are compressed; ISO 32000-1 7.5.7 only keeps the encryption dictionary out
  • Encrypted files keep both dictionaries at the top level, as before

Version 2.766.42

Changed

  • Files written with object streams, including those from CompressDocument and CompressLoadedDocument, spell dictionaries and arrays compactly, leaving out the spaces and line breaks the PDF syntax does not need (ISO 32000-1 7.2.2); stream dictionaries, which cannot go into object streams and stay uncompressed, gain the most
  • Signature dictionaries and the encryption dictionary keep their spaced layout, so signing a document written with object streams works as before
  • Files written without object streams are unchanged byte for byte

Version 2.766.41

Fixed

  • PDF files written with object streams no longer start with the %PDF- header and binary comment line twice; this affected every save with UseObjectStreams, CompressDocument or CompressLoadedDocument
  • Viewers tolerated the repeated header, but strict validators could flag it, and it cost 15 bytes per file

Version 2.766.40

Fixed

  • Loaded PDFs that keep a bare number in an object stream, as many producers store stream lengths, can now be edited and saved; every change used to stop the save with "Cannot rewrite compressed object N: the source member could not be loaded"
  • Such a number is now read as a number; before, the parser looked past the end of the member for an indirect reference and gave up, so the member could not be loaded at all
  • Saving such a file without changes was not affected, because an unchanged file is copied as it is

Version 2.766.39

Fixed

  • Stamp annotations in PDF/A-2 and later and PDF/X-6 documents showed only their frame, without the stamp name such as APPROVED or CONFIDENTIAL
  • The name is now drawn in the page's current font, which is embedded together with the page text, in capitals and the annotation color, centred in the rectangle
  • Long names such as NOTFORPUBLICRELEASE are set smaller so that they fit the rectangle width
  • The documents still pass PDF/A validation; stamps in other documents are written as before

Version 2.766.38

Added

  • New CompressLoadedDocument overload with options that makes a loaded PDF as small as possible without changing how it looks: it drops unused page resources, merges identical fonts and forms, subsets the embedded fonts, recompresses streams with Flate and writes the next save with object streams
  • Every step is lossless and images are not resampled or recompressed; a three-page document that embeds full Arial and SimSun fonts drops from about 10 MB to about 20 KB, and three other sample PDFs shrank by 15-50%
  • Documents with signature fields are refused by default and left unchanged, because every step rewrites signed bytes; AllowSignatureInvalidation compresses them anyway
  • SubsetLoadedFonts gains a CompactTrueTypeSubsets option, off by default, that builds compact subsets of TrueType fonts used through CIDFontType2 fonts with the identity CID mapping; color fonts and fonts with a /CIDSet keep the normal subset
  • The parameterless CompressLoadedDocument keeps its behavior of recompressing unfiltered streams only

Version 2.766.37

Added

  • New CompressDocument property, off by default: one switch that writes the next document as small as possible without changing how it looks
  • For that document it turns on Flate compression at the maximum level, a cross-reference stream with object streams (ISO 32000-1 7.5.7 and 7.5.8), font subsetting and compact font subsets; a three-page document of mixed English and Chinese text drops from about 10 MB to about 20 KB
  • Object streams need PDF 1.5, so an older Version is raised to 1.5 unless the version is locked; PDF/A-1 output keeps its classic cross-reference table
  • Your own settings are left alone: after EndDoc, Compression, CompressionLevel, UseXRefStream, UseObjectStreams, the font subsetting options and the version read back as you set them
  • Images are not resampled or recompressed

Version 2.766.36

Added

  • New CompactFontSubsetting property, off by default: font subsets renumber the glyphs they keep, so the embedded font no longer carries an entry for every glyph of the source font; an explicit /CIDToGIDMap stream maps the page's glyph codes to the renumbered glyphs (ISO 32000-1 9.7.4.2)
  • CJK fonts shrink the most: two Chinese characters in SimSun take about 3 KB of font data instead of about 25 KB, and a Microsoft YaHei document drops from 114 KB to 6 KB
  • Applies to TrueType fonts written as Type 0 fonts when EnableFontSubsetting is on, and to the font registered with RegisterUnicodeTTF, which until now got compact subsets only under PDF/A
  • Page content, glyph widths and text extraction are unchanged; OpenType-CFF fonts keep the normal subset, and a font that cannot be compacted falls back to it

Version 2.766.35

Fixed

  • Text drawn with an explicit advance for each character no longer shifts after a character outside the Basic Multilingual Plane, such as a musical symbol or an emoji, when the registered Unicode font covers it. Every following character used to take its neighbour’s advance; the character now advances by the sum of its two entries
  • Justified Unicode text boxes containing such characters line up at the box edge, and the underline or strike-out of that text is as long as the text

Version 2.766.34

Added

  • SVG export now draws image masks (/ImageMask), inline ones included, as stencils in the current fill color: the parts that are not painted are transparent instead of being drawn as a black-and-white picture
  • Images with an /SMask soft mask or an explicit /Mask stencil are exported as PNG images with an alpha channel, so their masked-out parts no longer cover what lies behind them
  • /Decode [1 0] on a mask or image mask is honored, and a mask finer than its image keeps its detail

Version 2.766.33

Fixed

  • Page rendering now honors an image's explicit /Mask stencil: the parts the mask covers are left unpainted instead of the whole image being drawn, including when the image is turned or mirrored
  • A /Decode [1 0] array on the mask reverses which parts are kept
  • Soft masks and masks that are finer than their image are applied at the mask's resolution, so a detailed 1-bit mask on a low-resolution photo keeps its edges

Version 2.766.32

Fixed

  • Page rendering now draws images through the full transformation matrix: images turned by a quarter turn or by any other angle, mirrored images and every image on a page with /Rotate are no longer drawn upright and unmirrored into their bounding box
  • Image masks (/ImageMask true) are now painted as stencils in the current fill color, with anti-aliased edges when they are reduced, instead of being drawn as a gray picture
  • Image masks with /Decode [1 0] now paint the samples of 1, as PDF specifies
  • Inline image masks (BI /IM true) are drawn again, and their /D array is honored
  • Soft-masked images keep their mask when they are turned or mirrored

Version 2.766.31

Added

  • SVG export now converts colors set with k/K (DeviceCMYK) and with cs/sc/scn in any named color space: ICCBased, calibrated, Lab, Indexed, Separation and DeviceN colors come out as the page renderer shows them instead of black
  • Selecting a color space with cs/CS now sets its initial color, for example full tint for a spot color, and restoring the graphics state with Q brings back a color set this way
  • Color spaces that refer to ICC profiles, lookup tables or tint functions by reference are resolved through the exported document during SVG export
  • Path enumeration now reports CMYK fill and stroke colors instead of keeping the previous color

Version 2.766.30

Fixed

  • THPDFEmfPatcher.RenderEmfDirect draws the bitmaps of an enhanced metafile at the same size and position at any Resolution. With a Resolution other than 72 they came out scaled by 72 / Resolution

Version 2.766.29

Added

  • SVG export now applies W and W* clipping paths: each becomes an SVG clip path that covers what is drawn after it until the graphics state is restored, so images, shadings and paths that a PDF crops are no longer drawn in full
  • Form XObjects are clipped to their /BBox in SVG export, and axial and radial shadings to their /BBox
  • Even-odd clipping (W*) keeps its fill rule, and a path painted together with W is drawn before the new clip takes effect, as PDF specifies

Version 2.766.28

Fixed

  • Charts drawn with DrawChart keep their layout at any Resolution. Their margins, titles, axis labels and line widths are point values and shrank with the Resolution
  • The default font of a new page, and of a page made current again, is 12 point at any Resolution instead of 12 drawing units
  • The layout diagnostic overlay keeps its line width and label size at any Resolution

Version 2.766.27

Fixed

  • DrawInlineImage and DrawFormXObject size the image or form in drawing units, like its position. With a Resolution other than 72 the width and height were taken as points, so the object came out too large

Version 2.766.26

Fixed

  • A page that becomes current again through CurrentPageNumber keeps drawing in the units it was laid out in. With a Resolution other than 72 it switched to points, so everything drawn on it afterwards came out at the wrong size and position
  • The page also keeps its own page Resolution when it is revisited

Version 2.766.25

Fixed

  • Images placed with ShowImage keep their size on a page sized through Width and Height when the document Resolution is not 72. At a Resolution of 144 they came out at half the size and shifted
  • ExtTextOut places each character at the given advances on such a page instead of half of them
  • Embedded glyph runs keep their glyph offsets and advances on such a page

Version 2.766.24

Added

  • SVG export now honors the /Extend entry of axial and radial shadings: an end that is not extended, which is the default, is left unpainted as in PDF instead of spreading its end color over the whole clip
  • For radial shadings this also leaves the inside of the start circle empty unless the start is extended

Version 2.766.23

Fixed

  • Flattening page rotation now turns annotation appearance streams with the page, so baked or flattened annotations look the same as on the rotated page instead of being squeezed sideways into their turned rectangle
  • Widget rotation (/MK /R) is adjusted by the page turn, so form field appearances regenerated after flattening keep their orientation
  • Annotations with the NoRotate flag stay upright and keep their size after flattening, pinned at their upper-left corner as viewers show them on a rotated page

Version 2.766.22

Fixed

  • Flattening page rotation on a tagged PDF no longer turns an annotation rectangle twice when the structure tree is reached before the page tree
  • Flattening page rotation no longer rotates the bounding box of Form XObjects used on the page; their geometry lives in form space and the page turn already applies to them through the content transform
  • Layout bounding boxes of structure elements that belong to another page are no longer changed when one page is flattened

Version 2.766.21

Fixed

  • Reading the bleed, trim or art box of a loaded page no longer picks up a /BleedBox, /TrimBox or /ArtBox placed on a parent /Pages node; these boxes are not inheritable in PDF, so a page without its own entry now reports its crop box as the specification requires
  • Flattening page rotation no longer copies such a parent-level bleed, trim or art box onto the page

Version 2.766.20

Fixed

  • Text drawn on the page Canvas or in a metafile placed with ShowMetafile keeps its size when the document Resolution is not 72. At a Resolution of 144 it came out at half its size while the rest of the drawing was correct
  • The page Canvas and ShowMetafile draw at the right size on a page sized through Width and Height, which draws in points. At a Resolution of 144 the drawing came out twice as large
  • The page Canvas and ShowMetafile also honour a page Resolution set on the page itself instead of shrinking the drawing by it

Version 2.766.19

Fixed

  • Justified Unicode text boxes now end at the box edge when character spacing is set. Every character received the spacing on top of its justified position, so each line ran past the right edge by the spacing times the number of characters
  • Justified Unicode text boxes with horizontal scaling fill the whole box width again instead of stopping short by the scaling factor
  • Word spacing now counts towards the natural width of a justified line, the same width the line was broken at
  • Text drawn with an explicit advance for each character lands at those positions whatever character spacing or horizontal scaling is in effect

Version 2.766.18

Fixed

  • Flattening page rotation now turns pages with /Rotate 90 and /Rotate 270 clockwise, so the flattened page looks exactly like the rotated original instead of being turned upside down relative to it
  • Annotations, link destinations and structure geometry move with the page the same way
  • Flattening a page that has no CropBox no longer adds one that cut the page down to a square; only the page boxes a page actually has are rotated

Version 2.766.17

Fixed

  • Font fallback chains now find faces such as SimSun and Microsoft YaHei on Windows systems that report them by a localized name, so mixed CJK text in WideTextOutBox, WideTextOutBoxEx and TextOutWithFallback is drawn in the fallback face instead of showing empty boxes
  • Text whose own font is one of these faces is no longer split into fallback runs or reported as unresolved by the unresolved-glyph diagnostics
  • A face can be listed in a chain by any family name it carries, in any language; a face that Windows only substitutes with another font is still skipped

Version 2.766.16

Fixed

  • N-up composition now places pages with /Rotate 90 and /Rotate 270 turned clockwise inside their cells; before, they were turned the other way and pushed out of the cell, often off the sheet
  • Pages with /Rotate 180 are now turned on the sheet instead of being composed upright
  • N-up composition now honors page boxes and /Rotate inherited from the page tree, so such pages are no longer skipped or composed unrotated
  • Blank pages inserted into a loaded document, including the composed N-up sheets, are no longer turned or cropped by a /Rotate or /CropBox inherited from the page tree

Version 2.766.15

Fixed

  • HPDFTokenizeContentStreamAppend can now reuse a token array after its count is set back to zero: tokens left from the earlier run are released first, so their strings no longer leak and their array items or inline image data no longer show up on the new tokens
  • Appending many small content streams to one token array now grows the array at least twofold instead of reallocating and moving it on every append, which kept pages built from thousands of small streams slow to compile

Version 2.766.14

Fixed

  • Pages with /Rotate 90 or /Rotate 270 are now rendered turned clockwise, as the PDF specification defines, instead of mirrored across the diagonal; before, the top-left corner of a 90-degree page ended up in the bottom-right
  • The fix covers page and region rendering, bitmap, metafile and banded PNG or TIFF export, and the SIMD rendering backend
  • The viewer's page-to-view and view-to-page coordinate conversions and its search and highlight overlays follow the same clockwise turn, so hits and hit-testing line up with the rendered page

Version 2.766.13

Fixed

  • SVG page export now writes text as UTF-8, as the document declares, so accented and CJK characters survive instead of turning into question marks or bytes that make the file unreadable; control codes that XML does not allow become U+FFFD
  • Text after the first run of a line, and text after a TJ kerning adjustment, is now placed correctly when the text matrix scales or rotates the text, which is how many PDF producers set the font size
  • Text rise and horizontal scaling now follow a scaled or rotated text matrix, and TJ adjustments respect horizontal scaling
  • Text drawn with render modes 4 to 6 (paint and clip) is exported instead of dropped, invisible text still moves the text position, and stroked text keeps its stroke opacity
  • Word spacing is no longer applied to two-byte codes that happen to equal 32, and runs of spaces are kept so each character stays at its own position
  • Ligature glyphs export all the characters they stand for, and fonts with mixed one- and two-byte codes are read code by code
  • Pages whose /MediaBox does not start at the origin now land on the SVG canvas instead of being shifted off it

Version 2.766.12

Fixed

  • Drawing on THPDFPage.Canvas, and metafiles played back as vector graphics with ShowMetafile at a position and scale, no longer lose part of their left and top edges when they set a clip region. Each clip region was moved in by one unit on those two sides, so a border or fill along the left or top edge came out thinner than the same one on the right or bottom
  • Clip regions now line up with the same regions when they are filled, and cover the same area at any THotPDF.Resolution

Version 2.766.11

Fixed

  • Underlines and strike-outs of Unicode text drawn with TextOut, UnicodeTextOut, RtLTextOut and ExtTextOut now span exactly the text. They were measured on the text converted to the system code page, so runs with Cyrillic, Hebrew, Greek, CJK or other letters outside that code page got bars that stopped short of the text or ran past it
  • The bars also follow character spacing, word spacing, horizontal scaling and the displacements passed to ExtTextOut

Version 2.766.10

Fixed

  • The report and grid export add-ons (FastReport, QuickReport, ReportBuilder, DevExpress and DBGrid) no longer overwrite each other's output when several exports run at the same time, for example on a server. Their temporary file was named after a timer that only changes every 10 to 16 ms, so exports started together wrote the same file

Version 2.766.9

Fixed

  • TextWidth now measures text the way it is drawn when character spacing, word spacing or horizontal scaling is set. The spacing was not scaled by the horizontal scaling, negative word spacing was ignored and a trailing space got no word spacing, so paragraph continuation, link rectangles and centred or right-aligned text were placed off the drawn text
  • TextWidth and GetWideTextWidth return the same width for the same text

Version 2.766.8

Fixed

  • The ReportBuilder device (TppHotPDFDevice) now draws native text inside its text box. The text was positioned as if its position were the baseline, so every text object started a line too low and its last line ran out of the box
  • Centred and right-aligned native text is measured with the Unicode widths it is drawn with, so text with letters outside the system code page, such as Chinese on a Western system, lines up correctly

Version 2.766.7

Fixed

  • The FastReport export now places memo text inside its memo. The text was positioned as if its position were the baseline, so every memo's text started one font height too low, and bottom-aligned text was drawn below the memo, where clipping hid it
  • Top, centre and bottom vertical alignment all measure from the top of the first line, for plain and HTML-tagged memos

Version 2.766.6

Fixed

  • The FastReport export filter (TfrxHotPDFExport) compiles again. The NotEmbeddedFonts property read a field of a different type, and native picture export used a Clipped property that TfrxPictureView does not have
  • Native picture export now clips every picture to its view, as FastReport does, so a picture larger than its view no longer spills over neighbouring objects
  • A centred picture keeps its frame and clip on the view bounds; only the image itself is centred. The frame used to move with the image

Version 2.766.5

Fixed

  • The DBGrid add-on now measures cell text with the Unicode text widths it draws with before cutting it to fit a column. Text with letters outside the system code page, such as Chinese on a Western system, was measured as question marks and ran past the cell; double-byte text on Chinese, Japanese or Korean systems was cut well before the cell was full
  • A cut never leaves half of a surrogate pair before the ...

Version 2.766.4

Fixed

  • The DBGrid add-on (TDBGridHotPDFExport and DBGridHotPDFExportToFile/ToStream) now draws cell text inside its cells. The text was placed as if its position were the baseline, so every row's text sat on the cell's bottom border and was cut by the next row's grid line
  • Header text is centred in the header row, and the title no longer touches the top of the table

Version 2.766.3

Fixed

  • GetLoadedPDFVersionString now returns %PDF-1.7 and the like on systems whose locale writes a decimal comma; it returned %PDF-1,7 there
  • The pdfVersion field of GetLoadedDocumentReport is fixed the same way

Version 2.766.2

Fixed

  • HTML import (RenderHTML and RenderHTML5) produces the same page at any THotPDF.Resolution. CSS lengths and the importer's Margin, BaseFontSize, ListIndent and BlockSpacing are points, but with Resolution 144 text, margins, lists and tables came out at half size
  • Text and graphics you draw before and after the import still use 1/Resolution inch
  • Documents built at the default Resolution of 72 come out exactly as before

Version 2.766.1

Fixed

  • XFA forms flattened with ApplyXFAAsAcroForm or FlattenLoadedXFA keep the positions, sizes and font sizes from the template at any THotPDF.Resolution. With Resolution 144 the whole form came out at half size in the top left corner of the page
  • Text and graphics you draw before and after flattening still use 1/Resolution inch
  • Documents built at the default Resolution of 72 come out exactly as before

Version 2.766.0

Added

  • THPDFPage.UserWidth and THPDFPage.UserHeight return the page size in the units you draw with, 1/Resolution inch, so layout code can compare it with coordinates, margins and TextWidth at any THotPDF.Resolution. Width and Height still return points, and existing code reads the same values as before

Fixed

  • With THotPDF.Resolution set to a value other than 72, paragraphs now wrap at the real space between their margins and move to the next page at the bottom margin. They measured the page in points, so at 144 a paragraph with wide margins could break after every character and ran onto far too many pages
  • A paragraph that continues on a new page keeps the same page size, coordinates and font size at any Resolution. At 144 the continuation page switched to point coordinates and the text on it came out at half size
  • THPDFTable starts a new page only when a row reaches the bottom margin; at 144 a table placed in the lower half of the page put every row on a page of its own
  • HTML import lays text out across the whole page width at any Resolution instead of the left half
  • Metafiles drawn centered on the page, and metafile clip regions that cover the whole page, use the full page at any Resolution
  • Layout diagnostics for page layers and flushed pages report the page size in drawing units
  • Documents built at the default Resolution of 72 come out exactly as before

Version 2.765.52

Fixed

  • AES-256 passwords with non-ASCII letters now work in other PDF readers. HotPDF hashed the password in the system code page, while ISO 32000-2 defines it as UTF-8, so other readers rejected a password such as a Chinese or accented one; both revision 5 and revision 6 are fixed
  • AES-256 passwords longer than 127 bytes are now cut to 127 bytes as the standard defines, so readers that follow it accept them
  • HotPDF now opens AES-256 files from other producers whose password has non-ASCII letters
  • Files that earlier versions encrypted with such passwords still open in HotPDF with the same password

Version 2.765.51

Fixed

  • ANSI text written after Unicode text in the same font no longer shows up as empty boxes. When a page drew Unicode text with TextOut and then used TextBox or TextOutBoxEx in the same face (for example Arial at another size), the ANSI text was written into the Unicode font and viewers could not find its glyphs; it now gets its own font resource and displays and extracts correctly
  • Pages that use only ANSI text or only Unicode text produce the same output as before

Version 2.765.50

Fixed

  • Documents encrypted with AES-256 revision 6 (UseAES256R6, and PDF 2.0 AES-256) now open in other PDF readers. The password hash was computed with the salt in every round and without the user entry on the owner side, so qpdf, MuPDF and other readers rejected both passwords; HotPDF only accepted its own files
  • HotPDF now opens revision 6 files created by other producers with their user or owner password instead of reporting an incorrect password
  • The AES-256 R6 sample of the Security demo opens in other readers

Version 2.765.49

Fixed

  • Justified Unicode text boxes no longer spread their letters apart and run past the right edge of the box. With a font chosen by name, such as Arial, each justified line came out about twice as wide as the box and overlapped whatever sat beside it; every justified line now ends at the box edge
  • Text drawn with an explicit advance for each character now lands where it was asked to in the same case, instead of every character being pushed an extra character width to the right

Version 2.765.48

Changed

  • The HelloWorld, CJKAnnotations, TextOut and RtLTextOut demos for Delphi and C++Builder now embed only the glyphs they use. They embedded whole system fonts such as Arial Unicode MS, so a one-page hello world came out at about 15 MB and the right-to-left sample at about 30 MB; the same pages are now between 80 KB and 650 KB and look the same

Version 2.765.47

Fixed

  • Right-to-left text no longer comes out with letters in the wrong order in some fonts. Hebrew in Arial Unicode MS had neighbouring letters swapped in many words, and Arabic in Microsoft Sans Serif was not reversed at all, because the glyph numbers of those fonts were mistaken for accent marks when the line was put into visual order
  • The Hebrew lines of the RtLTextOut demo now read correctly

Version 2.765.46

Fixed

  • GetWideTextWidth now includes the character spacing and word spacing the text is drawn with, as TextWidth does. Word-wrapped and centred Unicode text with spacing set was measured too narrow
  • TextOutHTML now shows word spacing set with SetWordSpacing: it places each run at its measured width, which left out the spacing. The CSS word-spacing and letter-spacing of HTML import go through the same layout

Version 2.765.45

Fixed

  • SetWordSpacing now works with embedded fonts. Text in an embedded font is written with two-byte character codes, and PDF applies word spacing only to the one-byte space code, so the spacing was silently ignored whenever FontEmbedding was on or the text needed a Unicode font
  • The spacing is added after every space as a text positioning adjustment, which every PDF viewer honours; text without word spacing is written exactly as before
  • The word-spacing row of the TextOut demo now shows the extra space

Version 2.765.44

Fixed

  • The Delphi and C++Builder AnnotationInteraction demos now fit each link caption inside its link rectangle. The text started too low, so the rectangle border ran through it, and it was wider than the rectangle

Version 2.765.43

Fixed

  • Strikeout text (fsStrikeOut) is now struck through the middle of the lowercase letters. The line was drawn half a line below the baseline, under the underline, so struck text looked double underlined; this also affected <s> in TextOutHTML
  • Rotated text now gets its underline below the baseline instead of along the top of the letters, and its strikeout through the letters
  • Strikeout lines are as thick as underlines on every text path; the Unicode and plain Latin paths drew a much thinner line

Version 2.765.42

Fixed

  • The HTMLText demo now produces a single page with all five samples on it. It added a second page after the one the document already starts with, leaving the first page empty, and began writing near the bottom of the page, so the entity sample and the word-wrapped paragraph fell off the page

Version 2.765.41

Fixed

  • The Delphi and C++Builder Layer demos now show the text of their layers. The text of the visible layer was drawn in the colour of the rectangle behind it and could not be seen, and the text of the hidden layer was nearly white
  • The caption of the Patterns demos is drawn in black instead of being filled with the tiling pattern, which broke it into pattern fragments
  • The caption of the AlphaTransparency demos is no longer drawn semi-transparent green with the Multiply blend mode; the transparent shapes now keep their transparency to themselves

Version 2.765.40

Fixed

  • The Delphi and C++Builder GraphicDraw demos now draw the tangent lines of their curve examples correctly. The first control point line of the left curve stopped short of the labelled point, and the right curve showed a short horizontal stroke instead of the lines from its start point through its control point to its end point
  • The section headings of the rectangle and ellipse pages are black again instead of taking the colour of the last shape drawn

Version 2.765.39

Fixed

  • Text and shapes drawn after PrintHyperlink keep the colours set before it. A gray colour came back as a different colour (white turned blue), and colours set in CMYK or through a colour space came back as an older RGB colour
  • The hyperlink colour now applies only to the link text, whatever colour space the page was using

Version 2.765.38

Fixed

  • TextOutOutline now draws the glyph outlines at the font size with any Resolution. With a Resolution other than 72 the outlines were scaled down once more, for example to half their size at 144
  • Outlines of fonts with fewer than 1000 units per em, such as SimHei, are no longer drawn several times too large

Version 2.765.37

Fixed

  • The Delphi and C++Builder CJKUnicode demos now show their Korean line on systems without Arial Unicode MS. They drew it with the first Chinese font found, which has no Hangul, so the line stayed empty; it now uses Malgun Gothic when the chosen font cannot show Korean

Version 2.765.36

Fixed

  • Chinese and Japanese text written with fonts such as SimHei no longer piles its characters on top of each other. When the same font was used for a second text run, many ideographs were given widths of a few units instead of a full em
  • The affected fonts store fewer advance widths than glyphs; the glyphs after the last stored width now use that width, as the TrueType format requires

Version 2.765.35

Fixed

  • Unicode text in fonts whose design grid has fewer than 1000 units per em, such as SimHei and SimSun with 256, is now spaced correctly. The glyph widths written to the PDF were about four times too large, so viewers left wide gaps after spaces and other newly used characters

Version 2.765.34

Fixed

  • The scanned-image scenario of the PDFOptimize demo now compresses a real text page. Its 1-bit test image came out entirely black, so CCITT G4 and JBIG2 were compared on a solid rectangle
  • The image scenarios of the PDFOptimize demo now embed only the glyphs of their page label, so the reported sizes show the difference between the image compression methods instead of being dominated by a whole embedded font

Version 2.765.33

Fixed

  • The E-Invoice demo now lays out the visible invoice page from the top: the title is at the top of the page and the invoice, parties and amounts follow below it. The page was drawn upside down in order, with the title near the bottom edge and the footer note at the top

Version 2.765.32

Fixed

  • JBIG2 images encoded strictly lossless (Lossless with LossyLevel = 0) now keep every pixel. The default removal of tiny black dots as scan noise ignored these settings, so the full stops and the dots of i and j in small text disappeared from images that were meant to be lossless
  • The scan-friendly defaults (LossyLevel = 5 with RemoveIsolatedBlackPixels) still remove speckles as before

Version 2.765.31

Fixed

  • Exporting loaded pages to PNG or TIFF no longer fails with "received too many rows" at resolutions where a render band is not a whole number of points, such as the default 150 DPI of SaveLoadedPagesAsImages with a Letter page. Rounding made every band one pixel row taller than planned, so the bands added up to more rows than the image

Version 2.765.30

Fixed

  • TextWidth, TextHeight, GetWideTextWidth and GetWideCharAdvances now answer in the page units of Resolution, the units text is drawn at. With a Resolution other than 72 they used to answer in points, so measured text did not fit the coordinates it was placed at
  • With a Resolution other than 72, text drawn with TextOut now starts at its Y instead of too high, and underlines and strike-outs cover the whole text at the right distance and thickness instead of a fraction of it
  • At any Resolution, TextBox, TextOutBoxEx and WideTextOutBoxEx centre and right-align their lines by the real text width, table cells and paragraphs wrap text by it, and the styled runs of TextOutHTML no longer overlap
  • A font fallback run inside WideTextOutBoxEx keeps the font size at any Resolution instead of shrinking
  • Output at Resolution 72 is unchanged

Version 2.765.29

Fixed

  • When Windows cannot apply the world transform of an EMF metafile itself, HotPDF combines the transforms on its own. The vertical offset of a combined transform used the wrong term, so content in such metafiles could be shifted up or down

Version 2.765.28

Fixed

  • Showing an EMF metafile no longer prints diagnostic lines such as [WMF_DEBUG] EMR_POLYGON16 record found to the standard output of console applications. The metafile trace was left switched on in the release build

Version 2.765.27

Fixed

  • Text in EMF metafiles shown with ShowMetafile now sits at the height Windows draws it. Top-aligned text, the default of TCanvas.TextOut, was drawn one line height too high, and bottom-aligned text was also too high
  • Baseline-aligned and rotated metafile text is unchanged

Version 2.765.26

Fixed

  • ShowMetafile with a position and scale now draws the metafile with its top left corner at the given point and scaled as requested. It used to ignore these arguments and always drew the metafile at the top left corner of the page at its natural size
  • ShowMetafile without a position is unchanged

Version 2.765.25

Fixed

  • AngleArc drawings in EMF metafiles shown with ShowMetafile now draw the arc they describe, in either direction, followed by lines that continue from the end of the arc. A full circle was drawn instead, and its size was wrong whenever the metafile had an offset

Version 2.765.24

Fixed

  • Under PDF/A and PDF/X, free text annotations with plain ASCII contents now show their text. Their appearance used to draw only the frame and fill, because the Helvetica named in the annotation's default appearance may not be used unembedded there
  • The text is drawn at 12 pt in the page's current font, which is embedded together with the page text, wrapped to the annotation box and aligned by the chosen justification, as already done for non-ASCII contents
  • Outside PDF/A and PDF/X, ASCII-only free text annotations are written exactly as before

Version 2.765.23

Fixed

  • With AutoShapeArabic turned on, TextOut and UnicodeTextOut now join Arabic, Persian and Urdu letters into their initial, medial and final forms and ligatures, as RtLTextOut already did. Every letter used to be shown in its isolated form
  • The same applies to AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam, AutoShapeHanifiRohingya and to Hebrew point reordering (sfHebrewReorder in ShapingFeatures)
  • With these options on, text whose glyph numbers happened to fall in the Arabic or Hebrew character ranges could be shown with the wrong glyphs; this no longer happens
  • Free text annotations drawn in the page font are shaped the same way as page text
  • Output with these options turned off is unchanged

Version 2.765.22

Fixed

  • Curved shapes now honour Resolution values other than 72. Ellipse, Circle, Arc, DrawArc, Pie, DrawPie, Chord and ArcTo used to be drawn at the wrong place and size, while straight lines, rectangles and rounded rectangles were correct
  • Output at the default resolution of 72 is unchanged

Version 2.765.21

Fixed

  • Pie wedges drawn with Pie or DrawPie are now single closed shapes, so their outline gets proper corners where the straight edges meet the arc instead of two loose line ends
  • Chords in EMF metafiles shown with ShowMetafile now close along the straight line between the ends of their arc. The line used to run to a point well away from the shape

Version 2.765.20

Fixed

  • DrawArc and DrawPie now draw the part of the ellipse their documentation describes: counterclockwise from the start point to the end point, as the Windows GDI Arc and Pie calls do. They used to draw the other part, so a quarter arc came out as three quarters
  • Pie slices, chords and ArcTo arcs in EMF metafiles shown with ShowMetafile now match the picture Windows draws, for both arc directions. They used to show the opposite part of the ellipse; plain arcs were already correct
  • The angle-based Arc, Pie, Chord and ArcTo methods are unchanged

Version 2.765.19

Fixed

  • Rotated rectangles drawn with RectangleRotate are now closed shapes, like those drawn with Rectangle. Stroking one used to leave its fourth side out, so an outline-only rotated rectangle showed three edges
  • Filled rotated rectangles, and the underline and strikeout bars of rotated text, look the same as before

Version 2.765.18

Fixed

  • Negative numbers written into generated PDFs are now rounded correctly. Values such as -50 used to be written as -49.99, so negative coordinates, offsets and positions in page content, annotation rectangles and similar entries could be off by up to 0.01 units
  • Negative values are now rounded half away from zero, exactly mirroring positive values; a negative value that rounds to zero is written as 0
  • Output for zero and positive numbers is unchanged

Version 2.765.17

Fixed

  • Free text annotations with Chinese, Japanese, Korean, Arabic, Cyrillic or other non-ASCII contents now show their text in every viewer. They used to rely on the viewer drawing the text in Helvetica, which can only represent Western characters, so viewers such as Poppler showed only the ASCII punctuation
  • These annotations now carry their own appearance (ISO 32000-1 12.5.5): the text is drawn in the page's current font, embedded and subset together with the page text, wrapped to the annotation box (between words, or between characters for text without spaces), aligned by the chosen justification and placed over the same frame and fill as before
  • The appearance is also written under PDF/A, where the embedded font keeps the document conformant and the annotation text is now visible instead of an empty box
  • Free text annotations with ASCII-only contents are written exactly as before

Version 2.765.16

Fixed

  • Blank pages inserted into loaded documents with InsertLoadedBlankPage now carry the resource dictionary every page requires (ISO 32000-1 Table 30), so validators such as qpdf no longer report the page tree as damaged and content can be added to the page later

Version 2.765.15

Fixed

  • In the Table demo the subtotal amount now spans the Qty and Price columns as intended; it used the wrong cell index, which left the Qty column as an empty cell

Version 2.765.14

Fixed

  • Images in THPDFTable cells are now drawn inside their cell and honour the vertical alignment; they were placed one image height too low, below the cell and outside the table

Version 2.765.13

Fixed

  • Unicode text widths (GetWideTextWidth and the justification measure) now match the font; for fonts such as Arial they came out about twice too large
  • Tables, word-wrapped text, and right-aligned, centred or justified text built on these widths are laid out correctly again: short cell text no longer wraps, right-aligned values reach the cell edge, and HTML text in table cells no longer shows large gaps between words

Version 2.765.12

Fixed

  • Forms with check boxes or radio buttons now list the ZapfDingbats font (/ZaDb) in the form's default resources. Viewers that draw these fields themselves (the default when AutoFormAppearances is off) look the font up there to draw the check mark; before, Poppler-based viewers reported an unknown font and showed no mark

Version 2.765.11

Fixed

  • In the CJKAnnotations demo the first note icon of each language row now lines up with the other icons of that row; it was placed 5 points higher

Version 2.765.10

Fixed

  • Fonts requested by their English name are now found on Windows systems in other languages. A request for SimSun, Microsoft YaHei or MS Gothic on Chinese, Japanese or Korean Windows was treated as a missing font, because Windows reports the name in the system language, and the text was silently set in Arial Unicode MS instead

Version 2.765.9

Fixed

  • Fonts that Windows keeps in TrueType collections (.ttc), such as SimSun, Microsoft YaHei and MS Gothic, are now embedded as valid standalone fonts. Before, every table of the embedded font pointed at the wrong data, so viewers rejected it and fell back to a system font, and on computers without that font the text showed wrong glyphs
  • This also affected documents whose requested font was missing and that Windows mapped to a collection font, for example Unicode text with Arial Unicode MS on systems where only SimSun was available

Version 2.765.8

Fixed

  • Source files that contain non-ASCII text are saved as UTF-8 with a byte order mark again. Without it, Delphi reads a source file in the code page of the building computer, so on Chinese, Japanese, Korean and other non-Western Windows systems the CJK, Arabic, Hebrew and accented text in the demos came out garbled in the generated PDFs, and library error messages showed wrong characters
  • The demos CJKAnnotations, Annotations, HelloWorld, RtLTextOut, PageSizes, TextOut, Showcase and ViewerPref again produce the intended text wherever they are compiled

Version 2.765.7

Fixed

  • Document information given as UTF-8 (Title, Author, Subject, Keywords, article thread titles and SetLoadedDocumentInfo with the SetLoadedTitle family) is now stored as Unicode, so viewers show accented and CJK text correctly and the document information matches the XMP metadata
  • Text in the system code page (for example a Chinese title on a Chinese Windows system) is also stored correctly, since bytes that are not valid UTF-8 are read in that code page

Version 2.765.6

Fixed

  • The initial view of new documents (InitialZoom) now writes complete fit-width and fit-height destinations; the operand that ISO 32000-1 Table 151 requires was missing, so viewers such as Poppler reported a too-short destination array for every document created with the default setting

Version 2.765.5

Fixed

  • Page labels that do not start on the first page now also cover the pages before the first range, which keep plain numbers; the page label tree must include the first page (ISO 32000-1 12.4.2), and without it viewers could show wrong labels
  • SetLoadedPageLabel now keeps the ranges in page order and replaces a range that starts on the same page, so viewers show the intended labels; before, new ranges were appended out of order and could repeat
  • SetLoadedPageLabel no longer discards the existing labels of documents that store them in a separate object, and it also updates label trees split into several nodes
  • Page label prefixes given as UTF-8 are now stored as Unicode

Version 2.765.4

Fixed

  • Link descriptions given as UTF-8 (AddURILink, AddGoToLink, AddGoToRLink, AddLaunchLink, AddNamedDestinationLink and the structure-destination links) are now written as Unicode, so screen readers and viewers show accented and CJK text instead of garbled characters
  • The same applies to the text and author of annotations added to loaded documents with the AddLoaded...Annotation methods, matching annotations created in new documents

Version 2.765.3

Fixed

  • AddGoToLink can now link to a page that is added later in a new document, so a table of contents on the first page can link forward; such links used to be dropped without any error
  • A link whose target page is never added keeps its area but no action, instead of pointing at a missing page

Version 2.765.2

Fixed

  • SetLoadedOutlineOpen now opens and closes bookmarks in loaded documents; before, it wrote a key that viewers ignore and the bookmark kept its state
  • AddLoadedOutline, SetLoadedOutlineURI and SetLoadedOutlineDestination now act on the requested bookmark; for any index above 0 they changed the wrong bookmark or did nothing
  • Adding a bookmark to a loaded document now updates the visible-item counts of its parent, its ancestors and the outline, so viewers no longer show wrong expand states or item totals
  • Setting a web link on a loaded bookmark now removes its page destination, and setting a destination removes its action, since a bookmark may carry only one of them
  • Bookmark titles given as UTF-8 to AddLoadedOutline and SetLoadedOutlineTitle are now stored as Unicode instead of as garbled bytes

Version 2.765.1

Fixed

  • Bookmarks in new documents now record how many entries are visible, as ISO 32000-1 12.3.3 requires: before, the outline and every open bookmark counted all nested entries, including those inside closed bookmarks
  • Setting Opened on a bookmark after its children were added now opens it in the viewer; before, the change never reached the file
  • Assigning Title to an existing bookmark now changes the title shown in the document
  • Bookmark titles with non-ASCII text given as UTF-8 are now written as Unicode, so accented and CJK titles show correctly instead of as garbled characters
  • Bookmarks now carry the parent reference that the specification requires

Version 2.765.0

Added

  • HPDFTokenizeContentStreamAppend tokenizes a content stream straight into an existing token array, so callers that combine several streams avoid a temporary array per stream

Changed

  • Compiling a page for rendering no longer allocates memory for each number and operator in its content stream, and page content is tokenized directly into the page's display list instead of being copied there
  • Parallel page rendering scales much better on a cold document: on a 128-page vector test document, 4 workers now finish about 3 to 3.5 times faster than 1 worker (previously about 1.4 times on 32-bit and 1.7 times on 64-bit builds)
  • Single-threaded page compilation and rendering is also about 35% faster on that document; tokens, display lists and rendered output are unchanged

Version 2.764.7

Changed

  • Rendering content that saves and restores the graphics state often (q/Q) no longer allocates memory for every save, which made worker threads of parallel page rendering wait on each other inside the memory manager
  • Cold parallel rendering of a 128-page vector test document is about 7–10% faster with 4 workers and about 5% faster on one worker; rendered output is unchanged

Version 2.764.6

Fixed

  • Parallel page rendering no longer drops to one page at a time when the pages were rendered before and their display lists are still cached
  • Previously every page waiting to be drawn kept its memory reservation while only one page was drawn at a time, so the other workers stalled on the shared memory budget; once as many pages are waiting as there are workers, they are now drawn in parallel
  • The first page still arrives early, and the memory reserved by a batch now stays proportional to the worker count instead of filling the whole budget

Version 2.764.5

Fixed

  • SetStructureClassMapEntry can now register one attribute dictionary under several class names, or again under the same name, without freeing it
  • Previously, removing or replacing one of those entries released the shared dictionary, so the remaining /ClassMap entries pointed at freed memory and saving the document could write garbage or raise an access violation
  • A directly created attribute dictionary now becomes an indirect object when it is registered, and every /ClassMap entry refers to it; the document owns the dictionary, so callers must not free it

Version 2.764.4

Fixed

  • RemoveUnusedLoadedPageResources no longer writes to a resource table after removing it, when a page's /Font, /XObject or other resource table is written directly inside /Resources and every entry in it is unused
  • Previously that write went to released memory, which usually went unnoticed but could corrupt memory or raise an access violation later in the session
  • Emptied resource tables are still removed from /Resources, and the saved output is unchanged

Version 2.764.3

Fixed

  • Opening a public-key (certificate) encrypted PDF with PubSecKeyMaterial, by LoadFromFile or BeginIncrementalUpdate, no longer reads recipient envelopes from memory that had already been released while recovering the file key
  • The failure depended on how memory happened to be reused: the document usually opened, but could be rejected as if no key material had been assigned, or unwrap the wrong bytes
  • Multi-recipient documents, the recipient selection callback and additional key materials registered with AddPubSecKeyMaterial all use the same corrected envelope list

Version 2.764.2

Fixed

  • Field appearances generated for loaded forms, by AddLoadedTextField and the other AddLoaded* field methods, EnsureLoadedFieldAppearanceStream or FlattenFormFields, now hold their own reference to the AcroForm /DR font instead of sharing the /DR entry
  • Replacing or deleting the AcroForm /DR dictionary, or removing the last form field (which also removes the AcroForm), no longer leaves those appearances pointing at freed font objects
  • Previously, freeing the document afterwards could hit a hidden access violation that left the rest of the document unreleased, or corrupt memory, most often in 64-bit builds
  • A font written directly inside /DR becomes an indirect object the first time an appearance uses it, so the field appearance and /DR refer to the same font object in the saved file

Version 2.764.1

Fixed

  • Calling ProcessObjectStreamsForDecompression after LoadFromFile no longer reads the file stream that the load had already closed; it rescans the loaded file instead, so object stream members stay available to ExtractObjectFromStream
  • The failure depended on how memory happened to be laid out: it usually went unnoticed, but could raise an access violation or scan unrelated memory, most often in 64-bit builds
  • FindAllObjectStreams, ScanAndLoadReferencedObjects and ForceLoadMissingReferencedObjects now do nothing when called outside a load, instead of touching the closed stream

Version 2.764.0

Changed

  • One THotPDF instance, for example a component dropped on a form, can now write any number of documents one after another: BeginDoc after EndDoc starts a new, independent document instead of raising an exception
  • EndDoc drops everything registered for the written document, including its images, fonts, form fields, outlines, document JavaScript, named destinations, page labels, ICC profiles and output intents, and the next BeginDoc frees its pages and objects, so none of it reaches the next file; with ReproducibleOutput on, a second document from a reused instance is byte for byte the same as that document from a new instance
  • Registrations made between EndDoc and the next BeginDoc, such as AddPDFAOutputIntent or scripts added through Names, belong to the next document and are no longer cleared by BeginDoc
  • Property settings such as FileName, Compression, PDFACompliance, Author and Title, together with page layers and font fallback chains, carry over to the next document; a PDF version raised automatically for one document returns to the Version property value
  • The written document stays available after EndDoc until the next BeginDoc, so ValidatePDFUA2Structure, CurrentPageNumber, PagesCount and the layout diagnostics keep working on it
  • Because the passwords are cleared once a protected document is encrypted, BeginDoc raises an exception when ActivateProtection is still on and no new password was set, instead of protecting the next file with empty passwords
  • Starting a new document after rewriting a loaded one on the same instance also produces a clean file

Version 2.763.1

Fixed

  • Converting an EPUB, or importing HTML with the HTML5 profile, no longer risks an access violation when a paragraph does not fit on the current page; the paragraph is now always drawn on the new page
  • The same fix covers paragraphs, list items and horizontal rules in the compact block renderer used by HPDFRenderHTMLDocument
  • The failure depended on how memory happened to be laid out, so it appeared only occasionally, most often in 64-bit builds, and could leave a conversion without output or corrupt its content

Version 2.762.1

Fixed

  • Calling BeginDoc again on a THotPDF instance that has already written a new document no longer ends in an access violation; it raises an exception that asks for a new instance, because the instance still holds the objects, images, fonts and form fields of the finished document
  • Past the crash, the second document would have carried the objects of the first one, including its content and form fields; one instance per new document keeps every file to its own content
  • Loading an existing document with LoadFromFile and rewriting it is not affected

Version 2.762.0

Fixed

  • Text, free text, line, square, circle, stamp and file attachment annotations are visible in PDF/A-2, PDF/A-3, PDF/A-4 and PDF/X-6 documents; they carried an empty appearance stream that only satisfied the validator, and because viewers draw the appearance, nothing was shown
  • These appearances now draw the annotation: the square and circle frames, the line, a note icon and an attachment icon in the annotation colour, the stamp frame, and the free text box filled with its background colour
  • PDF 2.0 output gives every one of these annotations, the extended markup annotations and new form fields an appearance stream, as ISO 32000-2 Table 166 requires, and writes /NeedAppearances false; outside PDF/A and PDF/X the free text and the stamp name are drawn in Helvetica
  • In PDF/A and PDF/X the free text and stamp appearances draw no text, because every font used there has to be embedded; the text stays in the annotation for viewers to show

Version 2.761.6

Fixed

  • File attachment annotations (AddFileAttachmentAnnotation) can be opened and saved again in viewers: the file specification wrote the embedded file stream itself as /EF, where ISO 32000-1 Table 44 requires an /EF dictionary holding the stream under /F, so readers reported that the file entry was missing
  • The embedded file stream of such an attachment is typed /EmbeddedFile, and the annotation text is also stored as the file's description

Version 2.761.5

Fixed

  • Named destinations, document-level JavaScript and document attachments are written with their name tree keys in sorted order, as ISO 32000-1 7.9.6 requires; they were written in registration order, and readers that search the tree could miss entries (qpdf reported the trees as unsorted)
  • Attaching two files with the same file name no longer creates two entries with one key, which left only one attachment reachable; the second one gets a numbered key such as a (2).txt and keeps its original file name
  • AddLoadedDocumentJavaScript and AddLoadedNamedDestination changes are saved; the edited name tree was not written back when it lived in a direct dictionary, so the new entries were lost. Both insert at the sorted position, also in trees split into /Kids nodes, and replace an existing entry of the same name
  • AddLoadedDocumentJavaScript stores a JavaScript action as the name tree value instead of a bare script stream, and AddLoadedNamedDestination writes the zoom operand of its /XYZ destination
  • RemoveLoadedJavaScript and RemoveLoadedJavaScriptAll remove the scripts from the document itself; before, only the list returned by the getters changed and the scripts stayed in the saved file
  • SetDocumentAttachmentMetadata renames the attachment it is given; it renamed the key of the last attachment in the tree, and the renamed entry now moves to its sorted position

Version 2.761.4

Fixed

  • New AcroForms always define the Helvetica font that the fields' default appearance strings name in the form's default resources (/DR), as ISO 32000-1 12.7.3.3 requires; without AutoFormAppearances the font was missing, so viewers that build field appearances had no font to build them with
  • AddLoadedComboBox creates a real combo box; it set the Edit flag instead of the Combo flag, so the field was a list box that viewers showed as a list of all options
  • Fields added to a loaded document write /NeedAppearances as the boolean true instead of the name /true, and an AcroForm created for them gets the default appearance string and default resources their /DA strings refer to
  • AddLoadedTextField, AddLoadedCheckBox, AddLoadedComboBox, AddLoadedListBox and AddLoadedPushButton give the new field an appearance stream, so it shows in viewers that do not build appearances and in documents whose form sets /NeedAppearances false
  • Appearances generated for loaded push buttons (when added, redrawn or flattened) draw the caption, where they were empty

Version 2.761.3

Fixed

  • Changing a text or choice field value in a loaded form now redraws the field: SetFormFieldValue, ResetLoadedFormField and multi-selection list box updates regenerate the appearance stream, where the saved file kept showing the old text in every viewer and in print because viewers draw the appearance, not the stored value
  • Generated appearances of password text fields show one asterisk per character instead of the password in readable form (ISO 32000-1 Table 228), both for new fields with AutoFormAppearances and for loaded fields that are redrawn or flattened
  • AnalyzeLoadedSignatureRevisions classifies the new appearance dictionary, appearance stream and its resources that a form fill adds after signing as form filling, as it already did for the field itself, so filling a certified form in an incremental update is no longer reported as a change outside recognised structures

Version 2.761.2

Fixed

  • 1-bit and 4-bit palette bitmaps added with Flate compression keep their colours; they were remapped onto the 256-colour system palette, which shifted every colour that palette does not contain. They are now embedded at their own bit depth with their own palette, which also makes the image data smaller
  • 1-bit bitmaps whose palette lists white before black no longer come out as a negative with CCITT Group 3, CCITT Group 4 or JBIG2 compression, including the batch and cross-page JBIG2 paths; the darker palette colour is always encoded as black
  • icAutoMono and AddMonochromeImageAuto keep a 1-bit bitmap with a coloured palette on Flate instead of turning it into black and white with CCITT or JBIG2
  • CCITT Group 3 two-dimensional images (icCCITT32) now follow their /K parameter: the first row and every second row are coded one-dimensionally and /K is 2, where every row used to be coded two-dimensionally under /K 1, which allows no two-dimensional rows at all (ISO 32000-1 Table 11, ITU-T T.4)

Version 2.761.1

Fixed

  • JPEG images added with DCT compression keep their own colour model: greyscale JPEGs are written as DeviceGray and CMYK JPEGs as DeviceCMYK, where every JPEG used to be declared DeviceRGB; readers then showed greyscale files garbled or truncated and CMYK files in wrong colours
  • CMYK JPEGs that carry the Adobe marker (the usual Photoshop output) get the inverted /Decode array their sample values need (ISO 32000-1 8.9.5.2 and 7.4.8)
  • PDF/A colour-space checks now see greyscale and CMYK JPEG images as DeviceGray and DeviceCMYK use instead of DeviceRGB
  • StampLoadedPageImage applies the same colour model when a JPEG is stamped onto a loaded page
  • File names such as PHOTO.JPG or scan.jpeg now load as JPEG with every compression type; the file overload of AddImage recognises JPEG data by its signature instead of a case-sensitive .jpg extension and no longer tries to read such files as bitmaps

Version 2.761.0

Added

  • New AddLoadedSignedSignatureField adds a signature field that is ready to sign to a loaded document, so an already signed PDF can receive a second signature (counter-signature or approval) in an incremental update
  • The field reserves the signature space that SignPDFWithPFX, PreparePDFForSigning and InsertSignatureHex fill in; after BeginIncrementalUpdate and SaveIncrementalUpdate the new signature covers the whole file while the earlier signatures stay valid
  • Optional reason, location and contact information, the SubFilter and the reserved signature size can be set per field; the AcroForm is flagged as signed and append-only, and no appearance regeneration flag is added to the signed document

Fixed

  • The documented multi-signature workflow for BeginIncrementalUpdate now describes steps that work; the previous description relied on a current page that does not exist after loading and on a signature field without reserved signature space, so signing failed

Version 2.760.1

Fixed

  • DrawQRCode, DrawDataMatrix, DrawPDF417 and DrawAztec restore the page fill colour after drawing, as documented; shapes filled afterwards used to take on the barcode colour
  • These barcodes are drawn as one path, with each run of dark modules in a row merged into a single rectangle, so the page content is smaller and viewers no longer show faint seams between adjacent modules

Version 2.760.0

Changed

  • Setting CryptKeyLength to aes256 raises the output to PDF 1.7 when it is lower, the way other version-dependent features already do, so documents are really protected with AES-256. With the default PDF 1.6 output they used to be written with AES-128 without any notice; with StrictVersionLock set, a lower version still falls back to AES-128

Fixed

  • Help pages for the protection properties showed permission names that do not exist; the examples and the descriptions of prPrint and prPrint12bit now match the actual options and the public-key encryption notes list the supported key types

Version 2.759.0

Fixed

  • Signed PDFs now leave the whole /Contents string, including its < and > delimiters, out of the signed byte ranges, as ISO/IEC 32000-1 12.8.3.3 requires; the delimiters used to be signed, which validators that check the byte range against the signature value report as an invalid byte range
  • PDF MAC validation of signatures carrying an attached MAC accepts both the standard byte range and the one earlier versions wrote

Security

  • Signature verification rejects a document whose unsigned gap between the two byte ranges holds anything besides the signature's own /Contents string, closing a signature-wrapping gap where content outside the signed bytes was reported as covered; signatures made by earlier versions still verify

Version 2.758.1

Fixed

  • The default appearance that AttachSignatureFieldAppearance gives an unsigned signature field draws its light grey background again: the fill rectangle was missing two operands and set its colour inside the path, which viewers reject
  • Free-text annotations created on a new page carry the default appearance string that ISO 32000-1 requires, so viewers can lay out their text instead of showing an empty box

Version 2.758.0

Fixed

  • The built-in JBIG2 decoder places every symbol after the first one in a text strip where ISO/IEC 14492 puts it; each further symbol used to land one more pixel to the right, so text in JBIG2 scans made by other encoders drifted apart
  • JBIG2 images written with the native arithmetic encoder and a symbol dictionary that holds a single glyph can now be read by other PDF viewers; the symbol identifiers were coded with one bit instead of none, which made those viewers fail at the first glyph
  • Symbol dictionaries that combine glyphs through refinement and aggregation are decoded with the standard spacing, matching other JBIG2 decoders
  • JBIG2 images that share a global symbol dictionary write /DecodeParms as an array matching the /Filter array; other viewers ignored the single dictionary and could not find the shared glyphs, so such images failed to display

Version 2.757.0

Fixed

  • DirectDrawBarcode and the Simple* bar functions now draw real barcodes for every symbology; most of them used to return evenly alternating bars that carried no data. GS1-128 with code set C (type 22) is drawn instead of falling back to Code 39, and POSTNET short bars are drawn at 40 % of the height
  • DirectDrawBarcode scales bar widths and heights with the page coordinate system, so barcodes stay readable when the document scale is not one point per unit
  • Code 128, Code 93 and the EAN / UPC family keep exact one-to-four module element widths whatever Ratio is set; any ratio other than 2 used to make them unreadable
  • EAN-8, EAN-13, UPC-A and UPC-E given only their data digits get the check digit added; the last data digit used to be taken as the check digit. With Checksum enabled, UPC-A no longer drops its last data digit, and the UPC-E check digit (which also selects the bar parity) is computed from the expanded UPC-A number
  • MSI check digits are correct for numbers with an odd digit count, POSTNET codes get their correction digit, and Interleaved 2 of 5 keeps the last digit of an odd-length number by adding a leading zero
  • Code 128 A encodes lower-case letters through SHIFT instead of turning them into spaces or control characters, Code 39 folds lower case to upper case, and Codabar keeps supplied start and stop characters
  • Characters a symbology cannot represent now raise an exception; Code 39 and Code 128 used to drop or replace them and Codabar read outside its character table
  • GS1-128 with Checksum enabled no longer appends another check digit to Text each time the barcode is measured or drawn

Version 2.756.0

Fixed

  • QR Codes drawn with DrawQRCode or built with THPDFQRCode now scan with standard readers: the format information is placed as ISO/IEC 18004 specifies, and the error correction block structure is correct for every version from 10 to 40 (and for version 7-Q)
  • Automatic mode selection keeps lower-case text in byte mode, so a URL such as https://example.com is no longer encoded and read back in upper case
  • Text whose length ends in one or two digits or one alphanumeric character gets a symbol large enough for it; the last characters were previously dropped
  • Encoding twice with the same THPDFQRCode instance no longer mixes the previous symbol into the new one
  • Encode returns False when an explicitly requested version is too small or the requested numeric or alphanumeric mode cannot represent the data, instead of producing a truncated symbol
  • Mask selection applies the finder-like pattern and dark-module balance penalties of ISO/IEC 18004 7.8.3
  • The built-in barcode decoder reads standard QR Codes: multi-block symbols with Reed-Solomon verification, numeric, alphanumeric, byte and ECI segments, UTF-8 payloads and versions with several alignment patterns

Added

  • HPDFQRFunctionMap and HPDFQRExtractDataWords expose the module layout and the block de-interleaving with error detection for code that reads QR symbols

Version 2.755.9

Changed

  • Image soft-mask rendering reuses exact horizontal sample indices and uses SSE2 alpha premultiplication on supported Delphi x86 and x64 targets, preserving pixel rounding and cancellation with bounded temporary storage and a scalar fallback

Version 2.755.8

Fixed

  • Foreground rendering can resume once cancelled page prefetch has released document resources, without waiting for the worker thread to finish exiting; explicit cancellation, replacement, reload, and destruction still join the thread, and invalid page ranges no longer leak a suspended worker

Version 2.755.7

Fixed

  • Page rendering preserves the current path across graphics-state restores and isolates Form XObject and Type3 glyph paths, clipping, and saved state, including malformed extra restores and cancellation

Version 2.755.6

Fixed

  • The SIMD rectangle renderer now honors compound even-odd and nonzero fill rules, preserving holes, reflected subpath direction, and fractional edge placement; cancellation during rasterization discards the partial bitmap and propagates correctly

Version 2.755.5

Fixed

  • Multi-select form imports now reserve exact option values before interpreting hexadecimal compatibility spellings in XFDF, preventing literal values from selecting a different option and keeping stored values consistent with selection indices

Version 2.755.4

Fixed

  • Text extraction from vertical (WMode 1) CID text now moves the pen by the ISO 32000-1 9.4.4 displacement, so character spacing shortens the step down the column as the specification defines instead of lengthening it
  • A TJ position adjustment in vertical text now moves the pen down or up the column instead of sideways, so extracted columns no longer split and the reading order stays top to bottom
  • The CIDFont /DW2 array is read in its specified [v1y w1y] order during extraction, so glyphs relying on the defaults advance by a full em instead of 0.88 em
  • Extracted vertical glyph origins stay on the column centre line, and glyph boxes are placed at the vertical origin minus the position vector, with the horizontal component defaulting to half the glyph width
  • /W2 list entries that describe several consecutive CIDs now apply their metrics to every CID in the run during extraction instead of only the first
  • The page renderer and the text extraction interpreter now share one implementation of the glyph and TJ displacement rules, so rendered and extracted positions cannot drift apart

Version 2.755.3

Added

  • THPDFQCStatementInfo gains HasPSD2Statement, PSD2RolesOfPSP, PSD2NCAName and PSD2NCAId; the CMS-level descriptor carries the same fields
  • HPDFParsePSD2QcStatement parses a PSD2 statement you already hold as DER and rejects any malformed input

Deprecated

  • PSD2RolesPayer and PSD2RolesPayee remain for source compatibility but are always empty, because the specification defines no payer and payee role lists; use PSD2RolesOfPSP

Fixed

  • The PSD2 qualified-certificate statement is now read with its ETSI TS 119 495 structure, reporting every role of the payment service provider with its role OID and role name, the name of the national competent authority and the authority identifier; real PSD2 certificates previously reported no roles at all
  • A malformed PSD2 statement, including overrunning or non-minimal lengths, missing or extra components, wrong string types and names that are not valid UTF-8, is ignored as a whole instead of being partly reported

Version 2.755.2

Fixed

  • Page rendering of vertical (WMode 1) text now advances each glyph by the ISO 32000-1 9.4.4 text-space displacement: word spacing is no longer scaled by the font size and is no longer added to two-byte CID codes, since it applies only to the single-byte space code
  • Character spacing in vertical text is applied along the writing direction exactly as the specification defines it, so columns set with a non-zero Tc render at the same height as in other conforming viewers
  • Invisible text (rendering mode 3 and hidden optional content) advances vertical columns with the same rules as painted text, keeping later visible glyphs in the correct place
  • The CIDFont /DW2 array is read in its specified [v1y w1y] order, so fonts that rely on the defaults advance by a full em instead of 0.88 em
  • Vertical glyphs are painted at the vertical origin minus their position vector, with the horizontal component defaulting to half the glyph width, which centres columns on the pen position
  • /W2 list entries that describe several consecutive CIDs now apply their metrics to every CID in the run instead of only the first

Version 2.755.1

Fixed

  • ExportLoadedFormToFDF now generates the complete FDF body before creating the target file, so a mid-export failure no longer replaces the destination with a truncated document
  • The FDF stream interchange scanner tracks hexadecimal strings, keeping field dictionaries intact when a hex value ends directly against the dictionary terminator
  • Choice selection index reconciliation decodes mixed PDFDocEncoding, UTF-16 and hexadecimal spellings with one matcher, so equivalent export values rebuild /I consistently
  • XFDF import accepts the hexadecimal spelling of an option export value delivered as plain literal text, restoring round trips written by third-party tools
  • FDF export skips widget-only fields without a field name, matching the XFDF exporter and the behaviour of every importer
  • The Delphi Stamp demo anchors its watermark and rubber-stamp annotation to the actual page size, keeping them visible on landscape and non-A4 inputs
  • The C++Builder DigiPrint demo releases its images and per-page line lists, initialises the header line spacing factor and reports a missing demo.xml instead of crashing
  • The Win64 ABI DLL and codec worker build scripts locate dcc64 in bin64 on RAD Studio 12 and later, and full C++Builder library builds detect and clean trial residue from the shared output directory

Version 2.755.0

Added

  • Loaded multi-select choice fields now exchange individual selected values through FDF file and stream APIs and XFDF array-aware callbacks, preserving option boundaries and synchronizing selection indices on import

Version 2.754.6

Fixed

  • SetLoadedFormFieldExportValue now uses the normal field-value update path, preserving button value types, selection indices, appearance states, encoded strings, and calculation change tracking

Version 2.754.5

Fixed

  • XFDF form values and annotation text elements now preserve their exact content without inserting formatting whitespace, including leading and trailing spaces, tabs, and line breaks

Version 2.754.4

Fixed

  • Loaded form value, default, and maximum-length helpers now honor inherited and indirect entries, while field resets preserve default value types, synchronize choice selections and button states, and leave sibling fields unchanged; regenerated button appearances retain the selected state and valid rendering bounds

Version 2.754.3

Fixed

  • Loaded named child fields now remain individually addressable when their field type is inherited, with inherited type, flags, and options available through field helpers and removal preserving sibling fields and their widgets

Version 2.754.2

Fixed

  • Regenerated loaded choice field appearances now display Unicode option labels while preserving export values, render unselected list options, and highlight single or multiple selections consistently with the field values and indices

Version 2.754.1

Fixed

  • Updating a loaded choice field now keeps its selected-option indices consistent with the new value, including option export values and editable entries outside the option list, without modifying shared selection arrays

Version 2.754.0

Added

  • Optional HPDFCreateTesseractOCREngine and HPDFCreateRapidOCREngine factories connect local recognition programs and caller-provided models to searchable text layers, with Unicode text, word coordinates, timeouts, cancellation, and output budgets

Fixed

  • Corrected text matrix advances, indirect CID font widths, q/Q and Form clipping restoration, reduced JPEG orientation, image soft masks, and Indexed stream palettes to restore text layout and image content on affected pages
  • Small embedded TrueType filled glyphs now use local coverage antialiasing to improve thin strokes at low DPI; canceled OCR requests are reported as cancellation even when the recognition engine returns failure
  • RenderOutputDither now applies across rendering backends and parallel page rendering, with consistent cache invalidation and cancellation

Version 2.753.0

Added

  • SetLoadedFreeTextPlainText explicitly converts supported loaded FreeText annotations to ASCII Helvetica plain text and rebuilds their visible appearance for full rewrites and incremental saves

Fixed

  • Loaded page conversion and save validation now resolve indirect and inherited page boxes, preserving shared page dimensions instead of replacing them with A4

Version 2.752.5

Fixed

  • Page bitmap initialization now checks cancellation while clearing bounded blocks, releases unfinished bitmaps, and avoids delaying foreground rendering while canceled prefetch work finishes initialization

Version 2.752.4

Fixed

  • Closing or reloading a document now releases its owned PDF object graphs and stream payloads, including shared and cyclic ownership, without freeing linked references twice

Version 2.752.3

Fixed

  • Loaded checkbox value changes now synchronize appearance states even when the normal appearance dictionary contains only the selected state

Version 2.752.2

Fixed

  • Enabling reproducible output after document construction now fixes the creation timestamp so equivalent saves remain byte-identical across clock ticks

Version 2.752.1

Fixed

  • Loaded form field names now decode PDF strings consistently, allowing fields with UTF-16 names to be found and updated without changing their identity

Version 2.752.0

Fixed

  • Moving a loaded non-widget annotation now keeps the annotation object identity and updates its optional page reference to the destination page

Version 2.751.0

Fixed

  • Deleting loaded pages now maintains named destinations, outline destinations, structure trees, parent trees, and annotation object references, eliminating reachable null references in both full rewrites and incremental saves

Version 2.750.0

Fixed

  • Full PDF rewrites now expand unread compressed objects before replacing object-stream containers, preserving fonts, color spaces, and ActualText while fixing garbled Chinese text, changed page appearance, and changed extraction text
  • Encrypted documents with an empty user password now load and start rewriting directly, while locked object streams fail clearly instead of producing an incomplete document
  • Unmodified numeric objects retain their source precision, preventing subtle color and transparency drift after a rewrite
  • Copied pages retain their validated resource names and references, fixing indirect resource dictionary errors and incorrectly bound images

Version 2.748.6

Fixed

  • Fixed a cross-reference subsection that declares more entries than the table holds spinning through the whole declared count with no data left to read, which made a forty-byte malformed file take tens of seconds to reject
  • Fixed the job runner losing every result it had already produced when an operation raised, and HTML import losing a picture object when the stream around it could not be created

Version 2.748.5

Fixed

  • Fixed PKCS#12 files with a non-ASCII password failing to open: the password is a UTF-8 byte string, but it was widened one byte at a time instead of being decoded, so the derived key was wrong for every character outside ASCII. Files protected with the modern PBES2 scheme were unaffected, which is why the two behaved differently
  • Fixed the signature batch validator and the revocation evidence cache raising an access violation instead of their own error when constructed with an invalid option, because the destructor ran before the members it releases had been created
  • Fixed the evidence download task failing in its destructor when its arguments were rejected, since the checks ran before the thread itself was created
  • Fixed the cloud-signature provider encoding an algorithm identifier whose second arc exceeds 39, and a malformed identifier now raises the provider's own error rather than a conversion error
  • Certificate and signature containers now reject a nested element that declares a length reaching past the element that holds it, so what is validated and what is covered by the signature can no longer differ
  • Private-key values are wiped from memory after RSA signing instead of being left on the heap for the next allocation

Version 2.748.4

Fixed

  • Fixed Type 1 font loading reading every property from the first line of the font program: the token list was refilled without being emptied, so the version, family and weight strings, the stem hints and the charstring key length were all taken from stale tokens. Type 1 fonts now report their own metadata
  • Fixed the charstring key length being kept as a pointer into a string that had already been freed, and being used without a range check; it is now stored as a value and clamped to the range the format allows
  • Fixed non-embedded fonts always falling back to the system default face: the requested face name was copied into the wide-character font record byte by byte, so no installed family ever matched
  • Fixed embedded TrueType and OpenType parsing reading past the end of a truncated font program while decoding glyph outlines, composite glyph arguments and the CFF table of an OpenType container, and a malformed character map no longer asks for a negative glyph array
  • Fixed cross-reference tables and streams whose declared object numbers overflow: an entry claiming a number near the integer limit wrapped into a negative index and was written outside the table, and a declared object count or /Size far larger than the file could hold sized the loader's arrays from that claim alone

Version 2.748.3

Fixed

  • Fixed Data Matrix rejecting valid input: the symbol size was estimated by halving the digit count, but only adjacent digits share a code word, so text like 1a2a3a selected a symbol too small for its own data and failed to encode
  • Fixed four-byte UTF-8 characters in XFDF, such as emoji, decoding to the wrong surrogate pair, and an unrecognised byte no longer swallows the three characters that follow it
  • Enhanced-metafile region records now bound their rectangle count by the record size instead of trusting the count in the region header, which could read far past the record
  • PNG images whose declared width times height exceeds the addressable range are rejected at the header instead of allocating a negative-length pixel buffer
  • High-quality image resampling now reports an out-of-range request instead of overflowing the size of its intermediate buffer
  • A WebP meta prefix image that claims more entropy groups than it has pixels is rejected instead of allocating hundreds of megabytes of prefix tables from a few hundred bytes of input
  • Fixed leaks on the failure paths of Aztec encoding, WebP bitmap decoding and the object-stream decode worker pool, where a partially built object was abandoned when a later step raised

Version 2.748.2

Fixed

  • Fixed QR Code symbols dropping the last code word bits: the module placement walk skipped the left-most column, so the tail of the final error correction block was never written into the symbol
  • Fixed the QR terminator filling the whole remainder of the data block with zero bits, which left no room for the 0xEC / 0x11 pad code words that ISO/IEC 18004 requires; a version 1 symbol carried six zero code words instead
  • A new test reads a generated symbol back out of its modules, so the data block, the pad code words, the error correction block, the mask and the placement are all checked against the standard rather than against the encoder's own output

Version 2.748.1

Fixed

  • Fixed three parsers hanging on malformed input instead of reporting it: the object parser on a >> inside an array or a ] inside a dictionary, the CMap reader on a stray bracket or brace, and the XFDF reader on a construct without a tag name (a document type declaration, for one) or a stray byte between attributes. Each of them stopped advancing its cursor, so a single unexpected byte turned the parse into an endless loop
  • Fixed CDATA sections in XFDF being read as markup: their content is now taken as element text, and the section marker is measured correctly instead of swallowing the first character
  • Fixed a WebP chunk length near 2 GB overflowing the size check, so the payload copy read past the end of the file buffer; chunk lengths are now range-checked in 64-bit arithmetic
  • Fixed a PNG chunk length of 0xFFFFFFFF freeing the chunk buffer while the chunk still reported its declared length, which left later reads pointing at released memory; over-long chunks are rejected
  • Fixed CCITT fax decoding overflowing its row-buffer size computation for very large declared page geometries, which could write past the buffer; the row store is now bounded and decoding stops cleanly at the limit
  • Fixed the CCITT encoder reading one byte past the end of a scan line for widths that are a multiple of eight
  • Fixed enhanced-metafile comment records being read through a 32-bit truncated pointer on 64-bit builds, which read an unrelated address for every EMF carrying a GDI comment
  • Fixed 8-bit images with fewer than 256 palette entries publishing uninitialised memory as the tail of their colour table, and the table now declares its real entry count
  • Fixed deeply nested indefinite-length BER structures exhausting the stack while parsing a signature or certificate container; nesting beyond 128 levels is rejected

Version 2.748.0

Fixed

  • Fixed the error correction of every 2D barcode the library draws: QR Code, Data Matrix, PDF417 and Aztec built their generator polynomial from the constant term upwards but divided by it as though the leading term came first, so each symbol carried check words that no conforming reader accepts. The check words now match the worked examples of ISO/IEC 18004, ISO/IEC 16022 and ISO/IEC 15438
  • Fixed Aztec symbols losing their payload: the encoder divides the code word array in place and the caller emits that same array, so the message words were overwritten by the division and the symbol carried neither the data nor a valid mode message
  • Fixed the Data Matrix generator polynomial starting its roots one power too low, which produced a different polynomial from the one ISO/IEC 16022 Annex E prescribes
  • Fixed the Data Matrix finder pattern: the solid L is now the left column and the bottom row, and the alternating clock track is the top row and the right column, each starting dark at the corner it shares with the L. The two were swapped, so readers could not establish the symbol orientation

Version 2.747.4

Fixed

  • Fixed loaded-document editing writing PDF numbers with the system decimal separator: page stitching, rectangle redaction, text and image stamps, composite watermark shapes and ellipse appearances now always emit a period, so documents edited on a decimal-comma locale (for example German or French Windows) no longer contain content streams that viewers reject
  • Fixed Type 1 font loading depending on the system locale: FontMatrix, BlueValues, stem hints and charstring real numbers are parsed as PostScript numbers with a period, so PFB fonts keep their metrics and outlines on decimal-comma systems instead of silently collapsing
  • Fixed default-appearance (/DA) font size and colour parsing, HTML width and size attributes, FormCalc results and job JSON numbers following the process locale; they now use the invariant format in every direction
  • Fixed the built-in barcode drawing writing its bar rectangles through a locale-dependent format, which produced an invalid content stream on a decimal-comma system
  • Free Pascal builds now parse and format content-stream operands, text-extraction metrics and JavaScript numbers with the invariant format, matching the Delphi builds instead of falling back to the locale-dependent conversion
  • The number writer no longer rewrites the decimal separator of the hosting application's global format settings on every call, which changed how the rest of the program formatted its own numbers and was unsafe when several threads produced documents at once

Version 2.747.3

Fixed

  • Fixed edits vanishing from compressed pages: rectangle redaction, page stitching, composite watermark shapes and annotation flattening appended their operators to a still-compressed page content stream, so the redaction bar, the stitched page, the watermark shape or the baked annotation was silently absent from the saved file. The page content is now expanded before anything is appended
  • Fixed appended content fusing with the last operator already on the page when that page did not end in white space, which produced an unreadable token such as Q0.5 and could make a viewer reject the whole page; an end-of-line is now inserted where one is needed

Version 2.747.2

Added

  • Added Free Pascal Win32 support: the Lazarus package now builds for both i386-win32 and x86_64-win64 through dedicated build entry points, the smoke suites accept an architecture argument, and the 32-bit compiler and C symbol linking issues were fixed; PDF creation, loading, Flate compression, AES encryption and CBZ document handling are covered on both targets

Version 2.747.1

Fixed

  • Fixed the rotated-mask retry of the built-in barcode decoder leaving stale bytes in untouched cells of the rotated mask, which invented phantom ink and made quarter-turned Code 39 symbols unreadable; the rotated buffer is now zeroed explicitly, so turned Code 39 photographs and scans decode through the rotation retry

Version 2.747.0

Added

  • Added WebP image import: AddImageFromFile now accepts .webp files through a built-in lossless (VP8L) decoder implementing RFC 9649 — canonical prefix codes, spatial meta prefix codes, LZ77 backward references with the neighborhood distance map, the color cache, and all four inverse transforms (predictor, color, subtract-green, color indexing with pixel bundling); lossy VP8 frames are rejected with a clear message

Version 2.746.0

Added

  • The built-in barcode decoder now reads QR symbols in any of the eight orientations a photographed or scanned page can arrive in: the finder patterns identify the missing corner, and the sampled module matrix is rotated or mirrored into the expected layout before decoding, so quarter-turned and mirrored captures read without pre-processing

Version 2.745.0

Added

  • Added eIDAS qualified-certificate evaluation for loaded signatures: GetLoadedSignatureQCStatements reports the ETSI EN 319 412-5 QCStatements of the signer certificate — QcCompliance, QcSSCD, QcType values, the QcLimitValue currency/amount/exponent and the PDS locations — plus the TS 119 495 PSD2 payer and payee roles, and raises a qualified-signature heuristic when QcCompliance and QcSSCD are both asserted (the QTSP trust decision stays with the caller)

Version 2.744.0

Added

  • Added N-up imposition for loaded documents: ComposeLoadedPagesNUp reflows every page onto grid-composed sheets of the source paper size (2-up, 4-up, 6-up, up to 16x16) for print-ready output, absorbing each page's /Rotate into the placement matrix, sharing the page resources with the composed form, and optionally drawing hairline cell frames with an adjustable gutter

Version 2.743.0

Added

  • FlattenLoadedAnnotations now bakes annotations that carry no appearance stream instead of silently skipping them: widgets get their field appearance generated from the field value first (the /NeedAppearances case common in browser-printed forms), so the entered value survives into the page content
  • Markup annotations without /AP get a synthesized appearance drawn from their own properties — FreeText and Stamp text with /DA styling and /Q quadding, Square and Circle shapes with /C / /IC colour and /BS width, Line and Ink strokes, and Highlight / Underline / StrikeOut / Squiggly quad markup honouring /QuadPoints and /CA opacity
  • Hidden annotations (the /F hidden flag) are left as annotations when they have no appearance, because baking an invisible note would make it visible

Version 2.742.0

Fixed

  • Fixed Free Pascal package builds failing since 2.738.0: the LTV evidence and seed-value member declarations were placed inside a Delphi-only conditional block while their implementations were unconditional, so the Free Pascal package no longer compiled; the implementations now carry the same conditional and the package builds again

Added

  • HTML import now resolves tables on a full occupancy grid, so rowspan and colspan cells claim their columns correctly and later rows skip the claimed slots instead of shifting left
  • Table row heights come from wrapping the cell text under the cell's own font instead of a character-count estimate, so mixed narrow and wide content no longer produces overflowing or oversized cells
  • Column widths follow <col> width hints and per-cell width attributes, and header rows marked up with <thead> (or leading all-<th> rows) repeat on top of every continued page when a table crosses a page break
  • A rowspan group is kept whole across page breaks: the rows joined by a spanning cell move to the next page together so the spanning cell is never cut

Version 2.741.0

Fixed

  • Fixed Free Pascal builds terminating instead of reporting an error when a document needed one of the codecs those builds do not link: opening a TIFF, decoding a JPEG 2000 or JBIG2 image, reading a progressive or reduced-scale JPEG, applying an ICC colour transform, or requesting Zopfli recompression ended the process outright
  • Each of those operations now fails the way its caller already expects, so a document that uses one of them loads with that feature skipped rather than taking the application down

Added

  • Added structure-order text extraction: ExtractLoadedPageStructureText walks the document structure tree in authoring order (ISO 32000-1 14.8.4) and concatenates the marked-content runs of a page by MCID, so tagged documents such as government forms and accessible publications extract their authoritative reading order instead of a geometric guess; glyphs the tree never claims fall to a geometric tail and are counted in the untagged report

Version 2.740.0

Fixed

  • Fixed colour glyphs losing their transparency in Free Pascal builds: embedded colour bitmaps were read through a path that discards the alpha channel, so every emoji or colour font glyph was drawn as an opaque rectangle. The bitmaps now keep their per-pixel alpha

Fixed

  • Enabled P-384 ECDH key agreement: the CIOS Montgomery multiplication final conditional subtraction compared against P limb plus borrow, which wraps to zero on the all-ones high limbs of the P-384 / P-521 primes and silently mis-borrowed; the comparison now detects the borrow without the overflowing addition and the P-384 shared secret matches OpenSSL reference vectors byte for byte

Version 2.739.0

Added

  • Free Pascal builds now encrypt and decrypt documents: the AES entry points are served by the library's own FIPS-197 implementation instead of reporting an unsupported-operation error, so AES-128 and AES-256 protected files can be created and opened there
  • AES-GCM encryption and decryption, including the streaming context used for large payloads, are available in Free Pascal builds
  • The Free Pascal smoke test now checks the cipher against the FIPS-197 known answer, exercises PKCS#7 and GCM round trips, and creates and reloads an AES-256 protected document with password rejection

Added

  • Added CSS2.1 paragraph typography to the HTML5 import engine: text-align (with legacy align attribute and center-tag mapping), letter-spacing and word-spacing through the PDF Tc / word-space operators, text-indent for first-line indents, and text-decoration underline / line-through rules, so existing web and email HTML imports keep their centred headings, indents, and underlines
  • Extended the built-in QR decoder beyond version 1: the symbol version now derives from the finder geometry through grid divisibility (versions 2-40 with a clean module grid decode), the byte-mode length cap follows the ISO/IEC 18004 Table 7 capacity per version, and the function-module map covers alignment patterns and version information blocks for higher symbols

Version 2.738.0

Added

  • Free Pascal builds now compress and decompress documents natively: the deflate codec is provided by a built-in backend over the Pascal zlib implementation that ships with Free Pascal, so FlateDecode content no longer reports an unsupported-operation error
  • Compressed documents can be created and reloaded under Free Pascal with the default compression setting, and cross-reference streams, object streams, embedded files and compressed page content all decode there
  • The backend covers the zlib and raw deflate wrappers, the gzip wrapper and automatic header detection, so SVG imports and the multi-window-size decompression fallback behave as they do under Delphi
  • The Free Pascal smoke test now verifies the codec through a wrapper and checksum self test plus a compressed document round trip

Added

  • Added AIA caIssuers chain completion: HPDFFetchAIAIntermediates walks the access-method 1.3.6.1.5.5.7.48.2 endpoints of a CMS certificate set through the caller transport (bare DER and PEM bodies both decode), and the FetchMissingIntermediates validation option feeds the fetched intermediates into path building so cloud-signer signatures with a lone end-entity certificate validate instead of failing path building
  • Added one-call LTV enablement: PopulatePAdESLTVEvidence walks every loaded signature, fetches its intermediates plus OCSP/CRL evidence online, and writes the material into the document DSS, upgrading a fresh B-B signature document to B-LT without hand-assembled evidence arrays
  • Added seed-value enforcement for signing: CheckLoadedSignatureSeedValue reads a signature field /SV dictionary and checks a candidate SubFilter, DigestMethod, Reason and DocMDP profile against its constraints with the force-bit semantics of ISO 32000-1 12.7.5.5, so form-author constraints are honoured before a signature is placed

Version 2.737.0

Added

  • Added strict save verification through the VerifySavedOutput property: after writing, a fresh reader instance with cross-reference recovery disabled reloads the file so corrupt serialisation raises at the call site instead of surfacing at the next consumer
  • Extended ReproducibleOutput to encrypted documents: AES-CBC streams use the static 14*(1+i) IV convention, key material and salts derive deterministically, and the canonical document ID normalises volatile Info timestamps, giving byte-identical encrypted saves for regression pipelines

Version 2.736.0

Added

  • Added high-quality resampling and monochrome dithering through a new HPDFResample unit: separable Catmull-Rom bicubic and Lanczos3 kernels replace GDI stretch semantics for image downsampling via the ImageDownsampleKernel property, and RenderOutputDither applies Floyd-Steinberg error diffusion after page composition so print-preview output keeps photographic detail in pure black and white

Version 2.735.2

Fixed

  • Fixed the Flate decompression streams passing the address of their buffer variable instead of the buffer itself when refilling from the source stream, which corrupted memory on every read and could crash the process; loading compressed documents, the inflate stream classes and the compress and decompress stream helpers are all affected

Version 2.735.1

Fixed

  • Fixed growable XFA fields that carry no data source collapsing to a single line when flattened: their height is now measured from the text the template itself declares, which is what such a field displays. A field bound to empty data still measures as empty

Version 2.735.0

Added

  • Free Pascal builds now cover the whole library: every unit compiles with FPC 3.2.2 and Lazarus, where previously only the core creation and loading path did
  • XPS, EPUB and CBZ containers can be imported under Free Pascal, through a built-in read-only ZIP reader that handles ZIP64 sizes, stored and deflated entries, CRC verification and traditionally encrypted entries with the same password callback as the Delphi path
  • XFA form flattening, the FormCalc calculation engine, the widget runtime, the document viewer components, the Type 1 font handlers, HTML import, signature verification and the job runner all compile in Free Pascal builds; flattening the XFA packets of a loaded document additionally needs the deflate codec, which those builds do not link

Fixed

  • Fixed the PNG helper unit's 64-bit byte swapping, which returned incorrect values on Win64 and had left the unit out of the build entirely

Added

  • Added draw-time missing-glyph detection: the TrackUnresolvedGlyphs property records every code point that would render as a .notdef tofu box through the active Unicode face, fires the OnUnresolvedGlyph event per finding, and leaves unregistered pure-GDI documents untouched
  • Added legacy kern table support: RegisterUnicodeTTF captures the Apple/GDI-era kern table and the kerning emit falls back to its format-0 binary pair search when a font carries no GPOS kern lookups, restoring classic pair spacing in fonts like stock Arial
  • Added per-run font fallback inside paragraph layout: WideTextOutBox now splits each wrapped line at code points the current font cannot map and draws every run in its resolved fallback font, so mixed Latin, emoji and CJK paragraphs render without tofu when fallback chains are registered

Version 2.734.0

Added

  • Added RFC 3161 time-stamp request plumbing: HPDFRFC3161BuildRequest emits the DER TimeStampReq with a fresh positive-INTEGER nonce, optional policy OID and certReq, and HPDFRFC3161ParseResponse decodes the PKIStatusInfo header and extracts the token, so TSA transport callbacks are three lines instead of a DER study
  • Added the ISO/TS 32002 developer extension declaration (THotPDF.EnsureISO32002Extensions) covering EdDSA signature algorithms and the additional ECDSA curves in PDF 2.0 documents, idempotent and version-gated like the 32001 SHA-3 declaration

Version 2.733.0

Added

  • Added portable X25519 and X448 Montgomery-ladder key agreement plus P-256 / P-521 NIST-curve ECDH with CIOS Montgomery multiplication, enabling key-agreement (KARI) public-key recipients to be created and unwrapped entirely in-process; RFC 7748 and OpenSSL-generated reference vectors lock the ladder behaviour into the regression suite
  • Added HPDFUnwrapKeyAgreementRecipientEnvelope together with the AddPubSecAgreementKeyMaterial and AddPubKeyAgreementRecipientWithSecret entry points, so documents encrypted with ECDH / X25519 / X448 recipients can be opened with the recipient private scalar and encrypted without external ECDH tooling

Version 2.732.0

Changed

  • Saves now route serializer output through a 1 MiB buffered write stream, collapsing the per-token Write calls of object headers, dictionary keys, and xref rows into batched pushes on file-backed destinations
  • Cross-reference stream payloads apply PNG Up prediction (/DecodeParms /Predictor 12) before FlateDecode and collapse free-list holes through /Index subsections, shrinking xref containers on every PDF 1.5+ document and on sparse object ranges
  • The CompressionLevel property now also selects the Flate effort of the cross-reference stream and object-stream containers, so clMaximum produces smaller structural streams during save

Fixed

  • Cross-reference stream /W field widths now adapt to the actual offset range instead of a fixed [1 4 2] layout whose Cardinal cast silently truncated offsets beyond 4 GiB into damaged output

Version 2.731.0

Changed

  • Rebuilt the built-in template-matching OCR with connected-component glyph extraction, grayscale coverage scoring against cached multi-font templates, Otsu binarisation with a local-window fallback, bimodal gap word splitting, per-word baselines, speckle-noise rejection, and an extended 62-character alphabet that recognises mixed-case ASCII text through line-level height clustering and case-context preference

Version 2.730.0

Added

  • Added Win64 support for Free Pascal 3.2.2 and Lazarus 4.6, including a runtime package, reproducible build script, compatibility layer, and non-GUI create-and-reload smoke test; native static codec integrations remain Delphi-only and report an explicit unsupported-operation error in Free Pascal builds

Version 2.729.0

Added

  • Added a host-neutral dynamic XFA widget runtime with Unicode editing, focus and hit testing, instance-aware binding, atomic validation and calculation, bounded reflow, and a read-only loaded-document factory that preserves the source XFA

Version 2.728.0

Fixed

  • Corrected XFA intrinsic measurement and text continuation to preserve explicit empty and calculated values, use each field or repeated-row binding context, retain breakAfter actions, avoid synthetic name collisions, and enforce a cached global measurement budget

Version 2.727.0

Changed

  • XFA layout now applies intrinsic minimum and maximum dimensions, measures growable fields from their bound text, and atomically splits eligible textEdit content across content areas and pages with read-only continuation fields and bounded text, fragment, and measurement budgets

Version 2.726.0

Added

  • Added complete NChannel process and spot attributes, mixing hints, bounded PDF 2.0 CxF/X-4 spectral ink streams, and document-level consistency checks for spot tint definitions and external output-intent colourant tables

Version 2.725.0

Added

  • Added a thread-safe deterministic SIMD scanline render backend that preflights supported rectangle display lists, writes the final bitmap surface in vector blocks without an intermediate bitmap copy, and returns exact per-request decline reasons through the existing software fallback and telemetry pipeline

Version 2.724.0

Changed

  • Expanded the bounded native FormCalc evaluator with general SOM node-set aggregates, mixed scalar and node-set arguments, nested numeric and string calls, and deterministic selection, string, trigonometric, logarithmic, and conversion functions under existing operation, array, depth, time, and output budgets

Version 2.723.0

Changed

  • SubsetLoadedFonts now safely subsets embedded Type 1 PFB, split binary and hex PFA programs, retains recursive TrueType composite dependencies, and closes COLR v0/v1 outline dependencies while preserving colour, bitmap, variation, and shaping tables

Version 2.722.0

Added

  • Added bounded password callbacks for classic ZIP-encrypted XPS, EPUB, and CBZ entries, including per-entry retry limits, cancellation checks, memory-only credential handling, and fail-closed rejection of unavailable, invalid, or unsupported encryption

Version 2.721.0

Changed

  • DownsampleLoadedImages now resizes supported 8-bit Separation and DeviceN image samples directly in component space and preserves the original colour-space graph, tint transform, colourants, /Decode ranges, and overprint semantics across save and reload

Version 2.720.0

Added

  • Added bounded built-in recognition overloads for high-contrast uppercase ASCII OCR, horizontal Code 39, and clean axis-aligned QR version 1 byte-mode symbols, allowing searchable text layers and loaded-page barcode decoding without a caller-supplied engine while ambiguous or unsupported input fails closed

Version 2.719.0

Added

  • Added bounded JPEG 2000 refinement by resolution and quality layer through THPDFJpeg2000Decoder.LoadProgressiveFromByteArray, plus multi-layer encoding through TJpeg2000Bitmap.QualityLayers, with identical final pixels for LRCP, RLCP, RPCL, PCRL, and CPRL progression orders

Version 2.718.0

Changed

  • Embedded complete UniJIS, UniGB, UniCNS, and UniKS UCS2 and UTF16 horizontal and vertical CMaps, including supplementary scalars and standard vertical defaults, so CJK text extraction and geometry no longer depend on external Unicode mapping files or half-em guesses

Version 2.717.0

Added

  • Added explicit linearized shared-object dependency ranges and a range-arrival redraw scheduler so pages can paint before all optional dependencies arrive and redraw exactly when newly available data changes the result

Version 2.716.0

Added

  • Added bounded object-graph repair for actionable xref, trailer, catalog, page-tree, and name-tree preflight findings with validated transaction commit and complete rollback on unsafe or ambiguous input

Version 2.715.0

Added

  • Added PDF 2.0 encrypted payload wrappers whose visible document content remains readable before authentication while embedded-file names, descriptions, and bytes stay protected until an explicit password unlock

Version 2.714.0

Changed

  • Loaded-page SVG export now emits axial and radial gradients, bounded PNG representations of Type 4 through Type 7 mesh shadings, and decoded inline images without incrementing the corresponding skip counters

Version 2.713.0

Changed

  • OpenType SVG colour glyphs now use the bounded Form XObject pipeline for arcs, vector gradients, opacity, geometric masks, and local #id reuse while continuing to reject scripts, external resources, images, and unsupported active content

Version 2.712.0

Changed

  • ReplaceLoadedPageText now replaces matches spanning TJ string items and arrays through glyph source spans while preserving kerning numbers, unmatched prefixes and suffixes, unrelated operands, and the original content-stream structure

Version 2.711.0

Added

  • Added CFF FontSet SyntheticBase resolution with inherited Top and Private DICT values, CharStrings, charset, Encoding, and Local Subrs, plus deterministic override semantics and bounded rejection of invalid, cyclic, or excessively deep inheritance

Version 2.710.0

Added

  • Added deterministic bounded Flate predictor selection through HPDFSelectFlatePredictor, using distributed row samples, estimated byte cost, configurable CPU weighting, and explicit byte, row, and work budgets

Version 2.709.0

Added

  • Added opt-in native JBIG2 Huffman symbol-dictionary and text-region output through THPDFJBIG2Options.UseHuffmanEncoding, including standard DH, DW, BMSIZE, FS, DS, and DT tables, raw collective bitmaps, symbol-ID tables, deterministic native routing, and pixel-exact decoder round trips while retaining arithmetic and MMR defaults

Version 2.708.0

Changed

  • Cached Arabic and combined presentation-form reverse cmap mappings by registered font generation, replacing repeated U+FB00..U+FDFF and U+FE70..U+FEFF scans in ApplyArabicGSUBRefinement, ApplyArabicGSUBContextualRefinement, and the generic contextual GSUB path while preserving codepoint precedence and shaped output

Version 2.707.0

Added

  • Added the Aztec 2D barcode encoder (ISO/IEC 24778) through THPDFPage.DrawAztec and the standalone THPDFAztec unit: dynamic-programming high-level encoding with mode latches, shifts, and binary-shift runs, bit stuffing, Reed-Solomon error correction over GF(16) through GF(4096), automatic compact 15x15..27x27 or full 19x19..143x143 symbol selection, and forced-layer control for fixed symbol sizes
  • Added vertical page text assembly: THotPDF.ExtractLoadedPageText and the range/stream aggregation APIs now cluster WMode 1 glyphs into columns on the glyph origin X, order the columns right-to-left, and walk each column top-to-bottom instead of shredding vertical CJK text into per-glyph lines

Fixed

  • Fixed parallel band export failing with a PNG band width mismatch on pages whose pixel dimensions are fractional (A4 at 96 DPI): the raster size is now rounded with Ceil uniformly with the band writers, so delivered tiles always match the encoder width

Version 2.706.0

Added

  • Added streaming loaded-page PNG export and banded multi-page TIFF export through THotPDF.SaveLoadedPageToPng, SaveLoadedPageToPngStream, SaveLoadedPagesToTiffBanded, and SaveLoadedPagesToTiffStreamBanded, writing compressed image data row by row through band encoders so very large pages do not require a complete framebuffer; THPDFBandImageExportInfo reports page, band, row, worker, memory, output, timing, and cancellation telemetry

Version 2.705.0

Added

  • Added PDF/A finalization to the loaded save paths: THotPDF.SaveLoadedDocument and SaveLoadedDocumentToStream now validate the GTS_PDFA1 OutputIntent (inherited from the source catalog or freshly registered) and emit the pdfaid:part / pdfaid:conformance XMP identification when PDFACompliance is set, while preserving an existing pdfaid packet byte-for-byte on re-save
  • Added vertical writing (WMode 1) consumption on the load side: CIDFont /W2 and /DW2 cell metrics now drive text extraction and page rendering, walking columns down the text-space y axis with the v1x/v1y positioning vector instead of horizontal /W advances

Version 2.704.0

Added

  • Added parallel loaded-page tile and band rendering through THotPDF.RenderLoadedPageTilesParallel and THotPDF.RenderLoadedPageBandsParallel, with row-major calling-thread callbacks, borrowed bitmaps, cooperative cancellation, caller-controlled in-flight memory, peak-memory admission, and a bounded immutable Type 3 glyph and halftone-screen cache shared across isolated render contexts

Version 2.703.0

Added

  • Added bounded CSC multisign digest batches through THPDFCSCSignatureProvider.SignHashBatch, using one hash-pinned SAD and one signatures/signHash request for an ordered same-algorithm batch while enforcing local and credential multisign limits, strict response cardinality, synchronous or asynchronous result ordering, SHA-256 content-addressed idempotency keys, and completed-batch replay

Version 2.702.0

Added

  • Extended THotPDF.RenewPAdESLTATimestamp with caller-supplied certificate, OCSP, and CRL evidence that is merged into the existing DSS before the new RFC 3161 document timestamp, preserves every earlier revision byte-for-byte, and exactly deduplicates validation streams across successive renewals

Version 2.701.0

Added

  • Added clause-addressable PAdES baseline and extended profile preflight through THotPDF.PreflightLoadedPAdES, reporting every applicable requirement with stable rule ID, profile, normative level, standards clause, PDF path, object number, signed or current revision, and pass status while validating CMS cardinalities, signer-certificate ESS references, signature-dictionary constraints, byte-range coverage, trusted time, DSS evidence, and document-timestamp coverage

Version 2.700.0

Added

  • Added end-to-end ECDSA, Ed25519, and Ed448 PFX / PKCS#12 private-key loading and CMS document signing, including named-curve CNG ECDSA, optional OpenSSL 3 PureEdDSA, RFC 8410 key decoding, RFC 8419 digest and parameter rules, SHAKE256 with 512-bit output for Ed448, automatic key-algorithm selection, and strict certificate-to-key pairing

Version 2.699.0

Added

  • Added deterministic multi-identity PFX / PKCS#12 credential selection through HPDFEnumeratePFXIdentities, HPDFParsePFXByLocalKeyID, and THPDFCMSSignOptions.PFXLocalKeyID, including strict single-valued localKeyId and friendlyName bag attributes, public-key pairing, recursive safe-content bags, bounded ambiguity and cycle diagnostics, and automatic matching intermediate and root certificate-chain embedding with exact DER deduplication

Version 2.698.0

Added

  • Expanded in-process PFX / PKCS#12 PBES2 decryption with AES-128-CBC and AES-192-CBC plus PBKDF2 HMAC-SHA-384 and HMAC-SHA-512 PRFs, including cipher-specific optional keyLength validation and bounded salt, iteration, IV, and padding checks while retaining AES-256-CBC and HMAC-SHA-1 / SHA-256 compatibility

Version 2.697.0

Added

  • Added specification-conforming XPS and OpenXPS Canvas FixedPage.NavigateUri inheritance so descendant Path, Glyphs, and nested Canvas visuals receive the scoped URI unless they override it, preserving external, mail, package-page, and percent-decoded LinkTarget actions through transforms, nested clips, isolated opacity groups, reusable-visual suppression, restoration after nested overrides, and existing link, URI, cancellation, and unsafe-scheme limits

Version 2.696.0

Added

  • Added bounded native XPS and OpenXPS Canvas transparency groups so Opacity and solid, gradient, or image Canvas.OpacityMask values composite overlapping child visuals once through isolated DeviceRGB Form XObjects, with folded uniform alpha, shared variable-alpha soft masks, nested groups, transformed clips, resource transfer, preserved links, and fail-closed malformed, unsupported, singular, or oversized content

Version 2.695.0

Added

  • Added bounded native XPS and OpenXPS Canvas.Clip conversion for abbreviated geometry, local or remote StaticResource PathGeometry values, direct property elements, structured line, Bézier, quadratic, and arc figures, geometry transforms, empty clips, and nested EvenOdd or NonZero clipping through PDF W* or W, with clipped navigation bounds, 100,000-value parsing limits, and fail-closed malformed or singular transforms

Version 2.694.0

Added

  • Added bounded native XPS and OpenXPS navigation for transformed Path and Glyphs visuals, preserving HTTP, HTTPS, and mail links as PDF URI annotations and resolving package-relative pages plus percent-decoded LinkTarget fragments as forward or backward PDF GoTo actions after all pages exist, with metric-aware click bounds, 65,536-link and 8,192-character limits, VisualBrush capture suppression, cancellation, and fail-closed unsafe-scheme diagnostics

Version 2.693.0

Added

  • Added bounded native XPS and OpenXPS VisualBrush conversion for inline or resource-backed Canvas, Path, and Glyphs visuals, hierarchical and remote ResourceDictionary lookup, absolute Viewbox, absolute or relative Viewport, None, Tile, and reflected tile modes, transforms, opacity, reusable Form XObjects, shared tiling patterns, token-aware resource transfer, and fail-closed cycle, malformed-input, recursion, content, cache, and placement budgets

Version 2.692.0

Added

  • Added native XPS and OpenXPS package-font embedding for TrueType and OpenType programs, TTC member fragments, GUID-obfuscated resources, direct or cmap-derived glyph IDs, one-to-many Unicode clusters, explicit advances and offsets, width-correct RTL origins, shared font resources, embedding and no-subsetting permissions, optional glyph subsetting, bounded ToUnicode maps, and amortised-linear positioned-run output without GDI face substitution

Version 2.691.0

Added

  • Added bounded OpenXPS Glyphs Indices layout for strict cluster code-unit and glyph counts, explicit hundredths-of-em advances, horizontal and vertical offsets, odd BidiLevel reverse progression, solid attribute or property-element fills, opacity, native PDF TJ batching, positioned Unicode cluster fallback, preserved text extraction, fail-closed malformed-input diagnostics, and amortised-linear buffers capped at 65,536 mappings

Version 2.690.0

Added

  • Added OpenXPS Path.OpacityMask support for solid, variable-alpha multi-stop linear and elliptical radial gradient, and ordinary, tiled, or reflected PNG ImageBrush masks through folded uniform alpha, bounded native DeviceGray transparency groups, shared shading patterns and image soft-mask streams, fail-closed unsupported-content handling, and the reusable RegisterLuminositySoftMaskState builder with alpha-image resource binding

Version 2.689.0

Added

  • Added OpenXPS ImageBrush Tile, FlipX, FlipY, and FlipXY modes through native PDF tiling patterns with one, two, or four independently clipped placements, shared image and PNG soft-mask resources, composed fixed-page, path, and brush matrices, and the bounded RegisterImageTilingPattern API for reusable image-backed patterns

Version 2.688.0

Added

  • Added OpenXPS ImageBrush.Transform support for finite six-parameter attribute matrices and MatrixTransform property elements, concatenated after native Path clipping and before viewport clipping and image placement so the brush can rotate, scale, skew, or translate without changing its containing vector geometry; non-standard RelativeTransform and unresolved matrix resources remain explicit diagnostics

Version 2.687.0

Added

  • Added matrix-controlled image XObject placement through THPDFPage.ShowImageMatrix and extended XPS fixed-page import with package JPEG, PNG, TIFF, and JPEG XR ImageBrush fills, absolute or bounds-relative Viewbox and Viewport mapping, native path and single-viewport clipping, image and path opacity, PNG soft-mask alpha, DPI-aware 96-DPI sizing, shared decoded-resource caching, and fail-safe diagnostics for unsupported tiling, transforms, colour conversion, and image strokes

Version 2.686.0

Changed

  • Added reusable bounded multi-stop radial gradient registration and extended native-vector XPS path import with property-element elliptical RadialGradientBrush values, Pad spread, uniform stop alpha, brush opacity, relative or absolute center, origin and radius mapping, native Type 3 PDF shading, and coordinate restoration that leaves path geometry unchanged

Version 2.685.0

Changed

  • Extended ordered native-vector XPS path import with quote-aware and bounded property-element parsing, solid and multi-stop linear gradient brushes, native PDF shading patterns, brush and stop alpha, default relative-to-bounds or explicit absolute gradient coordinates, out-of-range stop interpolation, and fail-safe diagnostics for unsupported transforms, spread modes, colour interpolation, variable alpha, and degenerate axes

Version 2.684.0

Changed

  • Added ordered native-vector XPS path import with bounded abbreviated geometry, fill rules, solid RGB and ARGB fills and strokes, path opacity, stroke width, six-parameter transforms, and fail-safe diagnostics for unsupported drawing features

Version 2.683.0

Changed

  • Strengthened actual-painted-content PDF/X-6 validation with definition-time shading-pattern graphics state, nonstroking pattern ExtGState semantics, fail-closed soft-mask subtype and backdrop checks, exact Type 3 glyph metrics and inherited-colour rules, strict combined-paint alpha classification, bounded JPX colour inference, and appearance-aware annotation compositing

Version 2.682.0

Added

  • Added producer and verifier support for brainpoolP256r1, brainpoolP384r1, and brainpoolP512r1 ECDSA signatures, including the curve-specific SHA-2 and SHA3 digest matrix, fail-before-provider signing validation, strict named-curve certificate parameters, parameter-free ECDSA algorithm identifiers, canonical DER signature values, Windows CNG named-curve import, and deterministic diagnostics for explicit, trailing, unknown, or mismatched parameters

Version 2.681.0

Changed

  • Unified non-progressive bitmap, direct-DC, Form and display-list content execution through HPDFInterpretContentTokensDevice and the optional complete IHPDFContentOperatorDevice extension, with one cancellation checkpoint per operator, compile-time operator-index caching for operand-scan-free display-list replay, public OperatorCount metrics, preserved semantic-device compatibility, corrected ", v and y operator semantics, and legal EI terminator handling without false fallback diagnostics

Version 2.680.0

Added

  • Added bounded transactional RepairPDFA4 overloads with typed options, detailed repair reports, shared finding provenance, safe PDF 2.0 header, trailer ID, metadata, Catalog and presentation normalisation, namespace-aware PDF/A identification repair, configurable partial or full-conformance commit policy, error-regression detection, byte-exact graph and XMP rollback, and a strict boundary that preserves page content, fonts, colour, transparency, images, graphics operators, and extracted text

Version 2.679.0

Added

  • Added actual-painted-content PDF/X-6 validation with selectable ISO 15930-9:2020 or resolved-errata 2025 rules, actual ICC header and channel checks, resource-aware traversal of content arrays, Form XObjects, tiling and shading patterns, images, Type 3 glyphs, soft masks and annotation appearances, overprint-mode and combined-paint transparency diagnostics, stable rule provenance, and bounded decoded-byte, token, object, issue, recursion and graphics-state work

Version 2.678.0

Added

  • Deepened bounded PDF/A-4 validation with cached ICC header and component checks, document and page output-intent consistency, actual painted device-colour and transparency analysis across content arrays, nested Form XObjects, images, image masks, shadings and annotation appearances, inherited graphics state, rendering-font embedding, CIDFont and CMap relationships, strict annotation flags and appearance states, UTF-8 XMP packet and namespace validation, logical page-tree locations, stable clause-aware diagnostics, and configurable decoded-byte and content-token ceilings

Version 2.677.0

Added

  • Completed bounded PDF/UA-2 document, human-readable string, optional-content, annotation, AcroForm, structure-destination, outline, embedded-file, and nested page-label validation, including physical ParentTree ownership, scalar structure children, appearance-stream restrictions, namespace-URI-based XMP properties, Unicode private-use detection, and clause-aware diagnostics; structured HTML, XHTML, XML, and JSON export now share a tagged-first accessible reading model with language, title, navigation, page labels, safe links, annotations, non-sensitive form controls, marked-content replacements, artifacts, image alternatives, geometric fallback, independent limits, cancellation, and atomic publication

Version 2.676.0

Added

  • Added bounded minimal byte-range planning for every page in a linearized PDF through PlanProgressiveLinearizedPageRanges, with raw and Flate primary or overflow hint decoding, interoperable byte-aligned combined and Annex F continuous split hint layouts, exact bootstrap, page, shared-group, and LF- or CRLF-prefixed traditional or stream cross-reference dependencies, legal short-read accumulation, a 256 MiB default planner-memory ceiling with fail-closed encoding disambiguation, overlap-aware merging, strict structural cross-checks, typed limits and availability diagnostics, and a unified [0, /E) first-page path

Version 2.675.0

Added

  • Added independent standards-conformant crypt-filter policies for strings, normal streams, and embedded files through ConfigureCryptFilterDefaults and SetStreamCryptFilter, including password and public-key reserved filters, /Identity, writer-correct password-security /EFF and leading /Crypt pipelines, fail-closed public-key stream-specific recipient boundaries, case-sensitive external named-filter loading and inspection, /CFM /None, V2 key-length reporting, mixed-policy Direct File fallback, split object-stream container and member-string policies, and policy-preserving encrypted incremental updates

Version 2.674.0

Added

  • Added credential-preserving Standard and public-key encrypted incremental updates through a password-aware BeginIncrementalUpdate overload and assigned recipient key material, with securely retained file keys or FEKs, separate string, stream, metadata, and Identity crypt-filter policies, generation-aware legacy object-key derivation, exact inherited /Encrypt references, byte-identical source revisions, original user, owner, or recipient access, and fail-closed rejection of encryption changes or unsupported heterogeneous filters

Version 2.673.0

Security

  • Added bounded JBIG2 segment-graph validation before full-page, region, native, or external decoding and before global-dictionary sharing, with indexed duplicate and missing-reference checks, iterative cycle and dependency-depth detection, embedded-stream page-association enforcement, forbidden segment rejection, long-reference and aggregate-edge budgets, symbol-dictionary allocation guards, and precise failure telemetry

Version 2.672.0

Added

  • Added PAdES E-EPES signature-policy-identifier generation and strict validation with explicit policy OIDs, known or ETSI unknown hashes, SPuri, SPUserNotice, and SPDocSpecification qualifiers, bounded Unicode and collection parsing, policy-document hashing, primary-signer OID and hash pinning before cryptographic work, dedicated mismatch statuses, and complete JSON reporting

Version 2.671.0

Added

  • Added deterministic RFC 5652 containers with up to 256 independent primary SignerInfo records through HPDFCMSBuildMultiSignedData and HPDFCMSMergeSignedData, including whole-batch prevalidation before signer side effects, per-signer attributes, algorithms, certificates and providers, strict definite-length container validation, DER-sorted and deduplicated sets, independent verification results, single-signer byte compatibility, and side-effect-free aggregate placeholder sizing

Version 2.670.0

Added

  • Added optional RFC 5652 SubjectKeyIdentifier signer identities through THPDFCMSSignOptions.SignerIdentifier, including compact IMPLICIT SID encoding, automatic SignerInfo and SignedData version selection, strict X.509 extension extraction, provider and placeholder-sizing support, and fail-closed SID, certificate, and version matching during verification

Version 2.669.0

Security

  • Added fail-fast CMS digest-algorithm consistency diagnostics across SignedData.digestAlgorithms, SignerInfo, signature mechanism parameters, and RFC 6211 CMSAlgorithmProtection, with dedicated verification status, validation failure code, timestamp propagation, detailed issue reasons, and JSON output

Version 2.668.0

Added

  • Added SHA3-256, SHA3-384, and SHA3-512 generation and verification across detached CMS, RSA PKCS#1 v1.5, RSA-PSS, ECDSA provider contracts, RFC 3161 content and signature timestamps, PAdES-LTA renewal, Seed Value dictionaries, and ISO 32001 PDF 2.0 developer-extension declarations, with bounded one-pass byte-range hashing shared with matching PDF MAC policies

Version 2.667.0

Added

  • Added THotPDF.ValidatePDFMACChain with oldest-to-newest incremental-revision validation, cumulative classic or xref-stream indexing, exact revision and xref failure locations, historical MAC replacement detection, stable KDFSalt enforcement, digest-strength downgrade rejection, authenticated /P and /Perms checks, preflight reporting, and bounded revision parsing without temporary PDF copies

Version 2.666.0

Added

  • Added THotPDF.SignPDFWithPFXAndAttachedPDFMAC and signature-attached validation with direct active-trailer AuthCode, indirect SigObjRef, complete signed-revision coverage, raw signature-value digest binding, SHA-2 or SHA-3 PDF MAC policies, one-pass signing and MAC range hashing, preflight reporting, and atomic output replacement

Version 2.665.0

Fixed

  • Corrected THotPDF.RegisterNChannelColorSpace to emit the ISO 32000-2 five-element DeviceN form with /Subtype /NChannel and process-component metadata, raised its minimum PDF version to 1.6, and made luminosity soft masks resolve NChannel paint through its alternate space while retaining read compatibility with legacy /NChannel family tokens

Version 2.664.0

Added

  • Completed PDF blend-mode rendering with integer hot-path implementations for Hue, Saturation, Color, and Luminosity, and corrected the full-opacity fast path so every active separable or non-separable blend mode composites against its backdrop

Version 2.663.0

Security

  • Authenticated PKCS#12 containers before exposing encrypted safe contents by verifying optional outer MacData with bounded PKCS#12 KDF iterations, SHA-1 or SHA-256 HMAC, constant-time digest comparison, and fail-closed wrong-password and tamper handling

Version 2.662.0

Added

  • Added three HotPDFCLI commands: render rasterises each selected page to <prefix>-page<N>.png through the loaded-page bitmap pipeline (--pages range, --dpi 10..2400, default 150), tables extracts typed tables to CSV or JSON via ExportLoadedTypedTables (--json, -o file or console) and compare prints the JSON comparison report of two documents through HPDFDocCompareDocuments (--mode 0..5 covering page-count, page-text, object-count, rendered-image, full and structural)

Fixed

  • Fixed the Win64 ICC transform pipeline producing all-zero output from 8-bit batch transforms (TransformBytes): the optimised 1D-LUT fast path inside the Win64 lcms2 objects returns zeroes while the generic resampling pipeline is correct, so the 8-bit transform now builds with cmsFLAGS_NOOPTIMIZE on Win64 only; the 16-bit single-colour path and all Win32 transforms keep the optimised fast path (batch sRGB primaries now round-trip on both platforms)

Version 2.661.0

Added

  • Added genuine budgeted Zopfli high-ratio Flate compression after the existing four-strategy zlib baseline, with strict no-growth selection, input, iteration, block, output, and elapsed-time limits, detailed stream and parallel-image telemetry, and deterministic fixed-corpus savings gates

Version 2.660.0

Added

  • Added deterministic XML machine-readable preflight reports and ABI-versioned trusted plugins for feature extraction and custom validation rules, with stable ordering, policy-bundle integration, cancellation propagation, fail-closed capability checks, and finite plugin, finding, feature, string, output, and elapsed-time budgets

Version 2.659.0

Added

  • Extended bounded XFA FormCalc with conditional logic, repeated numeric aggregates, and validated dynamic-instance callbacks, and added default-off sandboxed QuickJS form scripts with full control flow, native typed arrays, isolated data access, finite instruction, time, memory, stack, value, and instance-operation budgets, and execution telemetry

Version 2.658.0

Added

  • Added bounded editable XFA packet DOMs for complete XDP streams and ordered packet arrays with local-name path queries, packet and node mutation, exact untouched-byte preservation, per-packet selective rewriting, deterministic namespace and attribute output, safe CDATA splitting, entity escaping, and finite input, output, packet, node, depth, attribute, text, and query budgets

Version 2.657.0

Added

  • Added CSC API v2 remote signing through the existing CMS provider pipeline with application-owned transport, OAuth token refresh, bounded credential-chain discovery, explicit authorization and SAD handling, synchronous or asynchronous digest signing, RSA-PSS parameters, polling, RFC 3161 timestamps, cancellation, stable idempotency keys, and a finite completed-operation cache

Version 2.656.0

Added

  • Added optional content-scored XPS, EPUB, and CBZ document handlers with replaceable thread-safe registration, one validated archive scan, fixed-page, spine, and natural image ordering, immutable PDF conversion caching, shared archive, resource, reflow, page, pixel, DPI, output, and cancellation budgets, and rollback-safe PDF publication

Version 2.655.0

Added

  • Added bounded typed-table extraction and atomic CSV or JSON export with canonical columns, same-page fragment and consecutive-page merging, merged-cell spans, repeated headers, page geometry, confidence, provenance, and locale-controlled integer, number, boolean, date, date-time, currency, and percentage inference

Version 2.654.0

Added

  • Added atomic structured export of loaded pages to HTML, XHTML, XML, and JSON through one reading-order model with blocks, styled spans, detected tables, coordinates, source order, optional bounded PNG images, Unicode-safe escaping, cancellation, and finite resource budgets

Version 2.653.0

Added

  • Added atomic loaded-page colour rewrite to DeviceGray, DeviceRGB, or DeviceCMYK with searchable vector preservation, lossless colour-managed raster conversion for images and complex resources, rotation-safe output, explicit render fidelity and resource budgets, and preserve, process-convert, or reject policies for spot plates

Version 2.652.0

Added

  • Added review-first loaded-page redaction detection with checksum-aware PII patterns, pluggable entity and face detectors, confidence-scored page-space findings, bounded work telemetry, mandatory reviewer identity, atomic approved-annotation staging, and a separate explicit burn-in boundary

Version 2.651.0

Added

  • Added bounded loaded-page and region barcode decoding with pluggable engines, progressive low-resolution rendering, fallback quarter-turn scans, validated text and raw payloads, PDF-space bounds and orientation, confidence filtering, overlap deduplication, cancellation, and resource telemetry

Version 2.650.0

Added

  • Added bounded cancellable searchable OCR text layers with pluggable recognition engines, confidence and geometry validation, rotation-aligned invisible Unicode text, optional-content grouping, resource telemetry, and atomic multi-page publication

Version 2.649.0

Added

  • Added complete object graph round trips through versioned JSON with streaming snapshot and incremental exports, raw or decoded embedded and atomic sidecar payloads, bounded schema-compatible import, structural and stream-length validation, and transactional publication

Version 2.648.0

Added

  • Added bounded repair for hand-edited QDF diagnostic documents that preserves object and stream bytes, fixes direct, indirect, missing, or stale stream lengths, rebuilds classic cross-reference offsets and trailers, rejects unsafe structure, and verifies output through the normal loader

Version 2.647.0

Added

  • Added a thread-safe custom stream filter registry with bounded push and pull contracts, shared decode budgets, cooperative cancellation, explicit seek requirements, isolated custom failures, and execution telemetry

Version 2.646.0

Added

  • Added bounded content-operator visitor and event APIs with read-only operand views, deterministic state callbacks, inspect, measure, replace, delete, stop, and reject actions, cooperative cancellation, validated output, and atomic loaded-page updates

Version 2.645.0

Added

  • Added a pluggable loaded-page render backend contract with compiled display-list access, native GDI implementation, thread-safe parallel dispatch, deterministic fallback policy, cache invalidation, and execution telemetry

Version 2.644.0

Added

  • Added bounded layout overlap detection, element paths, opt-in source mapping, native vector overflow and overlap overlays, live diagnostic callbacks, and work statistics

Version 2.643.0

Added

  • Added native bounded vector charts with line, bar, area, pie, and scatter series, automatic or manual axes, themes, legends, labels, PDF/UA Figure alternatives, and render statistics

Version 2.642.0

Added

  • Added bounded GUI-thread RichEdit and RTF pagination with vector EMF output, images, opt-in supported OLE presentations, cancellation, stream-position preservation, and explicit input, character, page, and output budgets

Version 2.641.0

Added

  • Added bounded SVG 2 import as reusable PDF Form XObjects with native geometry and arcs, CSS cascade, vector gradients, clip and mask support, Base 14 text, opacity resources, placement-aware link annotations, and import statistics

Version 2.640.0

Added

  • Added a versioned HTML5 paged-media import profile with tolerant DOM parsing, print CSS cascade, paginated block and table layout, optional AcroForm controls, bounded callback-driven resources, and per-operation statistics

Version 2.639.0

Changed

  • Large local-file mappings now adapt the configured mapped-byte cap between larger sequential windows and up to 16 smaller MRU random-access windows, retain an explicit fixed-geometry option, and report active geometry, transitions, access-pattern counts, and peak mapped bytes

Version 2.638.0

Added

  • Added bounded cross-page JBIG2 symbol training with external and native backends, one shared global dictionary, exact duplicate-page reuse, direct PDF image-batch insertion, backend and size telemetry, and measured 78.8 percent compression savings on the 100-page regression corpus

Version 2.637.0

Changed

  • Parallel loaded-page rendering now reduces requested workers from the process-wide memory budget, reserves every claimed page, retains ordered-output reservations through callback delivery, wakes budget waiters on cancellation or failure, and reports concurrency, reservation, admission, delay, and wait telemetry

Version 2.636.0

Changed

  • Loaded-page prefetch now compiles and renders outside the cache lock, cancels cooperatively through tokenization and playback, yields to foreground page rendering, and exposes progress, failure, preemption, and cancellation-latency telemetry

Version 2.635.0

Added

  • Added ordered streaming parallel page rendering with calling-thread callbacks, a bounded completed-bitmap queue, producer backpressure, cooperative cancellation, borrowed bitmap lifetimes, and queue, byte, wait, completion, and delivery telemetry

Version 2.634.0

Added

  • Added a two-stage parallel loaded-page pipeline that compiles display lists outside the render-cache lock, starts playback before the full page set is compiled, dynamically balances bounded workers, preserves input order, reduces content-token allocation, and exposes stage, cache, completion, and latency telemetry

Version 2.633.0

Added

  • Added immutable reference-counted decoded bitmap handles with copy-free cache hits, direct thread-safe renderer drawing, isolated mutable copies on demand, eviction-independent lifetimes, and cumulative handle and copy telemetry

Version 2.632.0

Changed

  • QuickJS execution now works through both static objects and an ABI-neutral bridge DLL on Win32 and Win64, with Unicode-safe values, deterministic status reporting, configurable memory, stack, script, time, and interrupt limits, secure DLL discovery, recovery after rejected scripts, and reproducible cross-platform runtime builds

Version 2.631.0

Changed

  • Factur-X and ZUGFeRD business-rule validation now executes the complete reviewed XPath 2 Schematron surface with external code databases, sequential bindings, quantifiers, FLWOR sums, stable fallback rule identifiers, secure bounded XML parsing, explicit evaluation-error findings, zero silent skips, and fail-closed combined validation

Version 2.630.0

Added

  • Added built-in TrueType variable-font instancing with mapped axes, shared and private gvar tuples, IUP interpolation, simple and composite outline updates, phantom-point metrics, HVAR, VVAR, and MVAR baking, compact static glyph rebuilding, checksum-correct output, and callback-free Unicode font registration

Version 2.629.0

Added

  • Added side-effect-free CMS placeholder estimation from explicit, provider, or RSA certificate signature sizes, exact static container shaping, conservative dynamic payload reserves, pre-sign rebuilds, capability-gated provider retries, strict external-signer single-invocation guarantees, bounded sizing, and detailed attempt diagnostics

Version 2.628.0

Added

  • Added reachability-based subsetting of fonts embedded in loaded PDFs, including page content, nested Form XObjects, annotation appearance states, shared font programs, TrueType and CFF formats, encoded-size selection, stable CID and ToUnicode mappings, detailed results, and default refusal when signatures are present

Version 2.627.0

Added

  • Added automatic PDF/UA structure generation for declarative layout trees, including headings, lists, tables, figures, language and alternate-text metadata, pagination artifacts, continuation-safe marked-content references, reading-order preservation, semantic validation, and structure statistics

Version 2.626.0

Added

  • Added a declarative document DOM with inheritable styles, reusable component factories, text, spacers, stacks, containers, sections, repeated headers and footers, weighted tables with repeating header rows, bounded continuation depth, pagination statistics, non-copying text and table fragments, linear top-level traversal, immediate page flushing, and matching Delphi and C++Builder surfaces

Version 2.625.0

Added

  • Added a repeatable Win32 and Win64 statistical performance gate that isolates load, save, render, and text extraction, records warmups and 30 raw samples with p50, p95, sample variance, RSS, process I/O, environment, and deterministic fixture identity, then evaluates stable JSON thresholds and returns a failing exit code on regression

Version 2.624.0

Changed

  • Reworked simple dictionary and array parsing around immutable source spans, direct numeric conversion, single-pass nested containers, and indexed dictionary insertion, with public materialisation telemetry; a 30,000-pair Win32 fixture reduced five-pass allocation bytes by 64.7 percent and elapsed time from 3,656 ms to 46 ms

Version 2.623.0

Added

  • Added configurable parser limits for individual token bytes, aggregate tokens, array or dictionary entries, and malformed tokens, plus a strict untrusted-input preset, typed limit exceptions, and per-load telemetry; regression gates reject a 2 MiB token and a one-million-token container in under 250 ms and below a 37 MiB process peak

Version 2.622.0

Added

  • Added explicit loaded-page object-graph release and telemetry APIs that discard clean page-owned roots and render caches while preserving indirect shared resources and reload metadata; sequential processing of 100,000 pages stays at a stable 69.3 MiB peak and released ordinary or compressed pages materialise again with their original object identity

Version 2.621.0

Changed

  • Decoded object-stream containers now use a configurable byte-capped LRU cache with immediate per-container eviction, source-backed reload after eviction, a zero-retention mode, and peak-byte, eviction, and reload telemetry

Version 2.620.0

Changed

  • Large ordinary page trees now open into compact placeholders, resolve random pages through /Count-guided traversal and an indirect-object hash index, cache resolved pages, expose materialization telemetry and controls, and expand automatically before structural mutation or save operations

Version 2.619.0

Changed

  • Loaded AcroForm fields, qualified names, widgets, annotations, and pages now share a lazy bidirectional relationship cache with reverse annotation lookup, per-widget page lookup, activity telemetry, explicit invalidation for raw object-graph edits, and mutation-safe automatic maintenance

Version 2.618.0

Changed

  • Page-object lookup now uses a lazily rebuilt mutation-aware reverse index for object numbers and resolved page pointers, replacing repeated page-table scans across page copying, outlines, named destinations, actions, forms, accessibility, and page-tree reconciliation while exposing validity and activity telemetry

Version 2.617.0

Changed

  • Rendered document comparison now supports caller-selected DPI, RGB or luminance color tolerance, changed-pixel ratio and SSIM-like similarity gates, deterministic connected changed regions, optional PNG difference overlays, and fail-closed page and aggregate pixel budgets with explicit rendering diagnostics

Version 2.616.0

Changed

  • Document comparison now traverses indirect object graphs through deterministic catalog-based paths, hashes values and streams within explicit resource limits, aligns pages before classifying insertions, deletions, moves, and changes, distinguishes moved objects from additions and removals, and reports incomplete comparisons instead of treating budget-limited results as identical

Version 2.615.0

Changed

  • Loaded-image decoding now uses 16 cache metadata shards and exact per-key singleflight coordination, performs independent expensive decodes concurrently while preserving one owner decode for duplicate requests, enforces the configured byte and entry budgets across all shards, and exposes cached decode entry points plus concurrency telemetry; four independent 12,000-pixel JPEG requests scale 3.72 times on four Win64 workers while eight same-key requests decode once

Version 2.614.0

Changed

  • Low-resolution grayscale and RGB JPEG rendering now selects a bounded 1/2, 1/4, or 1/8 inverse-DCT scale, streams scaled scanlines through a fixed-point resampler directly into the exact target bitmap, preserves decode budgets, cancellation, and codec-worker isolation, and exposes source, scaled, target, scanline, and memory telemetry through GetLastJPEGReducedDecodeInfo; the 12,000 by 12,000 to 300 by 300 regression fixture runs 24.05 times faster than full decode without allocating its 432 MB source raster

Version 2.613.0

Changed

  • Loaded page /Contents arrays now expose a lazy seekable concatenated stream, retain unfiltered segments in source-backed storage, decode at most one filtered segment at a time, use amortised-linear token and byte accumulation, preserve original streams when editing by appending a new segment, and keep a 1 GiB 10,000-segment sequence below 64 MiB of additional working memory

Version 2.612.0

Changed

  • Incremental updates now keep the source file write-locked and file-backed instead of retaining complete source bytes, visit and emit only changed, new, and deleted objects in sparse xref subsections, stream the original prefix to a new target, and append directly with rollback for same-target saves; a 4 GiB one-object revision stays within 128 MiB of additional working memory

Version 2.611.0

Added

  • Added a bounded document-scoped loaded-font decoder cache with a 32 MiB and 128-entry LRU limit, singleflight parse reuse across pages and loaded text extraction, SVG export, and text replacement, independent deep-copy results from GetLoadedFontDecoder, configurable memory budget and telemetry APIs, and automatic graph, page, reload, JSON Patch, and CMap configuration invalidation; repeated use of one shared indirect font now parses its encoding, widths, ToUnicode, CIDToGIDMap, and descendant mappings only once while retained

Version 2.610.0

Changed

  • Accelerated page import and object grafting by replacing the linear, exactly resized foreign-object lookup array with an operation-scoped power-of-two open-addressed map keyed by source document, object number and generation; shared indirect objects and cyclic graphs keep their existing identity semantics across batch imports while large object graphs now use amortised constant-time registration and expected constant-time lookup

Version 2.609.0

Changed

  • Improved SVG page export fidelity: direct w, J, j, M and d graphics-state operators now preserve line width, named cap and join styles, miter limits, dash arrays and dash phase; q/Q restores these attributes across nested content and Form XObjects; even-odd f*, B* and b* paint operators emit fill-rule="evenodd"; zero-width PDF hairlines remain visible through non-scaling SVG strokes

Version 2.608.0

Added

  • Added QuickJS static-linking infrastructure: Lib/HPDFQuickJSStatic.pas links the five QuickJS OMF objects (built with bcc32c from patched sources) through {'$L'} directives — no DLL dependency — and declares the full C runtime surface (47 symbols: msvcrt C99 math, Borland 64-bit arithmetic, size-neutral atomic stubs, pthread stubs); thirdparty/QuickJS/build-static.bat automates the patch-and-compile pipeline. Known limitation: JS_NewRuntime succeeds but JS_NewContext hits an access violation because the _Atomic removal changes struct initialization order; the DLL build from v2.607.0 remains the working evaluation path

Version 2.607.0

Added

  • Added DataMatrix 2D barcode generation (Lib/HPDFDataMatrix.pas): ASCII-mode encoding with digit-pair compression, Reed-Solomon ECC over GF(256) with the DataMatrix primitive polynomial $12D, square sizes 10x10 through 144x144, alternating-direction codeword placement, and the L-shaped finder pattern; THPDFPage.DrawDataMatrix renders the encoded matrix as a grid of filled module squares
  • Added PDF417 stacked 2D barcode generation (Lib/HPDFPDF417.pas): text-mode encoding with base-30 character pairing, Reed-Solomon ECC over GF(929) with primitive 3, symbol descriptor encoding, and row/column layout with start/stop patterns; THPDFPage.DrawPDF417 renders the codeword matrix
  • Added the QuickJS JavaScript engine binding (Lib/HPDFQuickJS.pas plus pre-built Win32/Win64 quickjs.dll under thirdparty/QuickJS/bin/): dynamic DLL loading, runtime+context lifecycle, and the evaluation API surface (Eval/EvalInt/EvalFloat); the Eval code path has a known Win32 startup crash when linked into an application and is documented for follow-up investigation
  • Added the THPDFWriter architectural extraction target (Lib/HPDFWriter.pas): xref entry registry (free/used/compressed), classic xref table serialiser, and trailer dictionary builder that the THotPDF save path delegates to incrementally

Version 2.606.0

Added

  • Added two HotPDFCLI commands: decrypt loads an encrypted PDF with the given password, decrypts it via DecryptLoadedDocument and saves an unencrypted copy (-o output path, default <input>-decrypted.pdf) and optimize recompresses every stream with FlateDecode via CompressLoadedDocument (-o output path, default <input>-optimized.pdf, refuses encrypted input)

Version 2.605.0

Added

  • Added QR Code 2D barcode generation: the new Lib/HPDFQRCode.pas implements a complete QR encoder (numeric, alphanumeric and byte encoding modes; Reed-Solomon error correction over GF(256); versions 1-40 with all four EC levels L/M/Q/H; all eight mask patterns with penalty evaluation; correct module placement including finder, timing, alignment, format info and version info patterns). The THPDFPage.DrawQRCode method renders the encoded matrix as a grid of filled module squares on any writing page (ModuleSize in points, configurable EC level and colour)

Version 2.604.0

Added

  • Added full MacExpertEncoding decode table: the 128-byte high half now maps expert glyphs (small capitals, old-style figures, superior/inferior digits, fractions, typographic symbols) to the closest Unicode codepoint or Private Use Area surrogate, replacing the previous raw-byte identity fallback that produced garbled output for documents using expert-encoded Type 1 fonts

Version 2.603.0

Fixed

  • Fixed a long-standing flaky failure in ConcurrentObjStmDecryptionMatchesSerial: the FRevision global was stale after aes256 downgraded to aes128 under the default PDF 1.6 version, misrouting CreateKeys into the V5 branch that never fills the legacy /O and /U password hashes — the serialised encryption dictionary then carried empty or stale password strings and the file was unopenable. The fix re-derives FRevision from the downgraded FCryptKeyType at both the setter and the two version-negotiation sites, and the legacy dictionary branch now raises a clear diagnostic when the password strings are not exactly 32 bytes

Added

  • Added the HotPDFCLI html command: renders a restricted HTML file (h1-h6, p, ul, ol, hr, inline markup) to a PDF via HPDFRenderHTMLDocument

Version 2.602.0

Added

  • Added block-level HTML import: THPDFHTMLImporter (and the HPDFRenderHTMLDocument convenience wrapper) renders a restricted HTML subset onto a writing document — h1-h6 headings with per-level sizes, p paragraphs (bare body text becomes implicit paragraphs), ul/ol lists with indented li items (bullet or 1. numbering), hr rules, automatic page breaks at the bottom margin and browser-style recovery for unclosed p/li blocks; head/script/style regions are skipped and container tags pass through transparently. Inline markup (b/i/u/font/a/sub/sup, entities, word wrap) is delegated to the existing TextOutHTML renderer, so blocks keep-together within a page; tables, images, CSS and nested lists are out of scope

Version 2.601.0

Added

  • Added three HotPDFCLI commands: merge appends every page of the additional inputs to the first document and saves the combined file (-o output path, at least two inputs, output/input collision guarded), split writes each selected page of a document to its own single-page file (<prefix>-page<N>.pdf, --pages one-based range, default prefix from the input path) and export-svg writes the SVG export of each selected page (<prefix>-page<N>.svg, default page 1)

Version 2.600.0

Added

  • Added SVG page export: BuildLoadedPageSVG returns a standalone SVG 1.1 document for any loaded page and SaveLoadedPageAsSVG writes it to disk; paths (fill/stroke/fill-and-stroke paint operators with the DeviceRGB colours), text runs (per-character positioned <text> elements using the same font-decode fallback chain as text extraction, honouring Tf/Tc/Tw/Tz/Ts and the text matrix incl. rotation and scaling), image XObjects (decoded and embedded as base64 PNG data URIs mapped through the CTM unit square) and Form XObjects (recursive interpretation with the form matrix and own /Resources) are exported, and /Rotate 90/180/270 pages export in the rotated canvas geometry
  • Known limits inherited from the shared content-stream device dispatcher: no W/W* clipping, no sh shadings, no Type 3 fonts, inline images report metadata only and ExtGState-supported stroke parameters (LW/LC/LJ/ca/CA) are honoured while the plain w/J/j/d operators are not dispatched

Version 2.599.0

Added

  • Added the HotPDFCLI command-line tool (tools/HotPDFCLI): a console front end with three commands — info (PDF version, page count and first page size, encryption method, linearization and xref structure, annotation/font/image/form/signature counters, Info metadata), extract-text (one-based --pages ranges, --out file output, --layout monospaced grid mode that matches visual reading order) and verify (per-signature-field status, signer, reason, hash, signing time, whole-document coverage and certificate state, non-zero exit when any signature fails); Build-HotPDFCLI.bat produces Win32 and Win64 binaries

Version 2.598.0

Added

  • Added SetRenditionMediaPlayParameters: attaches or updates the /P media play parameters dictionary of a media rendition with must-honour /MH or best-effort /BE targets carrying the volume percentage, controller visibility, autoplay flag, fit mode (meet/slice/fill/scroll/hidden), repeat count and an intrinsic, infinity or explicit timespan duration
  • Added SetRenditionMediaScreenParameters: attaches or updates the /SP media screen parameters dictionary of a media rendition (window type floating/full-screen/hidden/screen-annotation rectangle, DeviceRGB background colour, background opacity, monitor index)
  • Added SetSoundAnnotationParameters: rewrites the sample format of a Sound annotation's /Sound stream (rate, channels, bits per sample, Raw/Signed/muLaw/ALaw encoding) beyond the hardcoded 22050 Hz stereo 16-bit Signed defaults and sets the /Name icon such as Speaker or Mic

Version 2.597.0

Added

  • Added SetMovieAnnotationParameters: overrides the /Movie dictionary of a movie annotation (aspect pair, rotation 0/90/180/270, duration in seconds, poster visibility) that AddMovieAnnotation created with its hardcoded defaults
  • Added SetRichMediaPresentation: populates the /RichMediaSettings activation, deactivation and presentation dictionaries of a RichMedia annotation (condition names such as PO page-open, toolbar / navigation UI / context click / transparency flags); an empty condition name omits the corresponding dictionary
  • Added ResolveIndirectObject on THotPDF: resolves the indirect references the authoring side stores inside written dictionaries so callers can navigate freshly built object trees; AddRichMediaAnnotation now also registers its annotation in LastAnnotation

Version 2.596.0

Added

  • Added live revocation evidence discovery: the certificate parser now reads the AIA OCSP responder and CRLDistributionPoints URI extensions, HPDFExtractCertificateRevocationURLs exposes them per certificate, and HPDFCollectCMSRevocationRequests turns them into evidence requests (GET pkix-crl per distribution point, POST ocsp-request with a minimal RFC 6960 SHA-256 CertID body built from the certificate and its issuer, self-signed certificates resolving as their own issuer)
  • Added HPDFValidateCMSCertificatePathOnline: collects those requests, executes them through the caller-supplied transport over the existing retry/worker machinery (the library never opens sockets), and feeds every fetched OCSP response and CRL into the offline validator; failed fetches degrade to the offline evidence semantics

Version 2.595.0

Added

  • Added JBIG2 halftone region decoding (segment types 22/23): pattern dictionaries (type 16) with MMR or arithmetic collective bitmaps, gray-scale bit-plane stacks in both MMR (byte-aligned chained planes) and arithmetic form (one shared MQ decoder), grid placement with 8.8 fixed-point vectors and the optional HSKIP blank map
  • Added JBIG2 standalone generic-refinement regions (types 42/43, GRTEMPLATE 0/1 with TPGRON) refining the archived bitmap of a referred region segment or the page buffer
  • Added AddPubSecKeyMaterial / ClearPubSecKeyMaterials: additional recipient private keys tried against every /Recipients envelope when the primary PubSecKeyMaterial does not match
  • Added test-stream builders HPDFJBIG2Codec_EncodeHalftoneRegionTestStream and HPDFJBIG2Codec_EncodeStandaloneRefinementTestStream covering the new segment types end to end

Fixed

  • Fixed public-key AES-128 document loading: the legacy object pass left FileKey, StringKeyType and StreamKeyType uninitialised after the pubsec split, so every object decrypted with a garbage key (a Win64 load failed outright; a Win32 load silently produced wrong plaintext)
  • Fixed encrypted string round-tripping: ciphertext is now always serialised as a hex string because literal strings normalise CR, LF and CRLF to a single LF and escape processing could flip arbitrary cipher bytes

Version 2.594.0

Added

  • Added built-in identity approximation for the predefined CJK UCS2/UTF16 CMaps (UniJIS-UCS2-H, UniGB-UTF16-V and 15 more): HPDFLoadStandardCMapFile answers from a built-in table when no CMap resources ship on disk, so Type0 text extraction no longer decodes 2-byte codes one byte at a time
  • Added user-supplied JBIG2 Huffman tables (segment type 53, Annex B.2 descriptor form): the native decoder parses the table segments and the symbol-dictionary SDHUFFDH/SDHUFFDW/SDHUFFBMSIZE/SDHUFFAGGINST and text-region SBHUFFFS/DS/DT/RDW/RDH/RDX/RDY/RDSIZE selector value 3 resolves them from the referred-to segments
  • Added SetStructureClassMapEntry registering the shared attribute dictionary of a class name in the StructTreeRoot /ClassMap, completing the SetStructureElementClass /C API

Fixed

  • Fixed public-key multi-recipient key recovery: the /Recipients envelopes were stored in an uncounted list that aliased one buffer across entries, so documents with two or more recipients derived a wrong file key for every cipher; envelopes are now owned copies and the legacy SHA-1 path hashes pristine envelope bytes like the AES-256 path

Version 2.593.0

Added

  • Added Shading Type 1 (function-based) rendering: the visible portion of the domain rectangle is subdivided by a colour-error-driven quadtree and each leaf cell is painted as two gradient triangles with vertex colours sampled from the 2-input function, replacing the previous "not sampled" fallback diagnostic
  • Added lenient 2-input function evaluation: a function that only declares one input degrades to f(x) (constant in the second domain coordinate) instead of failing, so sampled and exponential functions behind a Type 1 shading still paint

Version 2.592.0

Added

  • Added object-stream quarantine: a corrupt /Type /ObjStm container is recorded with a reason (THPDFObjStmQuarantineReason: not a stream, bad dictionary, bad header, bad stream size, decrypt failed, decompress failed, /First out of range, header unparsable, or container exception), a diagnostic line, and the member object numbers it left unresolved, while independent containers keep loading
  • Added member-level quarantine (osqrMemberUnparsable): a member body that fails to parse out of a successfully decoded container is recorded once without affecting its siblings, and GetLoadedQuarantinedObjStmCount / GetLoadedQuarantinedObjStmInfo expose every record; quarantine records survive the recovery retries of one load, deduplicate per container, and clear on the next load entry