HotPDF Release Notes

British English version history for HotPDF 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 to 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 whilst continuing to refuse values below the supported bound

Version 2.968.0

Added

  • Evaluate explicit rich-text colour scheme, reduced motion, transparency and data preferences, contrast, forced and inverted colours, and scripting availability whilst 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 programmes, 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 behaviour across six native compiler targets

Version 2.955.1

Security

  • Reject all-zero X25519 and X448 shared secrets after canonical byte serialisation, including low-order inputs whose weak field limbs are non-zero, 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 behaviour

Fixed

  • Authenticate ordinary loaded-document annotation imports against original encryption permissions, signatures and field locks whilst 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 whilst 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 whilst 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 serialisation, 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 serialisation, 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 whilst preserving exact case-sensitive export values, original selection order and transactional failure behaviour

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 serialisation, 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 colours, 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 colour 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 colour 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 through 26 bits with mixed precision, subsampling and opacity, normalise 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, recognise 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 recognise 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 whilst 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 synchronised 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 whilst 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 colours 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 behaviour, 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 behaviour

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 whilst preserving existing Windows Unicode initialisation

Version 2.903.1

Fixed

  • Keep Unicode directional-only shaping clusters at zero character-spacing advance whilst 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 colour 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 whilst 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 synchronisation

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 colour 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, colour 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, serialisation, cloning and transactional rollback, whilst 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 whilst 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

  • Synchronise materialised hidden and invisible XFA scalar aliases after visible field commits whilst 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 honour soft-hyphen prohibitions

Version 2.887.0

Added

  • Import and serialise 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, honour 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 initialisation, preserve an active caller colour 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 synchronisation, 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 coloured and uncoloured 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 whilst 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 authorisation and freshness before publishing signatures

Version 2.875.0

Added

  • Resolve actual XFA field defaults without manufacturing data whilst 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 synchronised 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, honour 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 whilst 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, colour, 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 whilst 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 prioritising 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

  • Honour valid inherited Windows signature seed and certificate constraints with actual digest and CAdES selection, Unicode signature information, normalised 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 colours, 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, colour 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, normalised 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, synchronised 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, honour 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 colours 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 colours 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 synchronise push-button caption metadata atomically

Version 2.840.0

Added

  • Render calibrated CalGray, CalRGB and Lab source colours, 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 colour-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 whilst 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 colour and alpha
  • Validate supplied certificate, OCSP and CRL evidence before incremental DSS/VRI publication whilst 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 authorisation, 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 behaviour, 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 colours, 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 whilst 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 serialisation, including stream-to-file saves and retries after an output failure

Version 2.812.0

Added

  • Convert compatible loaded documents to PDF/A-4 whilst 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 synchronisation, preserving Windows APIs and correctly serialising 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 whilst 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 mitre limits for solid and gradient strokes, whilst 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 behaviour 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 normalised into validated PDF/A-4 raster documents with strict native rendering, verified sRGB colour, 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 synchronise 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 whilst keeping the examples identifiable when annotation appearances are hidden

Version 2.780.0

Changed

  • The demo catalogues now prioritise 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, personalised 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 favour 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, whilst 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

  • The built-in OCR engine now treats blank or unrecognisable pages as successful empty results so batches of scanned documents can carry on, preserves bitmap pixels under Windows FPC, and checks cancellation and time limits throughout image analysis
  • Native RapidOCR angle classification keeps short-line aspect ratios intact and will only rotate a text crop when the upside-down prediction is a confident one
  • The local Python RapidOCR adapter now keeps recognised line spacing and punctuation rather than emitting separate characters that can pick up unwanted spaces, and the Tesseract DLL adapter filters out C1 control characters before text is published

Version 2.776.0

Added

  • Text layers in scanned PDFs can atomically replace the marked HotPDF OCR streams once a document has been saved and reloaded; existing layers survive failed or empty recognition, replaced pages are reported, and a native multilingual RapidOCR console example handles conversion without overwriting the files already there

Fixed

  • Neighbouring Latin and Cyrillic OCR words on the same line with a visible word gap now receive explicit Unicode spaces, keeping phrase search and copying stable, whilst adjacent CJK words remain unseparated
  • JPEG scan rendering under Windows FPC no longer loses decoded pixels when converting to the OCR bitmap format, which stops an LCL pixel-format change from feeding blank input to recognition

Version 2.775.0

Added

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

Fixed

  • Local process OCR adapters now retry clearing their temporary output when diagnostic files stay briefly locked after a worker has terminated

Version 2.774.0

Added

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

Version 2.773.0

Added

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

Version 2.772.1

Fixed

  • The Tesseract DLL and CLI adapters now run in the Windows FPC/Lazarus Win32 and Win64 builds: Unicode OCR words are preserved and current LCL image pixels are read when building searchable PDF text layers

Version 2.772.0

Added

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

Version 2.771.1

Changed

  • The built-in OCR engine recognises regular, bold, italic and bold italic ASCII text against light or predominantly dark backgrounds, accepts faded lettering where the greyscale contrast is sufficient, and leaves out words containing uncertain retained glyphs rather than quietly discarding characters

Version 2.770.175

Fixed

  • LoadedDocInspector and SignatureValidator now exit with a failure code when a PDF cannot be read, and reject invalid command-line arguments rather than reporting a successful but empty inspection

Version 2.770.174

Fixed

  • LoadedImageExport checks every image destination before a single page is exported, so path aliases cannot overwrite the input PDF or another chosen page; unsupported format names are rejected too

Version 2.770.173

Fixed

  • The rendered-page disk cache now steers clear of linked document folders during recovery, lookup, storage, invalidation and eviction, leaving files outside the cache untouched

Version 2.770.172

Fixed

  • JSON jobs refuse malformed syntax, trailing content, numbers beyond the finite Double range and excessive nesting before any operation runs, releasing partially parsed values when validation fails

Version 2.770.171

Fixed

  • PreflightCLI reviews the full report output plan before anything is written, shielding input PDFs from file aliases and turning away conflicting report destinations; recursive scans skip linked child directories so that cycles cannot form

Version 2.770.170

Fixed

  • CopyPage verifies file identities before exporting and turns away conflicting output aliases; automatically named outputs for extensionless inputs stay alongside them, even in directories whose names contain full stops

Version 2.770.169

Fixed

  • JSON job values keep escaped null characters intact, serialise finite numbers beyond the signed 64-bit range without integer overflow, and hand back defaults for out-of-range integer parameters without touching the process locale

Version 2.770.168

Fixed

  • Recovery in the simple-object parser now stops at stray closing brackets in unbracketed array bodies, and still preserves valid numbers and dictionary keys that appear straight after malformed delimiters

Version 2.770.167

Fixed

  • HotPDFCLI refuses output paths that alias input files and vetoes every generated path before batch export begins, so commands can no longer truncate or overwrite their own source data

Version 2.770.166

Fixed

  • The ExtractText example keeps its input PDF safe when an output resolves to a directory junction or hard link, and LoadedImageExport reports failure when a document cannot be read or a page export is incomplete

Version 2.770.165

Fixed

  • Direct file reads discard incomplete cache refills following an I/O failure, and read-ahead ranges close to the signed 64-bit offset limit are bounded safely

Version 2.770.164

Fixed

  • RunLength decoding now allocates just the decoded payload size, validating malformed runs before any output is reserved, so streams with early terminators no longer trigger oversized memory reservations

Version 2.770.163

Fixed

  • The Delphi and C++Builder examples find their bundled images, metafiles, colour profiles and optional signing fixtures in both the project folders and nested build output directories

Version 2.770.162

Fixed

  • The HugeFileBenchmark examples refuse generated PDF paths that match any input document before a benchmark batch starts
  • The C++Builder example keeps relative input subdirectories for generated PDFs, so same-named recursive inputs no longer share one output file
  • Failed operations, memory-limit violations and invalid zero-page loads now yield a nonzero exit code whilst still keeping the benchmark report

Version 2.770.161

Fixed

  • The Delphi and C++Builder Preflight CLIs refuse report and aggregate output paths matching an input PDF, so reports can no longer overwrite the source documents

Version 2.770.160

Fixed

  • ASN.1 parsing now turns away high-tag-number encodings beyond the supported 32-bit tag range instead of quietly accepting a tag number that has wrapped round

Version 2.770.159

Fixed

  • The C++Builder Preflight CLI keeps relative subdirectories for recursive reports and dashboard links, so identically named PDFs no longer overwrite one another
  • The Delphi and C++Builder Preflight dashboards now encode report links correctly when special characters or non-ASCII directory names are involved
  • C++Builder standard-validation failures now come back with exit code 3 and show up as invalid in the dashboard for every report format, including inputs that cannot be loaded

Version 2.770.158

Fixed

  • The C++Builder PDF merge example resolves relative input paths against the executable directory and stops file dialogs from shifting the working directory
  • Each generated bookmark now points at the first page copied from its own input document

Version 2.770.157

Fixed

  • The object parser normalises unescaped CR and CRLF line endings inside PDF literal strings down to LF, whilst escaped carriage returns and line continuations are preserved

Version 2.770.156

Fixed

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

Version 2.770.155

Fixed

  • In Win64 builds, importing SVG or XPS path data containing a number with an exponent close to 100 (1e-100 or 5e99, say) no longer raises a floating-point overflow when the application unmasks floating-point exceptions
  • Numbers of this kind are now read at their true value, so a long mantissa paired 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 has been set; previously the positions came out shifted by the crop box offset, or scaled against the wrong page height
  • Face findings from DetectLoadedRedactionFindings (with face detection switched on) now land on the detected faces of such pages rather than sitting offset from them
  • Both features render the visible page area (the CropBox clipped to the MediaBox) and map detected positions back through that same area; the page box handed to a custom IHPDFFaceDetector now tallies with the bitmap it receives
  • Barcode decoding with an explicit region, along with pages that have no CropBox or whose CropBox equals the MediaBox, is unchanged

Version 2.770.153

Fixed

  • ApplyLoadedOCRTextLayer now positions the invisible text layer correctly on pages whose CropBox differs from the MediaBox; previously the searchable text came out shifted by the crop box offset, or scaled against the wrong page height, leaving selections and search hits out of line with the visible words
  • The OCR raster is rendered from the visible page area (the CropBox clipped to the MediaBox), and recognised word positions are mapped back through that same area
  • The page box passed to a custom IHPDFOCREngine in THPDFOCRRequest is now the rendered visible area, matching the bitmap that engine receives
  • Pages with no CropBox, or whose CropBox equals the MediaBox, behave exactly as before

Version 2.770.152

Fixed

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

Version 2.770.151

Fixed

  • THPDFTable now keeps rows linked by a RowSpan together on one page: when the group will not fit into the space remaining, the entire group moves to the next page along with the repeated header
  • A cell spanning several rows no longer runs past the bottom margin whilst the rows it covers carry on over the page
  • A row-span group taller than a full page is still split row by row, its spanning cells being cut at each page's bottom margin
  • TotalHeightRendered reflects the relocated group on the last page

Version 2.770.150

Fixed

  • THPDFTable cells carrying a ColSpan or RowSpan of zero or less are now drawn as single cells, exactly where the table grid placed them, rather than shoving the following cells into the wrong columns
  • Negative spans no longer send the table reading outside its grid, and spans that run past the last column or row are clipped at the table edge during measuring as well as drawing
  • A cell whose first word is wider than its column no longer begins with an empty line, so its row grows no taller than the wrapped text requires

Version 2.770.149

Security

  • XFA forms declaring an internal entity in their DOCTYPE can no longer blow up memory by referencing a large entity over and over: text substituted for internal entities is capped at 16 MB per document
  • A single internal entity value longer than 1 MB is rejected outright
  • Documents crossing either limit fail to load with an EHPDFXFAError rather than ballooning into gigabytes of text; everyday entity use is unaffected
  • Text packed with entity or character references is likewise decoded in linear time

Version 2.770.148

Fixed

  • RecalculateLoadedFormFieldsIncremental now treats every field handed to it as changed in the same manner, whatever order the names arrive in
  • A calculated field written directly alongside one of its source fields keeps the value that was written, instead of being recalculated only when it happens to be listed after that source
  • Fields depending on the changed ones are still recalculated exactly once, following 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, just as Code 128 A does
  • Lower-case letters in these barcodes are now written via a SHIFT into code set B rather than as a set B codeword that scanners misread as a control character in set A
  • Scanned GS1-128 A symbols containing lower-case text therefore give back 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 switched on
  • Drawing one of these barcodes repeatedly now yields the same symbol every time, instead of the text gaining a digit per redraw and the bar pattern shifting
  • By definition the add-on symbols carry no check character, so Checksum is disregarded 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 out as the real Unicode text rather than hex digits or code-page rubbish
  • Annotation contents, author, subject, state and overlay text exported to XFDF retain non-Latin characters, Chinese or Cyrillic comments for example
  • Rich text (/RC, /RV) beginning with an XML declaration is now embedded without that declaration, keeping the exported XFDF well-formed XML
  • XFDF import no longer pushes text through the system ANSI code page: values that PDFDocEncoding can represent are stored as such, everything else as a UTF-16BE text string, for form fields and annotation text alike
  • Characters outside the ANSI code page now round-trip through ImportLoadedFormFromXFDF and ImportLoadedAnnotationsFromXFDF in exported XFDF files without degrading 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 along the lines of "Müller GmbH" no longer returns as garbled multi-byte characters
  • Escaped markup characters and character references are resolved, so "A & B" in the XML is reported back as "A & B"
  • ValidateVisualXmlConsistency no longer flags a seller name containing accented letters or an ampersand as absent from the visible page text when it is plainly printed there
  • Summary text comes back in the system ANSI code page, since the summary record's fields are ANSI strings; characters that code page cannot represent turn into question marks

Version 2.770.143

Fixed

  • GetLoadedInvoiceSummary now takes the invoice-level net total (BT-106) from the header monetary summation rather than the first line item's amount
  • Tax total, grand total and amount due are likewise read from the header summation, ZUGFeRD 1.0 invoices included
  • The issue date (BT-2) now comes back as the plain date value (20260305, for instance) instead of dragging in the nested DateTimeString markup
  • HPDFFacturXXMLElementText now returns the whole element's character data with child tags stripped, and no longer matches elements whose name merely begins with the requested one

Version 2.770.142

Fixed

  • XFDF export now writes characters outside the Basic Multilingual Plane (emoji or rare CJK ideographs, say) as valid four-byte UTF-8 instead of encoding each surrogate half on its own, so strict XML readers accept the file
  • XFDF import now decodes character references above U+FFFF, such as 😀, into the complete character instead of truncating it to some unrelated BMP character
  • Character references that fail to name a Unicode scalar value, together with unpaired surrogates on export, now become U+FFFD rather than corrupting the text
  • XFDF files written by earlier versions continue to import correctly

Version 2.770.141

Fixed

  • Field values and annotation text containing backslashes, Windows paths such as C:\Data\2024\001, now come through an XFDF export and import unchanged, rather than digit sequences being converted into control characters
  • Where a backslash would otherwise be read back as an escape, XFDF export now writes it as the octal escape \134, just as in a PDF literal string (ISO 19444-1 5.8.2)
  • XFDF import decodes only the octal escapes the format reserves for control characters and backslashes; other backslash sequences arriving in 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 functions for documents opened with LoadFromFile, LoadFromStream and LoadFromRandomAccessSource; previously the disk tier was skipped for ordinary loads, meaning no page was ever written to or read back from the folder
  • Documents loaded from a file are identified by their size, last-write time and their leading and trailing bytes, so reopening an unchanged file pulls its pages from the cache without hashing the entire file
  • Documents loaded from a stream or a random-access source are identified by the SHA-256 of their content; set RenderCacheFolder before loading if such documents are to use the disk tier
  • A document edited after loading no longer reads or writes disk entries for the remainder of that load, so edited pages are never served from, nor stored as, the cached pages of the original file
  • Disk entries now factor in the page render backend and the ICC proofing workflow too, so pages rendered under other settings are not reused when the backend or output profile differs; encrypted documents are never written to the disk cache

Version 2.770.139

Fixed

  • Importing large XFDF files no longer slows with the square of the file size: a file holding thousands of fields or annotations now parses in milliseconds rather than seconds or minutes
  • Field values containing many line breaks or other character references are decoded in linear time
  • Peak memory whilst parsing XFDF no longer grows in step with element count multiplied by file size
  • SVG input read through the same lightweight XML reader enjoys the same speed-up

Version 2.770.138

Fixed

  • When DecodeLoadedPageBarcodes retries a page turned by 90 or 270 degrees, the raster passed to the decoder is now turned clockwise, exactly as AttemptRotationDegrees documents
  • Symbols turning up only in those retries are now reported at their true position on the page rather than at the point-mirrored one
  • The orientation reported for these symbols now matches their reading direction on the page instead of being out by 180 degrees
  • Custom barcode decoders relying on the documented clockwise turn now receive correctly turned rasters

Version 2.770.137

Fixed

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

Version 2.770.136

Fixed

  • Annotations created on new pages (AddStampAnnotation, AddTextAnnotation and the remaining THPDFPage annotation methods) now write /Rect with the lower-left corner first, [llx lly urx ury]; several used to put the top edge before the bottom one ([395 712 575 652], for example), which viewers tolerate but PDF/A validators and certain 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) rather than an AnsiString, so a cache folder whose path holds characters outside the system code page (a Chinese user name on an English Windows, say) is used as supplied instead of degrading into question marks
  • Code assigning an AnsiString to the property still compiles; the value is converted to Unicode at 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; the entire value used to be written as a text string under /Min, which viewers disregard, so the layer's zoom range achieved nothing
  • The Zoom value is the minimum magnification optionally followed by the maximum, separated by a space ('0.5 4', for instance); a value not beginning with a number now raises an exception

