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
ResolveFontForCodePointandAnalyzeUnresolvedGlyphsoverloads 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
THPDFTablenow keeps rows linked by aRowSpantogether 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
TotalHeightRenderedreflects the relocated group on the last page
Version 2.770.150
Fixed
THPDFTablecells carrying aColSpanorRowSpanof 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
EHPDFXFAErrorrather 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
RecalculateLoadedFormFieldsIncrementalnow 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 (
THPDFBarcodetype 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 (
THPDFBarcodetypes 18 and 19) no longer append a computed digit toTextwhenChecksumis 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
Checksumis 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
ImportLoadedFormFromXFDFandImportLoadedAnnotationsFromXFDFin 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"
ValidateVisualXmlConsistencyno 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
GetLoadedInvoiceSummarynow 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 nestedDateTimeStringmarkup HPDFFacturXXMLElementTextnow 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
DecodeLoadedPageBarcodesretries a page turned by 90 or 270 degrees, the raster passed to the decoder is now turned clockwise, exactly asAttemptRotationDegreesdocuments - 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.pdfnow genuinely uses compressed content streams, as the demo comments promise; it setsCompressiontocmFlateDecoderather than leaning on theBeginDocargument, which does not govern compression
Version 2.770.102
Fixed
- Images drawn with
AlphaBlendin an enhanced metafile now retain their recorded opacity when the metafile is converted viaTHPDFEmfPatcher.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
/BBoxwhen 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
EOverflowon 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
qoperators no longer lose the enclosing graphics state: deeper saves were ignored whilst their matchingQstill restored, so text and graphics following the nested block picked up the state from before an outerq - 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
shoperator and to shading patterns serving as fill or stroke colour
Version 2.770.69
Fixed
- Navigation demo: the named destinations
chapter-1andchapter-2now 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
/Domainsuch 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
/C1now 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
/Rangeonly 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
iforifelseprocedures 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
THotPDFinstances 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:
-don 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-oand in the dashboard - PreflightCLI demo:
-f jsonand-f csvnow 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--pagesoptions 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
THPDFDiskPageCacheaccepts 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/BBoxas positioned by its/Matrixand 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 Tdoffsets 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
--openis 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,HPDFDocRunJobandHPDFDocRunJobWithCallbacksis now read as UTF-8 throughout:\uXXXXescapes 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
\uescapes, so such files are found and written under their proper names - A malformed
\uescape 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
RenderLoadedPageToBitmapand 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
ImportLoadedInterchangeFromFDFnow matches complete key names when it reads annotations and the FDF status:/Tno longer halts at/Typeor/Text,/Fno longer at/FreeText, and/Statusno 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\dddand backslash line continuations, over and above\n,\rand 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
TJpeg2000Bitmapnow 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
TJpeg2000BitmapthroughSaveToStreamandLoadFromStream, 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_destroywhilst 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_destroyreturns; 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_HANDLEinstead 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
RenderLoadedPageToDCno 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 callerGetLoadedPageMetafileno 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
RenderLoadedPageToDCwhen 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
WorW*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*andb*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/\x5Cforms are not valid JSON and led standard parsers to reject results containing a quote or a Windows path - Control characters are written as
\uXXXXescapes 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_iofails 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
DecodeLoadedPageBarcodeson pages with/Rotate 90or/Rotate 270now 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
ApplyLoadedOCRTextLayeron 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
RenderColorimetricLuminosityMasksproperty selects how a luminosity soft mask turns colour into mask values when its group has a CIE-based blending space (CalGray,CalRGB,Lab, orICCBased) - Setting it to
truetakes 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
/BCbackdrop 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
DecodeLoadedImageRegionAtResolutionreturns 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 falseare 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 falsekeep 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
ProcessObjectStreamsForDecompressionon a loaded document no longer throws away the object streams the load had read: the compressed objects remain available toExtractRawObjectFromStreamandExtractObjectFromStreamafterwards, 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
ExtractRawObjectFromStreamdecodes 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
EncryptFileandDecryptFileno longer corrupt embedded font files whose dictionary names/Length1ahead 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
BuildLoadedPageSVGandSaveLoadedPageAsSVGaccept an optionalEmbedFontsparameter; it defaults to off, and calls already in place export precisely as they did- With
EmbedFontsset toTrue, 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
/Differencesentry 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
Tfand 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
LoadFromFileandLoadFromStreamgain overloads carrying anAutoDecryptparameter. WithAutoDecryptTrue, 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 ofsans-serif, Courier New ahead ofmonospace. 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_GB2312or 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
THPDFGlyphRecordgainsGlyphEndXandGlyphEndY: 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 intoPDFReference - 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 (
a1toa206) 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 —
arrowrightorspade, for instance — is still preferred over a ZapfDingbats name
Version 2.766.74
Fixed
HPDFExtractGlyphsViaDeviceno 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
Qas the specification demands (ISO 32000-1 9.3.1). Formerly only the transformation came back, so a font, character spacing or leading set insideq...Qlingered into the text that followed - When the font chosen inside
q...Qworked in two-byte codes while the font outside it used one-byte codes, everything afterQwas 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
RestoreStatenow always has a font selected. The page omits a font selection that merely repeats the last one written, but failed to allow forRestoreState(theQoperator) handing the reader back the font that applied beforeSaveState. Text shown afterRestoreStatein 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
SaveStateandRestoreStatethe same way, so a value re-issued afterRestoreStateis 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
/ToUnicodeCMap 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 Tfwith a scaledTm, 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
THPDFTextExtractDevicereceives the same correction
Version 2.766.69
Fixed
- The page renderer handed Windows font names containing
#xxescapes 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
#xxescapes literally as the escapes themselves, so CJK font names held as UTF-8 bytes — the KaiTi_GB2312 name in Chinese characters, for one — arrived infont-familyas#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 insideq...Qbled into the text afterwards. Pages that embolden a heading via2 Trinside 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
/Encryptas 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, andSaveLoadedDocumentproduced a damaged file that lost/Encryptyet 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/CropBoxare untouched
Added
THotPDF.GetLoadedPageVisibleBoxgives back a loaded page's visible box — its/CropBoxclipped to its/MediaBoxTHPDFPageDisplayList.CropBoxsupplies 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,zcaronamongst them) were never reached. Text extraction disregarded a font's/Differencesentries naming them, and the page renderer drew y, z and 0 of embedded CFF fonts withWinAnsiEncodingorMacRomanEncodingin 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 thangrave, 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
shor used inside a shading pattern; the export now samples the shading's function across its/Domaininto 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
/Backgroundcolour when shown with theshoperator, 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
/BBoxof function-based, axial and radial shadings (ISO 32000-1 8.7.4.5.1); an extended shading painted withshor 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
d1are 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
/Widthsas 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/Wwidths and embedded glyphs are found at the right CIDs; previously lowercase Latin letters inSTSong-Lighttext, 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
-Vturn 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
/Widthsarray — 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
/Encodingnow 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
/Widthsarray 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'
ForceBoldandItalicflags and italic angles take effect - The
SmallCapflag no longer forces text bold; boldness now follows theForceBoldflag (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
/Functionis 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"andfont-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
Qinside the form now restores those colours as well - Content devices can begin nested content from the caller's colours via the new
IHPDFContentInheritedColorDeviceinterface
Version 2.766.47
Added
- SVG export now fills paths using a tiling pattern with an SVG
<pattern>repeating the pattern cell at itsXStepandYStepspacing, clipped to the cell's/BBox; previously such paths came out black or kept the prior colour - Uncoloured tiling patterns (
PaintType2) 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
Qreinstates a pattern saved withq - Content devices can take pattern selections through the new
IHPDFContentPatternDeviceinterface
Version 2.766.46
Added
- Images carrying a colour-key
/Maskarray (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
DecodeLoadedImageColorKeyMaskmethod 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
CompressDocumentandCompressLoadedDocumentnow 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
ConfigureAdaptiveObjectStreamPackingis respected,CompressDocumentputs the limit back atEndDoc, 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
CompressDocumentandCompressLoadedDocumentamongst 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 involvingUseObjectStreams,CompressDocumentorCompressLoadedDocumentwas 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
CompressLoadedDocumentoverload 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;
AllowSignatureInvalidationopts them in regardless SubsetLoadedFontsgains aCompactTrueTypeSubsetsoption (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/CIDSetkeep the ordinary subset- The parameterless
CompressLoadedDocumentcarries on as it was, recompressing unfiltered streams only
Version 2.766.37
Added
- A new
CompressDocumentproperty (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
Versionis 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
EndDochas 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
CompactFontSubsettingproperty (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/CIDToGIDMapstream 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
EnableFontSubsettingis on, and to the font registered throughRegisterUnicodeTTF, 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
/SMasksoft mask or an explicit/Maskstencil 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
/Maskstencil: 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
/Rotateare 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/Darray 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 withcs/sc/scnin 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/CSnow establishes its initial colour — full tint for a spot colour, for instance — and restoring the graphics state withQreinstates 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
WandW*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 alongsideWis 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
/Extendentry 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,/TrimBoxor/ArtBoxsitting on a parent/Pagesnode; 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 90and/Rotate 270clockwise, 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,WideTextOutBoxExandTextOutWithFallbackis 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 90and/Rotate 270clockwise within their cells; previously they were turned the opposite way and shoved out of the cell, often clean off the sheet - Pages with
/Rotate 180are now turned on the sheet rather than composed upright - N-up composition now honours page boxes and
/Rotateinherited 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
/Rotateor/CropBoxinherited from the page tree
Version 2.766.15
Fixed
HPDFTokenizeContentStreamAppendcan 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 90or/Rotate 270are 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
TJkerning 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
TJadjustments 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
/MediaBoxdoes 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 throughShowMetafileat 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,RtLTextOutandExtTextOutnow 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
TextWidthnow 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 textTextWidthandGetWideTextWidthreturn 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. TheNotEmbeddedFontsproperty read a field of the wrong type, and native picture export relied on aClippedproperty thatTfrxPictureViewdoes 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 (
TDBGridHotPDFExportandDBGridHotPDFExportToFile/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
GetLoadedPDFVersionStringnow returns%PDF-1.7and its kin on systems whose locale writes a decimal comma; there it used to return%PDF-1,7- The
pdfVersionfield ofGetLoadedDocumentReportis corrected in the same way
Version 2.766.2
Fixed
- HTML import (
RenderHTMLandRenderHTML5) produces the same page at anyTHotPDF.Resolution. CSS lengths and the importer'sMargin,BaseFontSize,ListIndentandBlockSpacingare 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
ApplyXFAAsAcroFormorFlattenLoadedXFAkeep the positions, sizes and font sizes of the template at anyTHotPDF.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.UserWidthandTHPDFPage.UserHeightreturn the page size in the units you draw with — 1/Resolutioninch — so layout code can weigh it against coordinates, margins andTextWidthat anyTHotPDF.Resolution.WidthandHeightstill return points, and existing code reads the same values as it always did
Fixed
- With
THotPDF.Resolutionset 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
THPDFTablestarts 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
TextOutand then usedTextBoxorTextOutBoxExin 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
GetWideTextWidthnow factors in the character spacing and word spacing the text is drawn with, matchingTextWidth. Word-wrapped and centred Unicode text with spacing set used to measure too narrowTextOutHTMLnow honours word spacing set viaSetWordSpacing: each run is placed at its measured width, which previously omitted the spacing. The CSSword-spacingandletter-spacingof HTML import pass through the same layout
Version 2.765.45
Fixed
SetWordSpacingnow 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 wheneverFontEmbeddingwas 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>inTextOutHTMLwas 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
PrintHyperlinkkeep 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
TextOutOutlinenow draws glyph outlines at the font size under anyResolution. At aResolutionother 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 (
LosslesswithLossyLevel = 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 = 5withRemoveIsolatedBlackPixels) 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
SaveLoadedPagesAsImageson 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,GetWideTextWidthandGetWideCharAdvancesnow answer in the page units ofResolution— the units text is drawn at. At aResolutionother than 72 they answered in points, so measured text refused to fit the coordinates it was placed at- At a
Resolutionother than 72, text drawn withTextOutnow 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,TextOutBoxExandWideTextOutBoxExcentre and right-align their lines by the true text width, table cells and paragraphs wrap text by it, and the styled runs ofTextOutHTMLno longer collide - A font fallback run inside
WideTextOutBoxExkeeps the font size at anyResolutioninstead of shrinking - Output at
Resolution72 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 foundto 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
ShowMetafilenow 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
ShowMetafilewith 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 sizeShowMetafilewithout a position is untouched
Version 2.765.25
Fixed
AngleArcdrawings in EMF metafiles shown withShowMetafilenow 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
AutoShapeArabicon,TextOutandUnicodeTextOutnow join Arabic, Persian and Urdu letters into their initial, medial and final forms and ligatures, asRtLTextOuthas long done. Every letter used to appear in its isolated form - The same holds for
AutoShapeSyriac,AutoShapeNko,AutoShapeAdlam,AutoShapeHanifiRohingyaand Hebrew point reordering (sfHebrewReorderinShapingFeatures) - 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
Resolutionvalues other than 72.Ellipse,Circle,Arc,DrawArc,Pie,DrawPie,ChordandArcToused 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
PieorDrawPieare 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
ShowMetafilenow 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
DrawArcandDrawPienow draw the portion of the ellipse their documentation describes: anticlockwise from start point to end point, as the Windows GDIArcandPiecalls do. They used to draw the complementary portion, so a quarter arc emerged as three quarters- Pie slices, chords and
ArcToarcs in EMF metafiles shown withShowMetafilenow 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,ChordandArcTomethods are untouched
Version 2.765.19
Fixed
- Rotated rectangles drawn with
RectangleRotateare now closed shapes, matching those drawn withRectangle. 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
InsertLoadedBlankPagenow 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
Tabledemo 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
THPDFTablecells 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 (
GetWideTextWidthplus 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 whilstAutoFormAppearancesis 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
CJKAnnotationsdemo 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,ShowcaseandViewerPrefonce 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 andSetLoadedDocumentInfowith theSetLoadedTitlefamily) 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
SetLoadedPageLabelnow 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 twiceSetLoadedPageLabelno 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,AddNamedDestinationLinkand 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...Annotationmethods receive the same treatment, bringing them into line with annotations created in new documents
Version 2.765.3
Fixed
AddGoToLinkcan 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
SetLoadedOutlineOpennow opens and closes bookmarks within loaded documents; previously it wrote a key which viewers disregard, and the bookmark stayed exactly as it wasAddLoadedOutline,SetLoadedOutlineURIandSetLoadedOutlineDestinationnow 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
AddLoadedOutlineandSetLoadedOutlineTitleas 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
Openedon a bookmark once its children have been added now opens it in the viewer; previously the change never made it into the file - Assigning
Titleto 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
HPDFTokenizeContentStreamAppendtokenises 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
SetStructureClassMapEntrycan 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
/ClassMapentries 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
/ClassMapentry refers to it; the document owns the dictionary, so callers must not free it themselves
Version 2.764.4
Fixed
RemoveUnusedLoadedPageResourcesno longer writes to a resource table once it has removed it — the case where a page's/Font,/XObjector other resource table sits directly inside/Resourcesand 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 viaLoadFromFileorBeginIncrementalUpdate— 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
AddPubSecKeyMaterialall share the same corrected envelope list
Version 2.764.2
Fixed
- Field appearances generated for loaded forms — by
AddLoadedTextFieldand the otherAddLoaded*field methods,EnsureLoadedFieldAppearanceStreamorFlattenFormFields— now hold their own reference to the AcroForm/DRfont rather than sharing the/DRentry - Replacing or deleting the AcroForm
/DRdictionary, 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
/DRbecomes an indirect object the first time an appearance uses it, so the field appearance and/DRrefer to the same font object in the saved file
Version 2.764.1
Fixed
- Calling
ProcessObjectStreamsForDecompressionafterLoadFromFileno longer reads the file stream that the load had already closed; it rescans the loaded file instead, so object stream members stay available toExtractObjectFromStream - 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,ScanAndLoadReferencedObjectsandForceLoadMissingReferencedObjectsnow do nothing when called outside a load, rather than touching the closed stream
Version 2.764.0
Changed
- One
THotPDFinstance — for example a component dropped on a form — can now write any number of documents one after another:BeginDocafterEndDocstarts a fresh, independent document rather than raising an exception EndDocdrops 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 nextBeginDocfrees its pages and objects, so none of it reaches the next file; withReproducibleOutputon, a second document from a reused instance is byte for byte identical to that document from a fresh instance- Registrations made between
EndDocand the nextBeginDoc, such asAddPDFAOutputIntentor scripts added throughNames, belong to the next document and are no longer cleared byBeginDoc - Property settings such as
FileName,Compression,PDFACompliance,AuthorandTitle, together with page layers and font fallback chains, carry over to the next document; a PDF version raised automatically for one document returns to theVersionproperty value - The written document remains available after
EndDocuntil the nextBeginDoc, soValidatePDFUA2Structure,CurrentPageNumber,PagesCountand the layout diagnostics keep working on it - Because the passwords are cleared once a protected document has been encrypted,
BeginDocraises an exception whenActivateProtectionis 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
BeginDoca second time on aTHotPDFinstance 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
LoadFromFileand 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/EFdictionary 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).txtand keeps its original file name - Changes made through
AddLoadedDocumentJavaScriptandAddLoadedNamedDestinationare 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/Kidsnodes included, and replace an existing entry of the same name AddLoadedDocumentJavaScriptstores a JavaScript action as the name tree value rather than a bare script stream, andAddLoadedNamedDestinationwrites the zoom operand of its/XYZdestinationRemoveLoadedJavaScriptandRemoveLoadedJavaScriptAllremove the scripts from the document itself; previously only the list returned by the getters changed and the scripts remained in the saved fileSetDocumentAttachmentMetadatarenames 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; withoutAutoFormAppearancesthe font was missing, so viewers that build field appearances had no font to build them from AddLoadedComboBoxproduces 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
/NeedAppearancesas the booleantruerather than the name/true, and an AcroForm created for them receives the default appearance string and default resources to which their/DAstrings refer AddLoadedTextField,AddLoadedCheckBox,AddLoadedComboBox,AddLoadedListBoxandAddLoadedPushButtonfurnish 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,ResetLoadedFormFieldand 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
AutoFormAppearancesas well as for loaded fields that get redrawn or flattened AnalyzeLoadedSignatureRevisionsclassifies 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
icAutoMonoandAddMonochromeImageAutokeep 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/Kparameter: the first row and every second row are coded one-dimensionally and/Kis 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
DeviceGrayand CMYK JPEGs asDeviceCMYK, whereas every JPEG used to be declaredDeviceRGB; 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
/Decodearray 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
StampLoadedPageImageapplies the same colour model whenever a JPEG is stamped onto a loaded page- File names such as
PHOTO.JPGorscan.jpegnow load as JPEG with every compression type; the file overload ofAddImageidentifies JPEG data by its signature rather than a case-sensitive.jpgextension and no longer attempts to read such files as bitmaps
Version 2.761.0
Added
AddLoadedSignedSignatureFieldis 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,PreparePDFForSigningandInsertSignatureHexsubsequently complete; onceBeginIncrementalUpdateandSaveIncrementalUpdatehave 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
BeginIncrementalUpdatenow 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,DrawPDF417andDrawAztecput 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
aes256forCryptKeyLengthnow 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; whenStrictVersionLockis 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
prPrintandprPrint12bitnow 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
/Contentsstring — 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
/Contentsstring, 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
AttachSignatureFieldAppearancegives 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
/DecodeParmsas an array that mirrors the/Filterarray; other viewers disregarded the single dictionary and could not locate the shared glyphs, so such images would not display
Version 2.757.0
Fixed
DirectDrawBarcodeand theSimple*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 heightDirectDrawBarcodescales 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
Ratiosetting; 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
Checksumenabled, 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
Checksumenabled no longer tacks a further check digit ontoTextevery time the barcode is measured or drawn
Version 2.756.0
Fixed
- QR Codes drawn with
DrawQRCodeor built withTHPDFQRCodenow 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.comis 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
THPDFQRCodeinstance no longer stirs the previous symbol into the new one EncodereturnsFalsewhen 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
HPDFQRFunctionMapandHPDFQRExtractDataWordsexpose 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
TJposition 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
/DW2array 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
/W2list 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
TJdisplacement rules, so rendered and extracted positions cannot drift apart
Version 2.755.3
Added
THPDFQCStatementInfogainsHasPSD2Statement,PSD2RolesOfPSP,PSD2NCANameandPSD2NCAId; the CMS-level descriptor carries the same fieldsHPDFParsePSD2QcStatementparses a PSD2 statement you already hold as DER and rejects any malformed input
Deprecated
PSD2RolesPayerandPSD2RolesPayeeremain for source compatibility but are always empty, because the specification defines no payer or payee role lists; usePSD2RolesOfPSP
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
Tcrender 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
/DW2array 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
/W2list 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
SetLoadedFormFieldExportValuenow 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
/Sizefar 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
1a2a3aselected 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 andsizeattributes, 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.5and 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-win32andx86_64-win64via 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:
AddImageFromFilenow accepts.webpfiles 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
/Rotateinto 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
/NeedAppearancescase common in browser-printed forms), so the entered value survives into the page content - Markup annotations without
/APget a synthesised appearance drawn from their own properties — FreeText and Stamp text with/DAstyling and/Qquadding, Square and Circle shapes with/C//ICcolour and/BSwidth, Line and Ink strokes, and Highlight / Underline / StrikeOut / Squiggly quad markup honouring/QuadPointsand/CAopacity - Hidden annotations (the
/Fhidden 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
rowspanandcolspancells 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
SubsetLoadedFontsnow 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
DownsampleLoadedImagesnow resizes supported 8-bit Separation and DeviceN image samples directly in component space and keeps the original colour-space graph, tint transform, colourants,/Decoderanges 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 viaTJpeg2000Bitmap.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
#idreuse whilst continuing to reject scripts, external resources, images, and unsupported active content
Version 2.712.0
Changed
ReplaceLoadedPageTextnow replaces matches spanningTJstring 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
SyntheticBaseresolution 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.DrawAztecand the standaloneTHPDFAztecunit: 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.ExtractLoadedPageTextand 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
Ceiluniformly 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,SaveLoadedPagesToTiffBandedandSaveLoadedPagesToTiffStreamBanded, writing compressed image data row by row through band encoders so very large pages never need a complete framebuffer;THPDFBandImageExportInforeports 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.SaveLoadedDocumentandSaveLoadedDocumentToStreamnow validate theGTS_PDFA1OutputIntent (inherited from the source catalog or freshly registered) and emit thepdfaid:part/pdfaid:conformanceXMP identification whenPDFAComplianceis set, whilst preserving an existing pdfaid packet byte-for-byte on re-save - Added vertical writing (WMode 1) consumption on the load side: CIDFont
/W2and/DW2cell 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/Wadvances
Version 2.704.0
Added
- Added parallel loaded-page tile and band rendering via
THotPDF.RenderLoadedPageTilesParallelandTHotPDF.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 onesignatures/signHashrequest for an ordered same-algorithm batch whilst enforcing local and credentialmultisignlimits, 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.RenewPAdESLTATimestampwith 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,HPDFParsePFXByLocalKeyIDandTHPDFCMSSignOptions.PFXLocalKeyID, including strict single-valuedlocalKeyIdandfriendlyNamebag 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
keyLengthvalidation 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.NavigateUriinheritance so descendantPath,Glyphsand nested Canvas visuals receive the scoped URI unless they override it, preserving external, mail, package-page and percent-decodedLinkTargetactions 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
Opacityand solid, gradient or imageCanvas.OpacityMaskvalues 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.Clipconversion for abbreviated geometry, local or remoteStaticResourcePathGeometryvalues, direct property elements, structured line, Bézier, quadratic and arc figures, geometry transforms, empty clips, and nestedEvenOddorNonZeroclipping through PDFW*orW, 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
PathandGlyphsvisuals, preserving HTTP, HTTPS and mail links as PDF URI annotations and resolving package-relative pages plus percent-decodedLinkTargetfragments 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
VisualBrushconversion for inline or resource-backedCanvas,PathandGlyphsvisuals, hierarchical and remoteResourceDictionarylookup, absoluteViewbox, absolute or relativeViewport,None,Tileand 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
ToUnicodemaps, and amortised-linear positioned-run output with no GDI face substitution
Version 2.691.0
Added
- Added bounded OpenXPS
GlyphsIndiceslayout for strict cluster code-unit and glyph counts, explicit hundredths-of-em advances, horizontal and vertical offsets, oddBidiLevelreverse progression, solid attribute or property-element fills, opacity, native PDFTJbatching, 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.OpacityMasksupport for solid, variable-alpha multi-stop linear and elliptical radial gradient, and ordinary, tiled or reflected PNGImageBrushmasks 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 reusableRegisterLuminositySoftMaskStatebuilder with alpha-image resource binding
Version 2.689.0
Added
- Added OpenXPS
ImageBrushTile,FlipX,FlipYandFlipXYmodes 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 boundedRegisterImageTilingPatternAPI for reusable image-backed patterns
Version 2.688.0
Added
- Added OpenXPS
ImageBrush.Transformsupport for finite six-parameter attribute matrices andMatrixTransformproperty elements, concatenated after nativePathclipping and before viewport clipping and image placement so the brush can rotate, scale, skew or translate without altering its containing vector geometry; non-standardRelativeTransformand unresolved matrix resources remain explicit diagnostics
Version 2.687.0
Added
- Added matrix-controlled image XObject placement via
THPDFPage.ShowImageMatrixand extended XPS fixed-page import with package JPEG, PNG, TIFF and JPEG XRImageBrushfills, absolute or bounds-relativeViewboxandViewportmapping, 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
RadialGradientBrushvalues, 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,brainpoolP384r1andbrainpoolP512r1ECDSA 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
HPDFInterpretContentTokensDeviceand the optional completeIHPDFContentOperatorDeviceextension, with one cancellation checkpoint per operator, compile-time operator-index caching for operand-scan-free display-list replay, publicOperatorCountmetrics, preserved semantic-device compatibility, corrected",vandyoperator semantics, and legalEIterminator handling with no false fallback diagnostics
Version 2.680.0
Added
- Added bounded transactional
RepairPDFA4overloads 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
ConfigureCryptFilterDefaultsandSetStreamCryptFilter, including password and public-key reserved filters,/Identity, writer-correct password-security/EFFand leading/Cryptpipelines, 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
BeginIncrementalUpdateoverload 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/Encryptreferences, 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-identifiergeneration 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
SignerInforecords by way ofHPDFCMSBuildMultiSignedDataandHPDFCMSMergeSignedData, 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
SubjectKeyIdentifiersigner identities viaTHPDFCMSSignOptions.SignerIdentifier, including compact IMPLICIT SID encoding, automaticSignerInfoandSignedDataversion 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 6211CMSAlgorithmProtection, 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.ValidatePDFMACChainwith oldest-to-newest incremental-revision validation, cumulative classic or xref-stream indexing, exact revision and xref failure locations, historical MAC replacement detection, stableKDFSaltenforcement, rejection of digest-strength downgrades, authenticated/Pand/Permschecks, preflight reporting, and bounded revision parsing without temporary PDF copies
Version 2.666.0
Added
- Added
THotPDF.SignPDFWithPFXAndAttachedPDFMACplus signature-attached validation with direct active-trailerAuthCode, indirectSigObjRef, 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.RegisterNChannelColorSpaceto emit the ISO 32000-2 five-elementDeviceNform with/Subtype /NChanneland 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/NChannelfamily 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
MacDatawith 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:
renderrasterises each selected page to<prefix>-page<N>.pngthrough the loaded-page bitmap pipeline (--pagesrange,--dpi10..2400, default 150),tablesextracts typed tables to CSV or JSON viaExportLoadedTypedTables(--json,-ofile or console) andcompareprints the JSON comparison report of two documents throughHPDFDocCompareDocuments(--mode0..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 withcmsFLAGS_NOOPTIMIZEon 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
gvartuples, IUP interpolation, simple and composite outline updates, phantom-point metrics, baking ofHVAR,VVARandMVAR, 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
/Contentsarrays 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,CIDToGIDMapand descendant mappings just once