Skip to content

FreePDF 7.4.1

Choose a tag to compare

@christianz christianz released this 04 Nov 10:20
31254c1

FreePDF 7.4.1

FreePDF 7.4.1 fixes signing and filling signed forms in Append mode, which
7.4.0 introduced, and opens encrypted files that have incremental updates.
Nothing else changes from 7.4.0.

Packages

dotnet add package io7.FreePDF --version 7.4.1
dotnet add package io7.FreePDF.Layout --version 7.4.1

Fixed

  • Signatures broken by inherited page values. Opening a document copies the
    /Resources, /MediaBox, /CropBox and /Rotate a page inherits from the
    page tree onto the page. When an Append-mode update wrote such a page, for
    example to add a signature or a comment, it wrote those copies too. The page's
    keys changed, and pyHanko judged the earlier signatures invalid. The update
    now leaves out unchanged copies; values the application changes are still
    written. Files from Ghostscript, xelatex and others put these values on the
    page tree: 15 of 2,950 corpus files were affected.
  • Signed forms with combo boxes and list boxes. Selecting an option of a
    combo box or a single-selection list box added the selected index (/I),
    which ISO 32000-1 says should not be used for such fields. The field's keys
    changed, and pyHanko judged a signature on the form invalid after the fill.
    /I is now written only for multiple selection, when options share an export
    value, or when the field already has one.
  • Encrypted files with incremental updates. An encrypted PDF whose update
    names the encryption dictionary again, as Acrobat and pyHanko write it (a
    signed encrypted PDF, for example), could not be opened in Import or
    Modify mode (InvalidOperationException).
  • Signature appearance not printed. A new signature field's widget had the
    flags Print and Locked in /Ff (field flags) instead of /F (annotation
    flags), so its appearance did not print.
  • Bookmarks with both /Dest and /A. Saving added a /Dest to every
    bookmark that leads to its page through a GoTo action, which ISO 32000-1
    forbids: 948 bookmarks in 264 of 2,950 corpus files. A bookmark now keeps its
    action while its destination is unchanged; a new or changed destination
    replaces the action with a /Dest, and an action the application sets is kept.
  • Drawing on a page whose inherited /Resources is a direct dictionary threw
    NullReferenceException in Modify and Append mode.

Upgrading from 7.4.0

Update all FreePDF packages to 7.4.1 together and rebuild; the assembly version
is now 7.4.1.0. The public API is unchanged. Behaviour changes to check:

  • Single-selection choice fields no longer get /I when an option is selected.
  • A bookmark whose destination you change, or that you give a new
    DestinationPage, loses its action (/A) in favour of a /Dest; a bookmark
    with an action you set yourself gets no /Dest.

Validation

All 7.4.0 release gates apply, plus:

  • regression tests for each fix (bookmark actions, inherited page values in flat
    and nested page trees, choice-field indices, signature widget flags, encrypted
    files with updates using RC4-128, AES-128 and AES-256); 494 regression
    tests in all;
  • pyHanko 0.29.1: a pyHanko-signed file whose page inherits its values,
    countersigned by FreePDF, keeps both signatures VALID ("signing and form
    filling"); filling a combo box and a list box in a form pyHanko certified is
    "signing and form filling", VALID; a pyHanko-encrypted and signed form opens;
  • corpus of 2,950 files: no bookmark gets both entries and none leads to another
    page; no updated page gains inherited keys (checked with pyHanko's revision
    reader); the 13 encrypted files open as before;
  • an independent review of each fix, whose findings were fixed before release;
    of the review's 77 encrypted samples, every one whose updates name the
    encryption dictionary (pyHanko AES and RC4 with tables, streams and object
    streams, up to three updates, and hand-made cases) opens with the right
    content; deliberately damaged ones fail as in 7.4.0, and an update that leaves
    /Encrypt out of its trailer reads as unencrypted, as in mutool and poppler.

The attached packages are the verified CI artifacts from source revision 31254c1d9e32ec0d657d4ed729da1dad8a44daf9, and the same files that were
uploaded to NuGet.org. SHA256SUMS and validation.json record their hashes and package-install evidence.
NuGet.org adds its repository signature, so a package downloaded from NuGet.org has a different hash from the attached file.

CI: https://github.com/io7/FreePDF/actions/runs/41811189504 (core),
https://github.com/io7/FreePDF/actions/runs/41811189563 (packages/API/independent checks),
https://github.com/io7/FreePDF/actions/runs/41811189668 (comparisons),
https://github.com/io7/FreePDF/actions/runs/41812552650 (NuGet publication).