Version 2.770.133

Fixed

  • Subsetting embedded CFF/OpenType fonts no longer discards subroutines that glyphs still rely on; glyphs with more than eight hints, hstemhm hints or counter masks were scanned incorrectly, so a subroutine still in use could be swapped for an empty one, leaving the glyph with missing or broken outlines

Version 2.770.132

Fixed

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

Version 2.770.131

Fixed

  • The XMP metadata written with EnableXMPMetadata now carries Title, Author, Subject and Keywords as valid UTF-8 whenever they hold text in the system code page (accented or Chinese characters assigned as AnsiString, for instance); the raw code-page bytes used to leave the packet as invalid XML, which PDF/A validators and XMP readers reject
  • Control characters XML 1.0 disallows are omitted from these XMP values

Version 2.770.130

Fixed

  • JBIG2 images written with JBIG2Options.AccumulateGlobalsAcrossPages decode correctly once more when a later page introduces symbols earlier pages never used; those pages kept pointing at the first page's globals stream, which lacks the new symbols, so viewers displayed them garbled or not at all
  • Whenever a page adds symbols, a globals stream holding the entire dictionary up to that page is written and used from that point on; pages adding no symbols keep sharing the most recent one

Version 2.770.129

Fixed

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

Version 2.770.128

Fixed

  • THPDFPage.TextOutHTML with a MaxWidth no longer sheds formatting at a line wrap: when several differently styled runs moved down to the next line together they were merged into a single run drawn with whichever style was in effect at the wrap, so their colour, bold or italic styling, font, size, sub/superscript offset and link all vanished. Each run now carries its own formatting onto the new line

Version 2.770.127

Fixed

  • InvalidateRenderedPageCache now clears the Type 3 glyph and halftone entries shared by parallel rendering too; after a whole-document invalidation, the next parallel render stood a chance of reusing 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 following a preflight hang on to 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, "Total (net)" for instance; the final character used to be chopped off
  • Field names written with octal escapes or 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 as it is written; the internal documents it creates now ship with AutoLaunch switched off

Version 2.770.124

Fixed

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

Version 2.770.123

Fixed

  • SetLoadedOpenActionPage now writes a destination naming the requested page; the page reference used to be written as 0 0 R, leaving viewers unable to open the document at that page
  • The destination preserves the current view position (null left and top) instead of forcing 0 0, which leapt to the page's bottom-left corner

Version 2.770.122

Fixed

  • SetLoadedViewerPreferences now writes HideToolbar, HideMenubar, FitWindow and DisplayDocTitle as boolean values; they were previously written as the names /true and /false, which viewers refuse to treat as booleans, so the preferences did nothing

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); a reason absent from the list used to slip through
  • Reasons are compared exactly, as text strings are throughout PDF; "approved" no longer satisfies a seed value listing "Approved"

Version 2.770.120

Fixed

  • Stamping a loaded page more than once with StampLoadedPageText or StampLoadedPageShape now gives every stamp its own opacity and every text stamp its own standard font; the second and subsequent stamps used to inherit the transparency and font of the page's first stamp
  • A stamp matching an earlier one's opacity and font still shares its resources, so repeated identical stamps do not inflate the page resources

Version 2.770.119

Fixed

  • ExtractLoadedPageStructureText now follows structure elements whose /K entry is a plain marked-content number (/K 3 or /K [0 1], for instance), the commonest form in tagged PDFs; such elements were previously 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 lacks a usable root object

Version 2.770.118

Fixed

  • StampLoadedPageText, StampLoadedPageImage, StampLoadedPageShape, StitchLoadedPage and FlattenLoadedAnnotations no longer break pages inheriting their resources from the parent /Pages node; such a page used to be handed a new, empty /Resources dictionary, hiding the inherited fonts and images so the page's original text and pictures stopped displaying
  • 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 across resources a source page inherits from its parent /Pages node; such pages were placed without their fonts and images, leaving their text and pictures missing or wrong on the composed sheet

Version 2.770.116

Fixed

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

Version 2.770.115

Fixed

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

Version 2.770.114

Fixed

  • HPDFPaginateTable no longer keeps adding pages until memory gives out when an unsplittable row will not fit beneath the repeated header rows; on a page holding nothing but 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 when a note's minimum fragment height cannot be met on an empty page; the note is simply placed on that page instead

Version 2.770.113

Fixed

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

Version 2.770.112

Fixed

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

Version 2.770.111

Fixed

  • ProcessObjectStreamsForDecompression and ExtractRawObjectFromStream no longer take an object stream's declared /N count at face value: a count above ten million is rejected, and the count is capped at the object-number pairs the stream header can genuinely hold, so a crafted file can no longer trick them into allocating or trawling 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 solely from that section's own trailer dictionary; on incrementally updated files it could latch onto a /Prev from a later revision's objects (an outline item, for instance) or trailer, then fail or read the wrong revision
  • A /Prev chain looping back to a section already read now stops, rather than reading the same sections a second time

Version 2.770.109

Security

  • ApplyLoadedRedactions now removes the text beneath a redaction area on pages whose content is spread over several streams; when one stream ended with an operator and the next began with one (ET followed by BT, for example), the text after the join was matched against the wrong operands and stayed readable in the saved file even though the area had been painted over
  • Content streams without data are skipped consistently, keeping the remaining streams aligned with the text located on the page

Version 2.770.108

Changed

  • GetLoadedOCGCount, GetLoadedOCGName, GetLoadedOCGVisibility and SetLoadedOCGVisibility now all share one 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 a single 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 appears in /OFF, or when it sits in neither array and the default configuration's /BaseState is /OFF

Fixed

  • SetLoadedOCGVisibility no longer places 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 lets the source and target page dictionaries share the same /Contents and /Resources entry objects; those shared objects were released twice when the document was freed or the target entry replaced, which could corrupt memory
  • The target page now receives 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 each stream object that cannot be read, a stream with neither a /Length entry nor an endstream keyword or one whose dictionary or data refuses to load for instance; repeatedly opening such files made the process grow without bound

Version 2.770.105

Fixed

  • Numbers written with an empty fraction, "21." for instance (permitted by the PDF specification), no longer break loading; an indirect stream /Length written that way used to discard the entire 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 too

Version 2.770.104

Fixed

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

Version 2.770.103

Fixed

  • TextOut demo: the generated TextOut.pdf now genuinely uses compressed content streams, as the demo comments promise; it sets Compression to cmFlateDecode rather than leaning on the BeginDoc argument, which does not govern compression

Version 2.770.102

Fixed

  • Images drawn with AlphaBlend in an enhanced metafile now retain their recorded opacity when the metafile is converted via THPDFEmfPatcher.RenderEmfDirect; they used to be blended at zero opacity and vanish
  • The recorded alpha format is honoured too, so images lacking 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 falls short of the declared bitmap, are now skipped rather than read past the record's end
  • Bitmaps exceeding 32768 pixels on a side, or 64 megapixels overall, 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 carrying the page's content, page box and resources; the page dictionary itself used to be registered as an XObject, which viewers cannot paint, so the stitched page never showed
  • Stitching several pages onto the same target keeps every stitched page: each receives its own XObject name instead of all of them sharing one name that overwrote the previous page

Version 2.770.100

Fixed

  • Form XObjects are now clipped to their /BBox when rendered, as ISO 32000-1 requires; content a form draws outside its bounding box no longer appears on the page
  • Form XObjects nested more than four levels deep are now drawn; they used to be dropped as though they recursed. Nesting is permitted to 32 levels
  • A form XObject that draws itself, whether directly or through other forms, is detected and the repeated call skipped, with a recursion entry noted 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 show up and the content stream ends every path with a painting operator as ISO 32000-1 8.5.2 requires; the reported text-PDF sizes shift slightly as a result

Version 2.770.98

Fixed

  • Literal strings containing balanced parentheses without backslashes, /Title (Report (draft) v2) for instance, are now read in full when a document loads; the string used to terminate at the first closing parenthesis, with the remainder of the dictionary misread as a result
  • Escaped parentheses continue to work 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 carries the letters "stream" at the end of a line (an Info dictionary with /Title (Livestream), say); the object used to be read as a stream and its entries lost with it
  • The stream keyword is now recognised only as a token in its own right, following the dictionary's closing >> at the end of a line, in line with how 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 serve as the image stamp; previously only JPEG worked, with other files failing on an invalid-bitmap error
  • Stamp demo: the rubber-stamp annotation lands in the top-right area of each page as intended, beneath a top-corner image stamp, rather than in the bottom-right corner where it collided with a bottom-right image stamp
  • Stamp demo: the default input, output and image paths resolve against the demo folder, and choosing a file in a dialog no longer moves 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 under a time stamp authority policy) now encode the requested policy as the plain object identifier RFC 3161 specifies
  • The policy used to be wrapped in a context tag RFC 3161 reserves for request extensions, so a strict time stamp authority would reject the request or disregard the policy
  • Requests lacking a policy OID are unchanged

Version 2.770.94

Fixed

  • ViewerPref demo: leaving Initial Zoom unchecked now genuinely means "None (Default)"; the generated PDF no longer opens at fit-height, that being the component default the demo failed to 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 contains characters outside the system ANSI code page; the attached file is passed by its plain file name rather than an absolute path

Version 2.770.92

Fixed

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

Version 2.770.91

Fixed

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

Version 2.770.90

Fixed

  • EmfDraw demo: a failed conversion (a missing input metafile, for instance) now finishes with exit code 1 rather than 0, so scripts and build steps running the demo can detect the failure

Version 2.770.89

Fixed

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

Version 2.770.88

Fixed

  • Content streams nesting more than 32 q operators no longer lose the enclosing graphics state: deeper saves were ignored whilst their matching Q still restored, so text and graphics following the nested block picked up the state from before an outer q
  • This affects text extraction through the content device interface and SVG export of such pages
  • Saved states now scale with the nesting depth; even very deep nesting is paired correctly

Version 2.770.87

Fixed

  • ImageDemo: the "Image zoom" bookmark now jumps to the IMAGE ZOOM heading rather than a spot close to the foot 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 together with the intermediate key derivation buffers the moment they cease to be needed, including on the retry with the alternative byte order and on each early failure path
  • Signing with a certificate taken 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 in front of the operand stack; the malformed operator is disregarded
  • A Type 1 charstring that finishes with the escape byte of a two-byte operator no longer reads beyond the end of the charstring

Version 2.770.84

Fixed

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

Version 2.770.83

Fixed

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

Version 2.770.82

Fixed

  • Real numbers in CFF font dictionaries (FontMatrix, FontBBox, blue values and the like) are read correctly when a byte holds a sign, decimal point or exponent beside a digit; the digit sharing that byte used to be discarded, so -2.25 turned into -0.5
  • These values are parsed with a full stop as the decimal separator whatever the Windows regional settings may be; 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 carrying 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 instance through SetVariableFontAxis) no longer distorts glyphs whose gvar data has a sparse tuple following another tuple; the sparse tuple began from the previous tuple's deltas and shifted those points twice
  • Points which a sparse tuple omits are now interpolated solely 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 multiplied by height would need a raster of more than 2 GB, raising an exception rather than allocating a buffer whose size had wrapped round and letting the decoder write past its end (heap overflow)
  • A TIFF page whose width or height is zero is refused in the same manner
  • Tall TIFF pages (1200 rows or more) now signal an allocation failure instead of decoding into a nil buffer

Version 2.770.78

Fixed

  • Type 3 font glyphs now honour horizontal scaling (Tz): a run drawn at 200% horizontal scale comes out twice as wide rather than at its natural width
  • Type 3 font glyphs now respect text rise (Ts), so superscripts and subscripts set in Type 3 fonts are raised or lowered instead of remaining on the baseline
  • Glyph advances were already scaled; the glyph shapes now tally 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 began with a zero byte the request carried a superfluous leading zero, which strict timestamp servers reject as malformed
  • The returned nonce keeps its requested length, so callers comparing it against 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 bearing a valid authentication tag is now accepted, whilst a tampered tag is still rejected

Version 2.770.76

Fixed

  • Hyperlink demo: link captions and URLs holding characters outside the system ANSI code page (for instance Greek, Cyrillic or accented text) are no longer turned into question marks; captions are drawn as Unicode text with a URI link laid across them
  • Hyperlink demo: non-ASCII characters in a URL are percent-encoded as UTF-8 before being 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) whilst rendering; the components are clipped to their valid range before the gamma is applied
  • Such colours now render as the closest 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 instance DADirectEncryptFileAES256 and DADirectDecryptFileAES256) running on several threads simultaneously no longer corrupt one another's output; the byte-range copy they share relied on a single 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 topmost bit set; such responses were stored under a serial lacking 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 within the batch; previously they were stored under the responder name, or not stored at all
  • Signatures relying 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 contains nodes that list one another or themselves as /Kids
  • Each name tree node is visited once, so names reachable via a shared node are still found

Version 2.770.71

Fixed

  • PageSizes demo: the Chinese 8K and 16K format pages now print their complete 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 entire painted area when the shading axis lies a long way from it, for example a gradient defined beyond the page edge with /Extend [true true]; such areas used to be left unpainted
  • This applies to the sh operator and to shading patterns serving 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 beneath the top edge, instead of scrolling to the foot 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 yet claims thousands of segments or groups; the table length is now verified before the segments and groups are read
  • Building the glyph-to-Unicode map for an embedded TrueType font now walks each cmap subtable once by segment or group rather than looking up all 65,535 BMP code points individually, which also speeds up extraction with large CJK fonts
  • Glyph lookups through a truncated format 4 or format 12 cmap subtable halt at the end of the font data instead of scanning segments that do not exist

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 used to be ignored and replaced by [0 1], so inputs were clipped to the wrong interval
  • An exponential function lacking /C1 now takes the default [1.0]; Separation colours and shadings defined that way used to render black
  • Exponential functions now evaluate C0 + x^N (C1 - C0) upon 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 where it is present; spot colours with a Lab alternate space (L* up to 100) used to be clipped to 0..1 and rendered almost black
  • An exponential function whose input falls 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 formerly failed 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 key decryption, so files that already opened continue to open in the same way

Version 2.770.65

Fixed

  • The page header of the C++Builder DBTable demo now reads "Page 1" rather than "Page1"
  • An error whilst the C++Builder DBTable demo writes its table now closes the half-built document, so the next click begins 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 land there even when launched from another directory
  • The C++Builder Graphic demos no longer send a close message to every window whose title mentions the name of their output PDF, which could shut unrelated windows
  • The C++Builder ImageMask demo now behaves like the Delphi version: it checks that Mask.bmp and Image.jpg exist, compresses its output, opens no viewer and reports errors instead of ending with an unhandled exception
  • The C++Builder EmfDraw demo reports an error, such as a missing Sample.emf, and returns a non-zero exit code instead of terminating with an unhandled exception
  • The C++Builder AddDelPages demo resolves relative input and output file names against the executable folder, in the manner of the Delphi version

Version 2.770.63

Fixed

  • The C++Builder FileAttach demo writes FileAttach.pdf alongside 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 remaining 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 located
  • /Prev and /XRefStm offsets beyond 2 GiB in the trailer or cross-reference stream are now followed instead of being read as 0, so older revisions and hybrid cross-reference sections of large files are no longer skipped over
  • The same holds when loading a large file and when inspecting its revisions
  • New HPDFDirectReadUIntBE64 and HPDFFindNameInt64 helpers give back the full 64-bit value

Version 2.770.61

Fixed

  • A cross-reference stream whose /W field widths are negative or exceed 8 bytes is now rejected rather than decoded; loading falls back to scanning the file for its objects
  • The Direct File API methods (for instance DADirectEncryptFileAES256) no longer read memory outside the decoded table on such a file, and can no longer crash; 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 had been swapped
  • Lines written with " and a non-zero word or character spacing no longer report displaced glyph positions, which could merge or split words in extracted page text and misplace search hits
  • Page rendering was unaffected

Version 2.770.59

Fixed

  • Table demo: the rows covered by the "Group A" rowspan now display their item and note in the Item and Notes columns; formerly the note text was displaced one column and lost
  • Table demo: the generated PDF is no longer opened in an external reader automatically, in line with the other console demos, and output paths outside the system ANSI code page are preserved intact

Version 2.770.58

Fixed

  • Decompressing Flate data into a stream no longer leaks the decoder state (roughly 40 KB each time) when the source or target stream raises an exception part way through, for instance when a write fails or a stream reaches its size limit
  • Compressing a string no longer leaks its temporary buffer should compression raise an exception
  • Successful compression and decompression behave precisely 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 be built
  • The constraints of such a certificate are now applied to the remainder of the chain just 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 whilst rendering; such a function is treated as unusable and the colour falls back as it would for any other invalid function
  • Nesting is capped at 64 levels, well beyond anything real calculator programs use; ordinary Type 4 tint transforms and shadings render as before
  • Evaluating calculator functions requires 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 appear garbled in the XML pane
  • E-Invoice demo: on Delphi XE2 and later the combined e-invoice verdict now governs the business-rule step, so a rule file or engine failure fails validation instead of slipping through 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 by itself

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 differing from the signed content, as RFC 5652 requires; such signatures used to verify as valid, which allowed signed attributes prepared for one content type to be passed off as signing another
  • Signatures carrying the content-type attribute twice are rejected as before
  • Countersignatures, which by definition bear no content-type attribute, and RFC 3161 timestamp tokens continue to verify 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 afresh before the new one is started
  • An error whilst the C++Builder Annotations demo builds its PDF now closes the half-built document, so the next click begins from a clean state

