HotPDF Release Notes
Version history for HotPDF user-visible features, fixes, compatibility updates, and documentation changes
Note: Only the latest 800 change records are kept
Last release
- Latest version: 2.974.0; Release date: 2026-10-11
Version 2.974.0
Added
- Remove page annotations by exact page and Unicode name, including popup and reply cascades, through bounded native APIs, Windows transactions, JSON jobs and versioned callbacks with authenticated permissions and publication rollback
Version 2.973.0
Added
- Exchange binary FDF annotations with preserved appearance resources, shared object graphs and local action destinations through native APIs, Windows interchange and versioned callbacks
Version 2.972.0
Added
- Render annotation default appearances with preserved text state, automatic fitting, rich-text spacing and text clipping, including rendering modes 4 through 7
Version 2.971.1
Fixed
- Prevent range-check failures in the public shaped-run cache on FPC 3.3.1 Windows builds by preserving explicit 32-bit modular hash multiplication, exact cache-key isolation and LRU eviction
Version 2.971.0
Added
- Match root :scope and admit static hover, active and focus pseudo classes with inactive interaction state, preserving negation, logical and relative selectors, support queries and saved FDF/XFDF appearances
Version 2.970.0
Added
- Evaluate native rich-text @supports groups and supports() imports with supported declaration and selector queries, bounded nested conditions, namespace-aware probes, cancellation recovery and computed saved FDF/XFDF appearances
Version 2.969.0
Added
- Evaluate finite calc, min, max and clamp expressions, root-relative and explicit viewport lengths, and final-font line and spacing metrics in native rich-text decoding, saved field appearances and rich FDF/XFDF imports
Fixed
- Admit exact minimum media dimensions, resolution and initial font sizes consistently across compiler targets while continuing to refuse values below the supported bound
Version 2.968.0
Added
- Evaluate explicit rich-text color scheme, reduced motion, transparency and data preferences, contrast, forced and inverted colors, and scripting availability while preserving unknown omitted preferences and computed saved appearances
Version 2.967.0
Added
- Apply caller-supplied linked and imported rich-text style sheets with shared preferred or alternate title sets, bounded URI and document-base resolution, and transactional native, Windows and Linux FDF/XFDF publication
Version 2.966.0
Added
- Evaluate native rich-text media queries with explicit print/screen profiles, nested conditions and bounded feature ranges, retaining computed styles in saved appearances and transactional FDF/XFDF imports
Version 2.965.0
Added
- Create, clone and edit native XFA form trees transactionally, preserving surviving node identities, event rollback, supported empty-merge occurrences and saved form packets independently of authored templates
Version 2.964.0
Added
- Generate native plain, rich, shaped and family appearances from complete OpenType CFF2 fonts at default variation coordinates, preserving glyph identity, Unicode, widths and embedding permissions in bounded static CID-keyed CFF 1 output
Version 2.963.0
Added
- Apply scoped CSS namespace declarations and qualified selectors to native rich-text fields and Windows/Linux form transactions, preserving computed appearances, bounded namespace lookup, exact no-op publication and checked-build compatibility
Version 2.962.0
Added
- Wrap generated raw-font annotation text at space and hyphen boundaries across style runs, preserving complete encoded characters, hard breaks, automatic sizing and bounded cancellation
Version 2.961.0
Added
- Render missing annotation text appearances with original Type1C, CIDFontType0C and bare Type1 font programs, preserving Unicode mappings, automatic sizing, spacing, line height and bounded immutable resources
Version 2.960.0
Added
- Transport standard XFDF Stamp normal, rollover and down Form appearances with embedded font and image resources, bounded acyclic graphs, authenticated native transactions and existing Windows/Linux callbacks
Version 2.959.0
Added
- Apply complex not lists, forgiving is and where lists, anchored has relations and filtered nth-child positions to native internal rich-text style sheets, preserving selector specificity, computed values, fonts and transactional FDF/XFDF appearances
Version 2.958.0
Added
- Access live native Data DOM child collections through read-only numeric indices in JavaScript and FormCalc, preserving current child order, retained script-object references, independent clones, saved values and PDF appearances
Fixed
- Reject numeric assignment, deletion and property definition both on current collections and inside retained lexical script objects, with bounded event rollback and retry
Version 2.957.0
Added
- Apply attribute selectors, sibling combinators, structural and positional pseudo classes, inherited language matching and compound negation to native internal rich-text style sheets, preserving actual computed values, fonts, saved appearances and transactional FDF/XFDF imports
Version 2.956.1
Fixed
- Resolve FormCalc nodes child-list paths through the actual event compiler, preserving live form/property collections, Data DOM item access, bounded replay, saved native values and PDF appearances
Version 2.956.0
Added
- Generate native plain, rich and shaped field appearances from complete OpenType CFF fonts, preserving name-keyed glyph identities, actual CID-keyed charsets, Unicode mappings, embedding permissions and shared font resources; render missing FreeText appearances using embedded OpenType defaults
Fixed
- Bound CFF parsing and glyph metrics, retain cancellation and immutable per-style readers, and preserve TrueType behavior across six native compiler targets
Version 2.955.1
Security
- Reject all-zero X25519 and X448 shared secrets after canonical byte serialization, including low-order inputs whose weak field limbs are nonzero, and keep the agreement result false with an empty secret and a fresh diagnostic
Fixed
- Preserve portable SHA3/SHAKE constants and intentional modulo-2^64 key-agreement arithmetic when integer overflow and range checks are enabled, including full-width P-256, P-384 and P-521 exchanges on 32-bit Free Pascal
Version 2.955.0
Added
- Add live JavaScript form/property child collections with length, indexed reads, item, namedItem, iteration and independent clones; retain owner identity across events, repeated-instance edits and implicit property creation, with saved native values and PDF appearances
Fixed
- Keep retained live lists attached to their current event owner, reject removed owners without retargeting another instance, and preserve native values, retained state and journal rollback under collection allocation, operation and deadline failures
Version 2.954.0
Added
- Apply internal XHTML style sheets to native rich-text fields and FDF/XFDF imports with type, class and ID selectors, descendant and child combinators, grouped selectors, Unicode identifier escapes, specificity, importance and source order
Fixed
- Preserve computed styles in actual saved values and widget appearances, with bounded scanning and matching, cancellation, exact committed no-op bytes and transactional callback rollback
Version 2.953.0
Added
- Add independent XFA query node collections with all, classAll, classIndex, clone and membership operations, stable retained references, bounded transactional replay and native saved-PDF consumption
Fixed
- Keep retained queried instance managers attached to the current event graph and evaluate ordinary SOM paths and predicates within the original default-stack and operation limits
Version 2.952.0
Added
- Preserve remote GoToR annotation destinations through native, ordinary Windows and versioned callback XFDF exchange, including exact coordinates, Unicode file specifications and optional window behavior
Fixed
- Authenticate ordinary loaded-document annotation imports against original encryption permissions, signatures and field locks while retaining permitted caller edits and independent source lifetime; read signature ByteRange integers without Single rounding and detach shared RC4 string storage before encryption
Version 2.951.0
Added
- Render bounded cloudy borders for Square, Circle, Polygon and FreeText annotations without normal appearances, preserving width, dash, opacity and source graphs; share immutable generated font bytes across FreeText views without repeated decoded-byte charges while retaining parsing budgets and cancellation
Version 2.950.0
Added
- Create, clone, rename, insert and remove native XFA Data DOM nodes with bounded ownership, inherited namespaces, stable imported references, binding refresh and complete event rollback; preserve UTF-8 attributes and retained FormCalc references through saved XML and native PDF consumers
Version 2.949.0
Added
- Preserve the distinction between no selected choice options and a selected empty export value through native, Windows and Linux XFDF exchange, with exact no-op publication, bounded validation and checked encrypted-document loading
Version 2.948.0
Fixed
- Render filled glyph masks with captured fractional clip coverage while preserving PDF paths, patterns, alpha and blend operators, and check raster working-memory capacity before allocation
Version 2.947.1
Fixed
- Preserve explicit empty default XML namespace declarations during XFA parsing and serialization, preventing unqualified data subtrees from inheriting an ancestor namespace after save and reload
Version 2.947.0
Added
- Render beveled and inset rectangular annotation borders and measured Unicode or rich line captions, preserving opacity, endpoint offsets, existing appearances, bounded font resources and annotation clipping
Version 2.946.3
Fixed
- Apply xfa.host.resetData through native events without misreading it as a Data XML import, preserving template defaults, bound values, repeated scopes, pending edits and transactional rollback
Version 2.946.2
Fixed
- Fix SHA-1, SHA-256, SHA-384 and SHA-512 word arithmetic with compiler range and overflow checks enabled, preserving valid digests and AES-256 password authentication without changing public interfaces
Version 2.946.1
Fixed
- Preserve present-empty XFA attributes and UTF-8 names, values, namespaces and indexed queries through native XML serialization, persistent property defaults, repeated script events and transactional rollback
Version 2.946.0
Added
- Render temporary rich annotation text with explicit read-only Preview/Print font permissions and unchanged full-font bytes, preserving editable embedding policies and existing Screen appearances without implicit media placeholders
Version 2.945.0
Added
- Preserve local annotation page and named destinations through native and legacy XFDF exchange, with exact bounded decimal tokens, qualified Adobe XML, duplicate-attribute validation and transactional Windows/Linux callback publication
Version 2.944.0
Added
- Manage live XFA choice display and export items through JavaScript and FormCalc, preserving surviving aliases, exact duplicate or empty selections, native per-instance lists and saved native or legacy PDF appearances under bounded mutation limits
Version 2.943.1
Fixed
- Preserve exact loaded PDF bytes when native mixed scalar and typed rich-text transactions or empty batches make no changes, retaining pending graph edits, authenticated signature and encryption policies, resource limits and atomic publication
Version 2.943.0
Added
- Exchange mapped annotation XFDF through Windows file jobs and original V1 callbacks with authenticated append transactions, bounded binary and Unicode data, exact no-op bytes and atomic publication
Version 2.942.0
Added
- Render supported annotations without normal appearances through bounded temporary geometry, line endings, icons and Unicode FreeText, retaining source resources, rich text, view/print flags and cancellation
Version 2.941.1
Fixed
- Validate native XFA choice selection uniqueness with bounded cancellable sorting while preserving exact case-sensitive export values, original selection order and transactional failure behavior
Version 2.941.0
Added
- Apply independently cascaded native CSS and original typed letter and word spacing to shaped runs, physical lines, fitting and saved appearances, with computed point serialization, exact decimal rounding and transactional Windows/Linux JSON publication
Version 2.940.0
Added
- Exchange eighteen mapped annotation types through bounded native XFDF and Linux V1 JSON operations, preserving Unicode rich contents, callouts, transparent colors, binary attachments, popup and forward-reply links, authenticated permissions and transactional append publication
Version 2.939.0
Added
- Create legacy XFA combo and list fields with exact repeated-instance exports, display labels, selected indices, scroll positions and styled Unicode appearances, preserving high field flags and per-field rollback with a supplied-font detached choice factory and metadata-only mode
Version 2.938.0
Added
- Render the four standard color intents across graphics states, forms, images, shadings, patterns and transparency groups with image overrides, relative fallback for unknown names and bounded cancellable ICC transform caching
Version 2.937.0
Added
- Create independent legacy XFA radio groups from actual repeated instance scopes, preserving exact exports, selected states and styled Unicode captions with whole-group adoption rollback and a detached supplied-font native member appearance API
Version 2.936.1
Added
- Parse valid PDF dictionaries and trailers with arithmetic overflow checking enabled by explicitly retaining the low32 bits of the FNV hash multiplication
Version 2.936.0
Added
- Bind explicit typed JSON rich-text line heights to Windows and Linux saved appearances, preserving authored runs, supplied parent metrics, bounded aggregate planning and transactional mixed-field updates
Version 2.935.1
Added
- Count supplementary Unicode characters once in portable XFA password appearances, retain original values and enforce aggregate glyph budgets before allocating masks with scalar-granular cancellation
Version 2.935.0
Added
- Preserve rich-text line height, computed CSS lengths, inherited factors and parent font metrics across native layout, saved appearances, Windows file jobs and callbacks, and Linux FDF/XFDF JSON imports with bounded metric-font planning
Version 2.934.0
Added
- Create real Unicode legacy XFA text, numeric, date and password appearances with effective per-instance font family and style, editable embedded font resources, scalar password masking and transactional resource adoption
Version 2.933.0
Added
- Evaluate multidimensional sampled cubic color functions with the existing four-knot scalar convention, short-dimension linear fallback, bounded tensor work, cancellation and unchanged scalar interpolation
Version 2.932.0
Added
- Decode signed and unsigned JPEG 2000 components through26 bits with mixed precision, subsampling and opacity, normalize bounded samples and ignore JPX image BitsPerComponent declarations before rendering
Version 2.931.0
Added
- Preserve legacy XFA checkbox on, off and neutral export states, styled Unicode captions and native appearance bundles, encode special PDF names consistently, and restore direct page resources after cancelled widget adoption
Version 2.930.0
Added
- Evaluate automatic optional-content usage applications with explicit zoom, language and user context, persistent native manual selections and bounded Linux JSON operation state; invalidate borrowed rendering contexts after document changes
Version 2.929.0
Added
- Build scalar text, comb cells, choice labels and button marks from ordered supplied regular font families across native setters, Windows jobs and versioned Windows/Linux callbacks; preserve ordinary scalar metadata and distinguish an empty choice selection from a selected empty export
Version 2.928.0
Added
- Render ExtGState dash arrays and phases with bounded typed PDF array scanning, preserving comments, strict operand validation, inherited stroke geometry, cancellation and ordinary text arrays
Version 2.927.0
Added
- Paint original Windows ApplyXFAAsAcroForm push-button scalar and rich captions with actual installed family/style programs, persistent per-instance overrides and native normal/down/rollover appearance bundles, registering genuine AcroForm font resources
Version 2.926.0
Added
- Expand bounded inline CSS font shorthand into independently cascaded size, weight, italic and supplied-family candidates, preserving inherited relative sizing, omitted-style resets, important component priorities and actual saved font appearances
Version 2.925.0
Added
- Select ordered caller-supplied font families for complete styled rich-text graphemes through Windows file jobs and V1 callbacks, preserving CSS and typed candidates, genuine empty-value transactions and aggregate font budgets
Version 2.924.0
Added
- Render default document optional-content groups and membership expressions across marked page content, form XObjects and annotations, preserve hidden graphics and text state, and expose explicit view or print usage through the native Linux V1 JSON interface
Version 2.923.0
Added
- Preserve ordered rich-text font candidate lists through native appearances and Linux V1 JSON, and bind mixed scalar and original typed runs to Windows file jobs and unchanged V1 callbacks with precise paint, supplied style programs and two-phase publication
Version 2.922.0
Added
- Select native annotation view or print visibility with PDF 2.0 Invisible rules, recognize RichMedia and Projection static appearances and implicit Text transforms, and retain bounded cancellable Windows PNG atomic replacement with actual OS error diagnostics
Version 2.921.0
Added
- Render native XFA push-button scalar and XHTML captions with genuine supplied family and style programs, preserved inline separators and authored padding, actual normal/down/rollover appearances, caption visibility and persistent repeated-instance overrides
Version 2.920.1
Fixed
- Keep successful native Linux C ABI PDF mutations aligned with their committed source snapshot, so following same-value FDF or XFDF imports preserve the exact published form values, typed appearances, drawn text and imported pages instead of restoring stale input bytes
Version 2.920.0
Added
- Save mixed scalar fields and original typed rich-text runs in one independent atomic document transaction, retain precise appearance values and supplied font programs, preserve authenticated policies and current graph edits, and recognize genuine read-only appearance no-ops
Version 2.919.0
Added
- Resolve complete styled Unicode graphemes through explicitly supplied candidate font families, preserve authored values and precise appearance styles, expose opt-in native Linux JSON fallback through unchanged V1 callbacks, and retain the actual aggregate font allowance while loading configured programs
Version 2.918.0
Added
- Render native XFA Boolean captions from effective XHTML and supplied named style fonts, preserve repeated-instance overlays and saved runtime XML, and measure automatic caption reserves with final logical text-line extents
Version 2.917.0
Added
- Select genuine named family and style programs for Windows FDF and XFDF imports through nested file paths or existing versioned font callbacks, and isolate synchronized random source reads from sequential transaction publication
Version 2.916.0
Added
- Decode and render 182 built-in legacy CMaps with bounded one-to-four-byte codes, exact parent and child writing modes, Unicode mappings, deterministic malformed-code recovery, cancellable inheritance and bundled redistribution notices
Version 2.915.0
Added
- Keep selected native XFA list options visible through font-metric selection windows and persisted top indices, preserve complete option and value arrays, and retain repeated-instance font changes and event rollback with bounded visible glyph preparation
Version 2.914.1
Fixed
- Overlap foreground memory-cache hits with cooperative prefetch cancellation after acquiring the real memory reservation, preserve operation cache telemetry and recheck cancellation after cache-lock or reservation waits while retaining strict miss ordering and thread joins
Version 2.914.0
Added
- Create native XFA Boolean appearances with six custom marks, round or square borders, mark colors and sizes, five caption placements and shared embedded caption fonts; preserve reversible Unicode export aliases and distinct legal neutral states through event execution and saved PDF reload
Version 2.913.2
Fixed
- Decode complete rotated matrix barcodes before disconnected fragments and reject exact QR finder mismatches before full-grid sampling, retaining tighter grouping, original linear-bar behavior, atomic scan budgets and the unchanged two-second deadline
Version 2.913.1
Added
- Resolve existing implicit XFA values through bounded live data contexts without repeating selector parsing charged to the script operation allowance, preserving original transaction deadlines and explicit binding behavior
Version 2.913.0
Added
- Select configured native rich font families through unchanged Linux V1 JSON callbacks for typed fills and FDF or XFDF imports, load actual required family and style programs with aggregate budgets, and advertise both implemented rich profiles
Version 2.912.0
Added
- Import and export real FDF or XFDF through Windows file jobs and V1 callbacks with immutable owned input, current unsaved graph preparation, actual four-font rich appearances, authenticated signed AES policies and context commit only after both output callbacks succeed
Version 2.911.0
Added
- Create native XFA rectangle, line and arc draws and inline PNG or JPEG images with actual sample decoding, alpha masks, fitted aspect and rotated placement, bounded preparation and transactional ownership under cancellation
Version 2.910.0
Added
- Fit NoZoom and NoRotate annotation appearances around the transformed upper-left rectangle anchor, preserving UserUnit, fitted form geometry, opacity and the actual page clip across scale and rotation
Version 2.909.0
Added
- Select actual supplied named TrueType families per rich run and bounded XHTML font-family declaration, preserve per-family style metrics and mark caches, and import real FDF or XFDF rich values with family-aware canonical comparison
Version 2.908.1
Fixed
- Apply valid inline rich-text declarations with independent important priority, enclosing computed font-size bases and explicit inherited properties, preserving CSS comment and quoted/function declaration boundaries
Version 2.908.0
Added
- Create genuine native XFA combo boxes, list boxes, multi-selection fields, checkboxes and structurally scoped radio groups directly from saved runtime data, with paired display/export labels, per-instance items, access flags and independent native appearance states
Version 2.907.1
Fixed
- Decode actual PDF hexadecimal escapes and UTF-8 bytes in name-valued and inherited form fields, preserving spaced, punctuated and Unicode button export states through native saved-document reload
Version 2.907.0
Added
- Render real CID-keyed CFF glyph identities and bounded notdef substitutions through actual font CID-to-GID mappings, preserving independent text extraction and cancellation checks throughout escaped CMap parsing
Version 2.906.0
Added
- Position cross-style combining marks using actual selected glyph bounds and canonical combining classes when attachment anchors are absent, with independent font scales, same-side stacking and actual resolved item directions for double marks
Version 2.905.1
Fixed
- Resolve escaped predictor parameters within the actual DecodeParms dictionary and locate the real stream token after balanced outer dictionary syntax, preserving whitespace-valued binary xref payloads in ordinary Windows loading
Version 2.905.0
Added
- Create native PDF page trees, repeated editable fields, push buttons and Unicode static text directly from XDP and saved runtime values on Linux and Windows, with genuine embedded appearances and bounded candidate preparation before caller output
Version 2.904.2
Fixed
- Read actual outer cross-reference stream dictionaries without confusing nested encryption settings, resolve escaped entry names and preserve direct encryption dictionaries in ordinary Windows incremental revisions
Version 2.904.1
Fixed
- Preserve complete paragraph direction controls and paired brackets through automatic standalone shaping and plain multiline field wrapping, with physical-line joining contexts, immutable paragraph caching and bounded total glyph output
Version 2.904.0
Added
- Execute the native XFA JavaScript, event journal, Data DOM, XML, FormCalc and ICU locale runtime on Linux with owned shared-module leases and real monotonic clocks while preserving existing Windows Unicode initialization
Version 2.903.1
Fixed
- Keep Unicode directional-only shaping clusters at zero character-spacing advance while retaining logical controls, glyph identities and normal visible-cluster and word spacing
Version 2.903.0
Added
- Preserve directional embeddings, overrides, isolates and paired-bracket paragraph context across wrapped rich style lines, expose bounded paragraph-derived and cached physical-line ordering APIs and shape actual line items with resolved levels and scripts
Version 2.902.0
Added
- Import and export styled FDF and XFDF through real Linux JSON C ABI callbacks, embed configured genuine font faces, preserve signature policies and exact private source bytes for no-op imports, and publish current document state only after both callback outputs succeed
Version 2.901.0
Added
- Render Coons and tensor patch mesh shadings with bounded cubic geometry, source-space color interpolation, continuation edges, fold handling and transactional resource and cancellation limits
Version 2.900.0
Added
- Load and save namespace-aware native XFA Data DOM XML transactionally, preserve ordered mixed content and data binding identities, quote host values in linear time and retain an exact per-session JavaScript module lease through bounded engine replay
Version 2.899.0
Added
- Attach styled combining marks to actual GPOS base, ligature and mark anchors with independent font scales, preserve negative-origin glyph outlines inside rich widget clips and reserve fitting line extents for visible stacked marks
Version 2.898.0
Added
- Read and write bounded FDF and XFDF rich text, decode native XHTML style spans into four genuine embedded font styles and transactionally import real appearances into signed or encrypted PDFs, including canonical comparison of existing read-only rich values
Version 2.897.0
Added
- Shape selected Unicode style spans with genuine surrounding HarfBuzz context, expose native paragraph order and direction APIs and place typed rich items within actual wrapped physical lines while preserving logical styles and object ownership
Version 2.896.0
Added
- Resolve native XFA binding SOM through repeated data scopes with bounded descendant traversal, escaped names, Unicode matching, per-instance missing-leaf fallbacks and transactional runtime value synchronization
Version 2.895.1
Fixed
- Compile static native XFA event support once per owned JavaScript engine and replay complete compact dynamic event arguments, preserving closures, recorded host responses, instance isolation, original journal budgets and transaction deadlines during rollback
Version 2.895.0
Added
- Import and export actual FDF and XFDF bytes through existing versioned native Linux JSON callbacks, preserve Unicode field values, AES security and authenticated signature policies, and roll back the current document after failed output or result publication
Version 2.894.0
Fixed
- Wrap overwide typed rich text at complete Unicode grapheme boundaries across font and color styles, measure actual styled ranges before line assignment and preserve indivisible oversized clusters, mixed point sizes and explicit character spacing
Version 2.893.1
Security
- Authenticate required Adobe signed CRL and OCSP evidence inside genuine RFC3161 document timestamps before accepting signature policy protected form updates, preserving transactional refusal for missing, revoked, expired or untrusted evidence
Version 2.893.0
Added
- Read and write bounded native FDF and XFDF scalar field data and transactionally import real Unicode, choice and button appearances into independently published PDFs, preserving authenticated signature policies and AES encryption
Version 2.892.0
Added
- Render bounded free-form and lattice triangle mesh shadings with genuine coordinate, flag, function, color and transparency semantics, and decode hexadecimal Indexed palette streams exactly once
Version 2.891.0
Added
- Preserve ordered native XFA XML comments and processing instructions through event import, serialization, cloning and transactional rollback, while excluding them from scalar text, rich text and SOM element selection
Version 2.890.1
Fixed
- Recover transient Windows atomic publication locks with at most eight cancellable replacement attempts while preserving exact targets, prepared bytes, permanent operating-system errors and owned staging cleanup
Version 2.890.0
Added
- Preserve legal Unicode word, nonbreaking-space, punctuation and numeric groups across typed rich style runs, fit whole groups with real styled font advances, retain mixed-size baselines and coalesce CRLF across style seams
Version 2.889.0
Added
- Synchronize materialized hidden and invisible XFA scalar aliases after visible field commits while preserving native repeated data scopes, explicit empty values and exact transactional rollback
Version 2.888.0
Added
- Apply complete Unicode 17 properties and contextual line breaking through existing document APIs, expose raw or LB1-resolved portable property queries, preserve established enum ordinals and tailoring contracts, and honor soft-hyphen prohibitions
Version 2.887.0
Added
- Import and serialize persistent native XFA exData XML with immediate script reads, namespace and mixed-content preservation, retained repeated-instance identities, transactional rollback and genuine saved XHTML rendering
Version 2.886.0
Added
- Create and authenticate standalone RFC3161 PDF document timestamps with bounded streaming, SHA256, SHA384 or SHA512 imprints, trusted TSA identity and nonce binding, required ESIC extension declarations and authenticated certification or field-lock exceptions
Version 2.885.0
Added
- Expose Unicode 17 default line-break opportunities and consume them in actual native rich fields, preserving nonbreaking-space, hyphen and punctuation groups and Unicode explicit separators with exact original V and RV values
Version 2.884.0
Added
- Expose portable Unicode 17 default extended grapheme boundaries and wrap overwide rich words at complete clusters, retaining actual Unicode appearance content and correcting joining-form width changes after substring shaping
Version 2.883.0
Added
- Create persistent native XFA image and geometric value children and render real PNG alpha, image DPI and aspect geometry, preserving repeated-instance isolation and transactional rollback; correct FPC image pixels that previously rendered black
Version 2.882.0
Added
- Inherit actual child-stream font resources and PDF text parameters in Form, Type3 and Pattern rendering, preserve graphics-state text saves, honor invisible Type3 text and reset independent annotation appearance defaults
Version 2.881.0
Added
- Automatically authenticate standard detached CAdES signatures with required signing-certificate binding and read genuine hexadecimal or escaped literal Contents strings consistently for verification, permitted form updates and long-term validation evidence
Version 2.880.2
Fixed
- Retain rich paragraph alignment across empty initial runs, inline style changes and explicit line breaks, and paint requested rectangle or circle borders and measured highlighted rows instead of silently omitting them
Version 2.880.1
Fixed
- Observe cancellation before page renderer allocation and context installation and during initialization, preserve an active caller color context when construction is initially rejected, and release borrowed display lists without publishing partial bitmaps
Version 2.880.0
Added
- Render actual native XFA scalar draw and caption values after script creation, preserve explicitly empty values and repeated-instance isolation, and retain exact rollback when later native drawing exhausts its budget
Version 2.879.0
Added
- Create persistent native XFA scalar value children with immediate field, data and shared-alias synchronization, typed form persistence, widget commits, repeated-instance isolation and exact transactional rollback
Version 2.878.0
Added
- Generate actual Windows signature appearance profiles with embedded Unicode fonts for merged and separate widgets, rotation, encryption and certification workflows, and enforce required AppearanceFilter against the profile actually generated
Version 2.877.0
Added
- Render actual colored and uncolored PDF tiling and shading patterns with inherited pattern origins, nested cells, overlap, stroke and stencil paints, transparency and bounded cancellation across native Linux and Windows targets
Version 2.876.1
Fixed
- Preserve complete XFA SOM binding and actual emitted-instance data selection while applying missing-instance form and template defaults, without borrowing values from another repeated occurrence
Version 2.876.0
Added
- Embed authenticated CRL and OCSP evidence in signed Windows Adobe RevocationInfoArchival attributes, enforce actual seed policies and validate trusted status, response authorization and freshness before publishing signatures
Version 2.875.0
Added
- Resolve actual XFA field defaults without manufacturing data while reading, preserve explicit empty instance values and ensure edits write independent instance data without modifying shared templates
Version 2.874.0
Added
- Edit native rich-text fields with typed Unicode style runs, actual embedded regular, bold, italic and bold-italic fonts, measured mixed-size appearance baselines, decorations and synchronized V/RV values across widgets and encrypted output
Version 2.873.0
Added
- Create persistent per-instance XFA UI choices through native scripts and consume actual text, password and choice widgets with multiline and measured long-word appearances
Version 2.872.0
Added
- Create actual Windows DocMDP certification signatures with P1, P2 or P3 permissions and authenticated Unicode legal attestations, honor required seed policies and FieldMDP locks, and permit subsequent signatures only where the signed policy allows them
Version 2.871.1
Fixed
- Execute XFA event bodies in their own lexical and strict scope while preserving field aliases in the outer scope, the event this value, explicit returns and exact failure rollback
Version 2.871.0
Added
- Create missing XFA font, paragraph, fill, color, border, edge and corner properties through actual native event scripts, persist stable per-instance form bindings with exact rollback, and regenerate optional widget appearances after effective style changes
Version 2.870.0
Added
- Render actual native Windows Cairo output with explicit GDI standard-font outlines and correct Win32 OpenJPEG calling conventions, using reproducible pinned native dependencies and independent output acceptance
Version 2.869.0
Added
- Sign Windows documents with real synchronous C ABI RFC 3161 transport callbacks and SHA256, SHA384 or SHA512 imprints, authenticated TSA trust and CRL checks, required timestamp seed constraints and bounded transactional publication
Version 2.868.0
Added
- Generate masked password and literal file-select field appearances with preserved Unicode values and AES-256 policies, carry escaped supplementary Unicode through the native JSON ABI, retain subnormal PDF decimal source tokens, and create RGB prefetch buffers without a screen DC
Version 2.867.0
Added
- Wrap XFA rich text across inline styles with measured word boundaries, explicit line breaks, shared line baselines and alignment, actual justified word gaps and fragment link geometry, preserving native repeated-instance XDP persistence
Version 2.866.1
Added
- Authenticate raw-signature RFC 3161 tokens using their actual supported SHA256, SHA384 or SHA512 message imprint algorithm while retaining the existing SHA256 request default and full token trust and revocation checks
Version 2.866.0
Added
- Align mixed-size XFA rich text runs to a common saved-PDF baseline, preserve the caller text-position mode, and apply the larger adjacent paragraph margin including empty paragraph transitions
Version 2.865.0
Added
- Request and authenticate RFC 3161 timestamps for explicit SHA256, SHA384 and SHA512 message imprints without hashing the imprint again, preserving strict digest lengths, fresh nonces, bounded transport, trust chains and revocation validation
Version 2.864.0
Fixed
- Preserve the original barcode scan deadline by prioritizing complete linear rasters and quiet-zone candidate groups, and reject invalid DataMatrix projective finder borders before sampling interior modules without changing finder tolerances
Version 2.863.0
Added
- Honor valid inherited Windows signature seed and certificate constraints with actual digest and CAdES selection, Unicode signature information, normalized indirect field locks, authenticated historical lock permissions, permitted second signatures and encrypted form policies
Version 2.862.0
Added
- Render actual native function, axial and radial PDF shadings with bounded geometry and function evaluation, inherited clipping, Domain, Matrix, Extend and BBox semantics, calibrated and special colors, transparency, soft masks, blending and knockout groups
Version 2.861.0
Added
- Export actual native annotated contract review PDFs and explicit Unicode highlights with visible normal appearances, preserving source content and incremental signature revisions, enforcing authenticated P3 annotation permissions and encrypted user rights, and preparing bounded outputs before callback publication
Version 2.860.0
Added
- Bind native Linux signing and verification options to actual digest selection, Unicode signature metadata, named appearance profiles, explicit trust bytes, timestamp transport identity and authenticated revocation evidence, with bounded private preparation before publication
Version 2.859.0
Added
- Apply live per-instance XFA font, paragraph and scalar body overrides to actual rich text drawing and measurement, preserve inline CSS precedence and explicit empty content through native XDP persistence, and retain exact transactional rollback
Version 2.858.0
Added
- Decode escaped PDF font, encoding, glyph, color and resource names exactly once in native rendering and shared text extraction, preserve literal hash resource keys and keep equivalent names aligned with actual outlines and glyph metrics
Version 2.857.0
Added
- Compare native documents by page and object counts, Unicode text, normalized structural graphs and actual rendered RGB or luminance pixels, with semantic stream equivalence, authenticated encrypted inputs and bounded preparation before callback publication
Version 2.856.0
Added
- Select actual native signature appearance presets by registered profile name, generate distinct approval, certification and compact layouts, preserve authenticated profile metadata and encrypted policies, and reject unknown profiles before publication
Version 2.855.0
Added
- Apply native XFA property schema defaults and preserve explicit empty values, per-instance styles and fractional point font, border and draw measurements through actual AcroForm and flattened PDF output
Version 2.854.0
Added
- Expose native XFA property and attribute objects with persistent per-instance form bindings, synchronized value/data writes and actual font, border, paragraph and UI layout effects, preserving transactional rollback and scriptless focus budgets
Version 2.853.0
Added
- Embed genuine Adobe revocation evidence as authenticated CMS signed attributes, validate complete certificate and timestamp chains against explicit trust and current CRL or OCSP evidence before publication, and enforce required signature seed revocation embedding
Version 2.852.0
Added
- Write authenticated Unicode legal attestations in certification signatures, honor certification-only Legal seed requirements, preserve existing legal statistics and catalog permissions, and retain encrypted string policies
Version 2.851.0
Added
- Render physical Lab ICC source colors and bounded XYZ compatibility inputs in paths, text, packed images and Indexed palettes, preserve calibrated and ICC alternate tints through RGB or CMYK groups, and apply embedded JPX profiles with separate or associated alpha
Version 2.850.0
Added
- Convert compatible missing-font documents to searchable text and vector PDF/A-4 with explicit bounded Ghostscript font embedding, genuine veraPDF validation and atomic publication, and select native Unicode TrueType fonts consistently across distributions
Version 2.849.0
Added
- Render embedded simple Type1 and Type1C fonts with exact declared or built-in Adobe glyph encodings, keep ToUnicode extraction separate from displayed outlines, and accept validated neutral stroke-adjustment and relative colorimetric graphics state
Version 2.848.0
Added
- Resolve complete XFA descendant path suffixes within each wildcard context, preserve local occurrence boundaries and execute predicates in the current event scope with exact transactional rollback
Version 2.847.0
Added
- Enforce inherited native signature seed and certificate constraints with real issuer chains, subject and key usage policies, selectable CMS digests, encrypted Unicode signature metadata and locked-document transforms
Version 2.846.0
Added
- Expose native XFA datasets and data nodes with bidirectional form bindings, dynamic instance data mirroring, stable retained references, independent unbound form values and transactional script replay
Version 2.845.0
Added
- Emit authenticated FieldMDP references from existing or inherited signature field locks, preserve encrypted Unicode field names and certification references, and apply lock permission levels without weakening original signed policies
Version 2.844.0
Added
- Render Separation and DeviceN alternate tints with bounded vector functions, packed images and CMYK group blending, preserve None knockout geometry and map All registration colors consistently
Version 2.843.0
Added
- Resolve dynamic XFA SOM paths with inferred and relative occurrences, scoped predicates, class and descendant selectors, wildcard collections and transactional script-object property assignments
Version 2.842.0
Added
- Provide native two-document C ABI and Pascal semantic contract comparison through a shared portable core, with source glyph geometry, encrypted and nested-content inputs, prepared JSON or HTML review output and stable concurrent lock ordering
Version 2.841.0
Added
- Authenticate original CMS and CAdES revisions before native form updates, enforce original DocMDP and FieldMDP permissions and locked fields, preserve signed content and resources, and synchronize push-button caption metadata atomically
Version 2.840.0
Added
- Render calibrated CalGray, CalRGB and Lab source colors, calibrated group and page blending, Indexed bases, 16-bit image samples and XYZ luminance soft masks with bounded conversion and safe gamma evaluation
Version 2.839.0
Added
- Implement FormCalc value copying and stable node references with assignment-through-reference, rebinding and null detachment, numeric identity equality, retained handles and transactional rollback
Version 2.838.0
Added
- Execute runtime-generated FormCalc Eval programs with isolated calculation scopes, nested evaluation, Unicode source, bounded compilation retries and transactional host response replay
Version 2.837.0
Added
- Generate embedded Unicode appearances through native Linux JSON form filling for text, choice and multiselect fields, checkbox and radio states, and push-button captions, retaining transactional publication and encryption
Version 2.836.0
Added
- Provide synchronous RFC 3161 timestamp transport through a compatible extended native signing operation record, with bounded responses, shared cancellation and explicit TSA trust and revocation validation
Version 2.835.0
Added
- Execute transactional XFA host state, page and lifecycle flags, per-instance focus changes, pending-edit validation and reset operations with stable identity and lexical-state replay
Version 2.834.0
Added
- Validate CAdES signing-certificate identifiers against the actual signer independently of optional certificate trust, and resolve embedded Encoding CMap streams through the native font adapter
Version 2.833.0
Added
- Render vertical Identity-V and Unicode predefined CMaps with real W2/DW2 origins, matrices, text movement and clipping, and correctly decode embedded Encoding CMap streams
Version 2.832.0
Added
- Sign through the native Linux callback ABI with PEM or bounded PFX identities, new Unicode appearance fields and certification, and retain the prepared signed document as the current context after successful publication
Version 2.831.0
Fixed
- Apply signing seed, lock and read-only constraints consistently to encoded PDF names, reject semantic duplicate keys and validate inherited policy dictionaries
Version 2.830.0
Added
- Execute advanced XFA numeric, calendar, text and compound picture clauses through real form events, preserving input precision, locale semantics and transactional script replay
Version 2.829.0
Added
- Import native page resource graphs and transformed annotation appearances into plain or encrypted documents and convert compatible inputs to searchable text and vector PDF/A-4 with genuine validation before atomic publication
Version 2.828.0
Added
- Render four-component CMYK and ICC transparency groups and page groups with all blend modes, nested knockout geometry and shared color-profile budgets
Version 2.827.0
Added
- Execute locale-aware XFA date, time, numeric and text pictures with embedded locale sets, bounded transactional locale queries and protected JavaScript IEEE arithmetic
Version 2.826.0
Added
- Read and write Unicode array-valued choice selections, maintain sorted option indices and generate matching appearances for visible and scrolled list-box selections
Version 2.825.0
Added
- Sign encrypted documents through Windows JSON and C ABI jobs while preserving the original revisions, AES security settings, document IDs and signature permissions
Version 2.824.0
Added
- Create native Linux HTML documents, insert visible or fitted searchable Unicode text, run bounded cancellable Tesseract OCR, and author independently validated raster PDF/A-4 output through Pascal and callback APIs
- Render graphics-state Alpha/Luminosity masks, bounded transfer functions, additive transparency and page groups, knockout shapes, and extended JPEG 2000 samples, embedded color and alpha
- Validate supplied certificate, OCSP and CRL evidence before incremental DSS/VRI publication while preserving existing signatures and AES encryption
- Execute explicit typed XFA host and FormCalc transport callbacks with bounded requests, recorded responses and transactional replay
Fixed
- Preserve Unicode values and exception diagnostics returned by the Free Pascal QuickJS API
Version 2.823.0
Added
- Embed validated RFC 3161 timestamps in headless CMS signatures with message-imprint, nonce, TSA authorization, trust and supplied revocation-evidence checks, preserving destination files when a required timestamp fails
- Retain XFA script-object lexical state, nested closures and independent repeated-instance modules with deterministic bounded transactional replay
- Apply explicit character and word spacing to measured and generated headless Unicode text appearances
Fixed
- Use specification-correct FormCalc At source/search argument order and return the first position for an empty search string
Version 2.822.0
Added
- Execute general QuickJS and compiled FormCalc XFA events with live repeated-instance DOM operations, transactional standard form-packet persistence, automatic initialize/calculate/validate/ready lifecycle, bounded execution and cancellation
Fixed
- Apply specification-correct XFA financial function parameters and cash-flow formulas, Gregorian date origins and negative remainder behavior, preserving double precision across Delphi and Free Pascal
Version 2.821.0
Added
- Expand native headless document workflows with a versioned Linux C ABI, real callback-based text/form/render/sign operations, bounded cancellation and failure rollback, multiline/comb/rotated/choice/button appearances with HarfBuzz/FriBidi shaping, PFX identities, new visible signature fields and DocMDP certification
- Render bounded image masks, soft masks, Indexed/ICC colors, PDF blend modes, isolated RGB transparency groups, Type3 glyphs and text clipping, and decode JPEG, JPEG 2000, CCITT, JBIG2 and RunLength image streams through the authenticated native document path
Version 2.820.0
Added
- Fill supported native headless single-line Unicode AcroForm fields with genuine embedded TrueType appearances, exact glyph widths and CIDToGID/ToUnicode mappings, transactional multi-widget updates, preserved AES security, controlled font embedding and bounded atomic saving on Linux and Windows
Version 2.819.0
Added
- Render supported PDF paths, horizontal text, images, Forms and existing annotation appearances to PNG with native Cairo/FreeType CPU surfaces on Linux, enforce bounded work and cancellation, preserve sources, and publish PNG files atomically
Fixed
- Use canonical Adobe AFM advances for twelve standard Helvetica/Times/Courier styles when PDF widths are absent, preventing cumulative text-position drift from substitute font metrics while preserving explicit and embedded font widths
Version 2.818.0
Added
- Publish genuine native headless incremental CMS/CAdES PDF signatures on Linux and Windows using existing unsigned fields and explicit PEM credentials, preserve prior revisions and AES-256 security, verify exact signed bytes, and protect existing destinations through bounded atomic publication
Version 2.817.0
Added
- Complete bounded JSON and C ABI document jobs with validated incremental PFX signing, existing signature fields, two-document comparison, six native comparison modes and two-sided contract JSON/HTML/annotated-PDF review, including cooperative cancellation, resource limits and atomic file publication
Version 2.816.0
Added
- Verify native headless PDF signatures with exact ByteRange/Contents binding and streaming OpenSSL 3, generate genuine detached CMS/CAdES signatures from explicit PEM credentials, and report certificate trust separately from integrity on Linux and Windows
Version 2.815.0
Added
- Use the bounded XFA instance-presentation helper for conditional events, explicit repeated binding, independent instance presence and access, stable persisted identity, transactional reflow, host canvas painting and accessibility records
Version 2.814.0
Added
- Open native headless AES-256 R5/R6 documents on Linux and Windows, authenticate owner/user permissions, decode encrypted compressed objects, and save encrypted incremental form values with exact source-prefix preservation and bounded atomic output
Version 2.813.0
Added
- Reflow text in bounded page rectangles across baselines and selected shared Form invocations, change fonts and width, inspect conservative collision reports, and use sealed previews with transactional commit or rollback
Fixed
- Preserve loaded-document edits in repeated saves after object serialization, including stream-to-file saves and retries after an output failure
Version 2.812.0
Added
- Convert compatible loaded documents to PDF/A-4 while preserving original text, vectors, images and embedded resources, compose visible annotation/widget appearances, retain or add searchable OCR, report explicit losses, and validate preservation before atomic file publication
Version 2.811.0
Added
- Load cross-reference streams, hybrid reference sections and compressed object streams through the native headless document API, validate bounded member indices and revision precedence, preserve exact wide numeric source values, and save source-preserving independent incremental output on Linux and Windows
Version 2.810.0
Added
- Correct scan orientation, continuous-angle skew, shadows, borders and explicit perspective quads with bounded reversible geometry, use trusted Tesseract orientation evidence, and map OCR words, baselines, page quadrilaterals and semantic layout back to the original scan for editable structured output
Version 2.809.0
Added
- Configure local Tesseract and RapidOCR CLI or DLL engines in JSON and C ABI OCR jobs, retain Unicode searchable text and scan pixels, discover supported adapters, validate explicit settings, and enforce rendering/recognition budgets with atomic output and failed-publication rollback
Version 2.808.0
Added
- Load classic-xref PDFs in native Linux console applications, extract Unicode page and nested Form text with inherited resources, inspect and fill AcroForm text values, and publish source-preserving incremental output with typed diagnostics, cancellation, resource budgets, and atomic replacement
Version 2.807.0
Added
- Locate multiple separated native barcodes in one raster, retain repeated payloads at distinct positions, decode rotated and projective ECC 200 Data Matrix symbols with four-corner geometry, and enforce aggregate scan budgets with cancellation and atomic result publication
Version 2.806.0
Added
- Compare contract paragraphs and word or sentence edits with insert, delete, replace and move records, two-sided page locations, repeated-clause preservation, explicit boilerplate exclusions, bounded HTML review, and source-checked annotated PDF output
Version 2.805.0
Added
- Import HTML business templates with nested flex/grid panels, wrapping rows, grid column spans, images and form controls in parallel boxes, plus explicitly supplied font-face resources retained through deferred embedding and a separate decoded-image cache budget
Version 2.804.0
Added
- Build the shared PDF object, Direct File I/O, content and font decoding, compression, cryptography, and writer core as native Linux code with POSIX mapping and synchronization, preserving Windows APIs and correctly serializing classic xref entries
Version 2.803.0
Added
- Register versioned invoice profile and country-rule layers, validate explicit CII XML or hybrid invoices with scope-aware reports, and execute official XRechnung 3.0.2 and French CTC invoice rules through an explicitly configured Saxon engine, with published profile selection and failure-closed diagnostics
Version 2.802.0
Added
- Export typed tables to Office-independent XLSX workbooks through native APIs, JSON jobs, and the C ABI, preserving value types, currency and percentage formats, merged cells, exact large integers, and optional source metadata with bounded staging and failure-safe publication
Version 2.801.0
Added
- JSON jobs and the C ABI can export selected loaded pages as semantic HTML, XHTML, XML, or JSON and typed tables as CSV or JSON, with native options, bounded staging, cancellation, signature-field compatibility, source-state preservation, and atomic file publication
Version 2.800.2
Fixed
- Invalidate loaded form relationship caches before graph rollback so signing jobs and failed document edits leave the original document safe to query and reuse
Version 2.800.1
Fixed
- Ordered parallel rendering now admits memory reservations in input order so later pages cannot exhaust the budget while delivery waits for an earlier page, preserving cancellation and bounded output on Delphi and FPC
Version 2.800.0
Changed
- SVG text, loaded FreeText appearances, and loaded text replacements now preserve document shaping features, script auto-shaping flags, and GSUB script and language selections, using each selected font's OpenType data and retaining Unicode mappings across font changes
Version 2.799.0
Changed
- SVG vector imports now retain inherited dash arrays, dash offsets, and miter limits for solid and gradient strokes, while native rendering preserves phased and zero-length dash patterns
Version 2.798.0
Changed
- Styled Unicode text now retains bold and italic fonts through fallback layout; style-aware
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 behavior under explicit budgets
Version 2.796.0
Added
- Expose bounded PDF/A-4 raster archival conversion through JSON jobs and the C ABI, with explicit information-loss acceptance, structured budget failures, cooperative cancellation, source-state restoration, and atomic file output
Version 2.795.0
Added
- Loaded PDFs can now be normalized into validated PDF/A-4 raster documents with strict native rendering, verified sRGB color, bounded decoding and raster resources, cancellation, source alias protection, and atomic file publication; the conversion report identifies deliberately removed interactive and attached content
Version 2.794.0
Changed
- HTML5 import now uses measured mixed-direction text lines, widow and orphan pagination, optional hyphenation, bounded flex and grid layouts, and observable CSS diagnostics; FPC native bitmaps synchronize direct GDI drawing with LCL image caches
Version 2.793.0
Changed
- Add bounded dynamic XFA instance-manager add/remove and template presence events with layout rebinding, edit-state preservation, atomic rollback, resource limits, and persistent XDP output
Version 2.792.0
Changed
- Expand SVG import with measured embedded Unicode fonts, PNG/JPEG resources, gradient strokes, and true Alpha and Luminosity soft masks, and correct native group alpha and FPC bitmap surface compositing
Version 2.791.0
Changed
- Add previewable loaded Unicode text replacement with embedded fonts, wrapping and width policies, per-match diagnostics, stale-plan detection, bounded resources, atomic commits, and JSON/C ABI preview and apply operations
Version 2.790.0
Changed
- Implement standard CFF Type 2 stack and transient-array operations in glyph rendering and preserve arithmetic-derived local and global subroutine dependencies during font subsetting
Version 2.789.0
Changed
- Expand built-in barcode decoding with Code 128, EAN/UPC, perspective-aware QR recovery, Data Matrix ECC 200, and PDF417 with Reed-Solomon correction and bounded payload decoding
Version 2.788.0
Changed
- Windows FPC now supports native TIFF, JPEG/JPX, ICC conversion, JBIG2 and Zopfli through an ABI-validated codec bridge, and uses actual worker threads for page, ordered-page, tile, band and JPEG 2000 tile rendering with budgets, ordered callbacks, cancellation and deterministic pixels
Version 2.787.0
Changed
- The C ABI and JSON job processor now share schema-versioned document operations for capabilities, rendering, Unicode text and forms, OCR layers, redaction, and PFX signing, with explicit resource budgets, callback failure rollback, and atomic file outputs; multi-page callback inputs are loaded correctly
Version 2.786.0
Changed
- Loaded FreeText editing now rebuilds embedded Unicode and rich-text appearances atomically, with wrapping, alignment, opacity, rotation, callouts, insets, and explicit overflow policies; rewritten stream payloads are captured before mutation so transaction rollback restores original text
Version 2.785.0
Added
- The SearchableOCR console demo adds built-in OCR and Tesseract DLL or CLI engines alongside RapidOCR, generates a three-page scan sample, and exposes page selection, confidence filtering, recognition budgets, and detailed conversion statistics
Version 2.784.0
Changed
- FDF and XFDF batch imports now roll back earlier field and annotation updates after an import failure, preserve caller-owned transactions, and clear failed interchange result metadata
Version 2.782.0
Added
- The local Tesseract OCR adapter accepts configurable page segmentation, recognition engine mode, pixel limits, and timeouts through THPDFTesseractOptions for single-line, single-word, sparse-text, and vertical-block recognition
Fixed
- The native Tesseract adapter uses the cross-text box dimension for predominantly vertical baselines, preventing vertical word lengths from inflating searchable PDF text sizes
Version 2.781.0
Changed
- The Delphi and C++Builder demo collections now include a multi-page barcode field guide with business labels and a complete navigation handbook with hierarchical bookmarks, named destinations, and working companion-document links; the minimal PDF/A recipes move to Miscellaneous, and redundant standalone outline and metadata projects are retired
Version 2.780.1
Fixed
- The Showcase annotation page separates content preview captions from live free-text and stamp appearances, preventing overlapping labels in PDF readers while keeping the examples identifiable when annotation appearances are hidden
Version 2.780.0
Changed
- The demo catalogs now prioritize complete workflows and separate seventeen minimal, focused, or legacy examples into Miscellaneous subfolders; the redundant ImageCompression and AddDelPages projects have been removed, with their functionality retained in the main demos and regression suites
Version 2.779.0
Added
- The Delphi and C++Builder Showcase demos now open a complete ten-chapter document studio with embedded preview, search highlighting, personalized covers, one-click review watermarks, verified page export, and AES-256 R6 protected copies that retain edits; both use the same document engine and support a window-free generation command
Version 2.778.1
Removed
- The redundant Delphi and C++Builder TestNumeric GUI demos have been retired in favor of automated numeric regression tests that verify fractional page dimensions and drawing operands after saving and reloading uncompressed and Flate-compressed PDFs, with persisted numeric-array coverage
Version 2.778.0
Changed
- The page and customer-report demos now provide practical workflows: PageOperations edits real PDFs through extract, delete, move, insert, and append commands with reload verification, while DBTable uses the table engine for wrapped rows, repeated headers, and automatic pagination with a database-free default sample
Version 2.777.1
Fixed
- OCR rejects malformed UTF-8, unsupported control characters, and incompatible native detection-model outputs before publishing text, and accounts for discarded recognition results when enforcing cross-page word limits
Version 2.777.0
Fixed
- Built-in OCR accepts blank or unrecognized pages as successful empty results so scanned-document batches can continue, preserves Windows FPC bitmap pixels, and checks cancellation and time limits throughout image analysis
- Native RapidOCR angle classification preserves short-line aspect ratios and requires confident upside-down predictions before rotating text crops
- The local Python RapidOCR adapter preserves recognized line spacing and punctuation instead of publishing individual characters that can gain unwanted spaces, and the Tesseract DLL adapter rejects C1 control characters before text publication
Version 2.776.0
Added
- Scanned PDF text layers can atomically replace marked HotPDF OCR streams after saving and reloading, retain existing layers on failed or empty recognition, report replaced pages, and use a native multilingual RapidOCR console example for conversion without overwriting existing files
Fixed
- Adjacent Latin and Cyrillic OCR words with a same-line word gap receive explicit Unicode spaces for stable phrase search and copying, while adjacent CJK words remain unseparated
- Windows FPC JPEG scan rendering retains decoded pixels when converting to the OCR bitmap format, preventing blank recognition input from an LCL pixel-format change
Version 2.775.0
Added
- Native RapidOCR gains local model presets for Simplified and Traditional Chinese, English, French, German, Spanish, Portuguese, Italian, Dutch, Turkish, Japanese, Korean, Russian, Arabic, and Hindi, with matched character dictionaries, verified model installation, horizontal reading order, and multilingual Unicode output in Delphi, C++Builder, and Windows FPC/Lazarus
Fixed
- Local process OCR adapters retry temporary output cleanup when diagnostic files remain briefly locked after worker termination
Version 2.774.0
Added
- A native RapidOCR DLL adapter keeps local ONNX models in process, recognizes bitmap snapshots without Python, supports optional angle classification and Unicode searchable PDFs, and validates output budgets with cooperative cancellation in Delphi, C++Builder, and Windows FPC/Lazarus builds
Version 2.773.0
Added
- The local RapidOCR adapter gains explicit ONNX model configuration, optional angle classification, local character dictionaries and fonts, CPU thread controls, offline preflight, and recognition budgets for Unicode searchable PDFs in Delphi, C++Builder, and FPC/Lazarus builds
Version 2.772.1
Fixed
- Tesseract DLL and CLI adapters now work in Windows FPC/Lazarus Win32 and Win64 builds, preserving Unicode OCR words and reading current LCL image pixels for searchable PDF text layers
Version 2.772.0
Added
- An optional native Tesseract DLL adapter adds multilingual OCR with configurable page segmentation and engine modes, Unicode words, confidence, word bounds, and baselines, plus cooperative cancellation, recognition deadlines, and output budgets for searchable scanned PDFs
Version 2.771.1
Changed
- Built-in OCR recognizes regular, bold, italic, and bold italic ASCII text on light or predominantly dark backgrounds, accepts faded lettering with sufficient grayscale contrast, and omits words containing uncertain retained glyphs instead of silently dropping characters
Version 2.770.175
Fixed
- LoadedDocInspector and SignatureValidator return a failure exit code for unreadable PDFs and reject invalid command arguments instead of reporting a successful empty inspection
Version 2.770.174
Fixed
- LoadedImageExport validates every image destination before exporting any page, preventing path aliases from overwriting the input PDF or another selected page, and rejects unsupported format names
Version 2.770.173
Fixed
- The rendered-page disk cache skips linked document folders during recovery, lookup, storage, invalidation, and eviction, preserving files outside the cache
Version 2.770.172
Fixed
- JSON jobs reject malformed syntax, trailing content, numbers outside the finite Double range, and excessive nesting before running any operation, releasing partially parsed values on failure
Version 2.770.171
Fixed
- PreflightCLI checks the complete report output plan before writing, protecting input PDFs from file aliases and rejecting conflicting report destinations; recursive scans skip linked child directories to avoid cycles
Version 2.770.170
Fixed
- CopyPage checks file identities before exporting, rejects conflicting output aliases, and keeps automatically named outputs beside extensionless inputs in directories containing periods
Version 2.770.169
Fixed
- JSON job values preserve escaped null characters, serialize finite numbers outside the signed 64-bit range without integer overflow, and return defaults for out-of-range integer parameters without changing the process locale
Version 2.770.168
Fixed
- Simple-object parser recovery finishes on stray closing brackets in unbracketed array bodies and preserves valid numbers and dictionary keys immediately after malformed delimiters
Version 2.770.167
Fixed
- HotPDFCLI rejects output paths that alias input files and checks all generated paths before starting batch export, preventing commands from truncating or replacing their source data
Version 2.770.166
Fixed
- The ExtractText example protects its input PDF when an output uses a directory junction or hard link, and LoadedImageExport reports failure for unreadable documents or incomplete page exports
Version 2.770.165
Fixed
- Direct file reads invalidate incomplete cache refills after an I/O failure and safely bound read-ahead ranges near the signed 64-bit offset limit
Version 2.770.164
Fixed
- RunLength decoding allocates only the decoded payload size and validates malformed runs before allocating output, avoiding excessive memory reservations for streams with early terminators
Version 2.770.163
Fixed
- The Delphi and C++Builder examples locate bundled images, metafiles, color profiles, and optional signing fixtures from both project folders and nested build output directories
Version 2.770.162
Fixed
- The HugeFileBenchmark examples reject generated PDF paths that match any input document before starting a benchmark batch
- The C++Builder example preserves relative input subdirectories for generated PDFs, preventing recursive inputs with the same name from sharing an output file
- Failed operations, memory-limit violations, and invalid zero-page loads now produce a nonzero exit code while retaining the benchmark report
Version 2.770.161
Fixed
- The Delphi and C++Builder Preflight CLIs reject report and aggregate output paths that match an input PDF, preventing reports from overwriting source documents
Version 2.770.160
Fixed
- ASN.1 parsing rejects high-tag-number encodings that exceed the supported 32-bit tag range instead of accepting a wrapped tag number
Version 2.770.159
Fixed
- The C++Builder Preflight CLI preserves relative subdirectories for recursive reports and dashboard links, so PDFs with the same name no longer overwrite each other
- The Delphi and C++Builder Preflight dashboards encode report links correctly for special characters and non-ASCII directory names
- C++Builder standard-validation failures now return exit code 3 and appear as invalid in the dashboard for every report format, including inputs that fail to load
Version 2.770.158
Fixed
- The C++Builder PDF merge example resolves relative input paths from the executable directory and keeps file dialogs from changing the working directory
- Each generated bookmark now targets the first page copied from its own input document
Version 2.770.157
Fixed
- The object parser normalizes unescaped CR and CRLF line endings inside PDF literal strings to LF while preserving escaped carriage returns and line continuations
Version 2.770.156
Fixed
- LZW stream compression reports the actual number of bytes written for empty input
- LZW compression and decompression round-trip correctly with InitialCodeSize set to 2, and compression rejects literals outside a reduced alphabet before writing output
Version 2.770.155
Fixed
- In Win64 builds, importing SVG or XPS path data with a number that has an exponent close to 100, such as 1e-100 or 5e99, no longer raises a floating-point overflow when the application unmasks floating-point exceptions
- Such numbers are now read as their actual value, so a long mantissa with a large negative exponent imports correctly
Version 2.770.154
Fixed
- DecodeLoadedPageBarcodes now reports correct barcode bounds on pages whose CropBox differs from the MediaBox when no decode region is set; previously the positions were shifted by the crop box offset, or scaled against the wrong page height
- Face findings from DetectLoadedRedactionFindings (with face detection enabled) now land on the detected faces on such pages, instead of being offset from them
- Both features render the visible page area (the CropBox clipped to the MediaBox) and now map detected positions back through that same area; the page box passed to a custom IHPDFFaceDetector now matches the bitmap it receives
- Barcode decoding with an explicit region, and pages without a CropBox or whose CropBox equals the MediaBox, are unchanged
Version 2.770.153
Fixed
- ApplyLoadedOCRTextLayer now places the invisible text layer correctly on pages whose CropBox differs from the MediaBox; previously the searchable text was shifted by the crop box offset, or scaled against the wrong page height, so selections and search hits did not line up with the visible words
- The OCR raster is rendered from the visible page area (the CropBox clipped to the MediaBox), and recognized word positions are now mapped back through that same area
- The page box handed to a custom IHPDFOCREngine in THPDFOCRRequest is now the rendered visible area, matching the bitmap it receives
- Pages without a CropBox, or whose CropBox equals the MediaBox, are unchanged
Version 2.770.152
Fixed
- GetLoadedInvoiceSummary now returns the buyer name (BT-44) as decoded text, so names with non-ASCII letters such as "Müller & Söhne" no longer come back as raw UTF-8 bytes with the XML escape still in place
- The buyer name is now always read from the buyer trade party itself, matching the seller name and the other summary fields
- ValidateVisualXmlConsistency benefits as well: a buyer name with accented letters or escaped characters is now compared with the visible page text as written
Version 2.770.151
Fixed
THPDFTablenow keeps rows tied together by aRowSpanon one page: when the group does not fit in the remaining space, the whole group moves to the next page together with the repeated header- A cell spanning several rows no longer runs past the bottom margin while the rows it covers continue on the next page
- A row-span group taller than a whole page is still split row by row, with its spanning cells cut at the bottom margin of each page
TotalHeightRenderedreflects the moved group on the last page
Version 2.770.150
Fixed
THPDFTablecells with aColSpanorRowSpanof zero or less are now drawn as single cells, as the table grid already placed them, instead of pushing the following cells into the wrong columns- Negative spans no longer make the table read outside its grid, and spans running past the last column or row are cut at the table edge when measuring and drawing too
- A cell whose first word is wider than the column no longer starts with an empty line, so its row is no taller than the wrapped text needs
Version 2.770.149
Security
- XFA forms that declare an internal entity in their DOCTYPE can no longer blow up memory by referencing a large entity many times: the text substituted for internal entities is capped at 16 MB per document
- A single internal entity value longer than 1 MB is rejected
- Documents exceeding either limit fail to load with an
EHPDFXFAErrorinstead of expanding to gigabytes of text; ordinary entity use is unaffected - Text containing many entity or character references is also decoded in linear time
Version 2.770.148
Fixed
RecalculateLoadedFormFieldsIncrementalnow treats every field passed as changed the same way, whatever order the names are listed in- A calculated field that was written directly together with one of its source fields keeps the written value instead of being recalculated only when listed after that source
- Fields that depend on the changed fields are still recalculated once, in calculation order
Version 2.770.147
Fixed
- GS1-128 barcodes with start code A (
THPDFBarcodetype 20) now encode their data in code set A, as Code 128 A does - Lower-case letters in such barcodes are now written with a SHIFT to code set B instead of a set B codeword that scanners read as a control character in set A
- Scanned GS1-128 A symbols containing lower-case text therefore return the original text
Version 2.770.146
Fixed
- EAN-2 and EAN-5 add-on barcodes (
THPDFBarcodetypes 18 and 19) no longer append a computed digit toTextwhenChecksumis enabled - Drawing such a barcode repeatedly now produces the same symbol each time instead of growing the text by one digit per redraw and changing the bar pattern
- The add-on symbols carry no check character by definition, so
Checksumis ignored for them; the parity pattern is still derived from the value as before
Version 2.770.145
Fixed
- XFDF export now decodes form field values and annotation text as PDF text strings (ISO 32000-1 7.9.2.2): UTF-16BE values, hexadecimal strings and PDFDocEncoding characters such as the bullet are written as the actual Unicode text instead of hex digits or code-page garbage
- Annotation contents, author, subject, state and overlay text exported to XFDF keep non-Latin characters, for example Chinese or Cyrillic comments
- Rich text (
/RC,/RV) that starts with an XML declaration is now embedded without it, so the exported XFDF stays well-formed XML - XFDF import no longer converts text through the system ANSI code page: values PDFDocEncoding can represent are stored as such, anything else as a UTF-16BE text string, for both form fields and annotation text
- Exported XFDF files now round-trip characters outside the ANSI code page through
ImportLoadedFormFromXFDFandImportLoadedAnnotationsFromXFDFwithout turning them into question marks
Version 2.770.144
Fixed
- Names and other text in the invoice summary are now decoded from the UTF-8 invoice XML, so a seller such as "Müller GmbH" no longer comes back as garbled multi-byte characters
- Escaped markup characters and character references are resolved, so "A & B" in the XML is reported as "A & B"
ValidateVisualXmlConsistencyno longer reports a seller name with accented letters or an ampersand as missing from the visible page text when it is printed there- Summary text is returned in the system ANSI code page, as the summary record's fields are ANSI strings; characters that code page cannot represent become question marks
Version 2.770.143
Fixed
GetLoadedInvoiceSummarynow reports the invoice-level net total (BT-106) from the header monetary summation instead of the first line item's amount- Tax total, grand total and amount due are likewise read from the header summation, including for ZUGFeRD 1.0 invoices
- The issue date (BT-2) is now returned as the plain date value, for example
20260305, instead of including the nestedDateTimeStringmarkup HPDFFacturXXMLElementTextnow returns the character data of the whole element with child tags removed, and no longer matches elements whose name merely starts with the requested name
Version 2.770.142
Fixed
- XFDF export now writes characters outside the Basic Multilingual Plane, such as emoji or rare CJK ideographs, as valid four-byte UTF-8 instead of encoding each surrogate half separately, so strict XML readers accept the file
- XFDF import now decodes character references above U+FFFF, such as
😀, to the full character instead of truncating it to an unrelated BMP character - Character references that do not name a Unicode scalar value, and unpaired surrogates on export, now become U+FFFD instead of corrupting the text
- XFDF files written by earlier versions still import correctly
Version 2.770.141
Fixed
- Field values and annotation text containing backslashes, such as Windows paths like
C:\Data\2024\001, now survive an XFDF export and import unchanged instead of having digit sequences turned into control characters - When a backslash would otherwise be read back as an escape, XFDF export now writes it as the octal escape
\134, as in a PDF literal string (ISO 19444-1 5.8.2) - XFDF import only decodes the octal escapes that the format uses for control characters and backslashes; other backslash sequences from third-party files are kept literally
- SVG text read through the same lightweight XML reader no longer loses backslash sequences either
Version 2.770.140
Fixed
- The persistent rendered-page cache enabled by RenderCacheFolder now works for documents opened with LoadFromFile, LoadFromStream and LoadFromRandomAccessSource; before, the disk tier was skipped for ordinary loads, so no page was ever written to or read from the folder
- Documents loaded from a file are identified by their size, last-write time and leading and trailing bytes, so reopening an unchanged file reads its pages from the cache without hashing the whole file
- Documents loaded from a stream or a random-access source are identified by the SHA-256 of their content; set RenderCacheFolder before the load for these documents to use the disk tier
- A document edited after it was loaded no longer reads or writes disk entries for the rest of that load, so edited pages are never served from, or stored as, the cached pages of the original file
- Disk entries now also depend on the page render backend and the ICC proofing workflow, so a different backend or output profile does not reuse pages rendered with other settings; encrypted documents are never written to the disk cache
Version 2.770.139
Fixed
- Importing large XFDF files no longer slows down with the square of the file size: a file with thousands of fields or annotations now parses in milliseconds instead of seconds or minutes
- Field values with many line breaks or other character references are decoded in linear time
- Peak memory while parsing XFDF no longer grows with the number of elements times the file size
- SVG input read through the same lightweight XML reader benefits from the same speed-up
Version 2.770.138
Fixed
- When
DecodeLoadedPageBarcodesretries a page turned by 90 or 270 degrees, the raster handed to the decoder is now turned clockwise, asAttemptRotationDegreesdocuments - Symbols found only in those retries are now reported at their real position on the page instead of the point-mirrored position
- The orientation reported for such symbols now matches their reading direction on the page rather than being off by 180 degrees
- Custom barcode decoders that rely on the documented clockwise turn now receive correctly turned rasters
Version 2.770.137
Fixed
- Copying pages between documents (CopyPageFromDocument, CopyPageByPhysicalIndex, page import and merge methods) no longer turns text strings that contain "<<" and ">>" or "[" and "]" into dictionaries or arrays; an annotation comment such as "Read <<this>> [now]" was copied as a broken dictionary
- Hexadecimal strings, such as annotation names and identifiers, are copied in hexadecimal form instead of being written as literal strings of their hex digits
Version 2.770.136
Fixed
- Annotations created on new pages (AddStampAnnotation, AddTextAnnotation and the other THPDFPage annotation methods) now write /Rect with the lower-left corner first, [llx lly urx ury]; several of them wrote the top edge before the bottom one, for example [395 712 575 652], which viewers accept but PDF/A validators and some processing tools reject or misread
Version 2.770.135
Changed
- THotPDF.RenderCacheFolder is now a string (UnicodeString in Delphi 2009 and later, UnicodeString in C++Builder) instead of an AnsiString, so a cache folder whose path contains characters outside the system code page, such as a Chinese user name on an English Windows, is used as given instead of being turned into question marks
- Code that assigns an AnsiString to the property keeps compiling; the value is converted to Unicode on assignment
Version 2.770.134
Fixed
- SetOptionalContentGroupUsage with the Zoom category now writes the zoom range as the numbers /min and /max, as the PDF specification defines them; the whole value was written as a text string under /Min, which viewers ignore, so the layer's zoom range had no effect
- The Zoom value is the minimum magnification optionally followed by the maximum, separated by a space (for example '0.5 4'); a value that does not start with a number now raises an exception
Version 2.770.133
Fixed
- Subsetting embedded CFF/OpenType fonts no longer drops subroutines that glyphs still use; glyphs with more than eight hints, hstemhm hints or counter masks were scanned incorrectly, so a used subroutine could be replaced by an empty one and the glyph rendered with missing or broken outlines
Version 2.770.132
Fixed
- RegisterNChannelColorSpace (the overload with spot colourant definitions) now writes colourant names that contain spaces or delimiters, such as "PANTONE 185 C", correctly as keys of the /Colorants, /Solidities and /DotGain dictionaries; the raw name broke the file syntax
- AddPDFX6ExternalOutputIntentSpotData writes its solidity and spectral data colourant keys the same way
Version 2.770.131
Fixed
- The XMP metadata written with EnableXMPMetadata now carries Title, Author, Subject and Keywords as valid UTF-8 when they hold text in the system code page (for example accented or Chinese characters assigned as AnsiString); the raw code-page bytes made the packet invalid XML, which PDF/A validators and XMP readers reject
- Control characters that XML 1.0 does not allow are left out of these XMP values
Version 2.770.130
Fixed
- JBIG2 images written with JBIG2Options.AccumulateGlobalsAcrossPages decode correctly again when a later page adds symbols that earlier pages did not use; such pages kept referring to the globals stream of the first page, which lacks the new symbols, so viewers showed them garbled or not at all
- Whenever a page adds symbols, a globals stream holding the whole dictionary up to that page is written and used from then on; pages that add no symbols keep sharing the latest one
Version 2.770.129
Fixed
- Saving a loaded document whose objects have a generation number other than 0 now writes consistent object numbers: a full rewrite (SaveLoadedDocument and related methods) writes every object, reference and cross-reference entry with generation 0, where object headers and the trailer used to keep the old generation while references and the cross-reference table used 0
- Incremental updates (SaveIncrementalUpdate and related methods) now refer to existing objects with their real generation number; references were always written with generation 0 and therefore pointed at objects that do not exist when the original used another generation
Version 2.770.128
Fixed
- THPDFPage.TextOutHTML with a MaxWidth no longer loses formatting at a line wrap: when several differently styled runs moved to the next line together, they were merged into one run drawn with the style in effect at the wrap, so their colour, bold or italic style, font, size, sub/superscript offset and link were lost. Each run now keeps its own formatting on the new line
Version 2.770.127
Fixed
- InvalidateRenderedPageCache now also drops the Type 3 glyph and halftone entries shared by parallel rendering; after a whole-document invalidation the next parallel render could reuse glyphs cached for the previous content
- PreflightLoadedPAdES no longer empties the shared rendering cache as a side effect of checking a signature's PAdES level, so renders after a preflight keep their cached glyphs
Version 2.770.126
Fixed
- Revision and modification analysis of signed documents now reports field names correctly when the name contains parentheses or ends with one, for example "Total (net)"; the last character was cut off
- Field names written with octal escapes or with a backslash line continuation are decoded as well
Version 2.770.125
Fixed
- SplitPDFToFiles no longer opens each output file in the default PDF viewer when it is written; the internal documents it creates now have AutoLaunch turned off
Version 2.770.124
Fixed
- GetLoadedTrailerID now returns the document's permanent file identifier from the trailer /ID array, as hexadecimal text; it looked for /ID in the document catalog, where it never is, and so reported no identifier for virtually every file
Version 2.770.123
Fixed
- SetLoadedOpenActionPage now writes a destination that names the requested page; the page reference was written as 0 0 R, so viewers could not open the document at that page
- The destination keeps the current view position (null left and top) instead of forcing 0 0, which jumped to the bottom-left corner of the page
Version 2.770.122
Fixed
- SetLoadedViewerPreferences now writes HideToolbar, HideMenubar, FitWindow and DisplayDocTitle as boolean values; they were written as the names /true and /false, which viewers do not treat as booleans, so the preferences had no effect
Version 2.770.121
Fixed
- CheckLoadedSignatureSeedValue now enforces a signature field's /Reasons seed value when the field's /Ff flags mark it as required (bit 4, value 8); an unlisted reason used to pass
- Reasons are compared exactly, as text strings are in PDF; "approved" no longer satisfies a seed value that lists "Approved"
Version 2.770.120
Fixed
- Stamping a loaded page more than once with StampLoadedPageText or StampLoadedPageShape now gives each stamp its own opacity, and each text stamp its own standard font; the second and later stamps reused the transparency and font of the first stamp on the page
- A stamp with the same opacity and font as an earlier one still shares its resources, so repeated identical stamps do not grow the page resources
Version 2.770.119
Fixed
- ExtractLoadedPageStructureText now follows structure elements whose /K entry is a plain marked-content number (for example /K 3 or /K [0 1]), the most common form in tagged PDFs; such elements were ignored, so the method reported no structure order for many tagged documents or returned their text in drawing order
- The method no longer reads an invalid catalog entry when a document has no usable root object
Version 2.770.118
Fixed
- StampLoadedPageText, StampLoadedPageImage, StampLoadedPageShape, StitchLoadedPage and FlattenLoadedAnnotations no longer break pages that inherit their resources from the parent /Pages node; they gave such a page a new, empty /Resources dictionary, which hid the inherited fonts and images so the page's original text and pictures no longer displayed
- The page now receives its own copy of the inherited resources before the new font, image or form is added
Version 2.770.117
Fixed
- ComposeLoadedPagesNUp, ImposeLoadedPagesNUp, ImposeLoadedPagesBooklet and the page stitching methods now carry over resources that a source page inherits from its parent /Pages node; such pages were placed without their fonts and images, so their text and pictures were missing or wrong on the composed sheet
Version 2.770.116
Fixed
- SaveIncrementalUpdateAuthenticated can now write back to the file the incremental update was started from; the accepted update could not replace the target because the document still held the source open, and the call always failed with an access-denied commit error
- As with an in-place SaveIncrementalUpdate, the source is released before the replacement, reopened if the replacement fails, and BeginIncrementalUpdate must be called again before another incremental save
Version 2.770.115
Fixed
- RepairPDFUA2Structure no longer takes exponential time on structure trees whose elements are listed by more than one parent (or form a cycle); language inheritance repair, heading order repair and the marked-content scan behind alternate-text repair now walk each structure element once. A crafted tree of 24 elements each listing the next one twice previously took about 40 seconds
Version 2.770.114
Fixed
- HPDFPaginateTable no longer adds pages until memory runs out when an unsplittable row does not fit below the repeated header rows; on a page that holds only repeated headers the row is now split (or, when the headers fill the page, placed and allowed to overflow)
- HPDFLayoutFootnotes and HPDFLayoutEndnotes no longer loop forever when the separator leaves no room on a page or a note's minimum fragment height cannot be met on an empty page; the note is placed on that page instead
Version 2.770.113
Fixed
- HPDFBalanceColumns no longer hangs when a splittable item has a line taller than the column height; it moved on to the next column forever. Such a line is now placed alone at the top of an empty column, overflowing it, and the layout continues
Version 2.770.112
Fixed
- Documents encrypted with the standard security handler revision 4 (RC4 or AES-128 crypt filters) open again when their encryption dictionary omits the optional top-level /Length entry; loading failed with "Unsupported legacy Standard security handler V=4 R=4 Length=40"
- Any top-level /Length value is accepted for such documents, since the file key is always 128 bits
Version 2.770.111
Fixed
- ProcessObjectStreamsForDecompression and ExtractRawObjectFromStream no longer trust an object stream's declared /N count: a count above ten million is rejected and the count is limited to the object-number pairs the stream header can actually hold, so a crafted file can no longer make them allocate or walk millions of empty entries
Version 2.770.110
Fixed
- The Direct File API (DADirectEncryptFileAES256, DADirectDecryptFileAES256 and related methods) now reads /Root, /Info, /Encrypt, /Prev and /XRefStm of a classic cross-reference section only from that section's own trailer dictionary; on incrementally updated files it could pick up a /Prev from a later revision's objects (for example an outline item) or trailer and fail or read the wrong revision
- A /Prev chain that loops back to a section already read now stops instead of reading the same sections again
Version 2.770.109
Security
- ApplyLoadedRedactions now removes the text under a redaction area on pages whose content is split over several streams; when one stream ended with an operator and the next began with one (for example ET followed by BT), the text after the join was matched to the wrong operands and stayed readable in the saved file although the area was painted over
- Content streams without data are skipped consistently, so the remaining streams line up with the text that was located on the page
Version 2.770.108
Changed
- GetLoadedOCGCount, GetLoadedOCGName, GetLoadedOCGVisibility and SetLoadedOCGVisibility now all use the same index: the position of the optional content group in the document's /OCProperties /OCGs array. Count and name used the position in the default configuration's /ON array, visibility used the position in /OFF and the setter used /OCGs, so one index could name three different groups; documents without /OCGs still fall back to the /ON array
- GetLoadedOCGVisibility now reports a group as hidden when it is listed in /OFF, or when it is in neither array and the default configuration's /BaseState is /OFF
Fixed
- SetLoadedOCGVisibility no longer puts the same reference object into both /OCGs and /ON or /OFF (it was released twice when the document was freed) and no longer leaks the entries it removes
Version 2.770.107
Fixed
- CopyLoadedPage no longer makes the source and target page dictionaries share the same /Contents and /Resources entry objects; the shared objects were released twice when the document was freed or the target entry was replaced, which could corrupt memory
- The target page now gets its own reference to the source content and resources (direct values are copied), and its rendered-page cache entry is refreshed
Version 2.770.106
Fixed
- Loading a damaged PDF no longer leaks memory for every stream object that cannot be read, for example a stream with neither a /Length entry nor an endstream keyword, or one whose dictionary or data cannot be loaded; repeatedly opening such files made the process grow without bound
Version 2.770.105
Fixed
- Numbers written with an empty fraction such as "21." (allowed by the PDF specification) no longer make loading fail; an indirect stream /Length written that way used to drop the whole stream, leaving the page blank
- Numbers with a leading plus sign, an empty integer part such as ".5", or an integer part beyond the 32-bit range are read correctly as well
Version 2.770.104
Fixed
- PDFmerge demo: with bookmarks enabled, each per-source bookmark now opens the first merged page of that source; previously every bookmark pointed at the first page of the merged file
- PDFmerge demo: the default sample sources and output name, and any relative names typed into the form, resolve against the demo folder; adding files or choosing the output in a dialog no longer changes the current directory and breaks the relative entries
Version 2.770.103
Fixed
- TextOut demo: the generated
TextOut.pdfnow really uses compressed content streams, as the demo comments promise; it setsCompressiontocmFlateDecodeinstead of relying on theBeginDocargument, which does not control compression
Version 2.770.102
Fixed
- Images drawn with
AlphaBlendin an enhanced metafile now keep their recorded opacity when the metafile is converted withTHPDFEmfPatcher.RenderEmfDirect; they were blended with zero opacity and disappeared - The recorded alpha format is honoured as well, so images without an alpha channel are blended with their constant opacity instead of failing
- Bitmap records whose header or pixel data point outside the record, or whose pixel data is shorter than the declared bitmap, are now skipped instead of being read past the record
- Bitmaps larger than 32768 pixels on a side or 64 megapixels in total are skipped instead of being allocated in full
Version 2.770.101
Fixed
- StitchLoadedPage, StitchLoadedPageSideBySide and StitchLoadedPageSideBySideEx now draw the source page through a Form XObject that carries the page's content, page box and resources; the page dictionary itself was registered as an XObject, which viewers cannot paint, so the stitched page did not show
- Stitching more than one page onto the same target keeps every stitched page: each gets its own XObject name instead of all sharing one name that replaced the previous page
Version 2.770.100
Fixed
- Form XObjects are now clipped to their
/BBoxwhen rendered, as ISO 32000-1 requires; content that a form draws outside its bounding box no longer shows on the page - Form XObjects nested more than four levels deep are now drawn; they were dropped as if they recursed. Nesting is allowed up to 32 levels
- A form XObject that draws itself, directly or through other forms, is detected and the repeated call is skipped, with a recursion entry in the render diagnostics
Version 2.770.99
Fixed
- PDFOptimize demo: the row of small rectangles on each text page is now stroked, so the bars are visible and the content stream ends every path with a painting operator as ISO 32000-1 8.5.2 requires; the reported text-PDF sizes change slightly as a result
Version 2.770.98
Fixed
- Literal strings that contain balanced parentheses without backslashes, such as /Title (Report (draft) v2), are now read in full when a document is loaded; the string used to end at the first closing parenthesis and the rest of the dictionary was misread
- Escaped parentheses keep working as before
Version 2.770.97
Fixed
- Loading no longer mistakes a dictionary object for a stream when one of its string or name values contains the letters "stream" at the end of a line, such as an Info dictionary with /Title (Livestream); the object was read as a stream and its entries were lost
- The stream keyword is now recognised only as its own token after the dictionary's closing >> and at the end of a line, as the PDF specification lays out stream objects
Version 2.770.96
Fixed
- Stamp demo: PNG and BMP files offered by the image picker can now be used as the image stamp; previously only JPEG worked and other files failed with an invalid-bitmap error
- Stamp demo: the rubber-stamp annotation is placed in the top-right area of each page as intended, below a top-corner image stamp, instead of the bottom-right corner where it overlapped a bottom-right image stamp
- Stamp demo: the default input, output and image paths resolve against the demo folder, and picking a file in a dialog no longer changes the current directory, so relative names keep pointing at the same files
Version 2.770.95
Fixed
- Timestamp requests built with a policy OID (HPDFRFC3161BuildRequest, and signing with a time stamp authority policy) now encode the requested policy as the plain object identifier that RFC 3161 specifies
- The policy used to be wrapped in a context tag that RFC 3161 reserves for request extensions, so a strict time stamp authority rejected the request or ignored the policy
- Requests without a policy OID are unchanged
Version 2.770.94
Fixed
- ViewerPref demo: leaving Initial Zoom unchecked now really means "None (Default)"; the generated PDF no longer opens at fit-height, which was the component default the demo did not reset
Version 2.770.93
Fixed
- FileAttach demo: the page-level attachment annotations are now created when the demo runs from a folder whose name has characters outside the system ANSI code page; the attached file is passed by its plain file name instead of an absolute path
Version 2.770.92
Fixed
- HTMLText demo: an output path containing characters outside the system ANSI code page (for example a Greek or Cyrillic folder name) is now written correctly instead of failing
- HTMLText demo: the generated PDF is no longer opened in an external reader automatically, matching the other console demos
Version 2.770.91
Fixed
- SVG and XPS path import no longer raises
EOverflowon numbers with hundreds of digits, or on long numbers combined with a large exponent; such values are rejected like any other out-of-range number - Affects SVG images placed through the SVG import APIs and XPS path geometry, on compilers whose floating-point exceptions are not masked
- Ordinary numbers, including long mantissas with negative exponents, are read as before
Version 2.770.90
Fixed
- EmfDraw demo: a failed conversion (for example a missing input metafile) now ends with exit code 1 instead of 0, so scripts and build steps that run the demo detect the failure
Version 2.770.89
Fixed
- CJKAnnotations demo: when Arial Unicode MS is not installed, the demo now actually falls back to Microsoft YaHei; it checks the installed fonts instead of waiting for an exception that a missing font never raised, so the CJK text no longer ends up in a substituted font without CJK coverage
Version 2.770.88
Fixed
- Content streams that nest more than 32
qoperators no longer lose the enclosing graphics state: deeper saves were ignored while their matchingQstill restored, so text and graphics after the nested block used the state from before an outerq - Affects text extraction through the content device interface and SVG export of such pages
- Saved states now grow with the nesting depth; very deep nesting is still paired correctly
Version 2.770.87
Fixed
- ImageDemo: the "Image zoom" bookmark now jumps to the IMAGE ZOOM heading instead of a point near the bottom of the first page
Version 2.770.86
Security
- Opening a PDF encrypted for a recipient certificate with an elliptic-curve key (ECDH key agreement) now wipes the raw shared secret and the intermediate key derivation buffers as soon as they are no longer needed, including on the retry with the alternate byte order and on every early failure path
- Signing with a certificate from the Windows certificate store no longer leaves crypt32.dll and advapi32.dll loaded when a required CryptoAPI function cannot be found
Version 2.770.85
Security
- Outlining a Type 1 glyph whose charstring uses sbw with too few operands no longer reads before the operand stack; the malformed operator is ignored
- A Type 1 charstring that ends with the escape byte of a two-byte operator no longer reads past the end of the charstring
Version 2.770.84
Fixed
- The byte length of character codes in a CMap codespace range now comes from the length of its hex strings, as ISO 32000-1 9.7.6.2 specifies; a range such as <0000> <00FF> was treated as one-byte because its upper bound fits in a byte, which split two-byte codes when rendering and extracting text
- Codespace ranges loaded from built-in CMaps carry their code length too
Version 2.770.83
Fixed
- Embedding a subset of an installed TrueType font keeps every component of composite glyphs (accented letters and similar) whose components carry a scale or a 2x2 transform; the component after such a transform was misread, so it could go missing from the subset or have its glyph reference written over the transform bytes
- Composite glyphs whose components refer to each other in a cycle, refer past the font's glyph count or point at an empty glyph no longer crash or hang font subsetting
- In a subset, a composite glyph nested inside another composite has its component references renumbered once instead of twice
Version 2.770.82
Fixed
- Real numbers in CFF font dictionaries (FontMatrix, FontBBox, blue values and similar) are read correctly when a byte holds a sign, decimal point or exponent next to a digit; the digit in the same byte used to be dropped, so -2.25 became -0.5
- These values are parsed with a period as decimal separator whatever the Windows regional settings; on systems that use a decimal comma they failed with a conversion error
Version 2.770.81
Fixed
- Text extraction and ToUnicode lookups no longer return a stale multi-character string for codes in a beginbfrange array entry that follows another array entry with multi-character targets; such codes now map to their own single character
Version 2.770.80
Fixed
- Instantiating a TrueType variable font at chosen axis values (for example through SetVariableFontAxis) no longer distorts glyphs whose gvar data has a sparse tuple after another tuple; the sparse tuple started from the previous tuple's deltas and moved those points twice
- Points a sparse tuple leaves out are now interpolated only from the points that tuple lists, as the OpenType gvar rules require
Version 2.770.79
Security
- AddTiffFromFile now refuses a TIFF page whose width times height needs a raster of more than 2 GB, raising an exception instead of allocating a buffer whose size had wrapped around and letting the decoder write past its end (heap overflow)
- A TIFF page with zero width or height is refused the same way
- Tall TIFF pages (1200 rows or more) now report an allocation failure instead of decoding into a nil buffer
Version 2.770.78
Fixed
- Type 3 font glyphs now follow horizontal scaling (
Tz): a run drawn at 200% horizontal scale is drawn twice as wide instead of at its natural width - Type 3 font glyphs now follow text rise (
Ts), so superscripts and subscripts set in Type 3 fonts are raised or lowered instead of staying on the baseline - Glyph advances were already scaled; the glyph shapes now line up with them
Version 2.770.77
Fixed
- RFC 3161 timestamp requests built by HPDFRFC3161BuildRequest always encode the nonce as a minimal DER INTEGER; when the random nonce started with a zero byte the request carried a redundant leading zero, which strict timestamp servers reject as malformed
- The returned nonce keeps the requested length, so callers that compare it with the timestamp response are unaffected
- Encrypted PDF 2.0 files (AES-256-GCM) whose object streams decrypt to empty content no longer fail to load with a GCM authentication error; an empty object stream with a valid authentication tag is now accepted, while a tampered tag is still rejected
Version 2.770.76
Fixed
- Hyperlink demo: link captions and URLs containing characters outside the system ANSI code page (for example Greek, Cyrillic or accented text) are no longer turned into question marks; captions are drawn as Unicode text with a URI link laid over them
- Hyperlink demo: non-ASCII characters in a URL are percent-encoded as UTF-8 before they are stored in the link action, so readers open the intended address
Version 2.770.75
Fixed
- CalRGB colours with components outside 0..1 no longer raise a floating-point exception (
EInvalidOp) while rendering; the components are clipped to their valid range before the gamma is applied - Such colours now render as the nearest in-range colour instead of an undefined one on compilers whose floating-point exceptions are masked
Version 2.770.74
Fixed
- Direct File API rewrites (for example DADirectEncryptFileAES256 and DADirectDecryptFileAES256) running on several threads at the same time no longer corrupt each other's output; the byte-range copy they share used one process-wide buffer
Version 2.770.73
Fixed
- The shared revocation cache of THPDFSignatureValidationBatch now finds OCSP responses for signer certificates whose serial number has its top bit set; such responses were stored under a serial without the leading zero byte and looked up with it, so every later signature missed the cache
- OCSP responses signed by a delegated responder, or identifying the responder by key, are now stored under the certificate issuer and can be reused by later signatures in the batch; before, they were stored under the responder name or not at all
- Signatures that rely on evidence cached by an earlier signature in the same batch now reach a trusted verdict instead of an unknown revocation status in these cases
Version 2.770.72
Fixed
- Looking up an embedded file by name (GetLoadedEmbeddedFileSpec, ExtractEmbeddedFileBytes, SaveLoadedEmbeddedFileToDisk and related methods) no longer overflows the stack when the document's /EmbeddedFiles name tree has nodes that list each other or themselves as /Kids
- Each name tree node is searched once, so names reachable through a shared node are still found
Version 2.770.71
Fixed
- PageSizes demo: the Chinese 8K and 16K format pages now print their full description on every system; the Chinese format names are given in pinyin because the descriptions are drawn in Arial, which has no CJK glyphs, and non-ASCII text turned into question marks on non-CJK code pages
Version 2.770.70
Fixed
- Axial (Type 2) shadings now cover the whole painted area when the shading axis lies far from it, for example a gradient defined off the page edge with
/Extend [true true]; such areas were left unpainted - Applies to the
shoperator and to shading patterns used 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 below the top edge, instead of scrolling to the bottom of the page; destination coordinates are PDF default user space with the origin at the bottom-left
Version 2.770.68
Fixed
- Text extraction from a PDF with an embedded TrueType font no longer stalls for minutes when the font's cmap is truncated but claims thousands of segments or groups; the table length is now checked before the segments and groups are read
- Building the glyph-to-Unicode map for an embedded TrueType font walks each cmap subtable once by segment or group instead of looking up all 65,535 BMP code points one by one, which also speeds up extraction with large CJK fonts
- Glyph lookups through a truncated format 4 or format 12 cmap subtable stop at the end of the font data instead of scanning segments that are not there
Version 2.770.67
Fixed
- Exponential (Type 2) and stitching (Type 3) functions now honour a one-input
/Domainsuch as[0 0.5]; it was ignored and replaced by[0 1], so inputs were clipped to the wrong interval - An exponential function without
/C1now uses the default[1.0]; Separation colours and shadings defined that way rendered black - Exponential functions now evaluate
C0 + x^N (C1 - C0)with the input itself instead of rescaling it into 0..1, matching ISO 32000-1 for domains other than[0 1] - Exponential function outputs are clipped to
/Rangeonly when it is present; spot colours with a Lab alternate space (L* up to 100) were clipped to 0..1 and rendered almost black - An exponential function whose input lies outside the values it is defined for is rejected instead of raising a floating-point exception
Version 2.770.66
Fixed
- PKCS#12 / PFX files exported without a password by tools that derive their keys from a zero-length password now open with an empty password in HPDFParsePFX, HPDFParsePFXByLocalKeyID, HPDFEnumeratePFXIdentities and the PFX signing methods; they used to fail with an authentication error
- With an empty password the standard encoding of RFC 7292 is tried first and the zero-length form second, for both the integrity check and the key decryption, so files that already opened keep opening the same way
Version 2.770.65
Fixed
- The page header of the C++Builder DBTable demo now reads "Page 1" instead of "Page1"
- An error while the C++Builder DBTable demo writes its table now closes the half-built document, so the next click starts from a clean state
Version 2.770.64
Fixed
- The C++Builder console demos AnnotationInteraction, FormFields, CanvasDraw, EmfDraw, FormXObject, GraphicDraw, ImageDemo, ImageMask, LineGraphicsState and RtLTextOut switch to the executable folder when started without arguments, like the Delphi demos, so their input files are found and their PDFs are written there even when they are run from another directory
- The C++Builder Graphic demos no longer send a close message to every window whose title contains the name of their output PDF, which could close unrelated windows
- The C++Builder ImageMask demo now works like the Delphi version: it checks that Mask.bmp and Image.jpg exist, compresses its output, does not open a viewer and reports errors instead of ending with an unhandled exception
- The C++Builder EmfDraw demo reports an error, for example a missing Sample.emf, and returns a non-zero exit code instead of ending with an unhandled exception
- The C++Builder AddDelPages demo resolves relative input and output file names against the executable folder, like the Delphi version
Version 2.770.63
Fixed
- The C++Builder FileAttach demo writes FileAttach.pdf next to the executable, the name the Delphi version and the readme use, instead of Output.pdf in the working directory, and keeps its FileAttach.txt attachment in the same folder
Version 2.770.62
Fixed
- The Direct File API (DADirectEncryptFileAES256, DADirectDecryptFileAES256 and the other direct rewrite methods) now reads cross-reference stream offsets beyond 2 GiB correctly; such offsets were truncated and turned negative, so objects in the upper part of a large file could not be found
- /Prev and /XRefStm offsets beyond 2 GiB in the trailer or cross-reference stream are followed instead of being read as 0, so older revisions and hybrid cross-reference sections of large files are no longer skipped
- The same applies when loading a large file and when inspecting its revisions
- New HPDFDirectReadUIntBE64 and HPDFFindNameInt64 helpers return the full 64-bit value
Version 2.770.61
Fixed
- A cross-reference stream whose /W field widths are negative or larger than 8 bytes is now rejected instead of decoded; loading falls back to scanning the file for its objects
- The Direct File API methods (for example DADirectEncryptFileAES256) no longer read memory outside the decoded table, and can no longer crash, on such a file; they refuse it instead
Version 2.770.60
Fixed
- Text extraction, search and glyph positions now read the
"text operator correctly: its first operand is the word spacing and its second the character spacing; the two were swapped - Lines written with
"and a non-zero word or character spacing no longer report shifted glyph positions, which could merge or split words in extracted page text and misplace search hits - Page rendering was not affected
Version 2.770.59
Fixed
- Table demo: the rows covered by the "Group A" rowspan now show their item and note in the Item and Notes columns; previously the note text was shifted one column and dropped
- Table demo: the generated PDF is no longer opened in an external reader automatically, matching the other console demos, and output paths outside the system ANSI code page are kept intact
Version 2.770.58
Fixed
- Decompressing Flate data into a stream no longer leaks the decoder state (about 40 KB each time) when the source or target stream raises an exception part way through, for example when a write fails or a stream reaches its size limit
- Compressing a string no longer leaks its temporary buffer if compression raises an exception
- Successful compression and decompression behave exactly as before
Version 2.770.57
Fixed
- Certificates whose name constraints extension is not marked critical are no longer rejected as unreadable during signature certificate validation; a CA certificate of that kind used to make every chain through it fail to build
- The constraints of such a certificate are now applied to the rest of the chain like critical ones, so signer names outside the permitted subtrees are still reported as a name constraint violation
Version 2.770.56
Fixed
- PostScript calculator (Type 4) functions with deeply nested
iforifelseprocedures no longer overflow the stack while rendering; such a function is treated as unusable and the colour falls back as for any other invalid function - Nesting is limited to 64 levels, well beyond what real calculator programs use; ordinary Type 4 tint transforms and shadings render as before
- Evaluating calculator functions needs less stack per nesting level
Version 2.770.55
Fixed
- E-Invoice demo: the extracted Factur-X / ZUGFeRD XML is decoded as UTF-8, so accented and other non-ASCII characters in names and addresses no longer show up garbled in the XML pane
- E-Invoice demo: on Delphi XE2 and later the combined e-invoice verdict now decides the business-rule step, so a rule file or engine failure fails validation instead of passing silently
- E-Invoice demo: a visible-text versus XML mismatch from the heuristic consistency check is reported as a warning and no longer fails the overall validation on its own
Version 2.770.54
Security
- CMS signature verification (HPDFVerifyCMSSignature, HPDFVerifyCMSSignatureEx and loaded PDF signatures) now reports a malformed signature when the signed attributes lack the content-type attribute or name a content type different from the signed content, as RFC 5652 requires; such signatures used to verify as valid, which let signed attributes made for one content type be presented as signing another
- Signatures with the content-type attribute repeated are rejected as before
- Countersignatures, which by definition carry no content-type attribute, and RFC 3161 timestamp tokens keep verifying as before
Version 2.770.53
Fixed
- Clicking the button of the C++Builder Annotations demo a second time no longer writes the previous document out again before the new one is started
- An error while the C++Builder Annotations demo builds its PDF now closes the half-built document, so the next click starts from a clean state
Version 2.770.52
Fixed
- Several documents or
THotPDFinstances in one process that use the same disk render cache folder now share a single cache index; previously each instance kept its own index and overwrote the others' on every save, losing the recently-used order - The document-count and total-size limits of the disk render cache are enforced across all instances that share a folder, so the folder no longer grows past its budget when several viewers or render threads use it at the same time
- The same folder is recognised regardless of letter case or a trailing path delimiter
Version 2.770.51
Fixed
- Resampling a bitmap with the bicubic or Lanczos3 kernel now works for every source pixel format; a 32-bit, 8-bit or 1-bit source used to be read as if it held 3-byte pixels, which mixed up its colour channels or read past the end of its rows
- Such sources are converted to 24-bit first, so the resampled image has the same colours as the source; the result stays a 24-bit bitmap as before
- 24-bit sources and the halftone kernel are unaffected
Version 2.770.50
Fixed
- PreflightCLI demo:
-don a single PDF now writes the dashboard index even when the file fails preflight - PreflightCLI demo: files that raise an error during preflight are listed as failed in the dashboard index, and the exit code reflects every failed file
- PreflightCLI demo: with
-r, reports for same-named PDFs in different subdirectories are written to matching subfolders instead of overwriting each other, both with-oand in the dashboard - PreflightCLI demo:
-f jsonand-f csvnow produce the same schema with or without--profile/--preset/--aggregate, including the CSV spec column - PreflightReport demo: CSV reports generated with a profile now fill the spec column like reports without one
Version 2.770.49
Fixed
- The C++Builder LargeFile demo now generates the benchmark input set its readme describes, like the Delphi version: LargeFile-Text.pdf, LargeFile-Image.pdf, LargeFile-Mixed.pdf and the AES-256 encrypted LargeFile-Encrypted.pdf in a BenchmarkInputs folder next to the executable; it only wrote a single 200-page LargeFile.pdf
- The C++Builder LargeFile demo accepts the
--output-dir,--scale(small, default, large, huge) and--pagesoptions and prints the HugeFileBenchmark command for the generated folder
Version 2.770.48
Fixed
- The C++Builder Outlines demo now writes Outlines.pdf next to the executable, the file the readme names, instead of Output.pdf in the working directory, and reports where it was saved instead of opening a viewer
- The C++Builder Outlines demo now builds the same 10-page document with Arial page labels as the Delphi version; the page-bottom labels at y = 830 were cut off at the page edge and the "Bottom" bookmarks of the last page pointed below them
- An error while the C++Builder Outlines demo writes the PDF no longer leaves the demo unable to create another document
Version 2.770.47
Fixed
- The persistent disk render cache now works under folders whose names contain characters outside the system ANSI code page (for example a user profile folder with non-Latin characters); previously every page write failed there and the cache never produced a hit
THPDFDiskPageCachetakes its root folder as a Unicode string and keeps all cache paths in Unicode, including the atomic replacement of page files and of the cache index
Version 2.770.46
Fixed
- Region and tile rendering (
RenderLoadedPageRegionToBitmap,RenderLoadedPageTiles, progressive region rendering) no longer leaves a tile blank when its only content comes from a form XObject placed away from the origin; a form now counts as covering its/BBoxas placed by its/Matrixand the current transformation - Text placed with
TD,T*,'or"now lands on the right line when deciding which tiles contain it, so later lines of a paragraph are no longer culled from the tiles they appear in Tdoffsets are scaled by the text matrix and measured from the start of the line, matching how the text is actually drawn- Character spacing, word spacing, horizontal scaling and text rise are taken into account when estimating where a text run ends, and glyphs are no longer assumed to be narrower than one em
Version 2.770.45
Fixed
- The C++Builder MemStream demo writes MemStream.pdf next to the executable, the name the Delphi version uses, instead of Memory.pdf in the working directory
- The C++Builder MemStream demo now reloads the in-memory PDF with LoadFromStream and checks that it has one page before saving it
- An error while the C++Builder MemStream demo writes the PDF no longer leaves the demo unable to create another document
Version 2.770.44
Fixed
- The C++Builder HelloWorld demo no longer sends a close message to every window whose title contains HelloWorld.pdf when it starts, which could close unrelated windows such as an editor or a file manager
- The C++Builder HelloWorld demo writes HelloWorld.pdf next to the executable and opens it only when
--openis given; like the Delphi version it accepts an output file name or--output <file>
Version 2.770.43
Fixed
- Loading a PDF whose page tree has intermediate /Pages nodes no longer drops the pages below those nodes; such documents previously reported only the pages listed directly under the root of the tree
- The pages keep their page tree order, so page indexes, page boxes and content match what other viewers show
- A page whose /Type is stored as an indirect object is recognised as a page during this ordering step
Version 2.770.42
Fixed
- Loading a PDF whose page tree refers back to itself (a /Pages node listed among its own /Kids, or two nodes listing each other) no longer crashes with a stack overflow; each page tree node is walked once and absurdly deep trees are cut off
- A page tree node whose /Kids array or /Type name is stored as an indirect object now loads its pages instead of failing or reading invalid memory
Version 2.770.41
Fixed
- THPDFPage.LastAnnotation now returns the link created by AddGoToLink, AddURILink, AddNamedDestinationLink, AddGoToRLink, AddLaunchLink, AddStructureDestinationLink and AddGoToRStructureDestinationLink
- Calling SetAnnotationFlags, SetAnnotationBorderStyle or AddPopupAnnotationFor with LastAnnotation right after adding a link no longer silently does nothing or changes the previously created annotation instead
Version 2.770.40
Fixed
- Job JSON passed to
THPDFJobProcessor.Execute,HPDFDocRunJobandHPDFDocRunJobWithCallbacksis now read as UTF-8 throughout:\uXXXXescapes no longer collapse into the ANSI code page, and escaped surrogate pairs such as😀produce the intended character instead of two broken ones - Input and output file names in merge, split, optimise, encrypt and validate jobs keep characters outside the system code page, whether written as raw UTF-8 or as
\uescapes, so such files are found and written under their real names - A malformed
\uescape with fewer than four hex digits is dropped without swallowing the following characters or the closing quote - A UTF-8 byte order mark at the start of the job text is ignored
Version 2.770.39
Fixed
- Object identifiers supplied by the caller when building signatures and timestamp requests (signature policy, commitment type, claimed role, timestamp policy and similar OIDs) are now encoded correctly when the first arc is 2 and the second arc is 48 or larger; the combined first value used to be cut to a single byte, producing a different, wrong identifier
- An object identifier arc too large to represent is now rejected with an error instead of silently wrapping around to another value
Version 2.770.38
Fixed
- HugeFileBenchmark demo: with
--recursive --keep-output, PDFs that share a file name in different subdirectories no longer overwrite each other's generated files; the work directory now mirrors the input folder tree
Version 2.770.37
Security
- Rendering a PDF with an embedded TrueType font whose composite glyphs list many components, each again a composite, can no longer hang the renderer or text-to-path export; one glyph now expands to at most 1024 components across all nesting levels
- A composite glyph component that refers back to its own glyph is skipped instead of being expanded down to the nesting limit
Version 2.770.36
Fixed
- A stitching (Type 3) function that refers back to itself, directly or through other functions, no longer recurses until the stack overflows; it is treated as an unusable function
- Affects Separation and DeviceN tint transforms, shading functions and transfer functions in malformed or hostile PDFs rendered with
RenderLoadedPageToBitmapand the other render paths - Function nesting is limited to 16 levels; legitimate documents nest far less deeply
Version 2.770.35
Fixed
- The C++Builder PageOperations demo now runs the same workflow as the Delphi version: it also inserts a custom-size blank page with InsertLoadedBlankPage and prints the text of pages 1-3 with ExtractLoadedPagesText
- The reordered and extracted files of the C++Builder PageOperations demo now contain the same pages as the Delphi version's, moving the last page to page 2 and extracting pages 2 and 5
Version 2.770.34
Fixed
- The C++Builder Hyperlink demo continues on a new page when the link list does not fit on one page; links past the bottom of the first page were written outside the page
- Add, Remove and Make PDF in the C++Builder Hyperlink demo are disabled while the PDF is written, so the link list can no longer change, and the document cannot be started a second time, in the middle of generation
Version 2.770.33
Fixed
- The C++Builder Stamp demo now places the text watermark and the rubber-stamp annotation relative to each page's size; on landscape and other non-A4 pages the stamp annotation fell outside the page and the watermark drifted off-center
Version 2.770.32
Fixed
- Each button of the C++Builder ViewerPref demo now starts from a fresh document; the reading direction, initial zoom and other viewer preferences of an earlier click stayed in effect, so for example Create PDF after Test Direction still wrote right-to-left text and preferences that were no longer selected
- The C++Builder PDF_INFO demo now writes PDFInfo.pdf next to the executable, the file name the Delphi version and the readme use
Version 2.770.30
Security
- Certificate path validation (HPDFValidateCMSCertificatePath, the online variant and signature batches) can no longer be stalled by a signature that embeds many certificates sharing one name and key; such a set used to make the path search try every possible ordering, which grows factorially and could keep a validation busy for hours
- Each issuer signature in a candidate chain is now verified once per validation and its result reused, instead of being verified again for every path that passes through it
- The path search is capped at a fixed amount of work; when the cap is reached the validation reports that no valid path reaches a trust anchor, and ordinary chains stay far below it
Version 2.770.29
Fixed
ImportLoadedInterchangeFromFDFnow matches whole key names when it reads annotations and the FDF status:/Tno longer stops at/Typeor/Text,/Fno longer at/FreeText, and/Statusno longer at a longer key that starts the same way, so imported annotations keep their author and flags- Keys of nested dictionaries inside an imported annotation, and key-like text inside strings, are no longer taken for the annotation's own entries
- Literal strings in imported FDF annotations and status decode all escapes defined by ISO 32000-1:
\t,\b,\f, octal\dddand backslash line continuations, in addition to\n,\rand escaped parentheses
Version 2.770.28
Fixed
- In builds made with Delphi versions before XE2, which use the bundled PNG reader, loading a PNG file with a compressed text (zTXt) chunk no longer reads past an internal buffer; text longer than 256 bytes came out corrupted and far too long, and large chunks could crash
- The compression method of a compressed text chunk is now read from the correct byte, so chunks with an unsupported method are ignored instead of being decoded as if they were deflate data
- Truncated or malformed compressed text no longer risks an endless decoding loop
- Builds with Delphi XE2 and later use the system PNG reader and are unaffected
Version 2.770.27
Changed
- The C++Builder SearchAndSelect demo now works like the Delphi version: it creates a sample PDF, loads it, finds the search term with SearchLoadedDocumentText and adds a highlight annotation over every match with AddLoadedHighlightAnnotation
- The C++Builder SearchAndSelect demo accepts an input PDF, a search term, an output file and the --case-sensitive and --whole-word options, and checks the saved copy for the new annotations
Fixed
- The highlights of the C++Builder SearchAndSelect demo now cover the matched words; they were placed one line too high because the text position was taken as the baseline instead of the top of the text
Version 2.770.26
Fixed
- The C++Builder DigiPrint demo now starts on systems whose decimal separator is a dot; the comma decimals in demo.xml were parsed with the system locale and raised an error while the form was created
- The DigiPrint demo reads demo.xml and its two JPEG icons from the executable folder and writes demo.pdf there, and the project now places the executable in the demo folder next to those files
- The footer page icons of the DigiPrint demo are drawn inside the footer row instead of below the page's bottom rule, and the title, year and footer text use the report style's font sizes
- Clicking the DigiPrint button more than once no longer shifts the left margin further to the right with every click
- An error while the DigiPrint demo builds the PDF, such as a missing image file, no longer leaves the demo unable to create another document
Version 2.770.25
Fixed
- Showcase demo: header bands, the cover background, the gradient swatches and the back-page accent now line up with the shapes they fill; gradient coordinates are given in PDF default user space (origin bottom-left), so the colours are no longer shifted or flipped
- Showcase demo: Save Copy no longer switches the working file, so Regenerate and Open External keep using the main gallery instead of the last copy written
- Showcase demo: when generating the gallery fails, the viewer is rebound and keeps showing the last gallery that loaded instead of staying blank
- Showcase demo: output paths with characters outside the system ANSI code page are passed through unchanged
Version 2.770.24
Fixed
- Loading a JPEG 2000 image with four components (RGB plus alpha, or YCC plus alpha) into a
TJpeg2000Bitmapnow puts red, green, blue and alpha into the right bytes of the 32-bit bitmap; previously the colour channels were shifted by one byte and the alpha channel overwrote one of them - This also fixes a round trip of a 32-bit
TJpeg2000BitmapthroughSaveToStreamandLoadFromStream, which came back with mixed-up colours - Three-component colour images, grayscale images and four-component CMYK images load as before
Version 2.770.23
Security
- A text string whose value starts with << and ends with >> (for example a title, author, form field value or annotation text such as "<<URGENT>>") is now always saved as a string; it was written out verbatim, which broke the file syntax and let crafted text inject a dictionary such as an action into the saved document
- Applies to new documents and to loaded documents saved with SaveLoadedDocument and related methods
Version 2.770.22
Fixed
- The C++Builder Barcodes demo writes Barcodes.pdf next to the executable instead of into the current working directory, and accepts an optional output file name as its only argument
- The C++Builder Barcodes demo no longer opens a PDF viewer after it runs, and like the Delphi version compresses its page content and opens at fit-height zoom
- Errors in the C++Builder Barcodes demo are reported with their message text; the console showed a memory address instead
Version 2.770.21
Fixed
- In the stable C ABI, calling
hpdf_document_destroywhile another call on the same handle is still running (from another thread, or from inside a read, write, progress or cancellation callback) no longer frees the document under that call - The handle becomes invalid as soon as
hpdf_document_destroyreturns; the document itself is released when the last running call on it finishes - Calls that look up a handle concurrently with its destruction get
HPDF_STATUS_INVALID_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 really accumulates across levels
- A contextual rule that fires many nested lookups can no longer multiply them into a near-endless loop: each top-level match runs at most 1024 nested lookups
Fixed
- A chaining contextual substitution (GSUB lookup type 6) reached from another contextual lookup is now applied; it was read with the plain contextual layout and never matched, so some ligatures and contextual forms were missing
- A reverse chaining substitution (GSUB lookup type 8) referenced from a contextual rule is skipped as the OpenType specification requires, instead of being misread as a contextual subtable
Version 2.770.19
Fixed
RenderLoadedPageToDCno longer raises an access violation when the page contains an image XObject or an inline image; the images are drawn into the caller's device contextGetLoadedPageMetafileno longer fails on pages with images, and the images are recorded in the returned metafile- Image clipping against the visible surface now uses the size passed to
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 start left of or above the region but still overlap it; such cells were treated as lying far outside, their gray values were skipped, and the remaining cells of the region were decoded out of step
- Negative grid coordinates that are not whole pixels are now rounded toward minus infinity as the JBIG2 specification requires, so partly visible cells land on the correct pixel
- Halftone regions whose grid lies entirely at non-negative coordinates are unaffected
Version 2.770.17
Fixed
- OCSP responses whose responder is identified by key hash in the standard RFC 6960 form (an explicit [2] tag around the key hash) are accepted again; certificate path validation used to discard them, so revocation stayed unknown for every responder that names itself by key
- Both direct responders (the issuing CA) and delegated OCSP signing certificates identified by key are matched, and the older implicitly tagged form keeps working
- HPDFDescribeValidationEvidence now keys OCSP descriptors by the DN of the certificate issuer named in each response, resolved from the response's issuer name hash, instead of by the responder DN; responses from delegated responders and responses identified by key now produce descriptors that a lookup by certificate issuer can find
- Added an HPDFDescribeValidationEvidence overload that takes the CMS signature and extra issuer certificates, for responses that identify the responder by key and embed no certificate
Version 2.770.16
Fixed
- Viewer demo: the form no longer raises an access violation on startup; the status bar now exists before the viewer is bound to the document and starts reporting page changes
- Viewer demo: pressing Enter in the search box now activates the first match instead of skipping straight to the second one
- Viewer demo: bookmarks without a resolvable destination page are listed without a bogus "(p0)" suffix, and clicking them no longer raises a range error
Version 2.770.15
Fixed
- The decryption step of the C++Builder Security demo now really opens the encrypted sample with the user password "user"; the password argument was taken as the automatic-decryption flag, so the sample was loaded without its password and Security-Decrypted.pdf was not a decrypted copy
Version 2.770.14
Fixed
- A clipping path set with
WorW*now takes effect after the path is painted, as ISO 32000-1 requires, instead of before it - Stroking a path that also sets the clip (
re W S) now paints the whole line width; the outer half of the stroke was cut away by the path's own clip - Fill-and-stroke with an even-odd clip (
W* B) now fills with the painting operator's own winding rule; the even-odd clip used to punch holes into the fill B*andb*now always fill with the even-odd rule, independent of the fill rule left over from an earlier operation
Version 2.770.13
Fixed
- JBIG2 halftone regions whose gray-scale planes are MMR-coded now decode; previously the planes came out inverted, only every eighth column was read, and the end of each plane was located at the wrong byte, so the following planes were decoded from the wrong position
- The end-of-block marker after each MMR plane is recognised whether it follows the last row directly or after byte padding, and every plane now starts on the byte boundary that follows
- Arithmetic-coded halftone regions are unaffected
- Applies to PDF images with the JBIG2Decode filter that are loaded, extracted or rendered with the built-in decoder
Version 2.770.12
Fixed
- JSON produced by the job processor (
THPDFJobProcessor.Execute,HPDFDocRunJob,HPDFDocRunJobWithCallbacks) and by the document comparison now escapes quotes and backslashes as\"and\; the previous\x22/\x5Cforms are not valid JSON and made standard parsers reject results that contained a quote or a Windows path - Control characters are written as
\uXXXXescapes and the output is always well-formed UTF-8: bytes that are not valid UTF-8 are replaced with U+FFFD instead of being copied into the result - Error messages in job results and in the comparison error object are encoded as UTF-8, so non-English exception text and file names no longer arrive in the ANSI code page
Version 2.770.11
Fixed
- RedactLoadedRect, StampLoadedPageText, StampLoadedPageImage, StampLoadedPageShape, StitchLoadedPage and FlattenLoadedAnnotations no longer throw away a page's existing content when its /Contents is an array of streams; the new operators are added as an extra stream at the end of the array, or at the front for an underlay
- Underlay stamps on a page whose content is split over several streams keep every original stream
- Pages whose single content stream uses a filter other than plain FlateDecode (ASCIIHex, ASCII85, LZW, RunLength, filter chains or Flate with a predictor) are now decoded before new operators are appended, so the stamp, redaction box or flattened appearance is actually painted and the original content stays readable
- When a page's content stream cannot be decoded at all it is left untouched and the new operators are written to a separate stream instead of being appended to the encoded bytes
Version 2.770.10
Security
- Rendering a PDF whose embedded CFF font (FontFile3, Type1C or CIDFontType0C) stores an INDEX offset of 0x80000000 or more no longer reads memory outside the font data; such offsets were treated as negative and passed the bounds checks
- Embedded TrueType fonts get the same treatment for glyph locations and table lengths of 0x80000000 or more: the glyph or the font is skipped instead of being read from the wrong place
- A CFF glyph whose subroutines call each other many times over can no longer hang rendering or text-to-path export; each glyph now has a fixed budget of charstring operations, far above what real fonts use
Version 2.770.9
Fixed
- JBIG2 images whose text regions use Huffman coding together with symbol refinement in the 13-pixel template now decode; the refinement adaptive-pixel bytes in the region header were skipped, so the instance count and every following field were read from the wrong offset and the image was rejected
- Text regions with arithmetic coding, or with the 10-pixel refinement template, are unaffected and decode exactly as before
- Applies to PDF images with the JBIG2Decode filter that are loaded, extracted or rendered with the built-in decoder
Version 2.770.8
Security
- With codec isolation enabled, the size of a decoded image returned by the isolated codec worker is now checked against the configured output limit and the shared memory the host process allocated, instead of a capacity field the worker itself can overwrite
- A compromised or faulty worker can no longer make the host copy past the end of the shared memory block; such a reply is rejected as a protocol error and the image is not drawn from it
- The worker's reply is copied once and validated from that copy, so its header cannot change between the checks and the pixel copy
Version 2.770.7
Fixed
- OCSP requests built for live revocation checking (HPDFCollectCMSRevocationRequests and the online certificate path validation) now encode the SHA-256 algorithm identifier of the CertID correctly; before, the first two object identifier arcs were written as separate bytes, so the hash algorithm was invalid
- OCSP responders that reject malformed requests now answer these requests with a normal status instead of an error, so online revocation checks no longer fall back to offline evidence because of the request encoding
Version 2.770.6
Fixed
- Rendering a Type 3 font now paints every occurrence of a glyph; previously a glyph repeated in the same text run, or anywhere else on the page with the same size and orientation, was painted only the first time and left blank afterwards
- Affects
RenderLoadedPageToBitmap,RenderLoadedPageToDC, page metafiles and the image export paths, with or without the shared render cache - Repeated Type 3 glyphs keep using the glyph cache, so the fix does not re-read the glyph procedure for each occurrence
Version 2.770.5
Fixed
- The stable C ABI no longer frees the input source twice when
hpdf_document_load_from_iofails while the document is being parsed, for example when the read callback reports an error or the operation is cancelled midway; such a load could corrupt the heap or crash the host process - A failed load now returns the callback or cancellation status instead of an internal error, and the same document handle can be loaded again afterwards
- Loading a new document into an existing handle releases the previous input source only once the new load has taken over
Version 2.770.4
Fixed
- Barcode results from
DecodeLoadedPageBarcodeson pages with/Rotate 90or/Rotate 270now report bounds at the symbol's real position instead of a position mirrored across the page - The reported barcode orientation on those pages now matches the direction the symbol actually reads in page space
- The invisible text placed by
ApplyLoadedOCRTextLayeron quarter-turned pages now lies over the recognised words, so selection and search highlight the right place - Face findings from redaction detection on quarter-turned pages are mapped back to the right page area as well
- Unrotated and upside-down pages are unaffected
Version 2.770.3
Fixed
- In 32-bit builds, loading or writing a TIFF image compressed with PixarLog no longer crashes with a stack overflow; selecting the codec builds its companding tables, which hit an endlessly recursive exponent helper
- SGILog (LogLuv) TIFF images in 32-bit builds go through the same corrected math helpers
- The 32-bit rounding-down helper used by the TIFF codecs now rounds negative values toward minus infinity and accepts large magnitudes without an overflow error, matching the 64-bit builds
Version 2.770.2
Changed
- When rendering, an image drawn at half its pixel size or less is shrunk to exactly the drawn size by area averaging right after decoding, instead of being kept at full size and stretched while drawing
- The shrunk image fits the decoded-image cache: a transparency group that is drawn twice, on black and on white, to recover its alpha now decodes such an image once instead of once per pass, and so does rendering the same page again
- An image with a soft mask is combined with its mask pixel for pixel at the drawn size, where the mask is also shrunk; this avoids building and premultiplying a full-size copy of a large image and its mask, and the mask edge is no longer sampled by nearest neighbour
- On a sample page with a 4229 x 4629 masked image drawn at about a quarter of its size inside such a group, rendering took about 1.8 seconds instead of 4.5
- Stencil image masks keep their full resolution, and the public region-decoding methods keep returning the sizes they document
Version 2.770.1
Fixed
- In 64-bit builds, rendering a page with a transparency group failed with a list index error whenever the group set no soft mask of its own, a regression of version 2.769.3; such pages now render again
Version 2.770.0
Added
- New
RenderColorimetricLuminosityMasksproperty chooses 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 separately
Changed
- By default a luminosity mask now weights the resolved colour of its group like DeviceRGB whatever the blending space, as common PDF viewers do. CIE Y is measured on a linear scale, so a mid-grey in an ICC or calibrated group masked only about a fifth, and drop shadows and fades came out much lighter than in other viewers
- The
/BCbackdrop colour of a mask follows the same setting as the paint inside the mask group - Masks whose group uses a device colour space render as before
Version 2.769.3
Fixed
- A transparency group painted with a blend mode other than Normal, such as the Multiply drop shadows that design tools export, now blends its own colour and alpha with the backdrop (ISO 32000-1 11.3.6 and 11.4.8). Where the group was partly transparent its pixels already held the backdrop, which was then blended with itself: a Multiply shadow came out too dark and in the backdrop's hue
- The content of a transparency group starts from the Normal blend mode, as the blend mode applies to the group as a whole (11.6.6). It kept the mode the group was painted with, so an isolated group multiplied its content into its empty start and painted black
- A soft mask set in the same graphics state as a blend mode draws its mask group with Normal blending (11.6.5.2); the blend mode turned a white mask group black and hid what the mask should have shown
- To find the alpha of a group that is not isolated, the group is drawn twice, on black and on white, when its own graphics states blend normally; such pages render somewhat slower
Version 2.769.2
Changed
- An image with a soft mask is decoded at the size it is drawn, as an image without one already was, and its mask is decoded at that size too; a JPEG mask goes through the reduced-size JPEG decoder instead of being decoded in full
- The image and its mask are always decoded whole, so the mask cannot shift against the image, and clipping keeps what is drawn to the visible part
- On a page with a 4229 x 4629 shadow image and a 2114 x 2314 JPEG mask drawn about 1000 pixels wide, rendering at 72 dpi took 1.6 instead of 3.7 seconds
DecodeLoadedImageRegionAtResolutionreturns a whole image of a format without a region decoder as decoded, without copying it once more
Version 2.769.1
Changed
- Soft masks are built faster: building a mask no longer keeps a second copy of the whole page to compare against, which pages with many masks, such as the gradients and drop shadows that design tools export, paid once per mask
- Luminosity masks over a calibrated or ICC-based blending space look the sRGB curve up instead of computing it for every channel of every pixel, and grey mask content, the common case, is converted through a single table
- A 1125 x 1600 page with about twenty soft masks renders roughly a fifth faster; the rendered pixels are unchanged
Version 2.769.0
Changed
- Setting a page's Width or Height no longer hides errors: a failure now raises an exception instead of leaving the size silently unapplied, and setting the size of a page whose canvas has already been closed raises the new EHPDFPageClosedError with a message that says why
- After such a failure the page no longer stays in a state where later size changes only update its MediaBox and not the page size used for drawing
Fixed
- Resizing a page of a loaded PDF no longer overwrites other objects: a MediaBox whose numbers are separate objects, or a MediaBox array shared by several pages, is copied for the page being resized, so other pages keep their size
- Resizing a loaded page whose MediaBox has fewer than four numbers now writes a complete MediaBox with the new size; the new size was ignored before
Version 2.768.20
Fixed
- Text extraction no longer enters a Form XObject that paints itself, directly or through other forms; such a form was read again at every nesting level, repeating its text up to twelve times, and one that painted itself twice took 4,096 passes
- Text of a Form XObject that falls outside the form's bounding box, which clips it, is no longer part of the page text
Version 2.768.19
Changed
- Large documents load faster again: walking the page tree no longer searches all loaded objects for every page, and the encryption check of LoadFromFile with AutoDecrypt reads the file through the same buffer as the load. The 56 MB PDF Reference 1.7 now loads in about 8 seconds instead of 22
Version 2.768.18
Fixed
- Page rendering now finds installed fonts that Windows reports under a localized name, such as Microsoft YaHei on Chinese Windows or Yu Mincho on Japanese Windows; text in such fonts was drawn in a substitute font when the PDF did not embed them
- Font names written without spaces now match Windows families that keep some words joined, such as MicrosoftYaHei for Microsoft YaHei, MicrosoftJhengHei for Microsoft JhengHei and MSPGothic for MS PGothic; they were looked up with a space before every capital letter and never found
- The renderer remembers which font names are installed, so documents with many fonts that are not installed no longer probe Windows for each name on every page
Version 2.768.17
Changed
- Large documents load much faster: operation telemetry now samples memory at most once every 10 ms within an operation instead of at every object the parser reads, a sample that walked every block of the memory manager. The 1,236-page PDF Reference 1.6 loads in about 2.5 seconds instead of 30, and the 56 MB PDF Reference 1.7 in about 22 seconds instead of over four minutes
- The slowdown grew with the size of the application's own heap, so applications holding much memory benefit most
- UpdateOperationTelemetrySample gains an optional Force parameter that takes a sample regardless of the interval; the end of every operation still takes one
Version 2.768.16
Fixed
- Loading an empty file no longer hangs; LoadFromFile used to loop forever reading backwards from the start of the file
- A file in which no page can be found, such as an empty file, plain text or random bytes, no longer loads as one or three blank pages guessed from its size; LoadFromFile now returns 0 or raises an exception, as for other unreadable files
- An encrypted file whose pages lie in encrypted object streams now raises an exception saying the password is needed when it is loaded without one, instead of loading as a blank page; load it with the password overload
Version 2.768.15
Fixed
- Page text no longer repeats characters that are painted again over themselves, as in overprinted logos and in bold faked by drawing the text twice with a small offset; such text was extracted twice, for example "Bold wordsBold words", and searches for it could fail
- The text, column, layout and semantic text extraction all read such a character once; the glyph list still reports every painted glyph
Version 2.768.14
Fixed
- Glyph names of the full Adobe Glyph List now resolve in text extraction and rendering, among them the ligatures fi, fl, ff, ffi and ffl and the afii names that older Cyrillic, Hebrew and Arabic fonts use; a font encoding that named such glyphs gave the wrong characters, for example "defined" was extracted as "deÞned"
Version 2.768.13
Changed
- LoadFromFile reads files below LocalFileMappingThreshold (8 MB by default), and every file when mapping is off or unavailable, through a 64 KB read buffer; files with many objects and a classic cross-reference table load far faster, for example the 912-page PostScript Language Reference Manual in about 1 second instead of close to 3 minutes
Version 2.768.12
Fixed
- Text extraction now places the glyphs of CID-keyed (Type 0) fonts whose /W width array is not ordered by CID; most glyphs got the default full-em width, so lines ran past the page edge and their ends were dropped from the extracted text and search
Version 2.768.11
Fixed
- Accented letters of embedded CFF (Type 1C) fonts that are built from a base letter and an accent, as in many fonts converted from Type 1, now render; letters such as ü and é were left blank, so words like "München" showed a gap
- The same letters are now complete in SVG export with embedded fonts
Version 2.768.10
Fixed
- Composite glyphs of embedded TrueType fonts now place each part at its own offset: accented letters such as é and Å lost their accent, and curly double quotes showed as a single quote followed by a gap
- The same glyphs are now complete in SVG export with embedded fonts
Version 2.768.9
Fixed
- Images marked
/Interpolate falseare now averaged when drawn smaller than their own resolution; they were sampled one pixel in several, so charts placed as images showed jagged, dark axis labels and broken thin lines where other viewers show them smooth - Enlarged images with
/Interpolate falsekeep their hard pixel edges as before
Version 2.768.8
Fixed
- Text drawn with a stroke narrower than a pixel, as documents use for fake bold, now renders at that width; the stroke used to be a whole pixel wide, so such headings looked smeared and much heavier than in other viewers
- Small glyphs of embedded and installed fonts are stroked with antialiasing in text rendering modes 1 and 2, in the stroke colour, after the fill
Version 2.768.7
Fixed
- Calling
ProcessObjectStreamsForDecompressionon a loaded document no longer discards the object streams the load had read: compressed objects stay available toExtractRawObjectFromStreamandExtractObjectFromStreamafterwards, where before none could be read - When the method scans the file itself, as for a document with a classic cross-reference table, it now finds an object stream that directly follows another stream and reads its object count and offsets from its own dictionary
ExtractRawObjectFromStreamdecodes an object stream again when the object stream cache has released it, instead of returning an empty result
Version 2.768.6
Fixed
- The Stamp demo now builds successfully for Win64
Version 2.768.5
Fixed
- On Chinese, Japanese and Korean editions of Windows, documents with cross-reference streams whose dictionaries hold binary strings, such as the checksums of attached files, now load in a fraction of a second; a 4 MB portfolio with nine attached PDF files took two minutes to open
- The parser now looks for its keywords in the raw bytes of the file rather than in text converted through the Windows code page, so binary data next to a keyword can no longer hide it or shift its position
Version 2.768.4
Fixed
- Content inside a Form XObject now renders with the opacity, soft mask and blend mode it sets for itself; before, everything inside a form painted at full opacity, so translucent watermarks and stamps came out solid
- A form painted with an opacity of its own is still composited once as a whole, as before
Version 2.768.3
Fixed
- Page text now includes text that the page paints through Form XObjects, such as page headers and footers, watermarks and stamps; before, only text in the page's own content was returned
- Form text appears where the form is painted, placed through the form's matrix and read in the form's own fonts, and forms nested inside forms are followed too
- This applies to plain, layout, column and semantic page text; the glyph-level extraction still returns only the glyphs of the page's own content, whose positions point into that content
Version 2.768.2
Fixed
EncryptFileandDecryptFilewith AES-256 no longer damage embedded font files whose dictionary lists/Length1before/Length, as Ghostscript and other tools write them; such fonts were encrypted as a single byte, which left the output unreadable- Streams whose length is stored in a compressed object stream keep all their data through AES-256 encryption and decryption; before, the last byte of such a stream could be lost
Version 2.768.1
Fixed
- Documents whose stream lengths are stored inside compressed object streams, as Ghostscript writes them, now load completely; before, every page content stream of such a file was dropped, so the pages rendered blank and gave no text
- A stream whose length refers to an object that does not exist, or that has no length at all, is now read up to its end marker instead of being dropped
Version 2.768.0
Added
BuildLoadedPageSVGandSaveLoadedPageAsSVGtake an optionalEmbedFontsparameter; it is off by default, and the existing calls export exactly as before- With
EmbedFontsset toTrue, text in fonts whose TrueType or CFF program is embedded in the PDF is drawn from the font's own glyph outlines, so the SVG looks the same on systems where those fonts are not installed - Each glyph outline is written once and reused wherever the character appears, which keeps the file size down on text-heavy pages
- The text stays in the SVG as transparent text over the outlines, so it can still be selected, searched and read by screen readers
- Fill, stroke and fill-and-stroke text, line widths, rotated or scaled text and text used as a clipping path come out as they do in the rendered page
- Fonts that are not embedded, Type 1 font programs and vertical CJK text stay ordinary SVG text
Version 2.767.4
Fixed
- Outlined and fill-and-outline text (text render modes 1 and 2) in fonts that are not embedded now honours the line width when rendered; before, every outline came out one pixel wide whatever the line width was
- Such outlines are now drawn from the installed font's exact glyph shapes at their exact positions, as filled text already was
- Characters the installed font lacks, which Windows takes from a fallback font, also keep the line width when outlined
Version 2.767.3
Fixed
- Text in fonts that are not embedded is now drawn with the characters its encoding names. The character codes went to the installed font unchanged, and the installed font reads them in its own character set, so every
/Differencesentry and the codes where StandardEncoding or MacRomanEncoding differ from the Windows character set drew the wrong characters, for example straight instead of curly quotation marks in Type 1 fonts without an encoding - On Chinese, Japanese and Korean editions of Windows, accented letters, curly quotation marks, the copyright sign and other characters above code 127 in fonts that are not embedded were drawn as question marks since version 2.766.83; they are read in the installed font's character set again
- Symbol fonts keep their own code mapping
Version 2.767.2
Fixed
- Large glyphs of embedded fonts are now rendered with antialiasing as well. Glyphs larger than 64 pixels, such as headings and titles at print resolutions, were filled without it and showed jagged edges; they are now antialiased up to 256 pixels, while larger text of installed fonts keeps the system's antialiased text output
Version 2.767.1
Fixed
- Layout text, column text and semantic text extraction now measure the page in page units. They compared positions with the font size given to
Tfand with text-space advances, which are a fraction of the real distances in the many documents that size text through the text matrix, so layout text spread each letter over several columns, column text lost all word spaces and semantic text put almost every word on its own line - All three now return only the text inside the visible box and separate words that a document spaces apart by moving the text position, like the plain page text
- Layout text keeps the letters of a word together, where wide letters such as m or W used to push a space into the word
- Semantic text no longer puts a blank line after every line of a single-column page: a run of full-width lines forms one zone, and a zone change separates lines only when they are set apart by more than a line spacing
- The help pages for these methods describe what they return, and the column method shows its full syntax
Version 2.767.0
Added
LoadFromFileandLoadFromStreamhave overloads with anAutoDecryptparameter. WithAutoDecryptTrue, a document encrypted with an empty user password, as documents that only restrict printing, copying or editing are, opens decrypted in memory the way viewers open it, so its text can be extracted and its pages rendered and exported without supplying a password- Documents that need a password, and unencrypted documents, load exactly as the plain overloads load them, and whether the empty password opens the document is checked from a few small ranges of the file before it is loaded
- As with the password overloads, a document opened this way is no longer encrypted in memory, and saving it writes an unencrypted copy
Version 2.766.83
Changed
- Small text in fonts that are not embedded, such as the standard 14 fonts and installed Office and Chinese fonts, is now rendered from the unhinted glyph outlines at its exact position, with the same antialiasing as embedded fonts. The system text output used before placed every glyph on a whole pixel and adjusted its shape to the pixel grid, so small text was spaced unevenly and looked blotchy; rendered pages now match the shapes and spacing of other viewers much more closely
- Glyphs that the installed font lacks and large glyphs are still drawn with the system text output, which can take missing characters from linked fonts
Fixed
- Small glyphs of embedded fonts are drawn faster, because the bitmaps behind their antialiasing are reused instead of being created for every glyph
Version 2.766.82
Fixed
- Text drawn with installed fonts in rendered pages now uses grayscale antialiasing. It followed the system's ClearType setting, so black text in rendered bitmaps carried red and blue fringes that depended on the machine and remained in saved, printed or scaled images
Version 2.766.81
Fixed
- Small text in embedded CFF and OpenType CFF fonts is now rendered with antialiasing, as TrueType text already was. These glyphs were filled without antialiasing, so at small sizes and normal screen resolutions stems narrower than a pixel disappeared and body text broke up into fragments; forms and documents set in fonts such as Helvetica Neue are now legible at 72 DPI
Version 2.766.80
Changed
- Page text extraction returns only the text the page shows. Glyphs that lie outside the visible area, the crop box within the media box, are left out, so printer's marks, slug lines and other content outside a trimmed page no longer appear in the extracted text. The glyph-level extraction still returns every glyph with its position
Version 2.766.79
Fixed
- Page text extraction no longer breaks a line at a raised superscript or a slightly shifted baseline in text that is sized through the text matrix. A new line was started whenever the text moved up or down by half the font size given to
Tf, which is often 1 in such documents, so a move of half a point was enough - Rotated text, such as labels running up the side of a page or diagonal watermarks, no longer puts every character on its own line. Lines are now told apart by the movement across the direction the text runs, compared with half the text height on the page
Version 2.766.78
Fixed
- When the SVG export falls back to a generic font family for a font that is not installed, it now names a common face of that kind first: Times New Roman before
serif, Arial beforesans-serifand Courier New beforemonospace. A browser picks the face for a bare generic family from its own language settings, and Chinese or Japanese browsers chose CJK fonts whose wide Latin letters overlapped at the positions taken from the PDF
Version 2.766.77
Fixed
- The SVG export now names installed Chinese font families for fonts known by their legacy GB2312 names, such as
KaiTi_GB2312or its Chinese spelling. Windows applications reach these fonts through the system's font substitutes, but browsers do not, so such text was shown in the browser's default font - A font named in only one language also gets the installed family's other name, for example SimHei together with its Chinese name, and a generic family that matches its style
Version 2.766.76
Added
THPDFGlyphRecordhasGlyphEndXandGlyphEndY, the page-space end of the glyph's own width along the baseline, without character and word spacing
Fixed
- Page text extraction now separates words that a document spaces apart by moving the text position instead of showing a space character. Many producers write
[(PDF)-240(Reference)]or place each word with its own positioning operator, and such words used to run together asPDFReference - A space is added where the gap after a glyph's own width exceeds 0.15 of the text height, measured in page units so that text sized through the text matrix is treated the same as text sized through the font size
- Kerning, slightly loosened spacing, tightened character spacing that position adjustments give back, overprinted text and real space characters are left as they are, and no space is added between two Chinese, Japanese or Korean characters however far apart justification sets them
Version 2.766.75
Fixed
- Text extraction, the SVG export and rendering now recognize the glyph names of the Symbol font, such as
copyrightsans,registerserif,trademarksansand the pieces of large brackets and braces (parenlefttp,braceex,integralex, ...). Subset Symbol fonts commonly re-encode these names, and the characters came out as raw control codes - All ITC Zapf Dingbats glyph names (
a1toa206) are recognized as well, so check marks, crosses, arrows and circled numbers that a font selects through these names, as form fields and bulleted lists often do, are extracted as their Unicode characters - Looking up a glyph name for a character still prefers the common name, such as
arrowrightorspade, over a ZapfDingbats name
Version 2.766.74
Fixed
HPDFExtractGlyphsViaDeviceno longer fails with an invalid pointer operation. The text-extraction device it creates is reference counted, and the function freed it explicitly as well, so every call ended by freeing the device a second time
Version 2.766.73
Fixed
- Text extraction now restores the text state with
Qas the specification requires (ISO 32000-1 9.3.1). Before, only the transformation was restored, so a font, character spacing or leading set insideq...Qstayed in effect for the text that followed - When the font selected inside
q...Qused two-byte codes and the font outside it one-byte codes, the text afterQwas decoded as two-byte codes and lost. Word and similar producers write pages this way, typically losing table-of-contents leaders and Latin words between Chinese runs - The fix covers both the page text API and the device-based text extraction interface
Version 2.766.72
Fixed
- Text drawn after
RestoreStatenow always has its font selected. The page skips a font selection that repeats the last one written, but it did not take into account thatRestoreState(theQoperator) returns the reader to the font in effect beforeSaveState. Text shown afterRestoreStatein the font chosen inside the pair came out with no font or the wrong font, so viewers could drop it and text extraction could not read it - Character spacing, word spacing, horizontal scaling and leading follow
SaveStateandRestoreStatein the same way, so a value set again afterRestoreStateis written out instead of being skipped while the reader has already returned to the earlier value - Selecting a Type 3 font no longer causes the next selection of the previous font to be skipped
- XPS documents converted to PDF were affected, because each glyph run is drawn inside its own saved graphics state
Version 2.766.71
Fixed
- Text extraction and the SVG export read the codes of a simple font (Type 1, TrueType or Type 3) as two bytes when its
/ToUnicodeCMap declared a two-byte codespace, as some producers write for every font. Codes of simple fonts are always single bytes (ISO 32000-1 9.6.6), so each pair of characters was taken as one unknown code and most of the text disappeared, leaving only strings of a single character
Version 2.766.70
Fixed
- The SVG export moved text by the operands of
Td,TD,T*,'and"in page units instead of text space (ISO 32000-1 9.4.2). Text whose size comes from the text matrix, with1 Tfand a scaledTmas word processors often write it, had its lines stacked on top of each other near the first baseline; it is now laid out as in the PDF - The same correction applies to the content-device text extractor
THPDFTextExtractDevice
Version 2.766.69
Fixed
- The page renderer passed font names that use
#xxescapes to Windows with the escapes, so non-embedded fonts named that way, common for CJK fonts such as KaiTi_GB2312 written in Chinese characters, matched no installed font and were drawn in a substitute face. Escapes are now decoded; UTF-8 names keep their characters and other bytes are read in the system code page
Version 2.766.68
Fixed
- The SVG export wrote font names that use
#xxescapes as the escapes themselves, so CJK font names stored as UTF-8 bytes (such as the KaiTi_GB2312 name in Chinese characters) reachedfont-familyas#e6#a5#b7...and never matched an installed font. Escapes are now decoded; a name that is valid UTF-8 is kept, and bytes of other encodings are dropped as before
Version 2.766.67
Fixed
- The SVG export did not restore the text state at
Q: font, size, spacing, scaling, leading, rise and render mode set insideq...Qcarried over to the text after it. Pages that embolden a heading with2 Trinside a saved state drew all the following body text stroked and heavy. The text state is now saved and restored with the rest of the graphics state (ISO 32000-1 9.3.1)
Version 2.766.66
Fixed
- The SVG export stroked text in the stroking render modes (1, 2, 5 and 6) without a stroke width, so SVG's default of one text-space unit applied; text that PDF producers embolden with a thin stroke, such as
2 Tr 0.25 w, came out much heavier. The line width is now converted from user space into the text element's space, a zero width gives a one-pixel line, and the line join is kept
Version 2.766.65
Fixed
- Documents whose trailer gives
/Encryptas a direct dictionary instead of a reference, as some PDF writers produce, were loaded as unencrypted: even with the right password their pages rendered blank and text extraction and the SVG export returned nothing, andSaveLoadedDocumentwrote a damaged file that dropped/Encryptbut kept the encrypted streams. They now open, decrypt and save like documents with an indirect encryption dictionary - The cross-reference loader cut a trailer at the first
>>, so entries after a nested dictionary in the trailer were lost; it now reads the trailer up to its matching closing delimiter
Version 2.766.64
Fixed
- Rendering, the SVG export, the viewer and printing showed a loaded page's whole
/MediaBox. A page is displayed and printed through its/CropBox, clipped to the/MediaBox(ISO 32000-1 14.11.2), so pages with a crop box came out too large, offset and with content meant to be hidden RenderLoadedPageToBitmap, the tile, band, metafile and device-context renderers,BuildLoadedPageSVG, the viewer's page geometry, highlights and region snapshots, and printing now cover the visible box; pages without a/CropBoxare unchanged
Added
THotPDF.GetLoadedPageVisibleBoxreturns a loaded page's visible box, its/CropBoxclipped to its/MediaBoxTHPDFPageDisplayList.CropBoxgives the same box for a compiled display list
Version 2.766.63
Fixed
- The built-in glyph list was searched up to a count 13 entries short of the table, so the glyph names that sort last (
y,z,zero,zeta,yen,ydieresis,zcaronand others) were never found. Text extraction ignored a font's/Differencesentries that named them, and the page renderer drew y, z and 0 of embedded CFF fonts withWinAnsiEncodingorMacRomanEncodingin a substitute system font - Looking up the glyph name of an accent such as U+0060 returned the small-capital name of MacExpertEncoding (
Gravesmall) instead ofgrave, so those accents were also missed in embedded CFF fonts
Version 2.766.62
Fixed
- The page renderer used the line width and dash lengths as device pixels instead of user-space units (ISO 32000-1 8.4.3.2 and 8.4.3.6); lines kept the same pixel width at every resolution and ignored any scaling
cm. Slides exported through macOS Quartz, which stroke shapes with a width in EMUs under a 1/12700 scale, were covered entirely by the stroke color - The stroke width and dashes now follow the scale of the CTM in effect when the path is stroked, also for text drawn in a stroking render mode
Version 2.766.61
Fixed
- The SVG export left out Type 1 function-based shadings (ISO 32000-1 8.7.4.5.2), whether painted with
shor used in a shading pattern; it now samples the shading's function over its/Domaininto an embedded PNG image placed through the shading's/Matrix, clipped to its/BBox, with the pattern's background color under it
Version 2.766.60
Fixed
- The page renderer painted the
/Backgroundcolor of a mesh shading shown with theshoperator, which PDF ignores (ISO 32000-1 8.7.4.5.1), so the whole clipping area around the mesh took that color - The background color of function-based, axial and radial shading patterns was not painted by the page renderer; it now fills the pattern's area before the shading, so it shows wherever the shading does not reach
- The SVG export now paints the background color of shading patterns in the same way and, like the renderer, ignores it for
sh
Version 2.766.59
Fixed
- The page renderer ignored the
/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 covered the whole clipping area instead of stopping at its box. Mesh shadings already honored it
Version 2.766.58
Fixed
- The SVG export wrote text in Type 3 fonts as SVG text in an installed font, so pages that draw their text or symbols with glyph procedures showed the wrong shapes; it now draws each glyph's procedure, placed through the font's
/FontMatrix, the font size and the text matrix (ISO 32000-1 9.6.5) - Type 3 glyphs that start with
d1are painted in the current fill color, and glyphs that set their own colors keep them
Version 2.766.57
Fixed
- Text extraction and the SVG export took the
/Widthsof a Type 3 font as thousandths of an em, although they are in glyph space and scaled by the font's/FontMatrix(ISO 32000-1 9.6.5); glyphs of a font with a[0.01 0 0 0.01 0 0]matrix were placed a tenth of their advance apart, which also merged words in extracted text
Version 2.766.56
Fixed
- Rendering a loaded page read every Type 0 font as if it used
Identity-H, two bytes per code and each code its own CID. Fonts encoded with the predefined UCS2 and UTF16 CMaps of the Chinese, Japanese and Korean collections, such asUniGB-UCS2-H, or with an embedded CMap now map their codes to CIDs, so/Wwidths and embedded glyphs are looked up at the right CIDs; before, for example, lowercase Latin letters in aSTSong-Lighttext were spaced a full em apart - Codes are read by the CMap's codespace ranges, so one-byte and four-byte (surrogate pair) codes are read whole, and names ending in
-Vselect vertical writing
Version 2.766.55
Fixed
- Rendering a loaded page drew fonts that are not embedded and carry a style part or a PostScript spelling in their name, such as
TimesNewRoman,Bold,TimesNewRomanPS-BoldMT,Arial,BoldItalicorSegoeUI-Semibold, in a substitute face; the family part of the name is now looked up among the installed fonts, also with spaces between its words (Times New Roman, Segoe UI), and the style comes from the name and the font descriptor
Version 2.766.54
Fixed
- Standard fonts without a
/Widthsarray, which ISO 32000-1 9.6.2.2 allows for the standard 14 fonts, were laid out at a fixed half-em advance when rendering a loaded page, exporting it to SVG or extracting its text, so letters crowded together; the Helvetica, Times and Courier families, also under the names Arial, TimesNewRoman and CourierNew, now take their widths from the installed Arial, Times New Roman and Courier New, which share their metrics - A standard Type 1 font with no
/Encodingnow decodes through its implied StandardEncoding, so for example code 39 reads as a right single quotation mark
Version 2.766.53
Fixed
- Rendering a loaded page ignored a font's
/Widthsarray when it was an indirect object, as many producers write it, and laid the text out at a fixed half-em advance; such text is now spaced by its widths - Font descriptors given as indirect objects are now read when rendering, so the
ForceBoldandItalicflags and the italic angle of non-embedded fonts take effect - The
SmallCapflag no longer makes text bold: bold now follows theForceBoldflag (ISO 32000-1 Table 123)
Version 2.766.52
Fixed
- Rendering a loaded page now clips to text shown in render modes 4 to 7 (ISO 32000-1 9.3.6): the glyphs become part of the clipping path at the end of the text object, until the graphics state is restored. Before, mode 7 text was ignored and a shading or image meant to show through the letters covered the whole area, and modes 4 to 6 painted the text without clipping
- Clip text is taken from the same glyph outlines as painted text, embedded fonts and Type 3 glyphs included
Version 2.766.51
Fixed
- SVG export now clips to text shown in render modes 4 to 7 (ISO 32000-1 9.3.6): the glyphs become an SVG clipping path from the end of the text object to the end of the graphics state, so a shading or image drawn through text appears only inside the letters
- Text in render mode 7 is no longer lost with nothing clipped, and modes 4 to 6 still fill or stroke the text as modes 0 to 2 do
Version 2.766.50
Fixed
- Axial, radial and function-based shadings whose
/Functionis an array of one-output functions, one per color component (ISO 32000-1 8.7.4.5.1), were not drawn when rendering a loaded page; they are now drawn, with the array's functions given directly or as indirect objects - SVG export writes such axial and radial shadings as gradients, including when they fill a path through a shading pattern
Version 2.766.49
Fixed
- SVG export wrote bold and italic text in the regular style: text now gets
font-weight="bold"andfont-style="italic"from the style part of the font name, such asArial-BoldMT,Helvetica-ObliqueorMinionPro-It, and from the font descriptor's weight, flags and italic angle - Fonts outside the standard 14 families were written with their style part in the family name (
SegoeUI-Semibold), which matches no installed font; the family is now named on its own and with spaces between its words (SegoeUI, Segoe UI), followed by a generic family from the descriptor flags or the name
Version 2.766.48
Fixed
- SVG export drew the content of form XObjects in black instead of the fill and stroke colors in effect where the form is painted (ISO 32000-1 8.10.1); a
Qinside the form now restores those colors too - Content devices can start nested content from the caller's colors through the new
IHPDFContentInheritedColorDeviceinterface
Version 2.766.47
Added
- SVG export now fills paths that use a tiling pattern with an SVG
<pattern>that repeats the pattern cell at itsXStepandYStepspacing, clipped to the cell's/BBox; before, such paths were filled black or kept the previous color - Uncolored tiling patterns (
PaintType2) paint the cell in the color given with the pattern, such as the components in/CS0 cs 0 0 1 /P1 scn - Paths filled with a shading pattern get the axial, radial or mesh shading of the pattern, clipped to the path
- The pattern matrix is applied in the space of the page or of the form that uses the pattern (ISO 32000-1 8.7.2), so patterns do not scale or move with the current transformation matrix, and
Qbrings back a pattern saved withq - Content devices can receive pattern selections through the new
IHPDFContentPatternDeviceinterface
Version 2.766.46
Added
- Images with a color-key
/Maskarray (ISO 32000-1 8.9.6.4) are now masked when a loaded page is rendered: pixels whose components all fall inside the key ranges are left unpainted, so the page shows through - SVG export applies the same color-key masks and writes such images as PNG images with an alpha channel
- The key is compared with the samples as stored, so an Indexed image masks by palette index even when two entries share a color, and images at 1, 2 and 4 bits per component are covered
- New
DecodeLoadedImageColorKeyMaskmethod returns the mask of a loaded image as a white-and-black bitmap; it covers Flate, LZW and unfiltered images, since lossy codecs do not keep exact sample values
Version 2.766.45
Changed
CompressDocumentandCompressLoadedDocumentlet each object stream hold up to 250 objects instead of 100; fewer, larger containers compress better and need fewer dictionaries- Loaded PDFs that were already written compactly with object streams now come out about the size of the original, most of them slightly smaller, instead of slightly larger
- A limit set through
ConfigureAdaptiveObjectStreamPackingis kept,CompressDocumentrestores the limit atEndDoc, and plain object-stream saves keep 100 objects per container
Version 2.766.44
Changed
- The cross-reference stream of files written with object streams uses the smallest field width each column needs, so offsets in files below 16 MB take 3 bytes instead of 4 (ISO 32000-1 7.5.8.2), and its dictionary is written compactly
- Files written with a cross-reference stream but without object streams are unchanged
Version 2.766.43
Changed
- Unencrypted files written with object streams now pack the document catalog and the document information dictionary into object streams as well, where they are compressed; ISO 32000-1 7.5.7 only keeps the encryption dictionary out
- Encrypted files keep both dictionaries at the top level, as before
Version 2.766.42
Changed
- Files written with object streams, including those from
CompressDocumentandCompressLoadedDocument, spell dictionaries and arrays compactly, leaving out the spaces and line breaks the PDF syntax does not need (ISO 32000-1 7.2.2); stream dictionaries, which cannot go into object streams and stay uncompressed, gain the most - Signature dictionaries and the encryption dictionary keep their spaced layout, so signing a document written with object streams works as before
- Files written without object streams are unchanged byte for byte
Version 2.766.41
Fixed
- PDF files written with object streams no longer start with the
%PDF-header and binary comment line twice; this affected every save withUseObjectStreams,CompressDocumentorCompressLoadedDocument - Viewers tolerated the repeated header, but strict validators could flag it, and it cost 15 bytes per file
Version 2.766.40
Fixed
- Loaded PDFs that keep a bare number in an object stream, as many producers store stream lengths, can now be edited and saved; every change used to stop the save with "Cannot rewrite compressed object N: the source member could not be loaded"
- Such a number is now read as a number; before, the parser looked past the end of the member for an indirect reference and gave up, so the member could not be loaded at all
- Saving such a file without changes was not affected, because an unchanged file is copied as it is
Version 2.766.39
Fixed
- Stamp annotations in PDF/A-2 and later and PDF/X-6 documents showed only their frame, without the stamp name such as APPROVED or CONFIDENTIAL
- The name is now drawn in the page's current font, which is embedded together with the page text, in capitals and the annotation color, centred in the rectangle
- Long names such as NOTFORPUBLICRELEASE are set smaller so that they fit the rectangle width
- The documents still pass PDF/A validation; stamps in other documents are written as before
Version 2.766.38
Added
- New
CompressLoadedDocumentoverload with options that makes a loaded PDF as small as possible without changing how it looks: it drops unused page resources, merges identical fonts and forms, subsets the embedded fonts, recompresses streams with Flate and writes the next save with object streams - Every step is lossless and images are not resampled or recompressed; a three-page document that embeds full Arial and SimSun fonts drops from about 10 MB to about 20 KB, and three other sample PDFs shrank by 15-50%
- Documents with signature fields are refused by default and left unchanged, because every step rewrites signed bytes;
AllowSignatureInvalidationcompresses them anyway SubsetLoadedFontsgains aCompactTrueTypeSubsetsoption, off by default, that builds compact subsets of TrueType fonts used through CIDFontType2 fonts with the identity CID mapping; color fonts and fonts with a/CIDSetkeep the normal subset- The parameterless
CompressLoadedDocumentkeeps its behavior of recompressing unfiltered streams only
Version 2.766.37
Added
- New
CompressDocumentproperty, off by default: one switch that writes the next document as small as possible without changing how it looks - For that document it turns on Flate compression at the maximum level, a cross-reference stream with object streams (ISO 32000-1 7.5.7 and 7.5.8), font subsetting and compact font subsets; a three-page document of mixed English and Chinese text drops from about 10 MB to about 20 KB
- Object streams need PDF 1.5, so an older
Versionis raised to 1.5 unless the version is locked; PDF/A-1 output keeps its classic cross-reference table - Your own settings are left alone: after
EndDoc,Compression,CompressionLevel,UseXRefStream,UseObjectStreams, the font subsetting options and the version read back as you set them - Images are not resampled or recompressed
Version 2.766.36
Added
- New
CompactFontSubsettingproperty, off by default: font subsets renumber the glyphs they keep, so the embedded font no longer carries an entry for every glyph of the source font; an explicit/CIDToGIDMapstream maps the page's glyph codes to the renumbered glyphs (ISO 32000-1 9.7.4.2) - CJK fonts shrink the most: two Chinese characters in SimSun take about 3 KB of font data instead of about 25 KB, and a Microsoft YaHei document drops from 114 KB to 6 KB
- Applies to TrueType fonts written as Type 0 fonts when
EnableFontSubsettingis on, and to the font registered withRegisterUnicodeTTF, which until now got compact subsets only under PDF/A - Page content, glyph widths and text extraction are unchanged; OpenType-CFF fonts keep the normal subset, and a font that cannot be compacted falls back to it
Version 2.766.35
Fixed
- Text drawn with an explicit advance for each character no longer shifts after a character outside the Basic Multilingual Plane, such as a musical symbol or an emoji, when the registered Unicode font covers it. Every following character used to take its neighbour’s advance; the character now advances by the sum of its two entries
- Justified Unicode text boxes containing such characters line up at the box edge, and the underline or strike-out of that text is as long as the text
Version 2.766.34
Added
- SVG export now draws image masks (
/ImageMask), inline ones included, as stencils in the current fill color: the parts that are not painted are transparent instead of being drawn as a black-and-white picture - Images with an
/SMasksoft mask or an explicit/Maskstencil are exported as PNG images with an alpha channel, so their masked-out parts no longer cover what lies behind them /Decode [1 0]on a mask or image mask is honored, and a mask finer than its image keeps its detail
Version 2.766.33
Fixed
- Page rendering now honors an image's explicit
/Maskstencil: the parts the mask covers are left unpainted instead of the whole image being drawn, including when the image is turned or mirrored - A
/Decode [1 0]array on the mask reverses which parts are kept - Soft masks and masks that are finer than their image are applied at the mask's resolution, so a detailed 1-bit mask on a low-resolution photo keeps its edges
Version 2.766.32
Fixed
- Page rendering now draws images through the full transformation matrix: images turned by a quarter turn or by any other angle, mirrored images and every image on a page with
/Rotateare no longer drawn upright and unmirrored into their bounding box - Image masks (
/ImageMask true) are now painted as stencils in the current fill color, with anti-aliased edges when they are reduced, instead of being drawn as a gray picture - Image masks with
/Decode [1 0]now paint the samples of 1, as PDF specifies - Inline image masks (
BI /IM true) are drawn again, and their/Darray is honored - Soft-masked images keep their mask when they are turned or mirrored
Version 2.766.31
Added
- SVG export now converts colors set with
k/K(DeviceCMYK) and withcs/sc/scnin any named color space: ICCBased, calibrated, Lab, Indexed, Separation and DeviceN colors come out as the page renderer shows them instead of black - Selecting a color space with
cs/CSnow sets its initial color, for example full tint for a spot color, and restoring the graphics state withQbrings back a color set this way - Color spaces that refer to ICC profiles, lookup tables or tint functions by reference are resolved through the exported document during SVG export
- Path enumeration now reports CMYK fill and stroke colors instead of keeping the previous color
Version 2.766.30
Fixed
- THPDFEmfPatcher.RenderEmfDirect draws the bitmaps of an enhanced metafile at the same size and position at any Resolution. With a Resolution other than 72 they came out scaled by 72 / Resolution
Version 2.766.29
Added
- SVG export now applies
WandW*clipping paths: each becomes an SVG clip path that covers what is drawn after it until the graphics state is restored, so images, shadings and paths that a PDF crops are no longer drawn in full - Form XObjects are clipped to their
/BBoxin SVG export, and axial and radial shadings to their/BBox - Even-odd clipping (
W*) keeps its fill rule, and a path painted together withWis drawn before the new clip takes effect, as PDF specifies
Version 2.766.28
Fixed
- Charts drawn with DrawChart keep their layout at any Resolution. Their margins, titles, axis labels and line widths are point values and shrank with the Resolution
- The default font of a new page, and of a page made current again, is 12 point at any Resolution instead of 12 drawing units
- The layout diagnostic overlay keeps its line width and label size at any Resolution
Version 2.766.27
Fixed
- DrawInlineImage and DrawFormXObject size the image or form in drawing units, like its position. With a Resolution other than 72 the width and height were taken as points, so the object came out too large
Version 2.766.26
Fixed
- A page that becomes current again through CurrentPageNumber keeps drawing in the units it was laid out in. With a Resolution other than 72 it switched to points, so everything drawn on it afterwards came out at the wrong size and position
- The page also keeps its own page Resolution when it is revisited
Version 2.766.25
Fixed
- Images placed with ShowImage keep their size on a page sized through Width and Height when the document Resolution is not 72. At a Resolution of 144 they came out at half the size and shifted
- ExtTextOut places each character at the given advances on such a page instead of half of them
- Embedded glyph runs keep their glyph offsets and advances on such a page
Version 2.766.24
Added
- SVG export now honors the
/Extendentry of axial and radial shadings: an end that is not extended, which is the default, is left unpainted as in PDF instead of spreading its end color over the whole clip - For radial shadings this also leaves the inside of the start circle empty unless the start is extended
Version 2.766.23
Fixed
- Flattening page rotation now turns annotation appearance streams with the page, so baked or flattened annotations look the same as on the rotated page instead of being squeezed sideways into their turned rectangle
- Widget rotation (
/MK /R) is adjusted by the page turn, so form field appearances regenerated after flattening keep their orientation - Annotations with the NoRotate flag stay upright and keep their size after flattening, pinned at their upper-left corner as viewers show them on a rotated page
Version 2.766.22
Fixed
- Flattening page rotation on a tagged PDF no longer turns an annotation rectangle twice when the structure tree is reached before the page tree
- Flattening page rotation no longer rotates the bounding box of Form XObjects used on the page; their geometry lives in form space and the page turn already applies to them through the content transform
- Layout bounding boxes of structure elements that belong to another page are no longer changed when one page is flattened
Version 2.766.21
Fixed
- Reading the bleed, trim or art box of a loaded page no longer picks up a
/BleedBox,/TrimBoxor/ArtBoxplaced on a parent/Pagesnode; these boxes are not inheritable in PDF, so a page without its own entry now reports its crop box as the specification requires - Flattening page rotation no longer copies such a parent-level bleed, trim or art box onto the page
Version 2.766.20
Fixed
- Text drawn on the page Canvas or in a metafile placed with ShowMetafile keeps its size when the document Resolution is not 72. At a Resolution of 144 it came out at half its size while the rest of the drawing was correct
- The page Canvas and ShowMetafile draw at the right size on a page sized through Width and Height, which draws in points. At a Resolution of 144 the drawing came out twice as large
- The page Canvas and ShowMetafile also honour a page Resolution set on the page itself instead of shrinking the drawing by it
Version 2.766.19
Fixed
- Justified Unicode text boxes now end at the box edge when character spacing is set. Every character received the spacing on top of its justified position, so each line ran past the right edge by the spacing times the number of characters
- Justified Unicode text boxes with horizontal scaling fill the whole box width again instead of stopping short by the scaling factor
- Word spacing now counts towards the natural width of a justified line, the same width the line was broken at
- Text drawn with an explicit advance for each character lands at those positions whatever character spacing or horizontal scaling is in effect
Version 2.766.18
Fixed
- Flattening page rotation now turns pages with
/Rotate 90and/Rotate 270clockwise, so the flattened page looks exactly like the rotated original instead of being turned upside down relative to it - Annotations, link destinations and structure geometry move with the page the same way
- Flattening a page that has no CropBox no longer adds one that cut the page down to a square; only the page boxes a page actually has are rotated
Version 2.766.17
Fixed
- Font fallback chains now find faces such as SimSun and Microsoft YaHei on Windows systems that report them by a localized name, so mixed CJK text in
WideTextOutBox,WideTextOutBoxExandTextOutWithFallbackis drawn in the fallback face instead of showing empty boxes - Text whose own font is one of these faces is no longer split into fallback runs or reported as unresolved by the unresolved-glyph diagnostics
- A face can be listed in a chain by any family name it carries, in any language; a face that Windows only substitutes with another font is still skipped
Version 2.766.16
Fixed
- N-up composition now places pages with
/Rotate 90and/Rotate 270turned clockwise inside their cells; before, they were turned the other way and pushed out of the cell, often off the sheet - Pages with
/Rotate 180are now turned on the sheet instead of being composed upright - N-up composition now honors page boxes and
/Rotateinherited from the page tree, so such pages are no longer skipped or composed unrotated - Blank pages inserted into a loaded document, including the composed N-up sheets, are no longer turned or cropped by a
/Rotateor/CropBoxinherited from the page tree
Version 2.766.15
Fixed
HPDFTokenizeContentStreamAppendcan now reuse a token array after its count is set back to zero: tokens left from the earlier run are released first, so their strings no longer leak and their array items or inline image data no longer show up on the new tokens- Appending many small content streams to one token array now grows the array at least twofold instead of reallocating and moving it on every append, which kept pages built from thousands of small streams slow to compile
Version 2.766.14
Fixed
- Pages with
/Rotate 90or/Rotate 270are now rendered turned clockwise, as the PDF specification defines, instead of mirrored across the diagonal; before, the top-left corner of a 90-degree page ended up in the bottom-right - The fix covers page and region rendering, bitmap, metafile and banded PNG or TIFF export, and the SIMD rendering backend
- The viewer's page-to-view and view-to-page coordinate conversions and its search and highlight overlays follow the same clockwise turn, so hits and hit-testing line up with the rendered page
Version 2.766.13
Fixed
- SVG page export now writes text as UTF-8, as the document declares, so accented and CJK characters survive instead of turning into question marks or bytes that make the file unreadable; control codes that XML does not allow become U+FFFD
- Text after the first run of a line, and text after a
TJkerning adjustment, is now placed correctly when the text matrix scales or rotates the text, which is how many PDF producers set the font size - Text rise and horizontal scaling now follow a scaled or rotated text matrix, and
TJadjustments respect horizontal scaling - Text drawn with render modes 4 to 6 (paint and clip) is exported instead of dropped, invisible text still moves the text position, and stroked text keeps its stroke opacity
- Word spacing is no longer applied to two-byte codes that happen to equal 32, and runs of spaces are kept so each character stays at its own position
- Ligature glyphs export all the characters they stand for, and fonts with mixed one- and two-byte codes are read code by code
- Pages whose
/MediaBoxdoes not start at the origin now land on the SVG canvas instead of being shifted off it
Version 2.766.12
Fixed
- Drawing on
THPDFPage.Canvas, and metafiles played back as vector graphics withShowMetafileat a position and scale, no longer lose part of their left and top edges when they set a clip region. Each clip region was moved in by one unit on those two sides, so a border or fill along the left or top edge came out thinner than the same one on the right or bottom - Clip regions now line up with the same regions when they are filled, and cover the same area at any
THotPDF.Resolution
Version 2.766.11
Fixed
- Underlines and strike-outs of Unicode text drawn with
TextOut,UnicodeTextOut,RtLTextOutandExtTextOutnow span exactly the text. They were measured on the text converted to the system code page, so runs with Cyrillic, Hebrew, Greek, CJK or other letters outside that code page got bars that stopped short of the text or ran past it - The bars also follow character spacing, word spacing, horizontal scaling and the displacements passed to
ExtTextOut
Version 2.766.10
Fixed
- The report and grid export add-ons (FastReport, QuickReport, ReportBuilder, DevExpress and DBGrid) no longer overwrite each other's output when several exports run at the same time, for example on a server. Their temporary file was named after a timer that only changes every 10 to 16 ms, so exports started together wrote the same file
Version 2.766.9
Fixed
TextWidthnow measures text the way it is drawn when character spacing, word spacing or horizontal scaling is set. The spacing was not scaled by the horizontal scaling, negative word spacing was ignored and a trailing space got no word spacing, so paragraph continuation, link rectangles and centred or right-aligned text were placed off the drawn textTextWidthandGetWideTextWidthreturn the same width for the same text
Version 2.766.8
Fixed
- The ReportBuilder device (
TppHotPDFDevice) now draws native text inside its text box. The text was positioned as if its position were the baseline, so every text object started a line too low and its last line ran out of the box - Centred and right-aligned native text is measured with the Unicode widths it is drawn with, so text with letters outside the system code page, such as Chinese on a Western system, lines up correctly
Version 2.766.7
Fixed
- The FastReport export now places memo text inside its memo. The text was positioned as if its position were the baseline, so every memo's text started one font height too low, and bottom-aligned text was drawn below the memo, where clipping hid it
- Top, centre and bottom vertical alignment all measure from the top of the first line, for plain and HTML-tagged memos
Version 2.766.6
Fixed
- The FastReport export filter (
TfrxHotPDFExport) compiles again. TheNotEmbeddedFontsproperty read a field of a different type, and native picture export used aClippedproperty thatTfrxPictureViewdoes not have - Native picture export now clips every picture to its view, as FastReport does, so a picture larger than its view no longer spills over neighbouring objects
- A centred picture keeps its frame and clip on the view bounds; only the image itself is centred. The frame used to move with the image
Version 2.766.5
Fixed
- The DBGrid add-on now measures cell text with the Unicode text widths it draws with before cutting it to fit a column. Text with letters outside the system code page, such as Chinese on a Western system, was measured as question marks and ran past the cell; double-byte text on Chinese, Japanese or Korean systems was cut well before the cell was full
- A cut never leaves half of a surrogate pair before the
...
Version 2.766.4
Fixed
- The DBGrid add-on (
TDBGridHotPDFExportandDBGridHotPDFExportToFile/ToStream) now draws cell text inside its cells. The text was placed as if its position were the baseline, so every row's text sat on the cell's bottom border and was cut by the next row's grid line - Header text is centred in the header row, and the title no longer touches the top of the table
Version 2.766.3
Fixed
GetLoadedPDFVersionStringnow returns%PDF-1.7and the like on systems whose locale writes a decimal comma; it returned%PDF-1,7there- The
pdfVersionfield ofGetLoadedDocumentReportis fixed 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, but with Resolution 144 text, margins, lists and tables came out at half size - Text and graphics you draw before and after the import still use 1/Resolution inch
- Documents built at the default Resolution of 72 come out exactly as before
Version 2.766.1
Fixed
- XFA forms flattened with
ApplyXFAAsAcroFormorFlattenLoadedXFAkeep the positions, sizes and font sizes from the template at anyTHotPDF.Resolution. With Resolution 144 the whole form came out at half size in the top left corner of the page - Text and graphics you draw before and after flattening still use 1/Resolution inch
- Documents built at the default Resolution of 72 come out exactly as before
Version 2.766.0
Added
THPDFPage.UserWidthandTHPDFPage.UserHeightreturn the page size in the units you draw with, 1/Resolutioninch, so layout code can compare it with coordinates, margins andTextWidthat anyTHotPDF.Resolution.WidthandHeightstill return points, and existing code reads the same values as before
Fixed
- With
THotPDF.Resolutionset to a value other than 72, paragraphs now wrap at the real space between their margins and move to the next page at the bottom margin. They measured the page in points, so at 144 a paragraph with wide margins could break after every character and ran onto far too many pages - A paragraph that continues on a new page keeps the same page size, coordinates and font size at any Resolution. At 144 the continuation page switched to point coordinates and the text on it came out at half size
THPDFTablestarts a new page only when a row reaches the bottom margin; at 144 a table placed in the lower half of the page put every row on a page of its own- HTML import lays text out across the whole page width at any Resolution instead of the left half
- Metafiles drawn centered on the page, and metafile clip regions that cover the whole page, use the full page at any Resolution
- Layout diagnostics for page layers and flushed pages report the page size in drawing units
- Documents built at the default Resolution of 72 come out exactly as before
Version 2.765.52
Fixed
- AES-256 passwords with non-ASCII letters now work in other PDF readers. HotPDF hashed the password in the system code page, while ISO 32000-2 defines it as UTF-8, so other readers rejected a password such as a Chinese or accented one; both revision 5 and revision 6 are fixed
- AES-256 passwords longer than 127 bytes are now cut to 127 bytes as the standard defines, so readers that follow it accept them
- HotPDF now opens AES-256 files from other producers whose password has non-ASCII letters
- Files that earlier versions encrypted with such passwords still open in HotPDF with the same password
Version 2.765.51
Fixed
- ANSI text written after Unicode text in the same font no longer shows up as empty boxes. When a page drew Unicode text with
TextOutand then usedTextBoxorTextOutBoxExin the same face (for example Arial at another size), the ANSI text was written into the Unicode font and viewers could not find its glyphs; it now gets its own font resource and displays and extracts correctly - Pages that use only ANSI text or only Unicode text produce the same output as before
Version 2.765.50
Fixed
- Documents encrypted with AES-256 revision 6 (
UseAES256R6, and PDF 2.0 AES-256) now open in other PDF readers. The password hash was computed with the salt in every round and without the user entry on the owner side, so qpdf, MuPDF and other readers rejected both passwords; HotPDF only accepted its own files - HotPDF now opens revision 6 files created by other producers with their user or owner password instead of reporting an incorrect password
- The AES-256 R6 sample of the Security demo opens in other readers
Version 2.765.49
Fixed
- Justified Unicode text boxes no longer spread their letters apart and run past the right edge of the box. With a font chosen by name, such as Arial, each justified line came out about twice as wide as the box and overlapped whatever sat beside it; every justified line now ends at the box edge
- Text drawn with an explicit advance for each character now lands where it was asked to in the same case, instead of every character being pushed an extra character width to the right
Version 2.765.48
Changed
- The HelloWorld, CJKAnnotations, TextOut and RtLTextOut demos for Delphi and C++Builder now embed only the glyphs they use. They embedded whole system fonts such as Arial Unicode MS, so a one-page hello world came out at about 15 MB and the right-to-left sample at about 30 MB; the same pages are now between 80 KB and 650 KB and look the same
Version 2.765.47
Fixed
- Right-to-left text no longer comes out with letters in the wrong order in some fonts. Hebrew in Arial Unicode MS had neighbouring letters swapped in many words, and Arabic in Microsoft Sans Serif was not reversed at all, because the glyph numbers of those fonts were mistaken for accent marks when the line was put into visual order
- The Hebrew lines of the RtLTextOut demo now read correctly
Version 2.765.46
Fixed
GetWideTextWidthnow includes the character spacing and word spacing the text is drawn with, asTextWidthdoes. Word-wrapped and centred Unicode text with spacing set was measured too narrowTextOutHTMLnow shows word spacing set withSetWordSpacing: it places each run at its measured width, which left out the spacing. The CSSword-spacingandletter-spacingof HTML import go 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 ignored wheneverFontEmbeddingwas on or the text needed a Unicode font- The spacing is added after every space as a text positioning adjustment, which every PDF viewer honours; text without word spacing is written exactly as before
- The word-spacing row of the TextOut demo now shows the extra space
Version 2.765.44
Fixed
- The Delphi and C++Builder AnnotationInteraction demos now fit each link caption inside its link rectangle. The text started too low, so the rectangle border ran through it, and it was wider than the rectangle
Version 2.765.43
Fixed
- Strikeout text (
fsStrikeOut) is now struck through the middle of the lowercase letters. The line was drawn half a line below the baseline, under the underline, so struck text looked double underlined; this also affected<s>inTextOutHTML - Rotated text now gets its underline below the baseline instead of along the top of the letters, and its strikeout through the letters
- Strikeout lines are as thick as underlines on every text path; the Unicode and plain Latin paths drew a much thinner line
Version 2.765.42
Fixed
- The HTMLText demo now produces a single page with all five samples on it. It added a second page after the one the document already starts with, leaving the first page empty, and began writing near the bottom of the page, so the entity sample and the word-wrapped paragraph fell off the page
Version 2.765.41
Fixed
- The Delphi and C++Builder Layer demos now show the text of their layers. The text of the visible layer was drawn in the colour of the rectangle behind it and could not be seen, and the text of the hidden layer was nearly white
- The caption of the Patterns demos is drawn in black instead of being filled with the tiling pattern, which broke it into pattern fragments
- The caption of the AlphaTransparency demos is no longer drawn semi-transparent green with the Multiply blend mode; the transparent shapes now keep their transparency to themselves
Version 2.765.40
Fixed
- The Delphi and C++Builder GraphicDraw demos now draw the tangent lines of their curve examples correctly. The first control point line of the left curve stopped short of the labelled point, and the right curve showed a short horizontal stroke instead of the lines from its start point through its control point to its end point
- The section headings of the rectangle and ellipse pages are black again instead of taking the colour of the last shape drawn
Version 2.765.39
Fixed
- Text and shapes drawn after
PrintHyperlinkkeep the colours set before it. A gray colour came back as a different colour (white turned blue), and colours set in CMYK or through a colour space came back as an older RGB colour - The hyperlink colour now applies only to the link text, whatever colour space the page was using
Version 2.765.38
Fixed
TextOutOutlinenow draws the glyph outlines at the font size with anyResolution. With aResolutionother than 72 the outlines were scaled down once more, for example to half their size at 144- Outlines of fonts with fewer than 1000 units per em, such as SimHei, are no longer drawn several times too large
Version 2.765.37
Fixed
- The Delphi and C++Builder CJKUnicode demos now show their Korean line on systems without Arial Unicode MS. They drew it with the first Chinese font found, which has no Hangul, so the line stayed empty; it now uses Malgun Gothic when the chosen font cannot show Korean
Version 2.765.36
Fixed
- Chinese and Japanese text written with fonts such as SimHei no longer piles its characters on top of each other. When the same font was used for a second text run, many ideographs were given widths of a few units instead of a full em
- The affected fonts store fewer advance widths than glyphs; the glyphs after the last stored width now use that width, as the TrueType format requires
Version 2.765.35
Fixed
- Unicode text in fonts whose design grid has fewer than 1000 units per em, such as SimHei and SimSun with 256, is now spaced correctly. The glyph widths written to the PDF were about four times too large, so viewers left wide gaps after spaces and other newly used characters
Version 2.765.34
Fixed
- The scanned-image scenario of the PDFOptimize demo now compresses a real text page. Its 1-bit test image came out entirely black, so CCITT G4 and JBIG2 were compared on a solid rectangle
- The image scenarios of the PDFOptimize demo now embed only the glyphs of their page label, so the reported sizes show the difference between the image compression methods instead of being dominated by a whole embedded font
Version 2.765.33
Fixed
- The E-Invoice demo now lays out the visible invoice page from the top: the title is at the top of the page and the invoice, parties and amounts follow below it. The page was drawn upside down in order, with the title near the bottom edge and the footer note at the top
Version 2.765.32
Fixed
- JBIG2 images encoded strictly lossless (
LosslesswithLossyLevel = 0) now keep every pixel. The default removal of tiny black dots as scan noise ignored these settings, so the full stops and the dots of i and j in small text disappeared from images that were meant to be lossless - The scan-friendly defaults (
LossyLevel = 5withRemoveIsolatedBlackPixels) still remove speckles as before
Version 2.765.31
Fixed
- Exporting loaded pages to PNG or TIFF no longer fails with "received too many rows" at resolutions where a render band is not a whole number of points, such as the default 150 DPI of
SaveLoadedPagesAsImageswith a Letter page. Rounding made every band one pixel row taller than planned, so the bands added up to more rows than the image
Version 2.765.30
Fixed
TextWidth,TextHeight,GetWideTextWidthandGetWideCharAdvancesnow answer in the page units ofResolution, the units text is drawn at. With aResolutionother than 72 they used to answer in points, so measured text did not fit the coordinates it was placed at- With a
Resolutionother than 72, text drawn withTextOutnow starts at its Y instead of too high, and underlines and strike-outs cover the whole text at the right distance and thickness instead of a fraction of it - At any
Resolution,TextBox,TextOutBoxExandWideTextOutBoxExcentre and right-align their lines by the real text width, table cells and paragraphs wrap text by it, and the styled runs ofTextOutHTMLno longer overlap - A font fallback run inside
WideTextOutBoxExkeeps the font size at anyResolutioninstead of shrinking - Output at
Resolution72 is unchanged
Version 2.765.29
Fixed
- When Windows cannot apply the world transform of an EMF metafile itself, HotPDF combines the transforms on its own. The vertical offset of a combined transform used the wrong term, so content in such metafiles could be shifted up or down
Version 2.765.28
Fixed
- Showing an EMF metafile no longer prints diagnostic lines such as
[WMF_DEBUG] EMR_POLYGON16 record foundto the standard output of console applications. The metafile trace was left switched on in the release build
Version 2.765.27
Fixed
- Text in EMF metafiles shown with
ShowMetafilenow sits at the height Windows draws it. Top-aligned text, the default ofTCanvas.TextOut, was drawn one line height too high, and bottom-aligned text was also too high - Baseline-aligned and rotated metafile text is unchanged
Version 2.765.26
Fixed
ShowMetafilewith a position and scale now draws the metafile with its top left corner at the given point and scaled as requested. It used to ignore these arguments and always drew the metafile at the top left corner of the page at its natural sizeShowMetafilewithout a position is unchanged
Version 2.765.25
Fixed
AngleArcdrawings in EMF metafiles shown withShowMetafilenow draw the arc they describe, in either direction, followed by lines that continue from the end of the arc. A full circle was drawn instead, and its size was wrong whenever the metafile had an offset
Version 2.765.24
Fixed
- Under PDF/A and PDF/X, free text annotations with plain ASCII contents now show their text. Their appearance used to draw only the frame and fill, because the Helvetica named in the annotation's default appearance may not be used unembedded there
- The text is drawn at 12 pt in the page's current font, which is embedded together with the page text, wrapped to the annotation box and aligned by the chosen justification, as already done for non-ASCII contents
- Outside PDF/A and PDF/X, ASCII-only free text annotations are written exactly as before
Version 2.765.23
Fixed
- With
AutoShapeArabicturned on,TextOutandUnicodeTextOutnow join Arabic, Persian and Urdu letters into their initial, medial and final forms and ligatures, asRtLTextOutalready did. Every letter used to be shown in its isolated form - The same applies to
AutoShapeSyriac,AutoShapeNko,AutoShapeAdlam,AutoShapeHanifiRohingyaand to Hebrew point reordering (sfHebrewReorderinShapingFeatures) - With these options on, text whose glyph numbers happened to fall in the Arabic or Hebrew character ranges could be shown with the wrong glyphs; this no longer happens
- Free text annotations drawn in the page font are shaped the same way as page text
- Output with these options turned off is unchanged
Version 2.765.22
Fixed
- Curved shapes now honour
Resolutionvalues other than 72.Ellipse,Circle,Arc,DrawArc,Pie,DrawPie,ChordandArcToused to be drawn at the wrong place and size, while straight lines, rectangles and rounded rectangles were correct - Output at the default resolution of 72 is unchanged
Version 2.765.21
Fixed
- Pie wedges drawn with
PieorDrawPieare now single closed shapes, so their outline gets proper corners where the straight edges meet the arc instead of two loose line ends - Chords in EMF metafiles shown with
ShowMetafilenow close along the straight line between the ends of their arc. The line used to run to a point well away from the shape
Version 2.765.20
Fixed
DrawArcandDrawPienow draw the part of the ellipse their documentation describes: counterclockwise from the start point to the end point, as the Windows GDIArcandPiecalls do. They used to draw the other part, so a quarter arc came out 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 part of the ellipse; plain arcs were already correct - The angle-based
Arc,Pie,ChordandArcTomethods are unchanged
Version 2.765.19
Fixed
- Rotated rectangles drawn with
RectangleRotateare now closed shapes, like those drawn withRectangle. Stroking one used to leave its fourth side out, so an outline-only rotated rectangle showed three edges - Filled rotated rectangles, and the underline and strikeout bars of rotated text, look the same as before
Version 2.765.18
Fixed
- Negative numbers written into generated PDFs are now rounded correctly. Values such as -50 used to be written as -49.99, so negative coordinates, offsets and positions in page content, annotation rectangles and similar entries could be off by up to 0.01 units
- Negative values are now rounded half away from zero, exactly mirroring positive values; a negative value that rounds to zero is written as 0
- Output for zero and positive numbers is unchanged
Version 2.765.17
Fixed
- Free text annotations with Chinese, Japanese, Korean, Arabic, Cyrillic or other non-ASCII contents now show their text in every viewer. They used to rely on the viewer drawing the text in Helvetica, which can only represent Western characters, so viewers such as Poppler showed only the ASCII punctuation
- These annotations now carry their own appearance (ISO 32000-1 12.5.5): the text is drawn in the page's current font, embedded and subset together with the page text, wrapped to the annotation box (between words, or between characters for text without spaces), aligned by the chosen justification and placed over the same frame and fill as before
- The appearance is also written under PDF/A, where the embedded font keeps the document conformant and the annotation text is now visible instead of an empty box
- Free text annotations with ASCII-only contents are written exactly as before
Version 2.765.16
Fixed
- Blank pages inserted into loaded documents with
InsertLoadedBlankPagenow carry the resource dictionary every page requires (ISO 32000-1 Table 30), so validators such as qpdf no longer report the page tree as damaged and content can be added to the page later
Version 2.765.15
Fixed
- In the
Tabledemo the subtotal amount now spans the Qty and Price columns as intended; it used the wrong cell index, which left the Qty column as an empty cell
Version 2.765.14
Fixed
- Images in
THPDFTablecells are now drawn inside their cell and honour the vertical alignment; they were placed one image height too low, below the cell and outside the table
Version 2.765.13
Fixed
- Unicode text widths (
GetWideTextWidthand the justification measure) now match the font; for fonts such as Arial they came out about twice too large - Tables, word-wrapped text, and right-aligned, centred or justified text built on these widths are laid out correctly again: short cell text no longer wraps, right-aligned values reach the cell edge, and HTML text in table cells no longer shows large gaps between words
Version 2.765.12
Fixed
- Forms with check boxes or radio buttons now list the ZapfDingbats font (
/ZaDb) in the form's default resources. Viewers that draw these fields themselves (the default whenAutoFormAppearancesis off) look the font up there to draw the check mark; before, Poppler-based viewers reported an unknown font and showed no mark
Version 2.765.11
Fixed
- In the
CJKAnnotationsdemo the first note icon of each language row now lines up with the other icons of that row; it was placed 5 points higher
Version 2.765.10
Fixed
- Fonts requested by their English name are now found on Windows systems in other languages. A request for SimSun, Microsoft YaHei or MS Gothic on Chinese, Japanese or Korean Windows was treated as a missing font, because Windows reports the name in the system language, and the text was silently set in Arial Unicode MS instead
Version 2.765.9
Fixed
- Fonts that Windows keeps in TrueType collections (.ttc), such as SimSun, Microsoft YaHei and MS Gothic, are now embedded as valid standalone fonts. Before, every table of the embedded font pointed at the wrong data, so viewers rejected it and fell back to a system font, and on computers without that font the text showed wrong glyphs
- This also affected documents whose requested font was missing and that Windows mapped to a collection font, for example Unicode text with Arial Unicode MS on systems where only SimSun was available
Version 2.765.8
Fixed
- Source files that contain non-ASCII text are saved as UTF-8 with a byte order mark again. Without it, Delphi reads a source file in the code page of the building computer, so on Chinese, Japanese, Korean and other non-Western Windows systems the CJK, Arabic, Hebrew and accented text in the demos came out garbled in the generated PDFs, and library error messages showed wrong characters
- The demos
CJKAnnotations,Annotations,HelloWorld,RtLTextOut,PageSizes,TextOut,ShowcaseandViewerPrefagain produce the intended text wherever they are compiled
Version 2.765.7
Fixed
- Document information given as UTF-8 (
Title,Author,Subject,Keywords, article thread titles andSetLoadedDocumentInfowith theSetLoadedTitlefamily) is now stored as Unicode, so viewers show accented and CJK text correctly and the document information matches the XMP metadata - Text in the system code page (for example a Chinese title on a Chinese Windows system) is also stored correctly, since bytes that are not valid UTF-8 are read in that code page
Version 2.765.6
Fixed
- The initial view of new documents (
InitialZoom) now writes complete fit-width and fit-height destinations; the operand that ISO 32000-1 Table 151 requires was missing, so viewers such as Poppler reported a too-short destination array for every document created with the default setting
Version 2.765.5
Fixed
- Page labels that do not start on the first page now also cover the pages before the first range, which keep plain numbers; the page label tree must include the first page (ISO 32000-1 12.4.2), and without it viewers could show wrong labels
SetLoadedPageLabelnow keeps the ranges in page order and replaces a range that starts on the same page, so viewers show the intended labels; before, new ranges were appended out of order and could repeatSetLoadedPageLabelno longer discards the existing labels of documents that store them in a separate object, and it also updates label trees split into several nodes- Page label prefixes given as UTF-8 are now stored as Unicode
Version 2.765.4
Fixed
- Link descriptions given as UTF-8 (
AddURILink,AddGoToLink,AddGoToRLink,AddLaunchLink,AddNamedDestinationLinkand the structure-destination links) are now written as Unicode, so screen readers and viewers show accented and CJK text instead of garbled characters - The same applies to the text and author of annotations added to loaded documents with the
AddLoaded...Annotationmethods, matching annotations created in new documents
Version 2.765.3
Fixed
AddGoToLinkcan now link to a page that is added later in a new document, so a table of contents on the first page can link forward; such links used to be dropped without any error- A link whose target page is never added keeps its area but no action, instead of pointing at a missing page
Version 2.765.2
Fixed
SetLoadedOutlineOpennow opens and closes bookmarks in loaded documents; before, it wrote a key that viewers ignore and the bookmark kept its stateAddLoadedOutline,SetLoadedOutlineURIandSetLoadedOutlineDestinationnow act on the requested bookmark; for any index above 0 they changed the wrong bookmark or did nothing- Adding a bookmark to a loaded document now updates the visible-item counts of its parent, its ancestors and the outline, so viewers no longer show wrong expand states or item totals
- Setting a web link on a loaded bookmark now removes its page destination, and setting a destination removes its action, since a bookmark may carry only one of them
- Bookmark titles given as UTF-8 to
AddLoadedOutlineandSetLoadedOutlineTitleare now stored as Unicode instead of as garbled bytes
Version 2.765.1
Fixed
- Bookmarks in new documents now record how many entries are visible, as ISO 32000-1 12.3.3 requires: before, the outline and every open bookmark counted all nested entries, including those inside closed bookmarks
- Setting
Openedon a bookmark after its children were added now opens it in the viewer; before, the change never reached the file - Assigning
Titleto an existing bookmark now changes the title shown in the document - Bookmark titles with non-ASCII text given as UTF-8 are now written as Unicode, so accented and CJK titles show correctly instead of as garbled characters
- Bookmarks now carry the parent reference that the specification requires
Version 2.765.0
Added
HPDFTokenizeContentStreamAppendtokenizes a content stream straight into an existing token array, so callers that combine several streams avoid a temporary array per stream
Changed
- Compiling a page for rendering no longer allocates memory for each number and operator in its content stream, and page content is tokenized directly into the page's display list instead of being copied there
- Parallel page rendering scales much better on a cold document: on a 128-page vector test document, 4 workers now finish about 3 to 3.5 times faster than 1 worker (previously about 1.4 times on 32-bit and 1.7 times on 64-bit builds)
- Single-threaded page compilation and rendering is also about 35% faster on that document; tokens, display lists and rendered output are unchanged
Version 2.764.7
Changed
- Rendering content that saves and restores the graphics state often (
q/Q) no longer allocates memory for every save, which made worker threads of parallel page rendering wait on each other inside the memory manager - Cold parallel rendering of a 128-page vector test document is about 7–10% faster with 4 workers and about 5% faster on one worker; rendered output is unchanged
Version 2.764.6
Fixed
- Parallel page rendering no longer drops to one page at a time when the pages were rendered before and their display lists are still cached
- Previously every page waiting to be drawn kept its memory reservation while only one page was drawn at a time, so the other workers stalled on the shared memory budget; once as many pages are waiting as there are workers, they are now drawn in parallel
- The first page still arrives early, and the memory reserved by a batch now stays proportional to the worker count instead of filling the whole budget
Version 2.764.5
Fixed
SetStructureClassMapEntrycan now register one attribute dictionary under several class names, or again under the same name, without freeing it- Previously, removing or replacing one of those entries released the shared dictionary, so the remaining
/ClassMapentries pointed at freed memory and saving the document could write garbage or raise an access violation - A directly created attribute dictionary now becomes an indirect object when it is registered, and every
/ClassMapentry refers to it; the document owns the dictionary, so callers must not free it
Version 2.764.4
Fixed
RemoveUnusedLoadedPageResourcesno longer writes to a resource table after removing it, when a page's/Font,/XObjector other resource table is written directly inside/Resourcesand every entry in it is unused- Previously that write went to released memory, which usually went unnoticed but could corrupt memory or raise an access violation later in the session
- Emptied resource tables are still removed from
/Resources, and the saved output is unchanged
Version 2.764.3
Fixed
- Opening a public-key (certificate) encrypted PDF with
PubSecKeyMaterial, byLoadFromFileorBeginIncrementalUpdate, no longer reads recipient envelopes from memory that had already been released while recovering the file key - The failure depended on how memory happened to be reused: the document usually opened, but could be rejected as if no key material had been assigned, or unwrap the wrong bytes
- Multi-recipient documents, the recipient selection callback and additional key materials registered with
AddPubSecKeyMaterialall use 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 instead of 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 corrupt 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, instead of 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 new, independent document instead of 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 the same as that document from a new 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 stays available after
EndDocuntil the nextBeginDoc, soValidatePDFUA2Structure,CurrentPageNumber,PagesCountand the layout diagnostics keep working on it - Because the passwords are cleared once a protected document is encrypted,
BeginDocraises an exception whenActivateProtectionis still on and no new password was set, instead of protecting the next file with empty passwords - Starting a new document after rewriting a loaded one on the same instance also produces a clean file
Version 2.763.1
Fixed
- Converting an EPUB, or importing HTML with the HTML5 profile, no longer risks an access violation when a paragraph does not fit on the current page; the paragraph is now always drawn on the new page
- The same fix covers paragraphs, list items and horizontal rules in the compact block renderer used by
HPDFRenderHTMLDocument - The failure depended on how memory happened to be laid out, so it appeared only occasionally, most often in 64-bit builds, and could leave a conversion without output or corrupt its content
Version 2.762.1
Fixed
- Calling
BeginDocagain on aTHotPDFinstance that has already written a new document no longer ends in an access violation; it raises an exception that asks for a new instance, because the instance still holds the objects, images, fonts and form fields of the finished document - Past the crash, the second document would have carried the objects of the first one, including its content and form fields; one instance per new document keeps every file to its own content
- Loading an existing document with
LoadFromFileand rewriting it is not affected
Version 2.762.0
Fixed
- Text, free text, line, square, circle, stamp and file attachment annotations are visible in PDF/A-2, PDF/A-3, PDF/A-4 and PDF/X-6 documents; they carried an empty appearance stream that only satisfied the validator, and because viewers draw the appearance, nothing was shown
- These appearances now draw the annotation: the square and circle frames, the line, a note icon and an attachment icon in the annotation colour, the stamp frame, and the free text box filled with its background colour
- PDF 2.0 output gives every one of these annotations, the extended markup annotations and new form fields an appearance stream, as ISO 32000-2 Table 166 requires, and writes
/NeedAppearances false; outside PDF/A and PDF/X the free text and the stamp name are drawn in Helvetica - In PDF/A and PDF/X the free text and stamp appearances draw no text, because every font used there has to be embedded; the text stays in the annotation for viewers to show
Version 2.761.6
Fixed
- File attachment annotations (
AddFileAttachmentAnnotation) can be opened and saved again in viewers: the file specification wrote the embedded file stream itself as/EF, where ISO 32000-1 Table 44 requires an/EFdictionary holding the stream under/F, so readers reported that the file entry was missing - The embedded file stream of such an attachment is typed
/EmbeddedFile, and the annotation text is also stored as the file's description
Version 2.761.5
Fixed
- Named destinations, document-level JavaScript and document attachments are written with their name tree keys in sorted order, as ISO 32000-1 7.9.6 requires; they were written in registration order, and readers that search the tree could miss entries (qpdf reported the trees as unsorted)
- Attaching two files with the same file name no longer creates two entries with one key, which left only one attachment reachable; the second one gets a numbered key such as
a (2).txtand keeps its original file name AddLoadedDocumentJavaScriptandAddLoadedNamedDestinationchanges are saved; the edited name tree was not written back when it lived in a direct dictionary, so the new entries were lost. Both insert at the sorted position, also in trees split into/Kidsnodes, and replace an existing entry of the same nameAddLoadedDocumentJavaScriptstores a JavaScript action as the name tree value instead of a bare script stream, andAddLoadedNamedDestinationwrites the zoom operand of its/XYZdestinationRemoveLoadedJavaScriptandRemoveLoadedJavaScriptAllremove the scripts from the document itself; before, only the list returned by the getters changed and the scripts stayed in the saved fileSetDocumentAttachmentMetadatarenames the attachment it is given; it renamed the key of the last attachment in the tree, and the renamed entry now moves to its sorted position
Version 2.761.4
Fixed
- New AcroForms always define the Helvetica font that the fields' default appearance strings name in the form's default resources (
/DR), as ISO 32000-1 12.7.3.3 requires; withoutAutoFormAppearancesthe font was missing, so viewers that build field appearances had no font to build them with AddLoadedComboBoxcreates a real combo box; it set the Edit flag instead of the Combo flag, so the field was a list box that viewers showed as a list of all options- Fields added to a loaded document write
/NeedAppearancesas the booleantrueinstead of the name/true, and an AcroForm created for them gets the default appearance string and default resources their/DAstrings refer to AddLoadedTextField,AddLoadedCheckBox,AddLoadedComboBox,AddLoadedListBoxandAddLoadedPushButtongive the new field an appearance stream, so it shows in viewers that do not build appearances and in documents whose form sets/NeedAppearances false- Appearances generated for loaded push buttons (when added, redrawn or flattened) draw the caption, where they were empty
Version 2.761.3
Fixed
- Changing a text or choice field value in a loaded form now redraws the field:
SetFormFieldValue,ResetLoadedFormFieldand multi-selection list box updates regenerate the appearance stream, where the saved file kept showing the old text in every viewer and in print because viewers draw the appearance, not the stored value - Generated appearances of password text fields show one asterisk per character instead of the password in readable form (ISO 32000-1 Table 228), both for new fields with
AutoFormAppearancesand for loaded fields that are 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 a certified form in an incremental update is no longer reported as a change outside recognised structures
Version 2.761.2
Fixed
- 1-bit and 4-bit palette bitmaps added with Flate compression keep their colours; they were remapped onto the 256-colour system palette, which shifted every colour that palette does not contain. They are now embedded at their own bit depth with their own palette, which also makes the image data smaller
- 1-bit bitmaps whose palette lists white before black no longer come out as a negative with CCITT Group 3, CCITT Group 4 or JBIG2 compression, including the batch and cross-page JBIG2 paths; the darker palette colour is always encoded as black
icAutoMonoandAddMonochromeImageAutokeep a 1-bit bitmap with a coloured palette on Flate instead of turning it into black and white with CCITT or JBIG2- CCITT Group 3 two-dimensional images (
icCCITT32) now follow their/Kparameter: the first row and every second row are coded one-dimensionally and/Kis 2, where every row used to be coded two-dimensionally under/K 1, which allows no two-dimensional rows at all (ISO 32000-1 Table 11, ITU-T T.4)
Version 2.761.1
Fixed
- JPEG images added with DCT compression keep their own colour model: greyscale JPEGs are written as
DeviceGrayand CMYK JPEGs asDeviceCMYK, where every JPEG used to be declaredDeviceRGB; readers then showed greyscale files garbled or truncated and CMYK files in wrong colours - CMYK JPEGs that carry the Adobe marker (the usual Photoshop output) get the inverted
/Decodearray their sample values need (ISO 32000-1 8.9.5.2 and 7.4.8) - PDF/A colour-space checks now see greyscale and CMYK JPEG images as DeviceGray and DeviceCMYK use instead of DeviceRGB
StampLoadedPageImageapplies the same colour model when 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 ofAddImagerecognises JPEG data by its signature instead of a case-sensitive.jpgextension and no longer tries to read such files as bitmaps
Version 2.761.0
Added
- New
AddLoadedSignedSignatureFieldadds a signature field that is ready to sign to a loaded document, so an already signed PDF can receive a second signature (counter-signature or approval) in an incremental update - The field reserves the signature space that
SignPDFWithPFX,PreparePDFForSigningandInsertSignatureHexfill in; afterBeginIncrementalUpdateandSaveIncrementalUpdatethe new signature covers the whole file while the earlier signatures stay valid - Optional reason, location and contact information, the SubFilter and the reserved signature size can be set per field; the AcroForm is flagged as signed and append-only, and no appearance regeneration flag is added to the signed document
Fixed
- The documented multi-signature workflow for
BeginIncrementalUpdatenow describes steps that work; the previous description relied on a current page that does not exist after loading and on a signature field without reserved signature space, so signing failed
Version 2.760.1
Fixed
DrawQRCode,DrawDataMatrix,DrawPDF417andDrawAztecrestore the page fill colour after drawing, as documented; shapes filled afterwards used to take on the barcode colour- These barcodes are drawn as one path, with each run of dark modules in a row merged into a single rectangle, so the page content is smaller and viewers no longer show faint seams between adjacent modules
Version 2.760.0
Changed
- Setting
CryptKeyLengthtoaes256raises the output to PDF 1.7 when it is lower, the way other version-dependent features already do, so documents are really protected with AES-256. With the default PDF 1.6 output they used to be written with AES-128 without any notice; withStrictVersionLockset, a lower version still falls back to AES-128
Fixed
- Help pages for the protection properties showed permission names that do not exist; the examples and the descriptions of
prPrintandprPrint12bitnow match the actual options and the public-key encryption notes list the supported key types
Version 2.759.0
Fixed
- Signed PDFs now leave the whole
/Contentsstring, including its<and>delimiters, out of the signed byte ranges, as ISO/IEC 32000-1 12.8.3.3 requires; the delimiters used to be signed, which validators that check the byte range against the signature value report as an invalid byte range - PDF MAC validation of signatures carrying an attached MAC accepts both the standard byte range and the one earlier versions wrote
Security
- Signature verification rejects a document whose unsigned gap between the two byte ranges holds anything besides the signature's own
/Contentsstring, closing a signature-wrapping gap where content outside the signed bytes was reported as covered; signatures made by earlier versions still verify
Version 2.758.1
Fixed
- The default appearance that
AttachSignatureFieldAppearancegives an unsigned signature field draws its light grey background again: the fill rectangle was missing two operands and set its colour inside the path, which viewers reject - Free-text annotations created on a new page carry the default appearance string that ISO 32000-1 requires, so viewers can lay out their text instead of showing an empty box
Version 2.758.0
Fixed
- The built-in JBIG2 decoder places every symbol after the first one in a text strip where ISO/IEC 14492 puts it; each further symbol used to land one more pixel to the right, so text in JBIG2 scans made by other encoders drifted apart
- JBIG2 images written with the native arithmetic encoder and a symbol dictionary that holds a single glyph can now be read by other PDF viewers; the symbol identifiers were coded with one bit instead of none, which made those viewers fail at the first glyph
- Symbol dictionaries that combine glyphs through refinement and aggregation are decoded with the standard spacing, matching other JBIG2 decoders
- JBIG2 images that share a global symbol dictionary write
/DecodeParmsas an array matching the/Filterarray; other viewers ignored the single dictionary and could not find the shared glyphs, so such images failed to display
Version 2.757.0
Fixed
DirectDrawBarcodeand theSimple*bar functions now draw real barcodes for every symbology; most of them used to return evenly alternating bars that carried no data. GS1-128 with code set C (type 22) is drawn instead of falling back to Code 39, and POSTNET short bars are drawn at 40 % of the heightDirectDrawBarcodescales bar widths and heights with the page coordinate system, so barcodes stay readable when the document scale is not one point per unit- Code 128, Code 93 and the EAN / UPC family keep exact one-to-four module element widths whatever
Ratiois set; any ratio other than 2 used to make them unreadable - EAN-8, EAN-13, UPC-A and UPC-E given only their data digits get the check digit added; the last data digit used to be taken as the check digit. With
Checksumenabled, UPC-A no longer drops its last data digit, and the UPC-E check digit (which also selects the bar parity) is computed from the expanded UPC-A number - MSI check digits are correct for numbers with an odd digit count, POSTNET codes get their correction digit, and Interleaved 2 of 5 keeps the last digit of an odd-length number by adding a leading zero
- Code 128 A encodes lower-case letters through SHIFT instead of turning them into spaces or control characters, Code 39 folds lower case to upper case, and Codabar keeps supplied start and stop characters
- Characters a symbology cannot represent now raise an exception; Code 39 and Code 128 used to drop or replace them and Codabar read outside its character table
- GS1-128 with
Checksumenabled no longer appends another check digit toTexteach time the barcode is measured or drawn
Version 2.756.0
Fixed
- QR Codes drawn with
DrawQRCodeor built withTHPDFQRCodenow scan with standard readers: the format information is placed as ISO/IEC 18004 specifies, and the error correction block structure is correct for every version from 10 to 40 (and for version 7-Q) - Automatic mode selection keeps lower-case text in byte mode, so a URL such as
https://example.comis no longer encoded and read back in upper case - Text whose length ends in one or two digits or one alphanumeric character gets a symbol large enough for it; the last characters were previously dropped
- Encoding twice with the same
THPDFQRCodeinstance no longer mixes the previous symbol into the new one EncodereturnsFalsewhen an explicitly requested version is too small or the requested numeric or alphanumeric mode cannot represent the data, instead of producing a truncated symbol- Mask selection applies the finder-like pattern and dark-module balance penalties of ISO/IEC 18004 7.8.3
- The built-in barcode decoder reads standard QR Codes: multi-block symbols with Reed-Solomon verification, numeric, alphanumeric, byte and ECI segments, UTF-8 payloads and versions with several alignment patterns
Added
HPDFQRFunctionMapandHPDFQRExtractDataWordsexpose the module layout and the block de-interleaving with error detection for code that reads QR symbols
Version 2.755.9
Changed
- Image soft-mask rendering reuses exact horizontal sample indices and uses SSE2 alpha premultiplication on supported Delphi x86 and x64 targets, preserving pixel rounding and cancellation with bounded temporary storage and a scalar fallback
Version 2.755.8
Fixed
- Foreground rendering can resume once cancelled page prefetch has released document resources, without waiting for the worker thread to finish exiting; explicit cancellation, replacement, reload, and destruction still join the thread, and invalid page ranges no longer leak a suspended worker
Version 2.755.7
Fixed
- Page rendering preserves the current path across graphics-state restores and isolates Form XObject and Type3 glyph paths, clipping, and saved state, including malformed extra restores and cancellation
Version 2.755.6
Fixed
- The SIMD rectangle renderer now honors compound even-odd and nonzero fill rules, preserving holes, reflected subpath direction, and fractional edge placement; cancellation during rasterization discards the partial bitmap and propagates correctly
Version 2.755.5
Fixed
- Multi-select form imports now reserve exact option values before interpreting hexadecimal compatibility spellings in XFDF, preventing literal values from selecting a different option and keeping stored values consistent with selection indices
Version 2.755.4
Fixed
- Text extraction from vertical (WMode 1) CID text now moves the pen by the ISO 32000-1 9.4.4 displacement, so character spacing shortens the step down the column as the specification defines instead of lengthening it
- A
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 that describe several consecutive CIDs now apply their metrics to every CID in the run during extraction instead of only the first- The page renderer and the text extraction interpreter now share one implementation of the glyph and
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 and 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, including overrunning or non-minimal lengths, missing or extra components, wrong string types and names that are not valid UTF-8, is ignored as a whole instead of being partly reported
Version 2.755.2
Fixed
- Page rendering of vertical (WMode 1) text now advances each glyph by the ISO 32000-1 9.4.4 text-space displacement: word spacing is no longer scaled by the font size and is no longer added to two-byte CID codes, since it applies only to the single-byte space code
- Character spacing in vertical text is applied along the writing direction exactly as the specification defines it, so columns set with a non-zero
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 that rely on the defaults advance by a full em instead of 0.88 em - Vertical glyphs are painted at the vertical origin minus their position vector, with the horizontal component defaulting to half the glyph width, which centres columns on the pen position
/W2list entries that describe several consecutive CIDs now apply their metrics to every CID in the run instead of only the first
Version 2.755.1
Fixed
- ExportLoadedFormToFDF now generates the complete FDF body before creating the target file, so a mid-export failure no longer replaces the destination with a truncated document
- The FDF stream interchange scanner tracks hexadecimal strings, keeping field dictionaries intact when a hex value ends directly against the dictionary terminator
- Choice selection index reconciliation decodes mixed PDFDocEncoding, UTF-16 and hexadecimal spellings with one matcher, so equivalent export values rebuild /I consistently
- XFDF import accepts the hexadecimal spelling of an option export value delivered as plain literal text, restoring round trips written by third-party tools
- FDF export skips widget-only fields without a field name, matching the XFDF exporter and the behaviour of every importer
- The Delphi Stamp demo anchors its watermark and rubber-stamp annotation to the actual page size, keeping them visible on landscape and non-A4 inputs
- The C++Builder DigiPrint demo releases its images and per-page line lists, initialises the header line spacing factor and reports a missing demo.xml instead of crashing
- The Win64 ABI DLL and codec worker build scripts locate dcc64 in bin64 on RAD Studio 12 and later, and full C++Builder library builds detect and clean trial residue from the shared output directory
Version 2.755.0
Added
- Loaded multi-select choice fields now exchange individual selected values through FDF file and stream APIs and XFDF array-aware callbacks, preserving option boundaries and synchronizing selection indices on import
Version 2.754.6
Fixed
SetLoadedFormFieldExportValuenow uses the normal field-value update path, preserving button value types, selection indices, appearance states, encoded strings, and calculation change tracking
Version 2.754.5
Fixed
- XFDF form values and annotation text elements now preserve their exact content without inserting formatting whitespace, including leading and trailing spaces, tabs, and line breaks
Version 2.754.4
Fixed
- Loaded form value, default, and maximum-length helpers now honor inherited and indirect entries, while field resets preserve default value types, synchronize choice selections and button states, and leave sibling fields unchanged; regenerated button appearances retain the selected state and valid rendering bounds
Version 2.754.3
Fixed
- Loaded named child fields now remain individually addressable when their field type is inherited, with inherited type, flags, and options available through field helpers and removal preserving sibling fields and their widgets
Version 2.754.2
Fixed
- Regenerated loaded choice field appearances now display Unicode option labels while preserving export values, render unselected list options, and highlight single or multiple selections consistently with the field values and indices
Version 2.754.1
Fixed
- Updating a loaded choice field now keeps its selected-option indices consistent with the new value, including option export values and editable entries outside the option list, without modifying shared selection arrays
Version 2.754.0
Added
- Optional HPDFCreateTesseractOCREngine and HPDFCreateRapidOCREngine factories connect local recognition programs and caller-provided models to searchable text layers, with Unicode text, word coordinates, timeouts, cancellation, and output budgets
Fixed
- Corrected text matrix advances, indirect CID font widths, q/Q and Form clipping restoration, reduced JPEG orientation, image soft masks, and Indexed stream palettes to restore text layout and image content on affected pages
- Small embedded TrueType filled glyphs now use local coverage antialiasing to improve thin strokes at low DPI; canceled OCR requests are reported as cancellation even when the recognition engine returns failure
- RenderOutputDither now applies across rendering backends and parallel page rendering, with consistent cache invalidation and cancellation
Version 2.753.0
Added
- SetLoadedFreeTextPlainText explicitly converts supported loaded FreeText annotations to ASCII Helvetica plain text and rebuilds their visible appearance for full rewrites and incremental saves
Fixed
- Loaded page conversion and save validation now resolve indirect and inherited page boxes, preserving shared page dimensions instead of replacing them with A4
Version 2.752.5
Fixed
- Page bitmap initialization now checks cancellation while clearing bounded blocks, releases unfinished bitmaps, and avoids delaying foreground rendering while canceled prefetch work finishes initialization
Version 2.752.4
Fixed
- Closing or reloading a document now releases its owned PDF object graphs and stream payloads, including shared and cyclic ownership, without freeing linked references twice
Version 2.752.3
Fixed
- Loaded checkbox value changes now synchronize appearance states even when the normal appearance dictionary contains only the selected state
Version 2.752.2
Fixed
- Enabling reproducible output after document construction now fixes the creation timestamp so equivalent saves remain byte-identical across clock ticks
Version 2.752.1
Fixed
- Loaded form field names now decode PDF strings consistently, allowing fields with UTF-16 names to be found and updated without changing their identity
Version 2.752.0
Fixed
- Moving a loaded non-widget annotation now keeps the annotation object identity and updates its optional page reference to the destination page
Version 2.751.0
Fixed
- Deleting loaded pages now maintains named destinations, outline destinations, structure trees, parent trees, and annotation object references, eliminating reachable null references in both full rewrites and incremental saves
Version 2.750.0
Fixed
- Full PDF rewrites now expand unread compressed objects before replacing object-stream containers, preserving fonts, color spaces, and ActualText while fixing garbled Chinese text, changed page appearance, and changed extraction text
- Encrypted documents with an empty user password now load and start rewriting directly, while locked object streams fail clearly instead of producing an incomplete document
- Unmodified numeric objects retain their source precision, preventing subtle color and transparency drift after a rewrite
- Copied pages retain their validated resource names and references, fixing indirect resource dictionary errors and incorrectly bound images
Version 2.748.6
Fixed
- Fixed a cross-reference subsection that declares more entries than the table holds spinning through the whole declared count with no data left to read, which made a forty-byte malformed file take tens of seconds to reject
- Fixed the job runner losing every result it had already produced when an operation raised, and HTML import losing a picture object when the stream around it could not be created
Version 2.748.5
Fixed
- Fixed PKCS#12 files with a non-ASCII password failing to open: the password is a UTF-8 byte string, but it was widened one byte at a time instead of being decoded, so the derived key was wrong for every character outside ASCII. Files protected with the modern PBES2 scheme were unaffected, which is why the two behaved differently
- Fixed the signature batch validator and the revocation evidence cache raising an access violation instead of their own error when constructed with an invalid option, because the destructor ran before the members it releases had been created
- Fixed the evidence download task failing in its destructor when its arguments were rejected, since the checks ran before the thread itself was created
- Fixed the cloud-signature provider encoding an algorithm identifier whose second arc exceeds 39, and a malformed identifier now raises the provider's own error rather than a conversion error
- Certificate and signature containers now reject a nested element that declares a length reaching past the element that holds it, so what is validated and what is covered by the signature can no longer differ
- Private-key values are wiped from memory after RSA signing instead of being left on the heap for the next allocation
Version 2.748.4
Fixed
- Fixed Type 1 font loading reading every property from the first line of the font program: the token list was refilled without being emptied, so the version, family and weight strings, the stem hints and the charstring key length were all taken from stale tokens. Type 1 fonts now report their own metadata
- Fixed the charstring key length being kept as a pointer into a string that had already been freed, and being used without a range check; it is now stored as a value and clamped to the range the format allows
- Fixed non-embedded fonts always falling back to the system default face: the requested face name was copied into the wide-character font record byte by byte, so no installed family ever matched
- Fixed embedded TrueType and OpenType parsing reading past the end of a truncated font program while decoding glyph outlines, composite glyph arguments and the CFF table of an OpenType container, and a malformed character map no longer asks for a negative glyph array
- Fixed cross-reference tables and streams whose declared object numbers overflow: an entry claiming a number near the integer limit wrapped into a negative index and was written outside the table, and a declared object count or
/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, but only adjacent digits share a code word, so text like
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 that follow it
- Enhanced-metafile region records now bound their rectangle count by the record size instead of trusting the count in the region header, which could read far past the record
- PNG images whose declared width times height exceeds the addressable range are rejected at the header instead of allocating a negative-length pixel buffer
- High-quality image resampling now reports an out-of-range request instead of overflowing the size of its intermediate buffer
- A WebP meta prefix image that claims more entropy groups than it has pixels is rejected instead of allocating hundreds of megabytes of prefix tables from a few hundred bytes of input
- Fixed leaks on the failure paths of Aztec encoding, WebP bitmap decoding and the object-stream decode worker pool, where a partially built object was abandoned when a later step raised
Version 2.748.2
Fixed
- Fixed QR Code symbols dropping the last code word bits: the module placement walk skipped the left-most column, so the tail of the final error correction block was never written into the symbol
- Fixed the QR terminator filling the whole remainder of the data block with zero bits, which left no room for the 0xEC / 0x11 pad code words that ISO/IEC 18004 requires; a version 1 symbol carried six zero code words instead
- A new test reads a generated symbol back out of its modules, so the data block, the pad code words, the error correction block, the mask and the placement are all checked against the standard rather than against the encoder's own output
Version 2.748.1
Fixed
- Fixed three parsers hanging on malformed input instead of reporting it: the object parser on a
>>inside an array or a]inside a dictionary, the CMap reader on a stray bracket or brace, and the XFDF reader on a construct without a tag name (a document type declaration, for one) or a stray byte between attributes. Each of them stopped advancing its cursor, so a single unexpected byte turned the parse into an endless loop - Fixed CDATA sections in XFDF being read as markup: their content is now taken as element text, and the section marker is measured correctly instead of swallowing the first character
- Fixed a WebP chunk length near 2 GB overflowing the size check, so the payload copy read past the end of the file buffer; chunk lengths are now range-checked in 64-bit arithmetic
- Fixed a PNG chunk length of 0xFFFFFFFF freeing the chunk buffer while the chunk still reported its declared length, which left later reads pointing at released memory; over-long chunks are rejected
- Fixed CCITT fax decoding overflowing its row-buffer size computation for very large declared page geometries, which could write past the buffer; the row store is now bounded and decoding stops cleanly at the limit
- Fixed the CCITT encoder reading one byte past the end of a scan line for widths that are a multiple of eight
- Fixed enhanced-metafile comment records being read through a 32-bit truncated pointer on 64-bit builds, which read an unrelated address for every EMF carrying a GDI comment
- Fixed 8-bit images with fewer than 256 palette entries publishing uninitialised memory as the tail of their colour table, and the table now declares its real entry count
- Fixed deeply nested indefinite-length BER structures exhausting the stack while parsing a signature or certificate container; nesting beyond 128 levels is rejected
Version 2.748.0
Fixed
- Fixed the error correction of every 2D barcode the library draws: QR Code, Data Matrix, PDF417 and Aztec built their generator polynomial from the constant term upwards but divided by it as though the leading term came first, so each symbol carried check words that no conforming reader accepts. The check words now match the worked examples of ISO/IEC 18004, ISO/IEC 16022 and ISO/IEC 15438
- Fixed Aztec symbols losing their payload: the encoder divides the code word array in place and the caller emits that same array, so the message words were overwritten by the division and the symbol carried neither the data nor a valid mode message
- Fixed the Data Matrix generator polynomial starting its roots one power too low, which produced a different polynomial from the one ISO/IEC 16022 Annex E prescribes
- Fixed the Data Matrix finder pattern: the solid L is now the left column and the bottom row, and the alternating clock track is the top row and the right column, each starting dark at the corner it shares with the L. The two were swapped, so readers could not establish the symbol orientation
Version 2.747.4
Fixed
- Fixed loaded-document editing writing PDF numbers with the system decimal separator: page stitching, rectangle redaction, text and image stamps, composite watermark shapes and ellipse appearances now always emit a period, so documents edited on a decimal-comma locale (for example German or French Windows) no longer contain content streams that viewers reject
- Fixed Type 1 font loading depending on the system locale: FontMatrix, BlueValues, stem hints and charstring real numbers are parsed as PostScript numbers with a period, so PFB fonts keep their metrics and outlines on decimal-comma systems instead of silently collapsing
- Fixed default-appearance (
/DA) font size and colour parsing, HTML width 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 vanishing from compressed pages: rectangle redaction, page stitching, composite watermark shapes and annotation flattening appended their operators to a still-compressed page content stream, so the redaction bar, the stitched page, the watermark shape or the baked annotation was silently absent from the saved file. The page content is now expanded before anything is appended
- Fixed appended content fusing with the last operator already on the page when that page did not end in white space, which produced an unreadable token such as
Q0.5and could make a viewer reject the whole page; an end-of-line is now inserted where one is needed
Version 2.747.2
Added
- Added Free Pascal Win32 support: the Lazarus package now builds for both
i386-win32andx86_64-win64through dedicated build entry points, the smoke suites accept an architecture argument, and the 32-bit compiler and C symbol linking issues were fixed; PDF creation, loading, Flate compression, AES encryption and CBZ document handling are covered on both targets
Version 2.747.1
Fixed
- Fixed the rotated-mask retry of the built-in barcode decoder leaving stale bytes in untouched cells of the rotated mask, which invented phantom ink and made quarter-turned Code 39 symbols unreadable; the rotated buffer is now zeroed explicitly, so turned Code 39 photographs and scans decode through the rotation retry
Version 2.747.0
Added
- Added WebP image import:
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 neighborhood distance map, the color cache, and all four inverse transforms (predictor, color, subtract-green, color indexing with pixel bundling); lossy VP8 frames are rejected with a clear message
Version 2.746.0
Added
- The built-in barcode decoder now reads QR symbols in any of the eight orientations a photographed or scanned page can arrive in: the finder patterns identify the missing corner, and the sampled module matrix is rotated or mirrored into the expected layout before decoding, so quarter-turned and mirrored captures read without pre-processing
Version 2.745.0
Added
- Added eIDAS qualified-certificate evaluation for loaded signatures: GetLoadedSignatureQCStatements reports the ETSI EN 319 412-5 QCStatements of the signer certificate — QcCompliance, QcSSCD, QcType values, the QcLimitValue currency/amount/exponent and the PDS locations — plus the TS 119 495 PSD2 payer and payee roles, and raises a qualified-signature heuristic when QcCompliance and QcSSCD are both asserted (the QTSP trust decision stays with the caller)
Version 2.744.0
Added
- Added N-up imposition for loaded documents: ComposeLoadedPagesNUp reflows every page onto grid-composed sheets of the source paper size (2-up, 4-up, 6-up, up to 16x16) for print-ready output, absorbing each page's
/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 synthesized 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 while their implementations were unconditional, so the Free Pascal package no longer compiled; the implementations now carry the same conditional and the package builds again
Added
- HTML import now resolves tables on a full occupancy grid, so
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 ended the process outright
- Each of those operations now fails the way its caller already expects, so a document that uses one of them loads with that feature skipped rather than taking the application down
Added
- Added structure-order text extraction: ExtractLoadedPageStructureText walks the document structure tree in authoring order (ISO 32000-1 14.8.4) and concatenates the marked-content runs of a page by MCID, so tagged documents such as government forms and accessible publications extract their authoritative reading order instead of a geometric guess; glyphs the tree never claims fall to a geometric tail and are counted in the untagged report
Version 2.740.0
Fixed
- Fixed colour glyphs losing their transparency in Free Pascal builds: embedded colour bitmaps were read through a path that discards the alpha channel, so every emoji or colour font glyph was drawn as an opaque rectangle. The bitmaps now keep their per-pixel alpha
Fixed
- Enabled P-384 ECDH key agreement: the CIOS Montgomery multiplication final conditional subtraction compared against P limb plus borrow, which wraps to zero on the all-ones high limbs of the P-384 / P-521 primes and silently mis-borrowed; the comparison now detects the borrow without the overflowing addition and the P-384 shared secret matches OpenSSL reference vectors byte for byte
Version 2.739.0
Added
- Free Pascal builds now encrypt and decrypt documents: the AES entry points are served by the library's own FIPS-197 implementation instead of reporting an unsupported-operation error, so AES-128 and AES-256 protected files can be created and opened there
- AES-GCM encryption and decryption, including the streaming context used for large payloads, are available in Free Pascal builds
- The Free Pascal smoke test now checks the cipher against the FIPS-197 known answer, exercises PKCS#7 and GCM round trips, and creates and reloads an AES-256 protected document with password rejection
Added
- Added CSS2.1 paragraph typography to the HTML5 import engine: text-align (with legacy align attribute and center-tag mapping), letter-spacing and word-spacing through the PDF Tc / word-space operators, text-indent for first-line indents, and text-decoration underline / line-through rules, so existing web and email HTML imports keep their centred headings, indents, and underlines
- Extended the built-in QR decoder beyond version 1: the symbol version now derives from the finder geometry through grid divisibility (versions 2-40 with a clean module grid decode), the byte-mode length cap follows the ISO/IEC 18004 Table 7 capacity per version, and the function-module map covers alignment patterns and version information blocks for higher symbols
Version 2.738.0
Added
- Free Pascal builds now compress and decompress documents natively: the deflate codec is provided by a built-in backend over the Pascal zlib implementation that ships with Free Pascal, so FlateDecode content no longer reports an unsupported-operation error
- Compressed documents can be created and reloaded under Free Pascal with the default compression setting, and cross-reference streams, object streams, embedded files and compressed page content all decode there
- The backend covers the zlib and raw deflate wrappers, the gzip wrapper and automatic header detection, so SVG imports and the multi-window-size decompression fallback behave as they do under Delphi
- The Free Pascal smoke test now verifies the codec through a wrapper and checksum self test plus a compressed document round trip
Added
- Added AIA caIssuers chain completion: HPDFFetchAIAIntermediates walks the access-method 1.3.6.1.5.5.7.48.2 endpoints of a CMS certificate set through the caller transport (bare DER and PEM bodies both decode), and the FetchMissingIntermediates validation option feeds the fetched intermediates into path building so cloud-signer signatures with a lone end-entity certificate validate instead of failing path building
- Added one-call LTV enablement: PopulatePAdESLTVEvidence walks every loaded signature, fetches its intermediates plus OCSP/CRL evidence online, and writes the material into the document DSS, upgrading a fresh B-B signature document to B-LT without hand-assembled evidence arrays
- Added seed-value enforcement for signing: CheckLoadedSignatureSeedValue reads a signature field /SV dictionary and checks a candidate SubFilter, DigestMethod, Reason and DocMDP profile against its constraints with the force-bit semantics of ISO 32000-1 12.7.5.5, so form-author constraints are honoured before a signature is placed
Version 2.737.0
Added
- Added strict save verification through the VerifySavedOutput property: after writing, a fresh reader instance with cross-reference recovery disabled reloads the file so corrupt serialisation raises at the call site instead of surfacing at the next consumer
- Extended ReproducibleOutput to encrypted documents: AES-CBC streams use the static 14*(1+i) IV convention, key material and salts derive deterministically, and the canonical document ID normalises volatile Info timestamps, giving byte-identical encrypted saves for regression pipelines
Version 2.736.0
Added
- Added high-quality resampling and monochrome dithering through a new HPDFResample unit: separable Catmull-Rom bicubic and Lanczos3 kernels replace GDI stretch semantics for image downsampling via the ImageDownsampleKernel property, and RenderOutputDither applies Floyd-Steinberg error diffusion after page composition so print-preview output keeps photographic detail in pure black and white
Version 2.735.2
Fixed
- Fixed the Flate decompression streams passing the address of their buffer variable instead of the buffer itself when refilling from the source stream, which corrupted memory on every read and could crash the process; loading compressed documents, the inflate stream classes and the compress and decompress stream helpers are all affected
Version 2.735.1
Fixed
- Fixed growable XFA fields that carry no data source collapsing to a single line when flattened: their height is now measured from the text the template itself declares, which is what such a field displays. A field bound to empty data still measures as empty
Version 2.735.0
Added
- Free Pascal builds now cover the whole library: every unit compiles with FPC 3.2.2 and Lazarus, where previously only the core creation and loading path did
- XPS, EPUB and CBZ containers can be imported under Free Pascal, through a built-in read-only ZIP reader that handles ZIP64 sizes, stored and deflated entries, CRC verification and traditionally encrypted entries with the same password callback as the Delphi path
- XFA form flattening, the FormCalc calculation engine, the widget runtime, the document viewer components, the Type 1 font handlers, HTML import, signature verification and the job runner all compile in Free Pascal builds; flattening the XFA packets of a loaded document additionally needs the deflate codec, which those builds do not link
Fixed
- Fixed the PNG helper unit's 64-bit byte swapping, which returned incorrect values on Win64 and had left the unit out of the build entirely
Added
- Added draw-time missing-glyph detection: the TrackUnresolvedGlyphs property records every code point that would render as a .notdef tofu box through the active Unicode face, fires the OnUnresolvedGlyph event per finding, and leaves unregistered pure-GDI documents untouched
- Added legacy kern table support: RegisterUnicodeTTF captures the Apple/GDI-era kern table and the kerning emit falls back to its format-0 binary pair search when a font carries no GPOS kern lookups, restoring classic pair spacing in fonts like stock Arial
- Added per-run font fallback inside paragraph layout: WideTextOutBox now splits each wrapped line at code points the current font cannot map and draws every run in its resolved fallback font, so mixed Latin, emoji and CJK paragraphs render without tofu when fallback chains are registered
Version 2.734.0
Added
- Added RFC 3161 time-stamp request plumbing: HPDFRFC3161BuildRequest emits the DER TimeStampReq with a fresh positive-INTEGER nonce, optional policy OID and certReq, and HPDFRFC3161ParseResponse decodes the PKIStatusInfo header and extracts the token, so TSA transport callbacks are three lines instead of a DER study
- Added the ISO/TS 32002 developer extension declaration (THotPDF.EnsureISO32002Extensions) covering EdDSA signature algorithms and the additional ECDSA curves in PDF 2.0 documents, idempotent and version-gated like the 32001 SHA-3 declaration
Version 2.733.0
Added
- Added portable X25519 and X448 Montgomery-ladder key agreement plus P-256 / P-521 NIST-curve ECDH with CIOS Montgomery multiplication, enabling key-agreement (KARI) public-key recipients to be created and unwrapped entirely in-process; RFC 7748 and OpenSSL-generated reference vectors lock the ladder behaviour into the regression suite
- Added HPDFUnwrapKeyAgreementRecipientEnvelope together with the AddPubSecAgreementKeyMaterial and AddPubKeyAgreementRecipientWithSecret entry points, so documents encrypted with ECDH / X25519 / X448 recipients can be opened with the recipient private scalar and encrypted without external ECDH tooling
Version 2.732.0
Changed
- Saves now route serializer output through a 1 MiB buffered write stream, collapsing the per-token Write calls of object headers, dictionary keys, and xref rows into batched pushes on file-backed destinations
- Cross-reference stream payloads apply PNG Up prediction (/DecodeParms /Predictor 12) before FlateDecode and collapse free-list holes through /Index subsections, shrinking xref containers on every PDF 1.5+ document and on sparse object ranges
- The CompressionLevel property now also selects the Flate effort of the cross-reference stream and object-stream containers, so clMaximum produces smaller structural streams during save
Fixed
- Cross-reference stream /W field widths now adapt to the actual offset range instead of a fixed [1 4 2] layout whose Cardinal cast silently truncated offsets beyond 4 GiB into damaged output
Version 2.731.0
Changed
- Rebuilt the built-in template-matching OCR with connected-component glyph extraction, grayscale coverage scoring against cached multi-font templates, Otsu binarisation with a local-window fallback, bimodal gap word splitting, per-word baselines, speckle-noise rejection, and an extended 62-character alphabet that recognises mixed-case ASCII text through line-level height clustering and case-context preference
Version 2.730.0
Added
- Added Win64 support for Free Pascal 3.2.2 and Lazarus 4.6, including a runtime package, reproducible build script, compatibility layer, and non-GUI create-and-reload smoke test; native static codec integrations remain Delphi-only and report an explicit unsupported-operation error in Free Pascal builds
Version 2.729.0
Added
- Added a host-neutral dynamic XFA widget runtime with Unicode editing, focus and hit testing, instance-aware binding, atomic validation and calculation, bounded reflow, and a read-only loaded-document factory that preserves the source XFA
Version 2.728.0
Fixed
- Corrected XFA intrinsic measurement and text continuation to preserve explicit empty and calculated values, use each field or repeated-row binding context, retain breakAfter actions, avoid synthetic name collisions, and enforce a cached global measurement budget
Version 2.727.0
Changed
- XFA layout now applies intrinsic minimum and maximum dimensions, measures growable fields from their bound text, and atomically splits eligible textEdit content across content areas and pages with read-only continuation fields and bounded text, fragment, and measurement budgets
Version 2.726.0
Added
- Added complete NChannel process and spot attributes, mixing hints, bounded PDF 2.0 CxF/X-4 spectral ink streams, and document-level consistency checks for spot tint definitions and external output-intent colourant tables
Version 2.725.0
Added
- Added a thread-safe deterministic SIMD scanline render backend that preflights supported rectangle display lists, writes the final bitmap surface in vector blocks without an intermediate bitmap copy, and returns exact per-request decline reasons through the existing software fallback and telemetry pipeline
Version 2.724.0
Changed
- Expanded the bounded native FormCalc evaluator with general SOM node-set aggregates, mixed scalar and node-set arguments, nested numeric and string calls, and deterministic selection, string, trigonometric, logarithmic, and conversion functions under existing operation, array, depth, time, and output budgets
Version 2.723.0
Changed
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 while preserving colour, bitmap, variation, and shaping tables
Version 2.722.0
Added
- Added bounded password callbacks for classic ZIP-encrypted XPS, EPUB, and CBZ entries, including per-entry retry limits, cancellation checks, memory-only credential handling, and fail-closed rejection of unavailable, invalid, or unsupported encryption
Version 2.721.0
Changed
DownsampleLoadedImagesnow resizes supported 8-bit Separation and DeviceN image samples directly in component space and preserves the original colour-space graph, tint transform, colourants,/Decoderanges, and overprint semantics across save and reload
Version 2.720.0
Added
- Added bounded built-in recognition overloads for high-contrast uppercase ASCII OCR, horizontal Code 39, and clean axis-aligned QR version 1 byte-mode symbols, allowing searchable text layers and loaded-page barcode decoding without a caller-supplied engine while ambiguous or unsupported input fails closed
Version 2.719.0
Added
- Added bounded JPEG 2000 refinement by resolution and quality layer through
THPDFJpeg2000Decoder.LoadProgressiveFromByteArray, plus multi-layer encoding throughTJpeg2000Bitmap.QualityLayers, with identical final pixels for LRCP, RLCP, RPCL, PCRL, and CPRL progression orders
Version 2.718.0
Changed
- Embedded complete UniJIS, UniGB, UniCNS, and UniKS UCS2 and UTF16 horizontal and vertical CMaps, including supplementary scalars and standard vertical defaults, so CJK text extraction and geometry no longer depend on external Unicode mapping files or half-em guesses
Version 2.717.0
Added
- Added explicit linearized shared-object dependency ranges and a range-arrival redraw scheduler so pages can paint before all optional dependencies arrive and redraw exactly when newly available data changes the result
Version 2.716.0
Added
- Added bounded object-graph repair for actionable xref, trailer, catalog, page-tree, and name-tree preflight findings with validated transaction commit and complete rollback on unsafe or ambiguous input
Version 2.715.0
Added
- Added PDF 2.0 encrypted payload wrappers whose visible document content remains readable before authentication while embedded-file names, descriptions, and bytes stay protected until an explicit password unlock
Version 2.714.0
Changed
- Loaded-page SVG export now emits axial and radial gradients, bounded PNG representations of Type 4 through Type 7 mesh shadings, and decoded inline images without incrementing the corresponding skip counters
Version 2.713.0
Changed
- OpenType SVG colour glyphs now use the bounded Form XObject pipeline for arcs, vector gradients, opacity, geometric masks, and local
#idreuse while continuing to reject scripts, external resources, images, and unsupported active content
Version 2.712.0
Changed
ReplaceLoadedPageTextnow replaces matches spanningTJstring items and arrays through glyph source spans while preserving kerning numbers, unmatched prefixes and suffixes, unrelated operands, and the original content-stream structure
Version 2.711.0
Added
- Added CFF FontSet
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 through
HPDFSelectFlatePredictor, using distributed row samples, estimated byte cost, configurable CPU weighting, and explicit byte, row, and work budgets
Version 2.709.0
Added
- Added opt-in native JBIG2 Huffman symbol-dictionary and text-region output through
THPDFJBIG2Options.UseHuffmanEncoding, including standard DH, DW, BMSIZE, FS, DS, and DT tables, raw collective bitmaps, symbol-ID tables, deterministic native routing, and pixel-exact decoder round trips while retaining arithmetic and MMR defaults
Version 2.708.0
Changed
- Cached Arabic and combined presentation-form reverse cmap mappings by registered font generation, replacing repeated U+FB00..U+FDFF and U+FE70..U+FEFF scans in
ApplyArabicGSUBRefinement,ApplyArabicGSUBContextualRefinement, and the generic contextual GSUB path while preserving codepoint precedence and shaped output
Version 2.707.0
Added
- Added the Aztec 2D barcode encoder (ISO/IEC 24778) through
THPDFPage.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 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 through
THotPDF.SaveLoadedPageToPng,SaveLoadedPageToPngStream,SaveLoadedPagesToTiffBanded, andSaveLoadedPagesToTiffStreamBanded, writing compressed image data row by row through band encoders so very large pages do not require 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, while 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 through
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 while 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 before the new RFC 3161 document timestamp, preserves every earlier revision byte-for-byte, and exactly deduplicates validation streams across successive renewals
Version 2.701.0
Added
- Added clause-addressable PAdES baseline and extended profile preflight through
THotPDF.PreflightLoadedPAdES, reporting every applicable requirement with stable rule ID, profile, normative level, standards clause, PDF path, object number, signed or current revision, and pass status while validating CMS cardinalities, signer-certificate ESS references, signature-dictionary constraints, byte-range coverage, trusted time, DSS evidence, and document-timestamp coverage
Version 2.700.0
Added
- Added end-to-end ECDSA, Ed25519, and Ed448 PFX / PKCS#12 private-key loading and CMS document signing, including named-curve CNG ECDSA, optional OpenSSL 3 PureEdDSA, RFC 8410 key decoding, RFC 8419 digest and parameter rules, SHAKE256 with 512-bit output for Ed448, automatic key-algorithm selection, and strict certificate-to-key pairing
Version 2.699.0
Added
- Added deterministic multi-identity PFX / PKCS#12 credential selection through
HPDFEnumeratePFXIdentities,HPDFParsePFXByLocalKeyID, andTHPDFCMSSignOptions.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 while retaining AES-256-CBC and HMAC-SHA-1 / SHA-256 compatibility
Version 2.697.0
Added
- Added specification-conforming XPS and OpenXPS Canvas
FixedPage.NavigateUriinheritance so descendantPath,Glyphs, and 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 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 after all pages exist, with metric-aware click bounds, 65,536-link and 8,192-character limits, VisualBrush capture suppression, cancellation, and fail-closed unsafe-scheme diagnostics
Version 2.693.0
Added
- Added bounded native XPS and OpenXPS
VisualBrushconversion for inline or resource-backedCanvas,Path, andGlyphsvisuals, hierarchical and remoteResourceDictionarylookup, absoluteViewbox, absolute or relativeViewport,None,Tile, and reflected tile modes, transforms, opacity, reusable Form XObjects, shared tiling patterns, token-aware resource transfer, and fail-closed cycle, malformed-input, recursion, content, cache, and placement budgets
Version 2.692.0
Added
- Added native XPS and OpenXPS package-font embedding for TrueType and OpenType programs, TTC member fragments, GUID-obfuscated resources, direct or cmap-derived glyph IDs, one-to-many Unicode clusters, explicit advances and offsets, width-correct RTL origins, shared font resources, embedding and no-subsetting permissions, optional glyph subsetting, bounded
ToUnicodemaps, and amortised-linear positioned-run output without 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 capped at 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 through 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,FlipY, andFlipXYmodes 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 changing its containing vector geometry; non-standardRelativeTransformand unresolved matrix resources remain explicit diagnostics
Version 2.687.0
Added
- Added matrix-controlled image XObject placement through
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 center, origin and radius mapping, native Type 3 PDF shading, and coordinate restoration that leaves path geometry unchanged
Version 2.685.0
Changed
- Extended ordered native-vector XPS path import with quote-aware and bounded property-element parsing, solid and multi-stop linear gradient brushes, native PDF shading patterns, brush and stop alpha, default relative-to-bounds or explicit absolute gradient coordinates, out-of-range stop interpolation, and fail-safe diagnostics for unsupported transforms, spread modes, colour interpolation, variable alpha, and degenerate axes
Version 2.684.0
Changed
- Added ordered native-vector XPS path import with bounded abbreviated geometry, fill rules, solid RGB and ARGB fills and strokes, path opacity, stroke width, six-parameter transforms, and fail-safe diagnostics for unsupported drawing features
Version 2.683.0
Changed
- Strengthened actual-painted-content PDF/X-6 validation with definition-time shading-pattern graphics state, nonstroking pattern ExtGState semantics, fail-closed soft-mask subtype and backdrop checks, exact Type 3 glyph metrics and inherited-colour rules, strict combined-paint alpha classification, bounded JPX colour inference, and appearance-aware annotation compositing
Version 2.682.0
Added
- Added producer and verifier support for
brainpoolP256r1,brainpoolP384r1, andbrainpoolP512r1ECDSA 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 without 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 selectable ISO 15930-9:2020 or resolved-errata 2025 rules, actual ICC header and channel checks, resource-aware traversal of content arrays, Form XObjects, tiling and shading patterns, images, Type 3 glyphs, soft masks and annotation appearances, overprint-mode and combined-paint transparency diagnostics, stable rule provenance, and bounded decoded-byte, token, object, issue, recursion and graphics-state work
Version 2.678.0
Added
- Deepened bounded PDF/A-4 validation with cached ICC header and component checks, document and page output-intent consistency, actual painted device-colour and transparency analysis across content arrays, nested Form XObjects, images, image masks, shadings and annotation appearances, inherited graphics state, rendering-font embedding, CIDFont and CMap relationships, strict annotation flags and appearance states, UTF-8 XMP packet and namespace validation, logical page-tree locations, stable clause-aware diagnostics, and configurable decoded-byte and content-token ceilings
Version 2.677.0
Added
- Completed bounded PDF/UA-2 document, human-readable string, optional-content, annotation, AcroForm, structure-destination, outline, embedded-file, and nested page-label validation, including physical ParentTree ownership, scalar structure children, appearance-stream restrictions, namespace-URI-based XMP properties, Unicode private-use detection, and clause-aware diagnostics; structured HTML, XHTML, XML, and JSON export now share a tagged-first accessible reading model with language, title, navigation, page labels, safe links, annotations, non-sensitive form controls, marked-content replacements, artifacts, image alternatives, geometric fallback, independent limits, cancellation, and atomic publication
Version 2.676.0
Added
- Added bounded minimal byte-range planning for every page in a linearized PDF through
PlanProgressiveLinearizedPageRanges, with raw and Flate primary or overflow hint decoding, interoperable byte-aligned combined and Annex F continuous split hint layouts, exact bootstrap, page, shared-group, and LF- or CRLF-prefixed traditional or stream cross-reference dependencies, legal short-read accumulation, a 256 MiB default planner-memory ceiling with fail-closed encoding disambiguation, overlap-aware merging, strict structural cross-checks, typed limits and availability diagnostics, and a unified[0, /E)first-page path
Version 2.675.0
Added
- Added independent standards-conformant crypt-filter policies for strings, normal streams, and embedded files through
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 through 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 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 throughHPDFCMSBuildMultiSignedDataandHPDFCMSMergeSignedData, 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 throughTHPDFCMSSignOptions.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 dedicated verification status, validation failure code, timestamp propagation, detailed issue reasons, and JSON output
Version 2.668.0
Added
- Added SHA3-256, SHA3-384, and SHA3-512 generation and verification across detached CMS, RSA PKCS#1 v1.5, RSA-PSS, ECDSA provider contracts, RFC 3161 content and signature timestamps, PAdES-LTA renewal, Seed Value dictionaries, and ISO 32001 PDF 2.0 developer-extension declarations, with bounded one-pass byte-range hashing shared with matching PDF MAC policies
Version 2.667.0
Added
- Added
THotPDF.ValidatePDFMACChainwith oldest-to-newest incremental-revision validation, cumulative classic or xref-stream indexing, exact revision and xref failure locations, historical MAC replacement detection, stableKDFSaltenforcement, digest-strength downgrade rejection, authenticated/Pand/Permschecks, preflight reporting, and bounded revision parsing without temporary PDF copies
Version 2.666.0
Added
- Added
THotPDF.SignPDFWithPFXAndAttachedPDFMACand 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 output replacement
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 while 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, Color, and Luminosity, and corrected the full-opacity fast path so every active separable or non-separable blend mode composites against its backdrop
Version 2.663.0
Security
- Authenticated PKCS#12 containers before exposing encrypted safe contents by verifying optional outer
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 while 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 both platforms)
Version 2.661.0
Added
- Added genuine budgeted Zopfli high-ratio Flate compression after the existing four-strategy zlib baseline, with strict no-growth selection, input, iteration, block, output, and elapsed-time limits, detailed stream and parallel-image telemetry, and deterministic fixed-corpus savings gates
Version 2.660.0
Added
- Added deterministic XML machine-readable preflight reports and ABI-versioned trusted plugins for feature extraction and custom validation rules, with stable ordering, policy-bundle integration, cancellation propagation, fail-closed capability checks, and finite plugin, finding, feature, string, output, and elapsed-time budgets
Version 2.659.0
Added
- Extended bounded XFA FormCalc with conditional logic, repeated numeric aggregates, and validated dynamic-instance callbacks, and added default-off sandboxed QuickJS form scripts with full control flow, native typed arrays, isolated data access, finite instruction, time, memory, stack, value, and instance-operation budgets, and execution telemetry
Version 2.658.0
Added
- Added bounded editable XFA packet DOMs for complete XDP streams and ordered packet arrays with local-name path queries, packet and node mutation, exact untouched-byte preservation, per-packet selective rewriting, deterministic namespace and attribute output, safe CDATA splitting, entity escaping, and finite input, output, packet, node, depth, attribute, text, and query budgets
Version 2.657.0
Added
- Added CSC API v2 remote signing through the existing CMS provider pipeline with application-owned transport, OAuth token refresh, bounded credential-chain discovery, explicit authorization and SAD handling, synchronous or asynchronous digest signing, RSA-PSS parameters, polling, RFC 3161 timestamps, cancellation, stable idempotency keys, and a finite completed-operation cache
Version 2.656.0
Added
- Added optional content-scored XPS, EPUB, and CBZ document handlers with replaceable thread-safe registration, one validated archive scan, fixed-page, spine, and natural image ordering, immutable PDF conversion caching, shared archive, resource, reflow, page, pixel, DPI, output, and cancellation budgets, and rollback-safe PDF publication
Version 2.655.0
Added
- Added bounded typed-table extraction and atomic CSV or JSON export with canonical columns, same-page fragment and consecutive-page merging, merged-cell spans, repeated headers, page geometry, confidence, provenance, and locale-controlled integer, number, boolean, date, date-time, currency, and percentage inference
Version 2.654.0
Added
- Added atomic structured export of loaded pages to HTML, XHTML, XML, and JSON through one reading-order model with blocks, styled spans, detected tables, coordinates, source order, optional bounded PNG images, Unicode-safe escaping, cancellation, and finite resource budgets
Version 2.653.0
Added
- Added atomic loaded-page colour rewrite to DeviceGray, DeviceRGB, or DeviceCMYK with searchable vector preservation, lossless colour-managed raster conversion for images and complex resources, rotation-safe output, explicit render fidelity and resource budgets, and preserve, process-convert, or reject policies for spot plates
Version 2.652.0
Added
- Added review-first loaded-page redaction detection with checksum-aware PII patterns, pluggable entity and face detectors, confidence-scored page-space findings, bounded work telemetry, mandatory reviewer identity, atomic approved-annotation staging, and a separate explicit burn-in boundary
Version 2.651.0
Added
- Added bounded loaded-page and region barcode decoding with pluggable engines, progressive low-resolution rendering, fallback quarter-turn scans, validated text and raw payloads, PDF-space bounds and orientation, confidence filtering, overlap deduplication, cancellation, and resource telemetry
Version 2.650.0
Added
- Added bounded cancellable searchable OCR text layers with pluggable recognition engines, confidence and geometry validation, rotation-aligned invisible Unicode text, optional-content grouping, resource telemetry, and atomic multi-page publication
Version 2.649.0
Added
- Added complete object graph round trips through versioned JSON with streaming snapshot and incremental exports, raw or decoded embedded and atomic sidecar payloads, bounded schema-compatible import, structural and stream-length validation, and transactional publication
Version 2.648.0
Added
- Added bounded repair for hand-edited QDF diagnostic documents that preserves object and stream bytes, fixes direct, indirect, missing, or stale stream lengths, rebuilds classic cross-reference offsets and trailers, rejects unsafe structure, and verifies output through the normal loader
Version 2.647.0
Added
- Added a thread-safe custom stream filter registry with bounded push and pull contracts, shared decode budgets, cooperative cancellation, explicit seek requirements, isolated custom failures, and execution telemetry
Version 2.646.0
Added
- Added bounded content-operator visitor and event APIs with read-only operand views, deterministic state callbacks, inspect, measure, replace, delete, stop, and reject actions, cooperative cancellation, validated output, and atomic loaded-page updates
Version 2.645.0
Added
- Added a pluggable loaded-page render backend contract with compiled display-list access, native GDI implementation, thread-safe parallel dispatch, deterministic fallback policy, cache invalidation, and execution telemetry
Version 2.644.0
Added
- Added bounded layout overlap detection, element paths, opt-in source mapping, native vector overflow and overlap overlays, live diagnostic callbacks, and work statistics
Version 2.643.0
Added
- Added native bounded vector charts with line, bar, area, pie, and scatter series, automatic or manual axes, themes, legends, labels, PDF/UA Figure alternatives, and render statistics
Version 2.642.0
Added
- Added bounded GUI-thread RichEdit and RTF pagination with vector EMF output, images, opt-in supported OLE presentations, cancellation, stream-position preservation, and explicit input, character, page, and output budgets
Version 2.641.0
Added
- Added bounded SVG 2 import as reusable PDF Form XObjects with native geometry and arcs, CSS cascade, vector gradients, clip and mask support, Base 14 text, opacity resources, placement-aware link annotations, and import statistics
Version 2.640.0
Added
- Added a versioned HTML5 paged-media import profile with tolerant DOM parsing, print CSS cascade, paginated block and table layout, optional AcroForm controls, bounded callback-driven resources, and per-operation statistics
Version 2.639.0
Changed
- Large local-file mappings now adapt the configured mapped-byte cap between larger sequential windows and up to 16 smaller MRU random-access windows, retain an explicit fixed-geometry option, and report active geometry, transitions, access-pattern counts, and peak mapped bytes
Version 2.638.0
Added
- Added bounded cross-page JBIG2 symbol training with external and native backends, one shared global dictionary, exact duplicate-page reuse, direct PDF image-batch insertion, backend and size telemetry, and measured 78.8 percent compression savings on the 100-page regression corpus
Version 2.637.0
Changed
- Parallel loaded-page rendering now reduces requested workers from the process-wide memory budget, reserves every claimed page, retains ordered-output reservations through callback delivery, wakes budget waiters on cancellation or failure, and reports concurrency, reservation, admission, delay, and wait telemetry
Version 2.636.0
Changed
- Loaded-page prefetch now compiles and renders outside the cache lock, cancels cooperatively through tokenization and playback, yields to foreground page rendering, and exposes progress, failure, preemption, and cancellation-latency telemetry
Version 2.635.0
Added
- Added ordered streaming parallel page rendering with calling-thread callbacks, a bounded completed-bitmap queue, producer backpressure, cooperative cancellation, borrowed bitmap lifetimes, and queue, byte, wait, completion, and delivery telemetry
Version 2.634.0
Added
- Added a two-stage parallel loaded-page pipeline that compiles display lists outside the render-cache lock, starts playback before the full page set is compiled, dynamically balances bounded workers, preserves input order, reduces content-token allocation, and exposes stage, cache, completion, and latency telemetry
Version 2.633.0
Added
- Added immutable reference-counted decoded bitmap handles with copy-free cache hits, direct thread-safe renderer drawing, isolated mutable copies on demand, eviction-independent lifetimes, and cumulative handle and copy telemetry
Version 2.632.0
Changed
- QuickJS execution now works through both static objects and an ABI-neutral bridge DLL on Win32 and Win64, with Unicode-safe values, deterministic status reporting, configurable memory, stack, script, time, and interrupt limits, secure DLL discovery, recovery after rejected scripts, and reproducible cross-platform runtime builds
Version 2.631.0
Changed
- Factur-X and ZUGFeRD business-rule validation now executes the complete reviewed XPath 2 Schematron surface with external code databases, sequential bindings, quantifiers, FLWOR sums, stable fallback rule identifiers, secure bounded XML parsing, explicit evaluation-error findings, zero silent skips, and fail-closed combined validation
Version 2.630.0
Added
- Added built-in TrueType variable-font instancing with mapped axes, shared and private
gvartuples, IUP interpolation, simple and composite outline updates, phantom-point metrics,HVAR,VVAR, andMVARbaking, compact static glyph rebuilding, checksum-correct output, and callback-free Unicode font registration
Version 2.629.0
Added
- Added side-effect-free CMS placeholder estimation from explicit, provider, or RSA certificate signature sizes, exact static container shaping, conservative dynamic payload reserves, pre-sign rebuilds, capability-gated provider retries, strict external-signer single-invocation guarantees, bounded sizing, and detailed attempt diagnostics
Version 2.628.0
Added
- Added reachability-based subsetting of fonts embedded in loaded PDFs, including page content, nested Form XObjects, annotation appearance states, shared font programs, TrueType and CFF formats, encoded-size selection, stable CID and ToUnicode mappings, detailed results, and default refusal when signatures are present
Version 2.627.0
Added
- Added automatic PDF/UA structure generation for declarative layout trees, including headings, lists, tables, figures, language and alternate-text metadata, pagination artifacts, continuation-safe marked-content references, reading-order preservation, semantic validation, and structure statistics
Version 2.626.0
Added
- Added a declarative document DOM with inheritable styles, reusable component factories, text, spacers, stacks, containers, sections, repeated headers and footers, weighted tables with repeating header rows, bounded continuation depth, pagination statistics, non-copying text and table fragments, linear top-level traversal, immediate page flushing, and matching Delphi and C++Builder surfaces
Version 2.625.0
Added
- Added a repeatable Win32 and Win64 statistical performance gate that isolates load, save, render, and text extraction, records warmups and 30 raw samples with p50, p95, sample variance, RSS, process I/O, environment, and deterministic fixture identity, then evaluates stable JSON thresholds and returns a failing exit code on regression
Version 2.624.0
Changed
- Reworked simple dictionary and array parsing around immutable source spans, direct numeric conversion, single-pass nested containers, and indexed dictionary insertion, with public materialisation telemetry; a 30,000-pair Win32 fixture reduced five-pass allocation bytes by 64.7 percent and elapsed time from 3,656 ms to 46 ms
Version 2.623.0
Added
- Added configurable parser limits for individual token bytes, aggregate tokens, array or dictionary entries, and malformed tokens, plus a strict untrusted-input preset, typed limit exceptions, and per-load telemetry; regression gates reject a 2 MiB token and a one-million-token container in under 250 ms and below a 37 MiB process peak
Version 2.622.0
Added
- Added explicit loaded-page object-graph release and telemetry APIs that discard clean page-owned roots and render caches while preserving indirect shared resources and reload metadata; sequential processing of 100,000 pages stays at a stable 69.3 MiB peak and released ordinary or compressed pages materialise again with their original object identity
Version 2.621.0
Changed
- Decoded object-stream containers now use a configurable byte-capped LRU cache with immediate per-container eviction, source-backed reload after eviction, a zero-retention mode, and peak-byte, eviction, and reload telemetry
Version 2.620.0
Changed
- Large ordinary page trees now open into compact placeholders, resolve random pages through
/Count-guided traversal and an indirect-object hash index, cache resolved pages, expose materialization telemetry and controls, and expand automatically before structural mutation or save operations
Version 2.619.0
Changed
- Loaded AcroForm fields, qualified names, widgets, annotations, and pages now share a lazy bidirectional relationship cache with reverse annotation lookup, per-widget page lookup, activity telemetry, explicit invalidation for raw object-graph edits, and mutation-safe automatic maintenance
Version 2.618.0
Changed
- Page-object lookup now uses a lazily rebuilt mutation-aware reverse index for object numbers and resolved page pointers, replacing repeated page-table scans across page copying, outlines, named destinations, actions, forms, accessibility, and page-tree reconciliation while exposing validity and activity telemetry
Version 2.617.0
Changed
- Rendered document comparison now supports caller-selected DPI, RGB or luminance color tolerance, changed-pixel ratio and SSIM-like similarity gates, deterministic connected changed regions, optional PNG difference overlays, and fail-closed page and aggregate pixel budgets with explicit rendering diagnostics
Version 2.616.0
Changed
- Document comparison now traverses indirect object graphs through deterministic catalog-based paths, hashes values and streams within explicit resource limits, aligns pages before classifying insertions, deletions, moves, and changes, distinguishes moved objects from additions and removals, and reports incomplete comparisons instead of treating budget-limited results as identical
Version 2.615.0
Changed
- Loaded-image decoding now uses 16 cache metadata shards and exact per-key singleflight coordination, performs independent expensive decodes concurrently while preserving one owner decode for duplicate requests, enforces the configured byte and entry budgets across all shards, and exposes cached decode entry points plus concurrency telemetry; four independent 12,000-pixel JPEG requests scale 3.72 times on four Win64 workers while eight same-key requests decode once
Version 2.614.0
Changed
- Low-resolution grayscale and RGB JPEG rendering now selects a bounded 1/2, 1/4, or 1/8 inverse-DCT scale, streams scaled scanlines through a fixed-point resampler directly into the exact target bitmap, preserves decode budgets, cancellation, and codec-worker isolation, and exposes source, scaled, target, scanline, and memory telemetry through
GetLastJPEGReducedDecodeInfo; the 12,000 by 12,000 to 300 by 300 regression fixture runs 24.05 times faster than full decode without allocating its 432 MB source raster
Version 2.613.0
Changed
- Loaded page
/Contentsarrays now expose a lazy seekable concatenated stream, retain unfiltered segments in source-backed storage, decode at most one filtered segment at a time, use amortised-linear token and byte accumulation, preserve original streams when editing by appending a new segment, and keep a 1 GiB 10,000-segment sequence below 64 MiB of additional working memory
Version 2.612.0
Changed
- Incremental updates now keep the source file write-locked and file-backed instead of retaining complete source bytes, visit and emit only changed, new, and deleted objects in sparse xref subsections, stream the original prefix to a new target, and append directly with rollback for same-target saves; a 4 GiB one-object revision stays within 128 MiB of additional working memory
Version 2.611.0
Added
- Added a bounded document-scoped loaded-font decoder cache with a 32 MiB and 128-entry LRU limit, singleflight parse reuse across pages and loaded text extraction, SVG export, and text replacement, independent deep-copy results from
GetLoadedFontDecoder, configurable memory budget and telemetry APIs, and automatic graph, page, reload, JSON Patch, and CMap configuration invalidation; repeated use of one shared indirect font now parses its encoding, widths,ToUnicode,CIDToGIDMap, and descendant mappings only once while retained
Version 2.610.0
Changed
- Accelerated page import and object grafting by replacing the linear, exactly resized foreign-object lookup array with an operation-scoped power-of-two open-addressed map keyed by source document, object number and generation; shared indirect objects and cyclic graphs keep their existing identity semantics across batch imports while large object graphs now use amortised constant-time registration and expected constant-time lookup
Version 2.609.0
Changed
- Improved SVG page export fidelity: direct
w,J,j,Manddgraphics-state operators now preserve line width, named cap and join styles, miter limits, dash arrays and dash phase;q/Qrestores these attributes across nested content and Form XObjects; even-oddf*,B*andb*paint operators emitfill-rule="evenodd"; zero-width PDF hairlines remain visible through non-scaling SVG strokes
Version 2.608.0
Added
- Added QuickJS static-linking infrastructure:
Lib/HPDFQuickJSStatic.paslinks the five QuickJS OMF objects (built with bcc32c from patched sources) through{'$L'}directives — no DLL dependency — and declares the full C runtime surface (47 symbols: msvcrt C99 math, Borland 64-bit arithmetic, size-neutral atomic stubs, pthread stubs);thirdparty/QuickJS/build-static.batautomates the patch-and-compile pipeline. Known limitation:JS_NewRuntimesucceeds butJS_NewContexthits an access violation because the_Atomicremoval changes struct initialization order; the DLL build from v2.607.0 remains the working evaluation path
Version 2.607.0
Added
- Added DataMatrix 2D barcode generation (
Lib/HPDFDataMatrix.pas): ASCII-mode encoding with digit-pair compression, Reed-Solomon ECC over GF(256) with the DataMatrix primitive polynomial $12D, square sizes 10x10 through 144x144, alternating-direction codeword placement, and the L-shaped finder pattern;THPDFPage.DrawDataMatrixrenders the encoded matrix as a grid of filled module squares - Added PDF417 stacked 2D barcode generation (
Lib/HPDFPDF417.pas): text-mode encoding with base-30 character pairing, Reed-Solomon ECC over GF(929) with primitive 3, symbol descriptor encoding, and row/column layout with start/stop patterns;THPDFPage.DrawPDF417renders the codeword matrix - Added the QuickJS JavaScript engine binding (
Lib/HPDFQuickJS.pasplus pre-built Win32/Win64quickjs.dllunderthirdparty/QuickJS/bin/): dynamic DLL loading, runtime+context lifecycle, and the evaluation API surface (Eval/EvalInt/EvalFloat); theEvalcode path has a known Win32 startup crash when linked into an application and is documented for follow-up investigation - Added the
THPDFWriterarchitectural extraction target (Lib/HPDFWriter.pas): xref entry registry (free/used/compressed), classic xref table serialiser, and trailer dictionary builder that the THotPDF save path delegates to incrementally
Version 2.606.0
Added
- Added two HotPDFCLI commands:
decryptloads an encrypted PDF with the given password, decrypts it viaDecryptLoadedDocumentand saves an unencrypted copy (-ooutput path, default<input>-decrypted.pdf) andoptimizerecompresses every stream with FlateDecode viaCompressLoadedDocument(-ooutput path, default<input>-optimized.pdf, refuses encrypted input)
Version 2.605.0
Added
- Added QR Code 2D barcode generation: the new
Lib/HPDFQRCode.pasimplements a complete QR encoder (numeric, alphanumeric and byte encoding modes; Reed-Solomon error correction over GF(256); versions 1-40 with all four EC levels L/M/Q/H; all eight mask patterns with penalty evaluation; correct module placement including finder, timing, alignment, format info and version info patterns). TheTHPDFPage.DrawQRCodemethod renders the encoded matrix as a grid of filled module squares on any writing page (ModuleSizein points, configurable EC level and colour)
Version 2.604.0
Added
- Added full MacExpertEncoding decode table: the 128-byte high half now maps expert glyphs (small capitals, old-style figures, superior/inferior digits, fractions, typographic symbols) to the closest Unicode codepoint or Private Use Area surrogate, replacing the previous raw-byte identity fallback that produced garbled output for documents using expert-encoded Type 1 fonts
Version 2.603.0
Fixed
- Fixed a long-standing flaky failure in
ConcurrentObjStmDecryptionMatchesSerial: theFRevisionglobal was stale afteraes256downgraded toaes128under the default PDF 1.6 version, misroutingCreateKeysinto the V5 branch that never fills the legacy/Oand/Upassword hashes — the serialised encryption dictionary then carried empty or stale password strings and the file was unopenable. The fix re-derivesFRevisionfrom the downgradedFCryptKeyTypeat both the setter and the two version-negotiation sites, and the legacy dictionary branch now raises a clear diagnostic when the password strings are not exactly 32 bytes
Added
- Added the HotPDFCLI
htmlcommand: renders a restricted HTML file (h1-h6, p, ul, ol, hr, inline markup) to a PDF viaHPDFRenderHTMLDocument
Version 2.602.0
Added
- Added block-level HTML import:
THPDFHTMLImporter(and theHPDFRenderHTMLDocumentconvenience wrapper) renders a restricted HTML subset onto a writing document —h1-h6headings with per-level sizes,pparagraphs (bare body text becomes implicit paragraphs),ul/ollists with indentedliitems (bullet or1.numbering),hrrules, automatic page breaks at the bottom margin and browser-style recovery for unclosedp/liblocks;head/script/styleregions are skipped and container tags pass through transparently. Inline markup (b/i/u/font/a/sub/sup, entities, word wrap) is delegated to the existingTextOutHTMLrenderer, so blocks keep-together within a page; tables, images, CSS and nested lists are out of scope
Version 2.601.0
Added
- Added three HotPDFCLI commands:
mergeappends every page of the additional inputs to the first document and saves the combined file (-ooutput path, at least two inputs, output/input collision guarded),splitwrites each selected page of a document to its own single-page file (<prefix>-page<N>.pdf,--pagesone-based range, default prefix from the input path) andexport-svgwrites the SVG export of each selected page (<prefix>-page<N>.svg, default page 1)
Version 2.600.0
Added
- Added SVG page export:
BuildLoadedPageSVGreturns a standalone SVG 1.1 document for any loaded page andSaveLoadedPageAsSVGwrites it to disk; paths (fill/stroke/fill-and-stroke paint operators with the DeviceRGB colours), text runs (per-character positioned<text>elements using the same font-decode fallback chain as text extraction, honouring Tf/Tc/Tw/Tz/Ts and the text matrix incl. rotation and scaling), image XObjects (decoded and embedded as base64 PNG data URIs mapped through the CTM unit square) and Form XObjects (recursive interpretation with the form matrix and own /Resources) are exported, and /Rotate 90/180/270 pages export in the rotated canvas geometry - Known limits inherited from the shared content-stream device dispatcher: no W/W* clipping, no
shshadings, no Type 3 fonts, inline images report metadata only and ExtGState-supported stroke parameters (LW/LC/LJ/ca/CA) are honoured while the plainw/J/j/doperators are not dispatched
Version 2.599.0
Added
- Added the HotPDFCLI command-line tool (
tools/HotPDFCLI): a console front end with three commands —info(PDF version, page count and first page size, encryption method, linearization and xref structure, annotation/font/image/form/signature counters, Info metadata),extract-text(one-based--pagesranges,--outfile output,--layoutmonospaced grid mode that matches visual reading order) andverify(per-signature-field status, signer, reason, hash, signing time, whole-document coverage and certificate state, non-zero exit when any signature fails);Build-HotPDFCLI.batproduces Win32 and Win64 binaries
Version 2.598.0
Added
- Added
SetRenditionMediaPlayParameters: attaches or updates the/Pmedia play parameters dictionary of a media rendition with must-honour/MHor best-effort/BEtargets carrying the volume percentage, controller visibility, autoplay flag, fit mode (meet/slice/fill/scroll/hidden), repeat count and an intrinsic, infinity or explicit timespan duration - Added
SetRenditionMediaScreenParameters: attaches or updates the/SPmedia screen parameters dictionary of a media rendition (window type floating/full-screen/hidden/screen-annotation rectangle, DeviceRGB background colour, background opacity, monitor index) - Added
SetSoundAnnotationParameters: rewrites the sample format of a Sound annotation's/Soundstream (rate, channels, bits per sample, Raw/Signed/muLaw/ALaw encoding) beyond the hardcoded 22050 Hz stereo 16-bit Signed defaults and sets the/Nameicon such as Speaker or Mic
Version 2.597.0
Added
- Added
SetMovieAnnotationParameters: overrides the/Moviedictionary of a movie annotation (aspect pair, rotation 0/90/180/270, duration in seconds, poster visibility) thatAddMovieAnnotationcreated with its hardcoded defaults - Added
SetRichMediaPresentation: populates the/RichMediaSettingsactivation, deactivation and presentation dictionaries of a RichMedia annotation (condition names such asPOpage-open, toolbar / navigation UI / context click / transparency flags); an empty condition name omits the corresponding dictionary - Added
ResolveIndirectObjectonTHotPDF: resolves the indirect references the authoring side stores inside written dictionaries so callers can navigate freshly built object trees;AddRichMediaAnnotationnow also registers its annotation inLastAnnotation
Version 2.596.0
Added
- Added live revocation evidence discovery: the certificate parser now reads the AIA OCSP responder and CRLDistributionPoints URI extensions,
HPDFExtractCertificateRevocationURLsexposes them per certificate, andHPDFCollectCMSRevocationRequeststurns them into evidence requests (GET pkix-crl per distribution point, POST ocsp-request with a minimal RFC 6960 SHA-256 CertID body built from the certificate and its issuer, self-signed certificates resolving as their own issuer) - Added
HPDFValidateCMSCertificatePathOnline: collects those requests, executes them through the caller-supplied transport over the existing retry/worker machinery (the library never opens sockets), and feeds every fetched OCSP response and CRL into the offline validator; failed fetches degrade to the offline evidence semantics
Version 2.595.0
Added
- Added JBIG2 halftone region decoding (segment types 22/23): pattern dictionaries (type 16) with MMR or arithmetic collective bitmaps, gray-scale bit-plane stacks in both MMR (byte-aligned chained planes) and arithmetic form (one shared MQ decoder), grid placement with 8.8 fixed-point vectors and the optional HSKIP blank map
- Added JBIG2 standalone generic-refinement regions (types 42/43, GRTEMPLATE 0/1 with TPGRON) refining the archived bitmap of a referred region segment or the page buffer
- Added
AddPubSecKeyMaterial/ClearPubSecKeyMaterials: additional recipient private keys tried against every/Recipientsenvelope when the primaryPubSecKeyMaterialdoes not match - Added test-stream builders
HPDFJBIG2Codec_EncodeHalftoneRegionTestStreamandHPDFJBIG2Codec_EncodeStandaloneRefinementTestStreamcovering the new segment types end to end
Fixed
- Fixed public-key AES-128 document loading: the legacy object pass left
FileKey,StringKeyTypeandStreamKeyTypeuninitialised after the pubsec split, so every object decrypted with a garbage key (a Win64 load failed outright; a Win32 load silently produced wrong plaintext) - Fixed encrypted string round-tripping: ciphertext is now always serialised as a hex string because literal strings normalise CR, LF and CRLF to a single LF and escape processing could flip arbitrary cipher bytes
Version 2.594.0
Added
- Added built-in identity approximation for the predefined CJK UCS2/UTF16 CMaps (
UniJIS-UCS2-H,UniGB-UTF16-Vand 15 more):HPDFLoadStandardCMapFileanswers from a built-in table when no CMap resources ship on disk, so Type0 text extraction no longer decodes 2-byte codes one byte at a time - Added user-supplied JBIG2 Huffman tables (segment type 53, Annex B.2 descriptor form): the native decoder parses the table segments and the symbol-dictionary SDHUFFDH/SDHUFFDW/SDHUFFBMSIZE/SDHUFFAGGINST and text-region SBHUFFFS/DS/DT/RDW/RDH/RDX/RDY/RDSIZE selector value 3 resolves them from the referred-to segments
- Added
SetStructureClassMapEntryregistering the shared attribute dictionary of a class name in the StructTreeRoot/ClassMap, completing theSetStructureElementClass/C API
Fixed
- Fixed public-key multi-recipient key recovery: the
/Recipientsenvelopes were stored in an uncounted list that aliased one buffer across entries, so documents with two or more recipients derived a wrong file key for every cipher; envelopes are now owned copies and the legacy SHA-1 path hashes pristine envelope bytes like the AES-256 path
Version 2.593.0
Added
- Added Shading Type 1 (function-based) rendering: the visible portion of the domain rectangle is subdivided by a colour-error-driven quadtree and each leaf cell is painted as two gradient triangles with vertex colours sampled from the 2-input function, replacing the previous "not sampled" fallback diagnostic
- Added lenient 2-input function evaluation: a function that only declares one input degrades to
f(x)(constant in the second domain coordinate) instead of failing, so sampled and exponential functions behind a Type 1 shading still paint
Version 2.592.0
Added
- Added object-stream quarantine: a corrupt
/Type /ObjStmcontainer is recorded with a reason (THPDFObjStmQuarantineReason: not a stream, bad dictionary, bad header, bad stream size, decrypt failed, decompress failed,/Firstout of range, header unparsable, or container exception), a diagnostic line, and the member object numbers it left unresolved, while independent containers keep loading - Added member-level quarantine (
osqrMemberUnparsable): a member body that fails to parse out of a successfully decoded container is recorded once without affecting its siblings, andGetLoadedQuarantinedObjStmCount/GetLoadedQuarantinedObjStmInfoexpose every record; quarantine records survive the recovery retries of one load, deduplicate per container, and clear on the next load entry