Version 2.770.52

Fixed

  • Several documents or THotPDF instances within 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 every instance sharing a folder, so the folder no longer outgrows its budget when several viewers or render threads use it simultaneously
  • The same folder is recognised irrespective 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 though it held 3-byte pixels, which jumbled its colour channels or read past the end of its rows
  • Such sources are first converted to 24-bit, so the resampled image keeps the colours of the source; the result remains a 24-bit bitmap as before
  • 24-bit sources and the halftone kernel carry on unchanged

Version 2.770.50

Fixed

  • PreflightCLI demo: -d on a single PDF now writes the dashboard index even when the file fails its preflight
  • PreflightCLI demo: files that raise an error during preflight are recorded as failed in the dashboard index, and the exit code reflects every failed file
  • PreflightCLI demo: with -r, reports for identically named PDFs in different subdirectories are written to matching subfolders instead of overwriting one another, 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, CSV spec column included
  • PreflightReport demo: CSV reports generated with a profile now fill in the spec column just as reports without one do

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 inside a BenchmarkInputs folder beside the executable; it previously wrote only 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 out the HugeFileBenchmark command for the generated folder

Version 2.770.48

Fixed

  • The C++Builder Outlines demo now writes Outlines.pdf alongside the executable, the file the readme names, instead of Output.pdf in the working directory, and reports where it was saved rather than 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 clipped at the page edge and the "Bottom" bookmarks of the last page pointed beneath them
  • An error whilst the C++Builder Outlines demo writes the PDF no longer leaves the demo unable to create a further document

Version 2.770.47

Fixed

  • The persistent disk render cache now works under folders whose names contain characters beyond the system ANSI code page (for instance a user profile folder with non-Latin characters); previously every page write failed there and the cache never produced a single hit
  • THPDFDiskPageCache accepts its root folder as a Unicode string and holds 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 positioned away from the origin; a form now counts as covering its /BBox as positioned by its /Matrix and the current transformation
  • Text placed with TD, T*, ' or " now lands on the correct line when deciding which tiles contain it, so later lines of a paragraph are no longer culled from the tiles in which they appear
  • Td offsets are scaled by the text matrix and measured from the beginning of the line, matching how the text is actually drawn
  • Character spacing, word spacing, horizontal scaling and text rise are all taken into account when estimating where a text run ends, and glyphs are no longer presumed narrower than one em

Version 2.770.45

Fixed

  • The C++Builder MemStream demo writes MemStream.pdf beside 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 confirms it has one page before saving it
  • An error whilst the C++Builder MemStream demo writes the PDF no longer leaves the demo unable to create a further document

Version 2.770.44

Fixed

  • The C++Builder HelloWorld demo no longer sends a close message to every window whose title mentions HelloWorld.pdf when it starts, which could shut unrelated windows such as an editor or a file manager
  • The C++Builder HelloWorld demo writes HelloWorld.pdf beside the executable and opens it only when --open is supplied; 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 beneath those nodes; such documents previously reported only the pages listed directly under the tree's root
  • The pages retain their page tree order, so page indexes, page boxes and content match what other viewers display
  • A page whose /Type is held 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 amongst 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 short
  • A page tree node whose /Kids array or /Type name is held as an indirect object now loads its pages instead of failing or reading invalid memory

Version 2.770.41

Fixed

  • THPDFPage.LastAnnotation now gives back the link created by AddGoToLink, AddURILink, AddNamedDestinationLink, AddGoToRLink, AddLaunchLink, AddStructureDestinationLink and AddGoToRStructureDestinationLink
  • Calling SetAnnotationFlags, SetAnnotationBorderStyle or AddPopupAnnotationFor with LastAnnotation immediately after adding a link no longer silently does nothing or alters 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 😀 yield the intended character instead of two broken ones
  • Input and output file names in merge, split, optimise, encrypt and validate jobs retain 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 proper names
  • A malformed \u escape with fewer than four hex digits is discarded without swallowing the characters that follow or the closing quote
  • A UTF-8 byte order mark at the beginning of the job text is disregarded

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 greater; the combined first value used to be cut down to a single byte, producing a different, incorrect identifier
  • An object identifier arc too large to represent is now refused with an error instead of silently wrapping round to another value

Version 2.770.38

Fixed

  • HugeFileBenchmark demo: with --recursive --keep-output, PDFs sharing a file name across different subdirectories no longer overwrite one another'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; a single 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 rather than being expanded all the way down to the nesting limit

Version 2.770.36

Fixed

  • A stitching (Type 3) function that refers back to itself, whether directly or through other functions, no longer recurses until the stack overflows; it is treated as an unusable function
  • This affects Separation and DeviceN tint transforms, shading functions and transfer functions in malformed or hostile PDFs rendered with RenderLoadedPageToBitmap and the remaining render paths
  • Function nesting is capped at 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 out 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 final page to page 2 and extracting pages 2 and 5

Version 2.770.34

Fixed

  • The C++Builder Hyperlink demo continues onto a new page when the link list will not fit on one page; links beyond the foot of the first page were written outside the page
  • Add, Remove and Make PDF in the C++Builder Hyperlink demo are disabled whilst the PDF is written, so the link list can no longer change, nor the document 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-centre

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 from an earlier click remained in force, so for instance Create PDF after Test Direction still wrote right-to-left text and preferences no longer selected
  • The C++Builder PDF_INFO demo now writes PDFInfo.pdf beside 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 held up 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 occupied for hours
  • Each issuer signature in a candidate chain is now verified once per validation with its result reused, rather than being verified afresh for every path passing through it
  • The path search is capped at a fixed quantity of work; once the cap is reached the validation reports that no valid path reaches a trust anchor, and ordinary chains remain far below it

Version 2.770.29

Fixed

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

Version 2.770.28

Fixed

  • In builds made with Delphi versions earlier than 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 program
  • 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 though they were deflate data
  • Truncated or malformed compressed text no longer runs the risk of an endless decoding loop
  • Builds with Delphi XE2 and later employ 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 places a highlight annotation over every match with AddLoadedHighlightAnnotation
  • The C++Builder SearchAndSelect demo takes an input PDF, a search term, an output file and the --case-sensitive and --whole-word options, and inspects the saved copy for the new annotations

Fixed

  • The highlights of the C++Builder SearchAndSelect demo now cover the matched words; they used to sit 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 full stop; the comma decimals in demo.xml were parsed with the system locale and raised an error whilst 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 puts the executable in the demo folder alongside those files
  • The footer page icons of the DigiPrint demo are drawn inside the footer row rather than 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 nudges the left margin further to the right with every click
  • An error whilst the DigiPrint demo builds the PDF, such as a missing image file, no longer leaves the demo unable to create a further 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 displaced or flipped
  • Showcase demo: Save Copy no longer switches the working file, so Regenerate and Open External keep to the main gallery instead of the last copy written
  • Showcase demo: should generating the gallery fail, the viewer is rebound and keeps displaying the last gallery that loaded instead of staying blank
  • Showcase demo: output paths containing 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 places red, green, blue and alpha into the correct bytes of the 32-bit bitmap; previously the colour channels were displaced by one byte and the alpha channel overwrote one of them
  • This also mends a round trip of a 32-bit TJpeg2000Bitmap through SaveToStream and LoadFromStream, which came back with jumbled colours
  • Three-component colour images, greyscale images and four-component CMYK images load as before

Version 2.770.23

Security

  • A text string whose value begins with << and finishes with >> (for instance a title, author, form field value or annotation text such as "<<URGENT>>") is now always saved as a string; it used to be written out verbatim, which broke the file syntax and let crafted text inject a dictionary such as an action into the saved document
  • This 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 beside the executable rather than into the current working directory, and accepts an optional output file name as its sole argument
  • The C++Builder Barcodes demo no longer opens a PDF viewer once it has run, 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 used to show a memory address instead

Version 2.770.21

Fixed

  • In the stable C ABI, calling hpdf_document_destroy whilst 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 the moment hpdf_document_destroy returns; the document itself is released once the last running call upon it finishes
  • Calls that look up a handle concurrently with its destruction receive 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 genuinely 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 the very most 1024 nested lookups

Fixed

  • A chaining contextual substitution (GSUB lookup type 6) reached from another contextual lookup is now applied; it used to be read with the plain contextual layout and never matched, so certain 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 demands, 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 device context of the caller
  • GetLoadedPageMetafile no longer fails on pages holding images, and the images are recorded in the returned metafile
  • Image clipping against the visible surface now uses the size handed 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 begin left of or above the region yet still overlap it; such cells were treated as lying far outside, their grey 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 towards minus infinity as the JBIG2 specification requires, so partly visible cells land on the correct pixel
  • Halftone regions whose grid lies wholly 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 round the key hash) are accepted once more; certificate path validation used to discard them, so revocation stayed unknown for every responder naming 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 carries on 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, rather than by the responder DN; responses from delegated responders and responses identified by key now yield descriptors that a lookup by certificate issuer can find
  • Added an HPDFDescribeValidationEvidence overload taking 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 start-up; the status bar now exists before the viewer is bound to the document and begins reporting page changes
  • Viewer demo: pressing Enter in the search box now activates the first match instead of jumping straight to the second one
  • Viewer demo: bookmarks without a resolvable destination page are listed without a spurious "(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 genuinely opens the encrypted sample with the user password "user"; the password argument was mistaken for 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 once the path is painted, as ISO 32000-1 requires, instead of beforehand
  • Stroking a path that also sets the clip (re W S) now paints the full line width; the outer half of the stroke used to be 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 in the fill
  • B* and b* now always fill with the even-odd rule, regardless of the fill rule left over from an earlier operation

Version 2.770.13

Fixed

  • JBIG2 halftone regions whose grey-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 planes after it were decoded from the wrong position
  • The end-of-block marker after each MMR plane is recognised whether it follows the final row directly or comes after byte padding, and every plane now starts on the byte boundary that follows
  • Arithmetic-coded halftone regions remain unaffected
  • This 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 earlier \x22 / \x5C forms are not valid JSON and led standard parsers to reject results containing a quote or a Windows path
  • Control characters are written as \uXXXX escapes and the output is invariably well-formed UTF-8: bytes that are not valid UTF-8 are replaced with U+FFFD rather than 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 turn up in the ANSI code page

Version 2.770.11

Fixed

  • RedactLoadedRect, StampLoadedPageText, StampLoadedPageImage, StampLoadedPageShape, StitchLoadedPage and FlattenLoadedAnnotations no longer cast aside 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 divided 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 genuinely 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 rather than 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 slipped past the bounds checks
  • Embedded TrueType fonts receive 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 one another 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 anything 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 over, so the instance count and every field after it were read from the wrong offset and the image was rejected
  • Text regions with arithmetic coding, or with the 10-pixel refinement template, remain unaffected and decode exactly as before
  • This 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 allocated by the host process, instead of a capacity field the worker itself can overwrite
  • A compromised or faulty worker can no longer make the host copy beyond 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 copying of pixels

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; previously the first two object identifier arcs were written out 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 upon 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 within 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 thereafter
  • This affects RenderLoadedPageToBitmap, RenderLoadedPageToDC, page metafiles and the image export paths, with or without the shared render cache
  • Repeated Type 3 glyphs carry on 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 whilst the document is being parsed, for instance 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 once more afterwards
  • Loading a new document into an existing handle releases the previous input source only after 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 true position instead of a position mirrored across the page
  • The reported barcode orientation on those pages now matches the direction in which the symbol actually reads in page space
  • The invisible text placed by ApplyLoadedOCRTextLayer on quarter-turned pages now sits over the recognised words, so selection and search highlight the right spot
  • Face findings from redaction detection on quarter-turned pages are likewise mapped back to the right page area
  • Unrotated and upside-down pages remain 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 ran into an endlessly recursive exponent helper
  • SGILog (LogLuv) TIFF images in 32-bit builds go through the same corrected maths helpers
  • The 32-bit rounding-down helper used by the TIFF codecs now rounds negative values towards 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 straight after decoding, instead of being kept at full size and stretched whilst drawing
  • The shrunk image fits the decoded-image cache: a transparency group drawn twice, on black and on white, to recover its alpha now decodes such an image once instead of once per pass, and the same goes for rendering the same page afresh
  • An image with a soft mask is combined with its mask pixel by pixel at the drawn size, the mask being shrunk likewise; this avoids building and premultiplying a full-size copy of a large image and its mask, and the mask edge is no longer sampled nearest-neighbour style
  • On a sample page with a 4229 x 4629 masked image drawn at roughly a quarter of its size inside such a group, rendering took about 1.8 seconds instead of 4.5
  • Stencil image masks retain 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 once more

Version 2.770.0

Added

  • New RenderColorimetricLuminosityMasks property selects 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 apart

Changed

  • By default a luminosity mask now weights the resolved colour of its group like DeviceRGB whatever the blending space may be, 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 far lighter than in other viewers
  • The /BC backdrop colour of a mask follows the same setting as the paint within the mask group
  • Masks whose group uses a device colour space render exactly 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 contained 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, since 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 concealed what the mask ought to have shown
  • To find the alpha of a group that is not isolated, the group is drawn twice, on black and on white, whenever its own graphics states blend normally; such pages render a little more slowly

Version 2.769.2

Changed

  • An image with a soft mask is decoded at the size at which 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 in their entirety, 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 roughly 1000 pixels wide, rendering at 72 dpi took 1.6 rather than 3.7 seconds
  • DecodeLoadedImageRegionAtResolution returns a whole image of a format lacking a region decoder as decoded, without copying it a second time

Version 2.769.1

Changed

  • Soft masks are built faster: building a mask no longer holds on to a second copy of the whole page for comparison, 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 pixels rendered are unchanged

Version 2.769.0

Changed

  • Setting a page's Width or Height no longer conceals 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 explaining why
  • After such a failure the page no longer remains in a state where later size changes merely 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 amongst several pages, is copied for the page being resized, so the other pages keep their size
  • Resizing a loaded page whose MediaBox has fewer than four numbers now writes out a complete MediaBox with the new size; the new size used to be ignored

Version 2.768.20

Fixed

  • Text extraction no longer enters a Form XObject that paints itself, whether 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, no longer forms part of the page text

Version 2.768.19

Changed

  • Large documents load faster once more: 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 localised 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 certain 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 single page

Version 2.768.17

Changed

  • Large documents load much faster: operation telemetry now samples memory at the very 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 a great deal of memory benefit most
  • UpdateOperationTelemetrySample gains an optional Force parameter that takes a sample irrespective 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 for ever 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, just as for other unreadable files
  • An encrypted file whose pages lie in encrypted object streams now raises an exception saying the password is required 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 over themselves a second time, as in overprinted logos and in bold faked by drawing the text twice with a small offset; such text was extracted twice (for instance "Bold wordsBold words") and searches for it could fail
  • The text, column, layout and semantic text extraction each 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, amongst 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 instance "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 instance 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 positions the glyphs of CID-keyed (Type 0) fonts whose /W width array is not ordered by CID; most glyphs received 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 é used to be left blank, so words like "München" showed a gap
  • The same letters now come out 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 Å used to lose their accent, and curly double quotes showed as a single quote followed by a gap
  • The same glyphs now come out 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 used to be 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 just 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 far heavier than in other viewers
  • Small glyphs of embedded and installed fonts are stroked with antialiasing in text rendering modes 1 and 2, using the stroke colour, after the fill

Version 2.768.7

Fixed

  • Calling ProcessObjectStreamsForDecompression on a loaded document no longer throws away the object streams the load had read: the compressed objects remain available to ExtractRawObjectFromStream and ExtractObjectFromStream afterwards, whereas previously none of them could be read
  • When the method scans the file itself — as happens for a document with a classic cross-reference table — it now spots an object stream sitting directly after another stream and takes its object count and offsets from its own dictionary
  • ExtractRawObjectFromStream decodes an object stream once more when the object stream cache has let it go, rather than coming back empty

Version 2.768.6

Fixed

  • The Stamp demo now compiles cleanly for Win64

Version 2.768.5

Fixed

  • On Windows editions for Chinese, Japanese and Korean, documents whose cross-reference streams carry binary strings in their dictionaries — attached-file checksums, for instance — now open in a fraction of a second; loading a 4 MB portfolio with nine attached PDF files used to take two minutes
  • Keywords are now sought in the file's raw bytes instead of in text run through the Windows code page, so binary bytes sitting beside a keyword can no longer mask it or nudge it out of place

Version 2.768.4

Fixed

  • A Form XObject's content now draws with whatever opacity, soft mask and blend mode the form gives itself; previously everything within a form was painted fully opaque, which turned translucent watermarks and stamps into solid blocks
  • A form that carries an opacity of its own is still, as before, composited once as a single unit

Version 2.768.3

Fixed

  • Text drawn through Form XObjects — page headers and footers, watermarks, stamps and the like — now appears in the page text as well; previously only text sitting in the page's own content was returned
  • Form text shows up at the spot where the form is painted, positioned via the form's matrix and decoded with the form's own fonts, and forms nested within forms are followed as well
  • Plain, layout, column and semantic page text all pick this up; glyph-level extraction still reports only the glyphs of the page's own content, since their positions refer into that content

Version 2.768.2

Fixed

  • AES-256 EncryptFile and DecryptFile no longer corrupt embedded font files whose dictionary names /Length1 ahead of /Length — the order Ghostscript and several other tools use; those fonts were being encrypted as a single byte, leaving the output unreadable
  • When a stream's length lives in a compressed object stream, AES-256 encryption and decryption now preserve every byte of it; previously the stream's final byte could go missing

Version 2.768.1

Fixed

  • Documents that keep their stream lengths inside compressed object streams — Ghostscript's habit — now load in full; previously each page content stream in such a file was discarded, so pages came out blank and yielded no text
  • A stream whose length points at a missing object, or which has no length whatsoever, is now read as far as its end marker rather than being thrown away

Version 2.768.0

Added

  • BuildLoadedPageSVG and SaveLoadedPageAsSVG accept an optional EmbedFonts parameter; it defaults to off, and calls already in place export precisely as they did
  • With EmbedFonts set to True, text set in fonts whose TrueType or CFF program travels inside the PDF is drawn from those glyph outlines, so the SVG looks right on machines without the fonts installed
  • Every glyph outline is written once and shared out wherever the character turns up, keeping file size in check on text-heavy pages
  • The text remains in the SVG as invisible text laid over the outlines, so selection, search and screen readers keep working
  • Filled, stroked and fill-and-stroke text, line widths, rotated or scaled runs and text serving as a clipping path all come out just as in the rendered page
  • Non-embedded fonts, Type 1 font programs and vertical CJK text remain ordinary SVG text

Version 2.767.4

Fixed

  • Outlined and fill-and-outline text (render modes 1 and 2) in non-embedded fonts now takes the line width into account when rendered; previously each outline emerged one pixel wide regardless of the width set
  • These outlines are now traced from the installed font's precise glyph shapes at their precise positions, matching what filled text already did
  • Characters missing from the installed font — which Windows supplies from a fallback — likewise hold their line width when outlined

Version 2.767.3

Fixed

  • Text in non-embedded fonts is now drawn with the characters its encoding actually names. Character codes previously reached the installed font untouched, and since the font interprets them in its own character set, every /Differences entry and every code where StandardEncoding or MacRomanEncoding diverges from the Windows character set produced the wrong glyph — straight quotation marks in place of curly ones in Type 1 fonts lacking an encoding, for example
  • On Chinese, Japanese and Korean Windows editions, accented letters, curly quotes, the copyright sign and other characters beyond code 127 in non-embedded fonts had been drawn as question marks since version 2.766.83; they are once more read in the installed font's character set
  • Symbol fonts retain their own code mapping

Version 2.767.2

Fixed

  • Oversized glyphs of embedded fonts are now antialiased too. Glyphs beyond 64 pixels — headings and titles at print resolutions, say — used to be filled without smoothing and showed ragged edges; smoothing now extends to 256 pixels, while installed fonts' larger text continues through the system's antialiased output

Version 2.767.1

Fixed

  • Layout, column and semantic text extraction now measure the page in page units. Positions were previously compared against the font size handed to Tf and against text-space advances — a small fraction of the true distances in the many documents that size text via the text matrix — so layout text scattered each letter across several columns, column text shed every word space and semantic text gave nearly every word a line of its own
  • All three now confine themselves to text within the visible box, and — like the plain page text — split words that a document separates by moving the text position
  • Layout text holds a word's letters together; wide characters such as m or W used to smuggle a space into the middle of a word
  • On a single-column page, semantic text no longer drops a blank line after each line: a run of full-width lines counts as one zone, and lines part ways at a zone boundary only when the gap between them exceeds a line spacing
  • The help pages for these methods now spell out what they return, and the column method's full syntax is shown

Version 2.767.0

Added

  • LoadFromFile and LoadFromStream gain overloads carrying an AutoDecrypt parameter. With AutoDecrypt True, a document encrypted under an empty user password — the case for documents that merely restrict printing, copying or editing — opens in memory already decrypted, just as viewers open it, so its text can be extracted and its pages rendered and exported without any password
  • Password-protected and unencrypted documents load precisely as the plain overloads load them, and a handful of small file ranges are inspected before loading to decide whether the empty password will open the document
  • As with the password overloads, a document opened this way sheds its encryption in memory, and saving it writes an unencrypted copy

Version 2.766.83

Changed

  • Small text in non-embedded fonts — the standard 14, installed Office fonts, Chinese fonts — is now rendered from the unhinted glyph outlines at its exact position, with the same antialiasing embedded fonts enjoy. The previous system text output snapped every glyph to a whole pixel and reshaped it onto the pixel grid, leaving small text unevenly spaced and blotchy; rendered pages now track the shapes and spacing of other viewers far more closely
  • Glyphs the installed font cannot supply, along with oversized glyphs, still go through the system text output, which can borrow missing characters from linked fonts

Fixed

  • Small glyphs of embedded fonts render faster: the bitmaps beneath their antialiasing are reused rather than rebuilt for each glyph

Version 2.766.82

Fixed

  • Text set in installed fonts within rendered pages now takes greyscale antialiasing. It used to follow the system's ClearType setting, so black text in rendered bitmaps picked up red and blue fringes that varied from machine to machine and persisted into saved, printed or scaled images

Version 2.766.81

Fixed

  • Small text in embedded CFF and OpenType CFF fonts now receives antialiasing, as TrueType text long has. Those glyphs were formerly filled without smoothing, so at small sizes and everyday screen resolutions stems narrower than a pixel vanished and body text splintered into fragments; forms and documents set in faces such as Helvetica Neue now read cleanly at 72 DPI

Version 2.766.80

Changed

  • Page text extraction now confines itself to the text a page actually shows. Glyphs beyond the visible area — the crop box inside the media box — are omitted, so printer's marks, slug lines and anything else outside the trimmed page stay out of the extracted text. Glyph-level extraction continues to report every glyph together with its position

Version 2.766.79

Fixed

  • In text sized through the text matrix, page text extraction no longer starts a new line at a raised superscript or a marginally shifted baseline. Any vertical move of half the font size given to Tf — frequently 1 in such documents — used to trigger a line break, so a shift of half a point sufficed
  • Rotated text — labels climbing the side of a page, diagonal watermarks — no longer strands every character on its own line. Lines are now told apart by movement across the text's direction of travel, judged against half the text height on the page

Version 2.766.78

Fixed

  • When the SVG export needs a generic font family fallback for a font that is not installed, it now puts a common face of that kind first: Times New Roman ahead of serif, Arial ahead of sans-serif, Courier New ahead of monospace. A browser resolves a bare generic family from its own language settings, and Chinese or Japanese browsers picked CJK fonts whose wide Latin letters collided at the positions taken from the PDF

Version 2.766.77

Fixed

  • For fonts known under their legacy GB2312 names — KaiTi_GB2312 or its Chinese spelling — the SVG export now names the installed Chinese font families. Windows applications reach these fonts via the system's font substitutes; browsers do not, so such text used to land in the browser's default font
  • A font named in a single language also receives the installed family's other name — SimHei alongside its Chinese name, say — plus a generic family matching its style

Version 2.766.76

Added

  • THPDFGlyphRecord gains GlyphEndX and GlyphEndY: the page-space endpoint of the glyph's own width along the baseline, excluding character and word spacing

Fixed

  • Page text extraction now splits words that a document separates by moving the text position rather than emitting a space character. Plenty of producers write [(PDF)-240(Reference)] or park each word with its own positioning operator, and such words previously ran together into PDFReference
  • A space is inserted whenever the gap following a glyph's own width tops 0.15 of the text height, measured in page units so text sized through the text matrix is judged exactly like text sized through the font size
  • Kerning, mildly loosened spacing, tightened character spacing handed back by position adjustments, overprinted text and genuine space characters are all left untouched, and no space ever goes between two Chinese, Japanese or Korean characters, however far justification spreads them

Version 2.766.75

Fixed

  • Text extraction, the SVG export and rendering now understand the Symbol font's glyph names — copyrightsans, registerserif, trademarksans, plus the pieces of large brackets and braces (parenlefttp, braceex, integralex, ...). Subsetted Symbol fonts routinely re-encode these names, and the characters previously surfaced as raw control codes
  • Every ITC Zapf Dingbats glyph name (a1 to a206) is understood too, so ticks, crosses, arrows and circled numbers a font picks via these names — as form fields and bulleted lists often do — are extracted as their Unicode characters
  • When mapping a character to a glyph name, the common name — arrowright or spade, for instance — is still preferred over a ZapfDingbats name

Version 2.766.74

Fixed

  • HPDFExtractGlyphsViaDevice no longer trips over an invalid pointer operation. The text-extraction device it builds is reference counted, yet the function also freed it explicitly, so each call ended up releasing the device twice

Version 2.766.73

Fixed

  • Text extraction now restores the text state at Q as the specification demands (ISO 32000-1 9.3.1). Formerly only the transformation came back, so a font, character spacing or leading set inside q ... Q lingered into the text that followed
  • When the font chosen inside q ... Q worked in two-byte codes while the font outside it used one-byte codes, everything after Q was decoded as two-byte codes and lost. Word and similar producers write pages this way, and the usual casualties were table-of-contents leaders and the Latin words between Chinese runs
  • Both the page text API and the device-based text extraction interface receive the fix

Version 2.766.72

Fixed

  • Text following RestoreState now always has a font selected. The page omits a font selection that merely repeats the last one written, but failed to allow for RestoreState (the Q operator) handing the reader back the font that applied before SaveState. Text shown after RestoreState in the font picked inside the pair emerged with no font or the wrong one, so viewers might discard it and text extraction could not read it
  • Character spacing, word spacing, horizontal scaling and leading track SaveState and RestoreState the same way, so a value re-issued after RestoreState is written out rather than skipped while the reader has already gone back to the earlier value
  • Selecting a Type 3 font no longer makes the next selection of the previous font get skipped
  • XPS documents converted to PDF were hit by this, as every glyph run is drawn inside its own saved graphics state

Version 2.766.71

Fixed

  • Text extraction and the SVG export read a simple font's codes (Type 1, TrueType or Type 3) as two bytes whenever its /ToUnicode CMap declared a two-byte codespace — something some producers write for every font. Simple-font codes are always single bytes (ISO 32000-1 9.6.6), so each character pair was swallowed as one unknown code and most of the text vanished, leaving only strings of a lone character

Version 2.766.70

Fixed

  • The SVG export displaced text by the operands of Td, TD, T*, ' and " in page units rather than in text space (ISO 32000-1 9.4.2). Where text takes its size from the text matrix — 1 Tf with a scaled Tm, as word processors typically write it — its lines piled on top of one another near the first baseline; it is now laid out as in the PDF
  • The content-device text extractor THPDFTextExtractDevice receives the same correction

Version 2.766.69

Fixed

  • The page renderer handed Windows font names containing #xx escapes with the escapes intact, so non-embedded fonts carrying such names — common among CJK faces like KaiTi_GB2312 written in Chinese characters — matched nothing installed and were drawn in a substitute face. Escapes are now decoded; UTF-8 names keep their characters while the remaining bytes are read in the system code page

Version 2.766.68

Fixed

  • The SVG export wrote font names with #xx escapes literally as the escapes themselves, so CJK font names held as UTF-8 bytes — the KaiTi_GB2312 name in Chinese characters, for one — arrived in font-family as #e6#a5#b7... and never matched an installed font. Escapes are now decoded; a name that proves valid UTF-8 is kept, and bytes in other encodings are dropped as before

Version 2.766.67

Fixed

  • The SVG export failed to restore the text state at Q: font, size, spacing, scaling, leading, rise and render mode set inside q ... Q bled into the text afterwards. Pages that embolden a heading via 2 Tr inside a saved state went on to draw all the following body text stroked and heavy. The text state now travels with the rest of the graphics state, saved and restored together (ISO 32000-1 9.3.1)

Version 2.766.66

Fixed

  • In the stroking render modes (1, 2, 5 and 6), the SVG export stroked text without any stroke width, letting SVG's default of one text-space unit take over; text that PDF producers embolden with a hairline stroke — 2 Tr 0.25 w, say — came out far heavier. The line width is now mapped from user space into the text element's space, a zero width yields a one-pixel line, and the line join survives

Version 2.766.65

Fixed

  • Documents whose trailer supplies /Encrypt as a direct dictionary rather than a reference — a shape some PDF writers emit — were treated as unencrypted on load: even with the correct password their pages rendered blank, text extraction and the SVG export gave back nothing, and SaveLoadedDocument produced a damaged file that lost /Encrypt yet kept the encrypted streams. Such documents now open, decrypt and save just like documents with an indirect encryption dictionary
  • The cross-reference loader chopped a trailer at the first >>, so entries following a nested dictionary in the trailer went missing; the trailer is now read up to its matching closing delimiter

Version 2.766.64

Fixed

  • Rendering, the SVG export, the viewer and printing all displayed a loaded page's entire /MediaBox. A page is meant to be displayed and printed through its /CropBox, clipped to the /MediaBox (ISO 32000-1 14.11.2), so pages carrying a crop box emerged oversized, offset and showing content intended to stay hidden
  • RenderLoadedPageToBitmap, the tile, band, metafile and device-context renderers, BuildLoadedPageSVG, the viewer's page geometry, highlights and region snapshots, and printing now work over the visible box; pages lacking a /CropBox are untouched

Added

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

Version 2.766.63

Fixed

  • Searches of the built-in glyph list stopped 13 entries short of the table's end, so the glyph names that sort last (y, z, zero, zeta, yen, ydieresis, zcaron amongst them) were never reached. Text extraction disregarded a font's /Differences entries naming 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 for an accent such as U+0060 handed back MacExpertEncoding's small-capital name (Gravesmall) rather than grave, so those accents went missing in embedded CFF fonts too

Version 2.766.62

Fixed

  • The page renderer took line width and dash lengths as device pixels rather than user-space units (ISO 32000-1 8.4.3.2 and 8.4.3.6); lines held one pixel width at every resolution and ignored any scaling cm. Slides exported through macOS Quartz, which strokes shapes with widths in EMUs under a 1/12700 scale, ended up smothered in the stroke colour
  • Stroke width and dashes now track the CTM's scale at the moment the path is stroked, stroking-render-mode text included

Version 2.766.61

Fixed

  • Type 1 function-based shadings (ISO 32000-1 8.7.4.5.2) were missing from the SVG export, whether painted with sh or used inside a shading pattern; the export now samples the shading's function across its /Domain into an embedded PNG image, placed via the shading's /Matrix, clipped to its /BBox, with the pattern's background colour beneath

Version 2.766.60

Fixed

  • The page renderer painted a mesh shading's /Background colour when shown with the sh operator, which PDF disregards (ISO 32000-1 8.7.4.5.1), so the entire clipping area around the mesh picked up that colour
  • Function-based, axial and radial shading patterns had their background colour skipped by the page renderer; the pattern's area is now filled with it ahead of the shading, so it shows wherever the shading fails to reach
  • The SVG export paints shading-pattern background colours in the same fashion and, in step with the renderer, ignores them for sh

Version 2.766.59

Fixed

  • The page renderer paid no attention to 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 swamped the whole clipping area instead of halting at its box. Mesh shadings already respected it

Version 2.766.58

Fixed

  • Text in Type 3 fonts went into the SVG as plain SVG text in an installed font, so pages drawing their text or symbols with glyph procedures displayed the wrong shapes; each glyph's procedure is now drawn, positioned through the font's /FontMatrix, the font size and the text matrix (ISO 32000-1 9.6.5)
  • Type 3 glyphs beginning with d1 are painted in the current fill colour, while glyphs that set their own colours hang on to them

Version 2.766.57

Fixed

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

Version 2.766.56

Fixed

  • When rendering a loaded page, every Type 0 font was read as though it used Identity-H: two bytes per code, each code its own CID. Fonts encoded with the predefined UCS2 and UTF16 CMaps of the Chinese, Japanese and Korean collections — UniGB-UCS2-H, for instance — or with an embedded CMap now map their codes to CIDs properly, so /W widths and embedded glyphs are found at the right CIDs; previously lowercase Latin letters in STSong-Light text, for one, sat a full em apart
  • Codes are read against the CMap's codespace ranges, so one-byte and four-byte (surrogate pair) codes come in whole, and names ending in -V turn on vertical writing

Version 2.766.55

Fixed

  • When rendering a loaded page, non-embedded fonts whose names carry a style part or a PostScript spelling — TimesNewRoman,Bold, TimesNewRomanPS-BoldMT, Arial,BoldItalic, SegoeUI-Semibold — were drawn in a substitute face; the family portion of the name is now matched against the installed fonts, spaces between its words included (Times New Roman, Segoe UI), with the style taken from the name and the font descriptor

Version 2.766.54

Fixed

  • Standard fonts lacking a /Widths array — which ISO 32000-1 9.6.2.2 permits for the standard 14 — were laid out at a fixed half-em advance whether rendering a loaded page, exporting it to SVG or extracting its text, packing the letters together; the Helvetica, Times and Courier families, including their Arial, TimesNewRoman and CourierNew aliases, now draw their widths from the installed Arial, Times New Roman and Courier New, whose metrics they share
  • A standard Type 1 font without /Encoding now decodes via its implied StandardEncoding, so code 39, for one, reads as a right single quotation mark

Version 2.766.53

Fixed

  • When rendering a loaded page, a font's /Widths array went unread whenever it sat in an indirect object — as many producers write it — and text was laid out at a fixed half-em advance; such text is now spaced by its widths
  • Font descriptors supplied as indirect objects are now consulted when rendering, so non-embedded fonts' ForceBold and Italic flags and italic angles take effect
  • The SmallCap flag no longer forces text bold; boldness now follows the ForceBold flag (ISO 32000-1 Table 123)

Version 2.766.52

Fixed

  • Rendering a loaded page now clips to text in render modes 4 to 7 (ISO 32000-1 9.3.6): at the end of the text object the glyphs join the clipping path and stay there until the graphics state is restored. Previously mode 7 text was ignored, letting a shading or image intended to show through the letters flood the whole area, while modes 4 to 6 painted the text with no clipping
  • Clip text draws on 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 in render modes 4 to 7 (ISO 32000-1 9.3.6): the glyphs turn into an SVG clipping path running from the end of the text object to the end of the graphics state, so a shading or image painted through text shows up only within the letters
  • Render mode 7 text no longer vanishes with nothing clipped, and modes 4 to 6 still fill or stroke the text just as modes 0 to 2 do

Version 2.766.50

Fixed

  • Axial, radial and function-based shadings whose /Function is an array of single-output functions, one per colour component (ISO 32000-1 8.7.4.5.1), went undrawn when rendering a loaded page; they now render, whether the array's functions are given directly or as indirect objects
  • SVG export turns such axial and radial shadings into gradients, fills of a path through a shading pattern included

Version 2.766.49

Fixed

  • SVG export used to set bold and italic text in the regular style; text now receives font-weight="bold" and font-style="italic" derived from the style part of the font name — Arial-BoldMT, Helvetica-Oblique, MinionPro-It — and from the font descriptor's weight, flags and italic angle
  • Fonts outside the standard 14 families were written with the style part left inside the family name (SegoeUI-Semibold), which matches nothing installed; the family now stands on its own, with spaced-out words as well (SegoeUI, Segoe UI), trailed by a generic family chosen from the descriptor flags or the name

Version 2.766.48

Fixed

  • SVG export painted form XObject content in black rather than the fill and stroke colours prevailing where the form is painted (ISO 32000-1 8.10.1); a Q inside the form now restores those colours as well
  • Content devices can begin nested content from the caller's colours via the new IHPDFContentInheritedColorDevice interface

Version 2.766.47

Added

  • SVG export now fills paths using a tiling pattern with an SVG <pattern> repeating the pattern cell at its XStep and YStep spacing, clipped to the cell's /BBox; previously such paths came out black or kept the prior colour
  • Uncoloured tiling patterns (PaintType 2) paint the cell in the colour supplied alongside the pattern — the components in /CS0 cs 0 0 1 /P1 scn, for instance
  • Paths filled through a shading pattern pick up the pattern's axial, radial or mesh shading, clipped to the path
  • The pattern matrix works in the space of the page or of the form using the pattern (ISO 32000-1 8.7.2), so patterns neither scale nor shift with the current transformation matrix, and Q reinstates a pattern saved with q
  • Content devices can take pattern selections through the new IHPDFContentPatternDevice interface

Version 2.766.46

Added

  • Images carrying a colour-key /Mask array (ISO 32000-1 8.9.6.4) are now masked when a loaded page renders: pixels whose components all sit within the key ranges stay unpainted, letting the page show through
  • SVG export honours the same colour-key masks and writes such images as PNG images with an alpha channel
  • The key is checked against the samples exactly as stored, so an Indexed image masks by palette index even where two entries share a colour, and images of 1, 2 and 4 bits per component are handled
  • The new DecodeLoadedImageColorKeyMask method hands back a loaded image's mask as a black-and-white bitmap; Flate, LZW and unfiltered images are covered, as lossy codecs cannot preserve exact sample values

Version 2.766.45

Changed

  • CompressDocument and CompressLoadedDocument now allow each object stream to pack up to 250 objects rather than 100; fewer, larger containers compress better and demand fewer dictionaries
  • Loaded PDFs already written compactly with object streams now emerge at roughly their original size — most a touch smaller rather than a touch larger
  • A limit set via ConfigureAdaptiveObjectStreamPacking is respected, CompressDocument puts the limit back at EndDoc, and ordinary object-stream saves stay at 100 objects per container

Version 2.766.44

Changed

  • Where object streams are in play, the cross-reference stream now picks the narrowest field width each column can get away with: offsets in files under 16 MB occupy 3 bytes rather than 4 (ISO 32000-1 7.5.8.2), and the accompanying dictionary is laid out compactly
  • Files that carry a cross-reference stream yet no object streams come out byte-for-byte identical

Version 2.766.43

Changed

  • For unencrypted files built with object streams, the document catalog and the document information dictionary now ride inside object streams too and benefit from the compression; ISO 32000-1 7.5.7 exempts only the encryption dictionary
  • Encrypted files continue to store both dictionaries at the top level, exactly as before

Version 2.766.42

Changed

  • When object streams are used — via CompressDocument and CompressLoadedDocument amongst others — dictionaries and arrays are written without the superfluous spaces and line breaks the PDF syntax tolerates (ISO 32000-1 7.2.2); stream dictionaries, which may not live in object streams and remain uncompressed, benefit most
  • Signature dictionaries and the encryption dictionary retain their spaced layout, so signing documents built with object streams behaves exactly as it did
  • Output written without object streams is byte-for-byte unchanged

Version 2.766.41

Fixed

  • PDF files produced with object streams no longer emit the %PDF- header and binary comment line twice; every save involving UseObjectStreams, CompressDocument or CompressLoadedDocument was affected
  • Viewers put up with the duplicated header, yet strict validators could raise a flag — and each file carried 15 bytes of dead weight

Version 2.766.40

Fixed

  • Loaded PDFs whose object streams hold a bare number — the way many producers record stream lengths — can once more be edited and saved; previously any modification aborted the save with "Cannot rewrite compressed object N: the source member could not be loaded"
  • Such a number is now treated as a number. The parser used to hunt beyond the member's end for an indirect reference, fail, and refuse to load the member at all
  • Saving such a file unmodified was never at risk, since an unchanged file is copied verbatim

Version 2.766.39

Fixed

  • In PDF/A-2 and later and PDF/X-6 documents, stamp annotations displayed nothing but their frame — no stamp name such as APPROVED or CONFIDENTIAL
  • The name now appears in capitals and the annotation colour, set in the page's current font (which travels with the page text as an embedded font) and centred within the rectangle
  • Lengthy names such as NOTFORPUBLICRELEASE are set at a smaller size so they fit the rectangle width
  • Such documents still pass PDF/A validation; stamps elsewhere are written exactly as before

Version 2.766.38

Added

  • A new CompressLoadedDocument overload taking options squeezes a loaded PDF as small as it will go whilst leaving its appearance untouched: unused page resources are dropped, identical fonts and forms merged, embedded fonts subset, streams recompressed with Flate, and the next save written with object streams
  • Each step is lossless — images are neither resampled nor recompressed. A three-page document embedding full Arial and SimSun falls from roughly 10 MB to roughly 20 KB, and three further sample PDFs came in 15-50% smaller
  • Documents carrying signature fields are declined by default and left untouched, because every step rewrites signed bytes; AllowSignatureInvalidation opts them in regardless
  • SubsetLoadedFonts gains a CompactTrueTypeSubsets option (off by default) that builds compact subsets for TrueType fonts used via CIDFontType2 fonts with the identity CID mapping; colour fonts and fonts with a /CIDSet keep the ordinary subset
  • The parameterless CompressLoadedDocument carries on as it was, recompressing unfiltered streams only

Version 2.766.37

Added

  • A new CompressDocument property (off by default): one switch that writes the next document as small as it will go without altering its appearance
  • For that document it enables maximum-level Flate compression, 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 mixing English and Chinese text falls from roughly 10 MB to roughly 20 KB
  • Object streams require PDF 1.5, so an older Version is lifted to 1.5 unless the version is locked; PDF/A-1 output retains its classic cross-reference table
  • Your own settings are left untouched: once EndDoc has run, Compression, CompressionLevel, UseXRefStream, UseObjectStreams, the font subsetting options and the version read back exactly as you set them
  • Images are neither resampled nor recompressed

Version 2.766.36

Added

  • A new CompactFontSubsetting property (off by default): font subsets renumber the glyphs they retain, so the embedded font no longer lugs along an entry for every glyph in the source font; an explicit /CIDToGIDMap stream maps the page's glyph codes onto the renumbered glyphs (ISO 32000-1 9.7.4.2)
  • CJK fonts benefit most: two Chinese characters in SimSun need roughly 3 KB of font data rather than 25 KB, and a Microsoft YaHei document falls from 114 KB to 6 KB
  • This applies to TrueType fonts written as Type 0 fonts whilst EnableFontSubsetting is on, and to the font registered through RegisterUnicodeTTF, which previously received compact subsets only under PDF/A
  • Page content, glyph widths and text extraction are untouched; OpenType-CFF fonts keep the ordinary subset, and any font that cannot be compacted falls back to it

Version 2.766.35

Fixed

  • Text drawn with a per-character explicit advance no longer drifts after a character from outside the Basic Multilingual Plane — a musical symbol or emoji, say — provided the registered Unicode font covers it. Each following character used to inherit its neighbour’s advance; now the character advances by the sum of its two width entries
  • Justified Unicode text boxes holding such characters line up flush with the box edge, and their underline or strike-out spans the full text

Version 2.766.34

Added

  • SVG export now renders image masks (/ImageMask), inline ones included, as stencils in the current fill colour: unpainted areas stay transparent rather than appearing as a black-and-white picture
  • Images carrying an /SMask soft mask or an explicit /Mask stencil are exported as PNG images with an alpha channel, so their masked-out regions no longer obscure whatever sits behind
  • /Decode [1 0] on a mask or image mask is honoured, and a mask finer than its image retains its detail

Version 2.766.33

Fixed

  • Page rendering now respects an image's explicit /Mask stencil: masked areas stay unpainted rather than the entire image being drawn — including when the image is rotated or mirrored
  • A /Decode [1 0] array on the mask inverts which parts survive
  • Soft masks and masks finer than their image are applied at the mask's own resolution, so a detailed 1-bit mask atop a low-resolution photo keeps its edges

Version 2.766.32

Fixed

  • Page rendering now runs images through the full transformation matrix: images rotated a quarter turn or by any other angle, mirrored images, and every image on a page with /Rotate are no longer squashed upright and unmirrored into their bounding box
  • Image masks (/ImageMask true) are now painted as stencils in the current fill colour, edges anti-aliased when reduced, rather than appearing as a grey picture
  • Image masks bearing /Decode [1 0] now paint the samples of 1, as the PDF specification demands
  • Inline image masks (BI /IM true) are drawn once more, and their /D array is honoured
  • Soft-masked images keep their mask whilst being turned or mirrored

Version 2.766.31

Added

  • SVG export now converts colours set with k/K (DeviceCMYK) and with cs/sc/scn in any named colour space: ICCBased, calibrated, Lab, Indexed, Separation and DeviceN colours emerge as the page renderer shows them instead of black
  • Choosing a colour space with cs/CS now establishes its initial colour — full tint for a spot colour, for instance — and restoring the graphics state with Q reinstates a colour set this way
  • Colour spaces that point at 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 colours rather than hanging on to the previous colour

Version 2.766.30

Fixed

  • THPDFEmfPatcher.RenderEmfDirect now draws an enhanced metafile's bitmaps at the same size and position whatever the Resolution. At any Resolution other than 72 they used to come out scaled by 72 / Resolution

Version 2.766.29

Added

  • SVG export now applies W and W* clipping paths: each turns into an SVG clip path governing whatever 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
  • In SVG export, Form XObjects are clipped to their /BBox, and axial and radial shadings likewise to their /BBox
  • Even-odd clipping (W*) keeps its fill rule, and a path painted alongside W is drawn before the new clip bites, as the PDF specification requires

Version 2.766.28

Fixed

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

Version 2.766.27

Fixed

  • DrawInlineImage and DrawFormXObject size the image or form in drawing units, just as its position is. At any Resolution other than 72 the width and height were misread as points, leaving the object too large

Version 2.766.26

Fixed

  • A page made current again via CurrentPageNumber continues drawing in the units it was laid out with. At a Resolution other than 72 it used to flip to points, so anything drawn afterwards landed at the wrong size and position
  • When revisited, the page likewise retains its own page Resolution

Version 2.766.25

Fixed

  • Images placed with ShowImage keep their size on a page sized via Width and Height even when the document Resolution is not 72. At a Resolution of 144 they used to come out half-size and displaced
  • On such a page, ExtTextOut places each character at the given advances rather than half of them
  • Embedded glyph runs retain their glyph offsets and advances on such a page

Version 2.766.24

Added

  • SVG export now honours the /Extend entry of axial and radial shadings: a non-extended end (the default) is left unpainted as PDF prescribes, rather than smearing its end colour across the whole clip
  • For radial shadings this also leaves the interior of the start circle empty unless the start is extended

Version 2.766.23

Fixed

  • Flattening page rotation now swings annotation appearance streams round with the page, so baked or flattened annotations match the rotated page instead of being squashed sideways into their turned rectangle
  • Widget rotation (/MK /R) is adjusted for the page turn, so form field appearances regenerated after flattening keep their orientation
  • Annotations carrying the NoRotate flag remain upright at their original size after flattening, pinned at their upper-left corner just as viewers show them on a rotated page

Version 2.766.22

Fixed

  • On a tagged PDF, flattening page rotation no longer rotates an annotation rectangle a second time when the structure tree is reached ahead of the page tree
  • Flattening page rotation leaves the bounding boxes of Form XObjects used on the page alone; their geometry lives in form space, and the page turn already reaches them through the content transform
  • Layout bounding boxes of structure elements belonging to another page are untouched when a single page is flattened

Version 2.766.21

Fixed

  • Reading a loaded page's bleed, trim or art box no longer scoops up a /BleedBox, /TrimBox or /ArtBox sitting on a parent /Pages node; PDF does not make these boxes inheritable, so a page lacking 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 inside a metafile placed with ShowMetafile keeps its size even when the document Resolution is not 72. At a Resolution of 144 it used to emerge at half size whilst the rest of the drawing stayed correct
  • The page Canvas and ShowMetafile now draw at the correct size on a page sized via Width and Height, which draws in points; at a Resolution of 144 the drawing used to come out twice as large
  • The page Canvas and ShowMetafile also honour a page Resolution set on the page itself, rather than shrinking the drawing by it

Version 2.766.19

Fixed

  • Justified Unicode text boxes now finish at the box edge when character spacing is set. Every character used to collect the spacing on top of its justified position, so each line overshot the right edge by the spacing multiplied by the character count
  • Justified Unicode text boxes under horizontal scaling fill the full box width once more instead of falling short by the scaling factor
  • Word spacing now contributes to the natural width of a justified line — the very width the line was broken at
  • Text drawn with a per-character explicit advance lands exactly where asked, whatever character spacing or horizontal scaling applies

Version 2.766.18

Fixed

  • Flattening page rotation now swings pages with /Rotate 90 and /Rotate 270 clockwise, so the flattened page matches the rotated original precisely instead of ending up upside down relative to it
  • Annotations, link destinations and structure geometry travel with the page in the same fashion
  • Flattening a page without a CropBox no longer invents one that clipped the page to a square; only the page boxes a page genuinely possesses get rotated

Version 2.766.17

Fixed

  • Font fallback chains now locate faces such as SimSun and Microsoft YaHei on Windows systems that report them under a localised name, so mixed CJK text in WideTextOutBox, WideTextOutBoxEx and TextOutWithFallback is drawn in the fallback face rather than empty boxes
  • Text whose own font is one of these faces is no longer carved into fallback runs, nor flagged by the unresolved-glyph diagnostics
  • A face may be listed in a chain under any family name it carries, in any language; a face Windows merely substitutes with another font is still skipped

Version 2.766.16

Fixed

  • N-up composition now seats pages with /Rotate 90 and /Rotate 270 clockwise within their cells; previously they were turned the opposite way and shoved out of the cell, often clean off the sheet
  • Pages with /Rotate 180 are now turned on the sheet rather than composed upright
  • N-up composition now honours page boxes and /Rotate inherited from the page tree, so such pages are neither skipped nor composed unrotated
  • Blank pages inserted into a loaded document — the composed N-up sheets included — 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 once its count is reset to zero: tokens lingering from the earlier run are released first, so their strings no longer leak and their array items or inline image data no longer turn up on the new tokens
  • Appending many small content streams to one token array now grows the array by at least a factor of two instead of reallocating and shuffling it on every append — behaviour that kept pages assembled 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 lays down, rather than mirrored across the diagonal; previously the top-left corner of a 90-degree page wound up in the bottom-right
  • The fix spans 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, together with 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 degenerating into question marks or bytes that render the file unreadable; control codes XML forbids become U+FFFD
  • Text after the first run of a line, and text following a TJ kerning adjustment, is now placed correctly when the text matrix scales or rotates the text — the trick many PDF producers use to set the font size
  • Text rise and horizontal scaling now track 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 advances the text position, and stroked text keeps its stroke opacity
  • Word spacing is no longer inflicted on two-byte codes that merely happen to equal 32, and runs of spaces are preserved so each character keeps its own position
  • Ligature glyphs export every character they stand for, and fonts mixing 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 pushed off it

Version 2.766.12

Fixed

  • Drawing on THPDFPage.Canvas, and metafiles played back as vector graphics through ShowMetafile at a position and scale, no longer forfeit part of their left and top edges when a clip region is set. Each clip region used to be nudged in by one unit along those two sides, so a border or fill hugging the left or top edge emerged thinner than its right or bottom counterpart
  • Clip regions now coincide with the same regions when filled, and cover identical area at any THotPDF.Resolution

Version 2.766.11

Fixed

  • Underlines and strike-outs on Unicode text drawn with TextOut, UnicodeTextOut, RtLTextOut and ExtTextOut now span precisely the text. They used to be measured on the text converted to the system code page, so runs containing Cyrillic, Hebrew, Greek, CJK or any other letters beyond that code page received bars that fell short of the text or overshot it
  • The bars also track character spacing, word spacing, horizontal scaling and the displacements handed to ExtTextOut

Version 2.766.10

Fixed

  • The report and grid export add-ons (FastReport, QuickReport, ReportBuilder, DevExpress and DBGrid) no longer trample one another's output when several exports run concurrently — on a server, say. Their temporary file took its name from a timer that ticks only every 10 to 16 ms, so exports launched together wrote to the same file

Version 2.766.9

Fixed

  • TextWidth now measures text the way it is actually drawn when character spacing, word spacing or horizontal scaling is set. The spacing used to escape the horizontal scaling, negative word spacing went ignored, and a trailing space attracted no word spacing — so paragraph continuation, link rectangles and centred or right-aligned text sat away from the drawn text
  • TextWidth and GetWideTextWidth return identical widths for identical text

Version 2.766.8

Fixed

  • The ReportBuilder device (TppHotPDFDevice) now draws native text within its text box. The text used to be positioned as though its position were the baseline, so every text object began a line too low and its final line spilled out of the box
  • Centred and right-aligned native text is measured with the Unicode widths it is drawn with, so text holding letters outside the system code page — Chinese on a Western system, for example — lines up properly

Version 2.766.7

Fixed

  • The FastReport export now seats memo text inside its memo. The text used to be positioned as though its position were the baseline, so each memo's text began one font height too low, and bottom-aligned text was drawn beneath the memo where clipping concealed it
  • Top, centre and bottom vertical alignment all measure from the top of the first line, whether the memo is plain or HTML-tagged

Version 2.766.6

Fixed

  • The FastReport export filter (TfrxHotPDFExport) compiles once more. The NotEmbeddedFonts property read a field of the wrong type, and native picture export relied on a Clipped property that TfrxPictureView does not possess
  • Native picture export now clips each picture to its view, just as FastReport does, so a picture larger than its view no longer spills across neighbouring objects
  • A centred picture keeps its frame and clip on the view bounds; only the image itself is centred. Previously the frame travelled with the image

Version 2.766.5

Fixed

  • The DBGrid add-on now measures cell text with the Unicode widths it actually draws with before trimming it to fit a column. Text holding letters outside the system code page — Chinese on a Western system, say — was measured as question marks and overflowed the cell; double-byte text on Chinese, Japanese or Korean systems was cut long before the cell filled
  • A cut never abandons half a surrogate pair in front of the ...

Version 2.766.4

Fixed

  • The DBGrid add-on (TDBGridHotPDFExport and DBGridHotPDFExportToFile/ToStream) now draws cell text within its cells. The text used to be placed as though its position were the baseline, so each row's text sat on the cell's bottom border and got sliced by the next row's grid line
  • Header text is centred within the header row, and the title no longer brushes the top of the table

Version 2.766.3

Fixed

  • GetLoadedPDFVersionString now returns %PDF-1.7 and its kin on systems whose locale writes a decimal comma; there it used to return %PDF-1,7
  • The pdfVersion field of GetLoadedDocumentReport is corrected in 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, yet at Resolution 144 text, margins, lists and tables used to come out half-size
  • Text and graphics you draw either side of the import still use 1/Resolution inch
  • Documents built at the default Resolution of 72 come out precisely as before

Version 2.766.1

Fixed

  • XFA forms flattened via ApplyXFAAsAcroForm or FlattenLoadedXFA keep the positions, sizes and font sizes of the template at any THotPDF.Resolution. At Resolution 144 the entire form used to emerge half-size in the page's top left corner
  • Text and graphics you draw either side of flattening still use 1/Resolution inch
  • Documents built at the default Resolution of 72 come out precisely 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 weigh it against coordinates, margins and TextWidth at any THotPDF.Resolution. Width and Height still return points, and existing code reads the same values as it always did

Fixed

  • With THotPDF.Resolution set to anything other than 72, paragraphs now wrap at the genuine 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 sprawl across far too many pages
  • A paragraph continuing on a fresh page keeps the same page size, coordinates and font size at any Resolution. At 144 the continuation page flipped to point coordinates and its text emerged half-size
  • THPDFTable starts a new page only once a row reaches the bottom margin; at 144 a table sitting in the page's lower half gave every row a page of its own
  • HTML import lays text out across the full page width at any Resolution rather than the left half
  • Metafiles drawn centred on the page, and metafile clip regions spanning 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 precisely as before

Version 2.765.52

Fixed

  • AES-256 passwords containing non-ASCII letters now work in other PDF readers. HotPDF hashed the password in the system code page, whereas ISO 32000-2 defines it as UTF-8, so other readers turned away a Chinese or accented password; both revision 5 and revision 6 are put right
  • AES-256 passwords beyond 127 bytes are now trimmed to 127 bytes as the standard prescribes, so conforming readers accept them
  • HotPDF now opens AES-256 files from other producers whose password carries non-ASCII letters
  • Files that earlier versions locked with such passwords still open in HotPDF using the same password

Version 2.765.51

Fixed

  • ANSI text written after Unicode text in the same font no longer surfaces as empty boxes. When a page drew Unicode text with TextOut and then used TextBox or TextOutBoxEx in the same face (Arial at another size, say), the ANSI text was poured into the Unicode font where viewers could not find its glyphs; it now receives its own font resource and both displays and extracts correctly
  • Pages using only ANSI text or only Unicode text produce the same output as ever

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 omitted the user entry on the owner side, so qpdf, MuPDF and other readers rejected both passwords; HotPDF would take only its own files
  • HotPDF now opens revision 6 files produced elsewhere with their user or owner password rather than complaining of an incorrect password
  • Other readers now open the AES-256 R6 sample of the Security demo

Version 2.765.49

Fixed

  • Justified Unicode text boxes no longer scatter their letters apart and overrun the box's right edge. With a font chosen by name — Arial, say — each justified line used to come out roughly twice the box's width and overlap whatever sat beside it; now every justified line finishes at the box edge
  • In the same scenario, text drawn with a per-character explicit advance now lands where requested, rather than every character being shoved one 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 just the glyphs they actually use. Whole system fonts such as Arial Unicode MS used to be embedded wholesale, so a one-page hello world weighed in at about 15 MB and the right-to-left sample at about 30 MB; the same pages now fall between 80 KB and 650 KB and render identically

Version 2.765.47

Fixed

  • Right-to-left text no longer emerges with letters out of order in some fonts. Hebrew in Arial Unicode MS had adjacent letters swapped within many words, whilst Arabic in Microsoft Sans Serif was not reversed at all — the glyph numbers of those fonts were mistaken for accent marks when the line was rearranged into visual order
  • The Hebrew lines of the RtLTextOut demo now read as they should

Version 2.765.46

Fixed

  • GetWideTextWidth now factors in the character spacing and word spacing the text is drawn with, matching TextWidth. Word-wrapped and centred Unicode text with spacing set used to measure too narrow
  • TextOutHTML now honours word spacing set via SetWordSpacing: each run is placed at its measured width, which previously omitted the spacing. The CSS word-spacing and letter-spacing of HTML import pass 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 dropped whenever FontEmbedding was on or the text required a Unicode font
  • The spacing is appended after every space as a text positioning adjustment, which every PDF viewer honours; text without word spacing is written precisely as before
  • The word-spacing row of the TextOut demo now displays 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 used to start too low, so the rectangle border cut through it, and it overflowed the rectangle's width

Version 2.765.43

Fixed

  • Strikeout text (fsStrikeOut) is now struck through the middle of the lowercase letters. The line used to sit half a line below the baseline, beneath the underline, so struck text looked doubly underlined; <s> in TextOutHTML was affected too
  • Rotated text now takes its underline below the baseline rather than along the tops of the letters, and its strikeout through the letters
  • Strikeout lines match underline thickness on every text path; the Unicode and plain Latin paths used to draw a far thinner line

Version 2.765.42

Fixed

  • The HTMLText demo now yields a single page carrying all five samples. It used to add a second page after the one the document already starts with — stranding the first page empty — and began writing near the page bottom, 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 their layers' text. The visible layer's text was drawn in the colour of the rectangle behind it and vanished from sight, whilst the hidden layer's text came out nearly white
  • The Patterns demos' caption is drawn in black rather than being filled with the tiling pattern, which shattered it into pattern fragments
  • The AlphaTransparency demos' caption is no longer drawn semi-transparent green under 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 properly. The left curve's first control point line fell short of the labelled point, whilst the right curve showed a short horizontal stroke in place of the lines running from its start point through its control point to its end point
  • The section headings of the rectangle and ellipse pages are black once more rather than adopting 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 grey colour used to return as a different colour (white came back blue), and colours set in CMYK or through a colour space returned as some earlier RGB colour
  • The hyperlink colour now applies solely to the link text, whatever colour space the page had in play

Version 2.765.38

Fixed

  • TextOutOutline now draws glyph outlines at the font size under any Resolution. At a Resolution other than 72 the outlines were scaled down a second time — to half their size at 144, for instance
  • Outlines of fonts with fewer than 1000 units per em, SimHei amongst them, are no longer drawn several times oversized

Version 2.765.37

Fixed

  • The Delphi and C++Builder CJKUnicode demos now display their Korean line on systems lacking Arial Unicode MS. They used to draw it with the first Chinese font found, which carries no Hangul, leaving the line empty; Malgun Gothic steps in whenever the chosen font cannot show Korean

Version 2.765.36

Fixed

  • Chinese and Japanese text written with fonts such as SimHei no longer stacks its characters atop one another. When the same font served a second text run, many ideographs were assigned widths of a few units instead of a full em
  • The fonts concerned store fewer advance widths than they have glyphs; glyphs beyond the last stored width now take that width, as the TrueType format requires

Version 2.765.35

Fixed

  • Unicode text in fonts whose design grid carries fewer than 1000 units per em — SimHei and SimSun with 256, for instance — is now spaced correctly. The glyph widths written into the PDF were roughly four times oversized, so viewers left gaping holes after spaces and other newly used characters

Version 2.765.34

Fixed

  • The scanned-image scenario of the PDFOptimize demo now compresses a genuine text page. Its 1-bit test image used to come out solid black, so CCITT G4 and JBIG2 were compared on a featureless rectangle
  • The PDFOptimize demo's image scenarios now embed just the glyphs of their page label, so the reported sizes expose the difference between the image compression methods rather than being swamped by a whole embedded font

Version 2.765.33

Fixed

  • The E-Invoice demo now lays out its visible invoice page from the top downwards: the title sits at the top of the page with the invoice, parties and amounts beneath. The page used to be drawn in upside-down order, the title huddled near the bottom edge and the footer note perched at the top

Version 2.765.32

Fixed

  • JBIG2 images encoded strictly losslessly (Lossless with LossyLevel = 0) now retain every pixel. The default removal of tiny black dots as scan noise rode roughshod over these settings, so full stops and the dots of i and j in small text vanished from images meant to be lossless
  • The scan-friendly defaults (LossyLevel = 5 with RemoveIsolatedBlackPixels) still strip 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 — the default 150 DPI of SaveLoadedPagesAsImages on a Letter page, for instance. Rounding left every band one pixel row taller than planned, so the bands accumulated more rows than the image holds

Version 2.765.30

Fixed

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

Version 2.765.29

Fixed

  • Where Windows cannot apply an EMF metafile's world transform itself, HotPDF composes the transforms unaided. The vertical offset of a combined transform picked up the wrong term, so content in such metafiles could drift 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 a console application's standard output. The metafile trace had been 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 at. Top-aligned text — TCanvas.TextOut's default — was drawn one line height too high, and bottom-aligned text was likewise too high
  • Baseline-aligned and rotated metafile text is untouched

Version 2.765.26

Fixed

  • ShowMetafile with a position and scale now draws the metafile with its top left corner at the given point, scaled as asked. These arguments used to be ignored, and the metafile was always drawn at the page's top left corner at its natural size
  • ShowMetafile without a position is untouched

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 continuing from the arc's end. A full circle was drawn in their place, wrongly sized whenever the metafile carried an offset

Version 2.765.24

Fixed

  • Under PDF/A and PDF/X, free text annotations with plain ASCII contents now display their text. Their appearance used to draw nothing but frame and fill, because the Helvetica named in the annotation's default appearance may not appear unembedded there
  • The text is drawn at 12 pt in the page's current font — embedded alongside the page text — wrapped to the annotation box and aligned by the chosen justification, just as non-ASCII contents already were
  • Beyond PDF/A and PDF/X, ASCII-only free text annotations are written precisely as before

Version 2.765.23

Fixed

  • With AutoShapeArabic on, TextOut and UnicodeTextOut now join Arabic, Persian and Urdu letters into their initial, medial and final forms and ligatures, as RtLTextOut has long done. Every letter used to appear in its isolated form
  • The same holds for AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam, AutoShapeHanifiRohingya and Hebrew point reordering (sfHebrewReorder in ShapingFeatures)
  • With these options on, text whose glyph numbers happened to land in the Arabic or Hebrew character ranges could be shown with the wrong glyphs; that can no longer occur
  • Free text annotations drawn in the page font are shaped exactly as page text is
  • Output with these options off is untouched

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, whilst straight lines, rectangles and rounded rectangles stayed correct
  • Output at the default resolution of 72 is untouched

Version 2.765.21

Fixed

  • Pie wedges drawn with Pie or DrawPie are now single closed shapes, so their outline gains 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 joining the ends of their arc. The line used to run off to a point well clear of the shape

Version 2.765.20

Fixed

  • DrawArc and DrawPie now draw the portion of the ellipse their documentation describes: anticlockwise from start point to end point, as the Windows GDI Arc and Pie calls do. They used to draw the complementary portion, so a quarter arc emerged 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 portion of the ellipse; plain arcs were already correct
  • The angle-based Arc, Pie, Chord and ArcTo methods are untouched

Version 2.765.19

Fixed

  • Rotated rectangles drawn with RectangleRotate are now closed shapes, matching those drawn with Rectangle. Stroking one used to omit its fourth side, so an outline-only rotated rectangle displayed just three edges
  • Filled rotated rectangles, along with the underline and strikeout bars of rotated text, look exactly 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 the like could stray by up to 0.01 units
  • Negative values are now rounded half away from zero, mirroring positive values exactly; a negative value rounding to zero is written as 0
  • Output for zero and positive numbers is untouched

Version 2.765.17

Fixed

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

Version 2.765.16

Fixed

  • Pages added to loaded documents via InsertLoadedBlankPage now include the resource dictionary every page must carry (ISO 32000-1 Table 30); validation tools such as qpdf therefore no longer flag the page tree as damaged, and content can be added to the page later on

Version 2.765.15

Fixed

  • Within the Table demo the subtotal figure now stretches across the Qty and Price columns as designed; it previously referenced the wrong cell index, which left an empty cell in the Qty column

Version 2.765.14

Fixed

  • Images placed in THPDFTable cells are now rendered within the cell and respect the vertical alignment; previously they sat one image height beneath where they belonged — below the cell and outside the table altogether

Version 2.765.13

Fixed

  • Widths measured for Unicode text (GetWideTextWidth plus the justification measure) now agree with the font; with fonts such as Arial the figures came out at roughly twice the size they should have been
  • Tables, word-wrapped text and text aligned right, centred or justified are all laid out correctly once more, since they build upon these widths: short cell text stays on a single line, right-aligned values finish at the cell edge, and HTML text in table cells no longer carries wide gaps between words

Version 2.765.12

Fixed

  • Forms containing check boxes or radio buttons now include the ZapfDingbats font (/ZaDb) amongst the form's default resources. Viewers which paint these fields themselves — the default whilst AutoFormAppearances is off — consult it there when drawing the check mark; previously, viewers built on Poppler reported an unknown font and displayed no mark whatsoever

Version 2.765.11

Fixed

  • In the CJKAnnotations demo the first note icon in each language row now sits level with that row's remaining icons; it used to be positioned 5 points too high

Version 2.765.10

Fixed

  • Fonts asked for by their English name are now located on Windows installations that run in other languages. Asking for SimSun, Microsoft YaHei or MS Gothic on a Chinese, Japanese or Korean Windows used to be treated as a missing font — Windows reports the name in the system language — and the text was quietly set in Arial Unicode MS instead

Version 2.765.9

Fixed

  • Fonts which Windows keeps in TrueType collections (.ttc) — SimSun, Microsoft YaHei and MS Gothic amongst them — are now embedded as valid standalone fonts. Previously each table of the embedded font pointed at the wrong data; viewers rejected it and fell back to a system font, and on machines lacking that font the text displayed incorrect glyphs
  • Documents whose requested font was absent, and which Windows mapped to a collection font, were caught by the same fault — Unicode text set in Arial Unicode MS on systems where only SimSun was available, for example

Version 2.765.8

Fixed

  • Source files containing non-ASCII text are once more saved as UTF-8 with a byte order mark. Without one, Delphi reads a source file in the building computer's code page, so on Chinese, Japanese, Korean and other non-Western Windows systems the CJK, Arabic, Hebrew and accented text in the demos appeared garbled in the generated PDFs, whilst library error messages displayed the wrong characters
  • Wherever they are compiled, the demos CJKAnnotations, Annotations, HelloWorld, RtLTextOut, PageSizes, TextOut, Showcase and ViewerPref once again produce the text they were meant to

Version 2.765.7

Fixed

  • Document information supplied as UTF-8 (Title, Author, Subject, Keywords, article thread titles and SetLoadedDocumentInfo with the SetLoadedTitle family) is now kept as Unicode; viewers therefore display accented and CJK text properly, and the document information agrees with the XMP metadata
  • Text held in the system code page — say, a Chinese title on a Chinese Windows system — is likewise stored correctly, because bytes which do not form valid UTF-8 are read using that code page

Version 2.765.6

Fixed

  • The initial view of new documents (InitialZoom) now emits complete fit-width and fit-height destinations; the operand demanded by ISO 32000-1 Table 151 was absent, so viewers such as Poppler complained of a too-short destination array on every document produced with the default setting

Version 2.765.5

Fixed

  • Page labels that begin somewhere other than the first page now also cover the pages preceding the first range, which keep plain numbers; the page label tree has to include the first page (ISO 32000-1 12.4.2), and without doing so viewers could present the wrong labels
  • SetLoadedPageLabel now keeps the ranges in page order and supersedes any range starting on the same page, so viewers present the intended labels; previously new ranges were appended out of sequence and could turn up twice
  • SetLoadedPageLabel no longer throws away the existing labels of documents which keep them in a separate object, and label trees split across several nodes are updated as well
  • Page label prefixes supplied as UTF-8 are now stored as Unicode

Version 2.765.4

Fixed

  • Link descriptions supplied as UTF-8 (AddURILink, AddGoToLink, AddGoToRLink, AddLaunchLink, AddNamedDestinationLink and the structure-destination links) are now written as Unicode, so screen readers and viewers present accented and CJK text rather than garbled characters
  • The text and author of annotations added to loaded documents through the AddLoaded...Annotation methods receive the same treatment, bringing them into line with annotations created in new documents

Version 2.765.3

Fixed

  • AddGoToLink can now target a page that is added later on in a new document, so a table of contents on the first page can link forwards; in the past such links were dropped without any error being raised
  • Should a link's target page never be added, the link keeps its area but carries no action, rather than pointing at a page that does not exist

Version 2.765.2

Fixed

  • SetLoadedOutlineOpen now opens and closes bookmarks within loaded documents; previously it wrote a key which viewers disregard, and the bookmark stayed exactly as it was
  • AddLoadedOutline, SetLoadedOutlineURI and SetLoadedOutlineDestination now operate upon the bookmark requested; with any index above 0 they either amended the wrong bookmark or achieved nothing
  • When a bookmark is added to a loaded document, the visible-item counts of its parent, its ancestors and the outline are now brought up to date, so viewers no longer display incorrect expand states or item totals
  • Attaching a web link to a loaded bookmark now clears its page destination, and attaching a destination clears its action — a bookmark may hold only one of the two
  • Bookmark titles handed to AddLoadedOutline and SetLoadedOutlineTitle as UTF-8 are now stored as Unicode rather than as garbled bytes

Version 2.765.1

Fixed

  • Bookmarks in new documents now record the number of visible entries, exactly as ISO 32000-1 12.3.3 demands: previously the outline and every open bookmark counted all nested entries, even those tucked inside closed bookmarks
  • Setting Opened on a bookmark once its children have been added now opens it in the viewer; previously the change never made it into the file
  • Assigning Title to an existing bookmark now alters the title displayed in the document
  • Bookmark titles containing non-ASCII text and supplied as UTF-8 are now written as Unicode, so accented and CJK titles display properly instead of appearing as garbled characters
  • Bookmarks now include the parent reference demanded by the specification

Version 2.765.0

Added

  • HPDFTokenizeContentStreamAppend tokenises a content stream straight into an existing token array, letting callers who combine several streams dispense with 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 tokenised straight into the page's display list rather than copied across
  • Parallel page rendering scales far better on a cold document: on a 128-page vector test document, 4 workers now complete the job roughly 3 to 3.5 times quicker than 1 worker (previously about 1.4 times on 32-bit builds and 1.7 times on 64-bit ones)
  • On that document, single-threaded page compilation and rendering is likewise around 35% quicker; tokens, display lists and rendered output are unchanged

Version 2.764.7

Changed

  • Rendering content which saves and restores the graphics state frequently (q/Q) no longer allocates memory on every save — behaviour that left the worker threads of parallel page rendering waiting on one another inside the memory manager
  • Cold parallel rendering of a 128-page vector test document runs roughly 7–10% quicker with 4 workers and about 5% quicker on a single worker; the rendered output is unchanged

Version 2.764.6

Fixed

  • Parallel page rendering no longer falls back to one page at a time where the pages have been rendered before and their display lists remain cached
  • Previously, whilst only one page was drawn at a time, every page awaiting drawing kept hold of its memory reservation, leaving the remaining workers stalled against the shared memory budget; as soon as as many pages are waiting as there are workers, drawing now proceeds in parallel
  • The first page still turns up early, and the memory a batch reserves now remains proportional to the worker count rather than swallowing the entire budget

Version 2.764.5

Fixed

  • SetStructureClassMapEntry can now register a single attribute dictionary beneath several class names, or once more under the same name, without freeing it
  • Previously, removing or replacing one such entry released the shared dictionary, leaving the remaining /ClassMap entries pointing at memory that had already been freed; a save of the document could then produce garbage bytes or trip an access violation
  • An attribute dictionary created directly now becomes an indirect object upon registration, and each /ClassMap entry refers to it; the document owns the dictionary, so callers must not free it themselves

Version 2.764.4

Fixed

  • RemoveUnusedLoadedPageResources no longer writes to a resource table once it has removed it — the case where a page's /Font, /XObject or other resource table sits directly inside /Resources and every entry within it is unused
  • That write previously landed on released memory; it usually passed unnoticed, but could corrupt memory or trigger an access violation later in the session
  • Resource tables that have been emptied are still removed from /Resources, and the saved output remains unchanged

Version 2.764.3

Fixed

  • Opening a public-key (certificate) encrypted PDF using PubSecKeyMaterial — whether via LoadFromFile or BeginIncrementalUpdate — no longer reads recipient envelopes from memory that had already been released whilst the file key was being recovered
  • How the failure showed itself depended on how memory chanced to be reused: the document usually opened, yet it could be rejected as though no key material had been assigned, or unwrap the wrong bytes
  • Multi-recipient documents, the recipient selection callback and extra key materials registered through AddPubSecKeyMaterial all share 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 rather than 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 corrupted 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, rather than 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 fresh, independent document rather than 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 identical to that document from a fresh 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 remains 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 has been encrypted, BeginDoc raises an exception when ActivateProtection is still on and no fresh password was set, rather than protecting the next file with empty passwords
  • Starting a new document after rewriting a loaded one on the same instance likewise 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 where a paragraph will 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 the memory happened to be laid out, so it showed up 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 a second time on a THotPDF instance that has already written a fresh document no longer finishes in an access violation; it raises an exception asking for a fresh instance, because the instance still holds the objects, images, fonts and form fields of the document it has finished with
  • Had the crash not intervened, the second document would have inherited the first one's objects, amongst them its content and form fields; one instance per new document keeps every file to its own content
  • Loading an existing document by way of LoadFromFile and writing it out again is unaffected

Version 2.762.0

Fixed

  • Text, free text, line, square, circle, stamp and file attachment annotations show up in PDF/A-2, PDF/A-3, PDF/A-4 and PDF/X-6 documents; they carried an empty appearance stream that did no more than satisfy the validator, and since viewers draw the appearance, nothing appeared on the page
  • These appearances now paint 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 in with its background colour
  • PDF 2.0 output gives each of these annotations, the extended markup annotations and new form fields an appearance stream, as ISO 32000-2 Table 166 demands, 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, since every font used there must be embedded; the text remains in the annotation for viewers to display

Version 2.761.6

Fixed

  • File attachment annotations (AddFileAttachmentAnnotation) can once more be opened and saved in viewers: the file specification wrote the embedded file stream itself as /EF, whereas ISO 32000-1 Table 44 requires an /EF dictionary holding the stream under /F, so readers reported the file entry as missing
  • The embedded file stream of such an attachment carries the type /EmbeddedFile, and the annotation text is likewise 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 demands; they used to be written in registration order, and readers that search the tree could miss entries (qpdf reported the trees as unsorted)
  • Attaching two files bearing the same file name no longer produces two entries sharing one key, which left only one of the attachments reachable; the second receives a numbered key such as a (2).txt and keeps its original file name
  • Changes made through AddLoadedDocumentJavaScript and AddLoadedNamedDestination are saved; the edited name tree was not written back whilst it lived in a direct dictionary, so the new entries were lost. Both insert at the sorted position, trees split into /Kids nodes included, and replace an existing entry of the same name
  • AddLoadedDocumentJavaScript stores a JavaScript action as the name tree value rather than a bare script stream, and AddLoadedNamedDestination writes the zoom operand of its /XYZ destination
  • RemoveLoadedJavaScript and RemoveLoadedJavaScriptAll remove the scripts from the document itself; previously only the list returned by the getters changed and the scripts remained in the saved file
  • SetDocumentAttachmentMetadata renames the attachment it is handed; 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 from
  • AddLoadedComboBox produces a true combo box; it set the Edit flag instead of the Combo flag, so the field was a list box that viewers presented as a list of all the options
  • Fields added to a loaded document write /NeedAppearances as the boolean true rather than the name /true, and an AcroForm created for them receives the default appearance string and default resources to which their /DA strings refer
  • AddLoadedTextField, AddLoadedCheckBox, AddLoadedComboBox, AddLoadedListBox and AddLoadedPushButton furnish the new field with an appearance stream, so it shows up in viewers that do not build appearances and in documents whose form sets /NeedAppearances false
  • Appearances generated for loaded push buttons (be it whilst added, redrawn or flattened) draw the caption, where formerly 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, whereas the saved file went on showing the old text in every viewer and in print, viewers drawing the appearance rather than the stored value
  • Generated appearances of password text fields show a single asterisk per character in place of the password in readable form (ISO 32000-1 Table 228), for new fields with AutoFormAppearances as well as for loaded fields that get 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 in a certified form within an incremental update is no longer reported as a change outside the 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 absent from that palette. They are now embedded at their own bit depth with their own palette, which also shrinks the image data
  • 1-bit bitmaps whose palette lists white before black no longer come out as a negative under CCITT Group 3, CCITT Group 4 or JBIG2 compression, the batch and cross-page JBIG2 paths included; the darker palette colour is always encoded as black
  • icAutoMono and AddMonochromeImageAuto keep a 1-bit bitmap with a coloured palette on Flate rather than turning it into black and white with CCITT or JBIG2
  • CCITT Group 3 two-dimensional images (icCCITT32) now honour their /K parameter: the first row and every second row are coded one-dimensionally and /K is 2, whereas every row used to be coded two-dimensionally under /K 1, which permits 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, whereas every JPEG used to be declared DeviceRGB; readers would then show greyscale files garbled or truncated and CMYK files in the wrong colours
  • CMYK JPEGs that carry the Adobe marker (the usual Photoshop output) receive 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 treat greyscale and CMYK JPEG images as DeviceGray and DeviceCMYK use in place of DeviceRGB
  • StampLoadedPageImage applies the same colour model whenever 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 identifies JPEG data by its signature rather than a case-sensitive .jpg extension and no longer attempts to read such files as bitmaps

Version 2.761.0

Added

  • AddLoadedSignedSignatureField is new: it places a signature field that is ready to sign into a document you have loaded, so an already signed PDF can take a further signature (counter-signature or approval) by way of an incremental update
  • The field sets aside the signature space that SignPDFWithPFX, PreparePDFForSigning and InsertSignatureHex subsequently complete; once BeginIncrementalUpdate and SaveIncrementalUpdate have run, the fresh signature spans the whole file whilst the earlier signatures remain valid
  • Each field can carry its own optional reason, location and contact details, SubFilter and reserved signature size; the AcroForm is marked signed and append-only, and the signed document gains no appearance regeneration flag

Fixed

  • The documented multi-signature workflow for BeginIncrementalUpdate now sets out steps that actually work; the earlier text leant on a current page that no longer exists after loading and on a signature field lacking reserved signature space, which made signing fail

Version 2.760.1

Fixed

  • DrawQRCode, DrawDataMatrix, DrawPDF417 and DrawAztec put the page fill colour back once drawing finishes, exactly as documented; shapes filled afterwards used to inherit the barcode colour
  • These barcodes are emitted as a single path, each run of dark modules within a row being merged into one rectangle, so page content shrinks and viewers no longer reveal faint seams between neighbouring modules

Version 2.760.0

Changed

  • Choosing aes256 for CryptKeyLength now lifts the output to PDF 1.7 when a lower version applies, mirroring the behaviour of other version-dependent features, so documents genuinely receive AES-256 protection. On the default PDF 1.6 output they were previously written with AES-128 and no warning; when StrictVersionLock is set, a lower version still falls back to AES-128

Fixed

  • Help pages for the protection properties named permission values that do not exist; the examples alongside the descriptions of prPrint and prPrint12bit now reflect the real options, and the public-key encryption notes enumerate the supported key types

Version 2.759.0

Fixed

  • Signed PDFs now exclude the whole /Contents string — its < and > delimiters included — from the signed byte ranges, as ISO/IEC 32000-1 12.8.3.3 demands; previously the delimiters were signed, and validators comparing the byte range against the signature value reported an invalid byte range
  • PDF MAC validation for signatures that carry an attached MAC accepts both the standard byte range and the variant earlier versions wrote

Security

  • Signature verification turns away a document whose unsigned gap between the two byte ranges contains anything other than the signature's own /Contents string, closing a signature-wrapping hole whereby content beyond the signed bytes was reported as covered; signatures produced by earlier versions still verify

Version 2.758.1

Fixed

  • The default appearance AttachSignatureFieldAppearance gives an unsigned signature field once again paints its light grey background: the fill rectangle lacked two operands and chose its colour inside the path, which viewers refuse
  • Free-text annotations created on a fresh page carry the default appearance string ISO 32000-1 calls for, so viewers can lay the text out rather than presenting an empty box

Version 2.758.0

Fixed

  • The built-in JBIG2 decoder now positions every symbol after the first in a text strip exactly where ISO/IEC 14492 specifies; each subsequent symbol used to land one pixel further right, so text within JBIG2 scans produced by other encoders drifted apart
  • JBIG2 images written with the native arithmetic encoder and a symbol dictionary holding a single glyph can now be read by other PDF viewers; the symbol identifiers were encoded with one bit rather than none, causing those viewers to fail on the first glyph
  • Symbol dictionaries combining glyphs through refinement and aggregation are decoded with standard spacing, in line with other JBIG2 decoders
  • JBIG2 images sharing a global symbol dictionary write /DecodeParms as an array that mirrors the /Filter array; other viewers disregarded the single dictionary and could not locate the shared glyphs, so such images would not display

Version 2.757.0

Fixed

  • DirectDrawBarcode and the Simple* bar functions now produce genuine barcodes for every symbology; most previously returned evenly alternating bars bearing no data. GS1-128 with code set C (type 22) is drawn rather than falling back to Code 39, and POSTNET short bars are drawn at 40 % of the height
  • DirectDrawBarcode scales bar widths and heights by the page coordinate system, keeping barcodes readable where the document scale is anything other than one point per unit
  • Code 128, Code 93 and the EAN / UPC family retain exact one-to-four module element widths regardless of the Ratio setting; any ratio other than 2 used to render them unreadable
  • EAN-8, EAN-13, UPC-A and UPC-E supplied with only their data digits gain an appended check digit; the final data digit used to be mistaken for the check digit. With Checksum enabled, UPC-A no longer discards its last data digit, and the UPC-E check digit (which also selects the bar parity) is worked out from the expanded UPC-A number
  • MSI check digits come out right for numbers with an odd digit count, POSTNET codes receive their correction digit, and Interleaved 2 of 5 preserves the final digit of an odd-length number by prefixing a zero
  • Code 128 A encodes lower-case letters by way of SHIFT instead of converting them into spaces or control characters, Code 39 folds lower case into upper case, and Codabar retains supplied start and stop characters
  • Characters a symbology cannot represent now raise an exception; Code 39 and Code 128 used to drop or substitute them, whilst Codabar read beyond its character table
  • GS1-128 with Checksum enabled no longer tacks a further check digit onto Text every time the barcode is measured or drawn

Version 2.756.0

Fixed

  • QR Codes drawn with DrawQRCode or built with THPDFQRCode now scan in standard readers: format information sits where ISO/IEC 18004 specifies, and the error correction block structure is right 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 capitals
  • Text whose length ends in one or two digits, or in a single alphanumeric character, now receives a symbol large enough to hold it; the trailing characters were previously discarded
  • Encoding twice with the same THPDFQRCode instance no longer stirs the previous symbol into the new one
  • Encode returns False when an explicitly requested version is too small, or when the requested numeric or alphanumeric mode cannot hold the data, instead of yielding a truncated symbol
  • Mask selection applies the finder-like pattern and dark-module balance penalties set out in ISO/IEC 18004 7.8.3
  • The built-in barcode decoder handles 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 together with block de-interleaving and error detection, for code that reads QR symbols

Version 2.755.9

Changed

  • Image soft-mask rendering reuses the exact horizontal sample indices and carries out SSE2 alpha premultiplication on supported Delphi x86 and x64 targets, keeping pixel rounding and cancellation intact whilst temporary storage remains bounded and a scalar fallback stands ready

Version 2.755.8

Fixed

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

Version 2.755.7

Fixed

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

Version 2.755.6

Fixed

  • The SIMD rectangle renderer now honours compound even-odd and nonzero fill rules, so holes, reflected subpath direction and fractional edge placement are preserved; cancellation during rasterisation throws away the partial bitmap and propagates correctly

Version 2.755.5

Fixed

  • Multi-select form imports now set aside the exact option values before interpreting hexadecimal compatibility spellings in XFDF, which stops literal values from choosing a different option and keeps stored values in step with the 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 rather than 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 describing 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 a single 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 or 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 — overrunning or non-minimal lengths, missing or extra components, wrong string types, 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, 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 relying 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 the columns on the pen position
  • /W2 list entries describing 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 builds the complete FDF body before the target file is created, so a failure part way through an export 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 finishes flush against the dictionary terminator
  • Choice selection index reconciliation decodes mixed PDFDocEncoding, UTF-16 and hexadecimal spellings with a single matcher, so equivalent export values rebuild /I consistently
  • XFDF import accepts the hexadecimal spelling of an option export value supplied as plain literal text, restoring round trips produced by third-party tools
  • FDF export skips widget-only fields that have no 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, so they remain visible on landscape and non-A4 inputs
  • The C++Builder DigiPrint demo frees 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 remove 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 synchronising selection indices on import

Version 2.754.6

Fixed

  • SetLoadedFormFieldExportValue now goes through 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 honour inherited and indirect entries, whilst field resets preserve default value types, synchronise 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 stay individually addressable when their field type is inherited, with the inherited type, flags and options available through field helpers, and removal preserves sibling fields and their widgets

Version 2.754.2

Fixed

  • Regenerated loaded choice field appearances now display Unicode option labels whilst 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, and leaves shared selection arrays untouched

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; cancelled 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 into ASCII Helvetica plain text and rebuilds their visible appearance for both full rewrites and incremental saves

Fixed

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

Version 2.752.5

Fixed

  • Page bitmap initialisation now checks cancellation whilst clearing bounded blocks, releases unfinished bitmaps, and avoids delaying foreground rendering whilst cancelled prefetch work finishes initialisation

Version 2.752.4

Fixed

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

Version 2.752.3

Fixed

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

Version 2.752.2

Fixed

  • Enabling reproducible output after the document has been constructed now pins the creation timestamp so equivalent saves stay byte-identical across clock ticks

Version 2.752.1

Fixed

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

Version 2.752.0

Fixed

  • Moving a loaded non-widget annotation now preserves 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, removing 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, colour spaces, and ActualText whilst fixing garbled Chinese text, changed page appearance, and changed extraction text
  • Encrypted documents with an empty user password now load and start rewriting directly, whilst locked object streams fail clearly instead of producing an incomplete document
  • Unmodified numeric objects retain their source precision, preventing subtle colour 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 entire 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 all the results 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 rather than 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 rather than 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 inside its destructor when its arguments were rejected, since the checks ran before the thread itself had been created
  • Fixed the cloud-signature provider encoding an algorithm identifier whose second arc exceeds 39; 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 its containing element, so what gets validated and what the signature covers can no longer differ
  • Private-key values are wiped from memory after RSA signing instead of being left lying 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 whilst 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, yet only adjacent digits share a code word, so text such as 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 after it
  • Enhanced-metafile region records now bound their rectangle count by the record size rather than trusting the count in the region header, which could read far beyond the record
  • PNG images whose declared width times height exceeds the addressable range are rejected at the header rather than allocating a negative-length pixel buffer
  • High-quality image resampling now reports an out-of-range request rather than overflowing its intermediate buffer size
  • A WebP meta prefix image that claims more entropy groups than it has pixels is rejected rather than allocating hundreds of megabytes of prefix tables on the strength of 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 end of the final error correction block was never written into the symbol
  • Fixed the QR terminator filling the whole of the data block remainder with zero bits, leaving 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 whilst 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 whilst 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 in 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 division overwrote the message words 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 prescribed by ISO/IEC 16022 Annex E
  • 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 round, 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 decimal point, 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 decimal point, 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 disappearing from compressed pages: rectangle redaction, page stitching, composite watermark shapes and annotation flattening appended their operators to a page content stream that was still compressed, so the redaction bar, the stitched page, the watermark shape or the baked annotation was silently missing from the saved file. Page content is now expanded before anything is appended
  • Fixed appended content fusing with the last operator already present on the page whenever that page did not end in white space, which produced an unreadable token such as Q0.5 and could lead a viewer to reject the whole page; an end-of-line is now inserted where one is required

Version 2.747.2

Added

  • Added Free Pascal Win32 support: the Lazarus package now builds for both i386-win32 and x86_64-win64 via 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 via 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 neighbourhood distance map, the colour cache, and all four inverse transforms (predictor, colour, subtract-green, and colour 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 are 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 remains 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) ready for printing, folding 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 synthesised 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 whilst 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 brought the process down 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 throws away 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 rather than 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 likewise 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 reopens 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 supplied 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 checks the codec by means of 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: once writing has finished, a fresh reader instance with cross-reference recovery disabled reloads the file so corrupt serialisation raises at the call site rather than 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 by way of 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 rather than 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 an empty one

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 by means of 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 kept 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 study in DER
  • 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 any external ECDH tooling

Version 2.732.0

Changed

  • Saves now route serialiser 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, greyscale 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 keeps the source XFA preserved

Version 2.728.0

Fixed

  • Corrected XFA intrinsic measurement and text continuation so that explicit empty and calculated values are preserved, each field or repeated-row binding context is used, breakAfter actions are retained, synthetic name collisions are avoided, and a cached global measurement budget is enforced

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 for 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 reports 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 the 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 whilst 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 keeps the original colour-space graph, tint transform, colourants, /Decode ranges and overprint semantics intact 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 whilst ambiguous or unsupported input fails closed

Version 2.719.0

Added

  • Added bounded JPEG 2000 refinement by resolution and quality layer via THPDFJpeg2000Decoder.LoadProgressiveFromByteArray, plus multi-layer encoding via 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 rely 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 every optional dependency has arrived 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 stays readable before authentication whilst embedded-file names, descriptions and bytes remain 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 whilst 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 by way of glyph source spans whilst 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 via 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 via THPDFJBIG2Options.UseHuffmanEncoding, including the standard DH, DW, BMSIZE, FS, DS and DT tables, raw collective bitmaps, symbol-ID tables, deterministic native routing, and pixel-exact decoder round trips whilst 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 whilst preserving codepoint precedence and shaped output

Version 2.707.0

Added

  • Added the Aztec 2D barcode encoder (ISO/IEC 24778) via 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 from 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 via THotPDF.SaveLoadedPageToPng, SaveLoadedPageToPngStream, SaveLoadedPagesToTiffBanded and SaveLoadedPagesToTiffStreamBanded, writing compressed image data row by row through band encoders so very large pages never need 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, whilst 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 via 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 whilst 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 ahead of the new RFC 3161 document timestamp, preserves every earlier revision byte for byte, and deduplicates validation streams exactly across successive renewals

Version 2.701.0

Added

  • Added clause-addressable PAdES baseline and extended profile preflight via THotPDF.PreflightLoadedPAdES, reporting every applicable requirement with a stable rule ID, profile, normative level, standards clause, PDF path, object number, signed or current revision, and pass status whilst 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 via 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 whilst 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 the 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 once 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 with no 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 with a cap of 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 by way of 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 altering 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 via 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 centre, origin and radius mapping, native Type 3 PDF shading, and coordinate restoration that leaves the 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 where drawing features are unsupported

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 annotation compositing that takes appearances into account

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 with no 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 a choice of 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 ceilings on decoded bytes and content tokens

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, artefacts, 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 by way of 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 by way of 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 any 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 by way of 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 via 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 a 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 and 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 the 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, rejection of digest-strength downgrades, authenticated /P and /Perms checks, preflight reporting, and bounded revision parsing without temporary PDF copies

Version 2.666.0

Added

  • Added THotPDF.SignPDFWithPFXAndAttachedPDFMAC plus 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 replacement of the output

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 whilst 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, Colour and Luminosity, and corrected the full-opacity fast path so every active separable or non-separable blend mode is composited against its backdrop

Version 2.663.0

Security

  • Authenticated PKCS#12 containers before exposing encrypted safe contents by verifying the 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 whilst 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 the two platforms alike)

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 covering whole XDP streams and ordered packet arrays: local-name path queries, packet and node mutation, byte-exact preservation of untouched bytes, per-packet selective rewriting, deterministic namespace and attribute output, safe CDATA splitting, entity escaping, plus finite budgets for input, output, packets, nodes, depth, attributes, text and queries

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 authorisation 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 handlers for XPS, EPUB and CBZ documents, with thread-safe registration that can be swapped out, a single validated archive scan, fixed-page, spine and natural image ordering, immutable caching of PDF conversions, 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 with atomic export to CSV or JSON: canonical columns, merging of same-page fragments and consecutive pages, merged-cell spans, repeated headers, page geometry, confidence and provenance, plus locale-driven inference for integers, numbers, booleans, dates, date-times, currency and percentages

Version 2.654.0

Added

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

Version 2.653.0

Added

  • Added atomic loaded-page colour rewriting to DeviceGray, DeviceRGB or DeviceCMYK, keeping searchable vectors searchable, converting images and complex resources losslessly through colour management, producing rotation-safe output, honouring explicit render fidelity and resource budgets, and offering preserve, process-convert or reject policies for spot plates

Version 2.652.0

Added

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

Version 2.651.0

Added

  • Added bounded barcode decoding for loaded pages and regions, built on pluggable engines with progressive low-resolution rendering and 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 built on 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 full object graph round trips via versioned JSON, with streaming snapshot and incremental exports, raw or decoded payloads for embedded and atomic sidecars, bounded schema-compatible import, structural and stream-length validation, and transactional publication

Version 2.648.0

Added

  • Added bounded repair of hand-edited QDF diagnostic documents: object and stream bytes are preserved, direct, indirect, missing and stale stream lengths are fixed, classic cross-reference offsets and trailers are rebuilt, unsafe structure is rejected, and the output is verified through the normal loader

Version 2.647.0

Added

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

Version 2.646.0

Added

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

Version 2.645.0

Added

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

Version 2.644.0

Added

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

Version 2.643.0

Added

  • Added native bounded vector charts supporting 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 pagination of RichEdit and RTF content on the GUI thread, with vector EMF output, images, opt-in OLE presentations where supported, cancellation, stream-position preservation and explicit input, character, page and output budgets

Version 2.641.0

Added

  • Added bounded SVG 2 import into reusable PDF Form XObjects, with native geometry and arcs, the 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 import profile for HTML5 paged media: tolerant DOM parsing, the 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 bigger sequential windows and as many as 16 smaller MRU random-access windows, keep an explicit fixed-geometry option available, and report the 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 per cent compression savings on the 100-page regression corpus

Version 2.637.0

Changed

  • Parallel loaded-page rendering now scales requested workers down against the process-wide memory budget, reserves every claimed page, keeps ordered-output reservations in place until callbacks are delivered, 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 tokenisation and playback, yields to foreground page rendering, and exposes progress, failure, pre-emption, and cancellation-latency telemetry

Version 2.635.0

Added

  • Added ordered streaming parallel page rendering: calling-thread callbacks, a bounded queue of completed bitmaps, producer backpressure, cooperative cancellation, borrowed bitmap lifetimes, and queue, byte, wait, completion and delivery telemetry

Version 2.634.0

Added

  • Added a two-stage pipeline for parallel loaded-page work that compiles display lists outside the render-cache lock, begins playback before the whole page set has been compiled, balances bounded workers dynamically, preserves input order, trims content-token allocation and exposes stage, cache, completion and latency telemetry

Version 2.633.0

Added

  • Added immutable, reference-counted handles for decoded bitmaps: cache hits need no copies, renderers draw directly and thread-safely, mutable copies are isolated and made on demand, lifetimes survive eviction, and handle and copy telemetry accumulates

Version 2.632.0

Changed

  • QuickJS execution now runs through static objects or an ABI-neutral bridge DLL alike on Win32 and Win64, with Unicode-safe values, deterministic status reporting, configurable memory, stack, script, time and interrupt limits, secure DLL discovery, recovery once a script has been rejected, and reproducible cross-platform runtime builds

Version 2.631.0

Changed

  • Factur-X and ZUGFeRD business-rule validation now covers the entire reviewed XPath 2 Schematron surface: external code databases, sequential bindings, quantifiers, FLWOR sums, stable fallback rule identifiers, secure bounded XML parsing, explicit evaluation-error findings, no silent skips whatsoever, and fail-closed combined validation

Version 2.630.0

Added

  • Added built-in instancing of TrueType variable fonts, handling mapped axes, shared and private gvar tuples, IUP interpolation, simple and composite outline updates, phantom-point metrics, baking of HVAR, VVAR and MVAR, compact static glyph rebuilding, checksum-correct output and callback-free Unicode font registration

Version 2.629.0

Added

  • Added CMS placeholder estimation without side effects, derived from explicit, provider or RSA certificate signature sizes: exact static container shaping, conservative reserves for dynamic payloads, pre-sign rebuilds, capability-gated provider retries, strict single-invocation guarantees for external signers, bounded sizing and detailed attempt diagnostics

Version 2.628.0

Added

  • Added subsetting driven by reachability for fonts embedded in loaded PDFs — page content, nested Form XObjects, annotation appearance states and shared font programs are all scanned — covering TrueType and CFF formats, encoded-size selection, stable CID and ToUnicode mappings, detailed results and refusal by default 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 artefacts, continuation-safe marked-content references, reading-order preservation, semantic validation, and structure statistics

Version 2.626.0

Added

  • Added a declarative document DOM: inheritable styles, reusable component factories, text, spacers, stacks, containers and sections, repeated headers and footers, weighted tables whose header rows repeat, 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 statistical performance gate for Win32 and Win64 that isolates load, save, render and text extraction, records warmups plus 30 raw samples with p50, p95, sample variance, RSS, process I/O, environment and deterministic fixture identity, then checks them against stable JSON thresholds and exits with a failure 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 per cent and elapsed time from 3,656 ms to 46 ms

Version 2.623.0

Added

  • Added configurable parser limits covering individual token bytes, aggregate tokens, array and dictionary entries, and malformed tokens, together with a strict preset for untrusted input, typed limit exceptions and per-load telemetry; regression gates turn away a 2 MiB token and a container of one million tokens in under 250 ms while keeping the process peak below 37 MiB

Version 2.622.0

Added

  • Added explicit release and telemetry APIs for the loaded-page object graph: clean page-owned roots and render caches are discarded whilst indirect shared resources and reload metadata survive; processing 100,000 pages in sequence holds a steady 69.3 MiB peak, and released pages, whether ordinary or compressed, materialise again under their original object identity

Version 2.621.0

Changed

  • Decoded object-stream containers now sit in a configurable LRU cache capped by bytes, with per-container eviction applied immediately, source-backed reload once evicted, 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 materialisation 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 draw on a shared lazy cache of bidirectional relationships: reverse annotation lookup, per-widget page lookup, activity telemetry, explicit invalidation for raw object-graph edits, and automatic maintenance that is safe under mutation

Version 2.618.0

Changed

  • Page-object lookup now goes through a lazily rebuilt reverse index that is aware of mutations, mapping object numbers to resolved page pointers; repeated page-table scans disappear from page copying, outlines, named destinations, actions, forms, accessibility and page-tree reconciliation, whilst validity and activity telemetry remain visible

Version 2.617.0

Changed

  • Rendered document comparison now supports caller-selected DPI, RGB or luminance colour 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 walks indirect object graphs along deterministic catalog-based paths, hashing values and streams within explicit resource limits; pages are aligned before insertions, deletions, moves and changes are classified, moved objects are told apart from additions and removals, and incomplete comparisons are reported rather than passing budget-limited results off as identical

Version 2.615.0

Changed

  • Loaded-image decoding now spreads over 16 cache metadata shards with exact per-key singleflight coordination: independent expensive decodes run concurrently, duplicate requests keep a single owner decode, the configured byte and entry budgets are enforced across every shard, and cached decode entry points come with concurrency telemetry; four independent 12,000-pixel JPEG requests scale 3.72 times across four Win64 workers, whilst eight requests for the same key decode just once

Version 2.614.0

Changed

  • Low-resolution greyscale 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 offer a lazy, seekable concatenated stream: unfiltered segments stay in source-backed storage, no more than one filtered segment decodes at any moment, token and byte accumulation is amortised-linear, edits preserve the original streams by appending a fresh segment, and a 1 GiB sequence of 10,000 segments stays under 64 MiB of extra working memory

Version 2.612.0

Changed

  • Incremental updates now hold the source file write-locked and file-backed rather than retaining all of its bytes, visit and emit only the changed, new and deleted objects inside sparse xref subsections, stream the original prefix towards a new target, and append directly with rollback when saving to the same target; a 4 GiB revision of a single object remains within 128 MiB of additional working memory

Version 2.611.0

Added

  • Added a bounded loaded-font decoder cache scoped to the document, with an LRU limit of 32 MiB and 128 entries, singleflight parse reuse spanning pages, loaded text extraction, SVG export and text replacement, deep-copy results independent of GetLoadedFontDecoder, configurable memory budget and telemetry APIs, plus automatic invalidation of graph, page, reload, JSON Patch and CMap configuration; while a shared indirect font is retained, repeated use parses its encoding, widths, ToUnicode, CIDToGIDMap and descendant mappings just once