Commit Graph
4730 Commits
Author SHA1 Message Date
oracola91 72311bc101 Signature validation takes the certification from the catalog (#6453) 2026-11-09 08:50:39 +08:00
mtlcl410 38ba2e7495 M5: a font a page lists among its annotations is not a comment (comment.list-view) (#6447) 2026-11-09 08:50:25 +08:00
mtlcl410 e83c200598 M6: a field whose /Kids loop back or name a root field keeps its other kids (form.field-list) (#6446) 2026-11-09 08:50:11 +08:00
mtlcl410 608ff62dae M6: a widget whose /Parent names a missing object is a field of its own (form.field-list) (#6445) 2026-11-09 08:49:56 +08:00
mtlcl410 de7ed00a1a M3: End shows the end of the document, the last page down to its bottom (view.page-navigation) (#6435) 2026-11-09 08:49:35 +08:00
mtlcl410 94bdfea62b M7: a click away from a picture being cropped applies the crop (edit.image-crop) (#6428) 2026-11-09 08:49:20 +08:00
Ken Mantle 218c2bb21f M12: headless orbit navigation for 3D models (#6406) 2026-11-09 08:48:58 +08:00
mtlcl410 e6b6216fd9 M1: a V4 RC4 file with a 40- or 48-bit key reads and saves (#6397) (#6398) 2026-11-09 08:48:43 +08:00
mtlcl410 1a28606c64 M10: a layer the document marks screen-only stays off the printed sheet (print.print-ready-pdf) (#6387) 2026-11-09 08:48:28 +08:00
BFlat 53eec5cd24 Merge pull request #6502 from mtlcl410/fix/sign-string-bytes-not-spelling
M9: a signed string respelled in hexadecimal is no change after signing (sign.changes-after-signing)
2026-11-09 08:48:07 +08:00
quincy-jc 0b9c7fb821 fix(canvas): find a page's pictures off the window thread (#6228) 2026-11-09 08:47:47 +08:00
quincy-jc 0bfcc8024e fix(canvas): release closed panels' thumbnails while a visible page renders (#6227) 2026-11-09 08:47:32 +08:00
Mex dec32d0501 M8: use AuditFinding in the audit README example (#6204) 2026-11-09 08:46:51 +08:00
Mex 0dbcf0b7a4 M1: define the Info object in the testkit README example (#6191) 2026-11-09 08:46:23 +08:00
Mex 2e524566d6 M5: document implemented annotation builders and rich text (#6189) 2026-11-09 08:46:09 +08:00
Raj Patel 6fda5d142b M1.10: richer synthetic seeds for the mutation fuzzer (#6186) 2026-11-09 08:45:55 +08:00
art804 0d22662c38 Windows: shortcuts take pdfcraft.exe's icon, so a taskbar pin keeps it (#6184) 2026-11-09 08:45:40 +08:00
Mex a50bc63292 M1: correct the COS object reference API example (#6183) 2026-11-09 08:45:25 +08:00
mtlcl410 0a029f0aad M12: floating fields show the values scripts give them, and the sheet number and count (#6160) (#6166) 2026-11-09 08:45:03 +08:00
Fatih Kunak 2ef2e2b822 fix(fonts): a subset that gives the space no width can't encode one (#6131) (#6158) 2026-11-09 08:44:48 +08:00
jonathanwxh-cell 5ee4a85876 fix(sign): merge CMS unsignedAttrs into one SET and validate SignerIdentifier (#6137) 2026-11-09 08:44:34 +08:00
jonathanwxh-cell 5d3f3a2e42 fix(export): skip empty Markdown runs before merging and emphasis lookahead (#6134) 2026-11-09 08:44:20 +08:00
.CooCoo e877b0822a Scroll: a touch zoom keeps zooming after its keys are let go (#6130) 2026-11-09 08:44:04 +08:00
.CooCoo d22aab133c fix(ui): two-page continuous view prefetches whole rows ahead (#6126) 2026-11-09 08:43:49 +08:00
jonathanwxh-cell 19619ad2cc fix(js): decode FormCalc Unicode string escapes and preserve chained unary not/! (#6122) 2026-11-09 08:43:09 +08:00
jonathanwxh-cell 9b2c8d6026 fix(xfa): read and validate the first alternative in typed_date (#6120) 2026-11-09 08:42:54 +08:00
Harrison Booth 3b731f9458 Expose widget rectangles to field scripts (#6093) 2026-11-09 08:42:39 +08:00
Dylan M. Taylor 74e1e40e67 fix(a11y): heading titles decode their source strings within a shared allowance (#6049) 2026-11-09 08:42:24 +08:00
Dylan M. Taylor 9642ed6f87 fix(sign): read each existing DSS stream once and within a decoded-size allowance (#6040) 2026-11-09 08:42:09 +08:00
Harrison Booth 85cd33e9c6 Harden Bates sequence validation (#6003) 2026-11-09 08:41:38 +08:00
Dylan M. Taylor ee6ae8eac4 fix(engine): coalesce script resetForm requests and bound console output per edit (#5975) 2026-11-09 08:41:24 +08:00
Dylan M. Taylor afaaaa6415 fix(print): index page labels once and cap how many pages a range selects (#5967) 2026-11-09 08:41:04 +08:00
Dylan M. Taylor ae21773fef fix(edit): stop rescanning what a loop already holds in wrapping, grouping and flattening (#5963) 2026-11-09 08:40:50 +08:00
Dylan M. Taylor a55eaa90e3 fix(redact): prune the resources of Forms a surviving Type 3 glyph draws (#5924) 2026-11-09 08:40:35 +08:00
Dylan M. Taylor eaeffa748b fix(measure): charge snapping per filter stage and bound listing work (#5920) 2026-11-09 08:40:21 +08:00
Hasan N. ccbfa6d24a M14: localization parity counts every catalog with the i18n report (#5805) (#5894) 2026-11-09 08:40:07 +08:00
Dylan M. Taylor 87139acf2c fix(create): image export checks a JPEG's Extended XMP chunks before decoding it (#5860) 2026-11-09 08:39:52 +08:00
mtlcl410 359cef8b0d M12: an XFA page area keeps at most 128 content areas, so a subform split across them lays out within its budget (#5843) (#5844) 2026-11-09 08:39:31 +08:00
NetterSilver 67a6037be1 Keep the font size when making text box properties default (#5784) 2026-11-09 08:39:16 +08:00
mtlcl410 607f79e5e0 M3: a protected file named before others at launch keeps its password prompt (#5756) (#5762) 2026-11-09 08:39:01 +08:00
Hasan N. bf409db55c M3: pages shorter than the window sit in its middle (#5708) (#5759) 2026-11-09 08:38:40 +08:00
mtlcl410 6062cd6a44 M5: Replace Text keeps its replacement on the group's primary, the caret (comment.replace-text) (#5689) 2026-11-09 08:38:25 +08:00
mtlcl410 ee2398f710 M11: PDF/A verify checks that predefined XMP properties have their value types (optimize.pdfa-validate) (#6220) 2026-11-09 08:37:56 +08:00
jonathanwxh-cell 1f48670fce refactor(cos): consolidate duplicate civil_from_days onto pdfcraft_cos::civil_from_days (#6540)
Fixes #6466
2026-11-09 08:32:08 +08:00
jonathanwxh-cell ca21968e64 fix(js): decode ', numeric, and HTML named character references in FormCalc Decode (#6538)
* fix(js): decode ', numeric, and HTML named character references in FormCalc Decode

* test(js): verify all HTML named entities and 8-byte name boundary (#6464)

* docs(js): remove duplicate decode_entities summary and document LATIN1_ENTITIES order (#6464)
2026-11-09 08:31:54 +08:00
jonathanwxh-cell 90def111c9 fix(engine): map URL text line rects with view_rect_to_user and filter non-finite coordinates (#6536)
* fix(engine): map URL text line rects with view_rect_to_user and filter non-finite coordinates

* test(engine): assert concrete rotated user rects and overflow guards (#6469)
2026-11-09 08:31:41 +08:00
c02341f6c0 M2: a wide stroke of a path with y curves is drawn, not dropped (vello_common patch 4) (#6526)
A cubic whose second control point is its end point (as the `y` operator builds,
ISO 32000-2 8.5.2.1 Table 58) has a zero derivative at its end. kurbo 0.13.1's
offset curve looks for cusps with a root search on the curvature, which grows
without bound towards that end; at some widths the search stops on the end point
and normalising the zero tangent there gives NaN. vello_common's fill drops any
outline with NaN, so the whole stroke vanished (a two-curve `y` path drew nothing
at 16, 32 and 63 pt; a PDFBox tracker file lost its 32 pt "XX" outline).

The NaN fallback that #4913 added to `flatten::stroke` now also moves such a
control point the stroke tolerance towards the previous control point before
stroking again (the curve moves by at most 4/9 of the tolerance). Outlines that
come back finite take the old path unchanged. The vendor ledger row also gets
back #4913's entry, which a merge had dropped.


Claude-Session: https://claude.ai/code/session_01Pq7HyCHD1R3rywQBPCHXZA

Co-authored-by: mtlcl410 <chuanlin@niar.org.tw>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 08:31:00 +08:00
3ae9093d61 M2: info lists the repairs made while opening, as Document Properties does (misc.cli-inspect) (#6518)
* M2: `info` lists the repairs made while opening, as Document Properties does (misc.cli-inspect)

`pdfcraft-cli info` now prints a `repairs` array: the notes about damage
repaired while opening that the app shows in Document Properties and
doc_info reports. It opens the document as the app does, once (the session
the dynamic XFA summary already used), so notes the app adds after reading
the objects, such as a page tree rebuilt from the pages found by scanning,
are listed too. A file the app cannot open for editing falls back to what
reading its objects repaired; a sound file prints an empty array.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pq7HyDBXygTf7jcqdsjcfn

* M2: `info` runs none of the document's scripts while inspecting it (misc.cli-inspect)

The session `info` opens to read the app's repair notes and the dynamic XFA
layout now has JavaScript turned off, so an XFA form's initialize and
calculate scripts, which the app runs on opening, do not run during
inspection of an untrusted file. Before this branch the session was opened
for dynamic XFA forms only, and their scripts ran there too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pq7HyDBXygTf7jcqdsjcfn

* M2: `info` reads the standards and repairs from the session it opens, and a laid-out form keeps its repair notes (misc.cli-inspect)

`info` now takes the declared standards (`Document::standards`, as the
Standards panel reads them) and the repair notes from the session it
opened, and reads the file once more only when the app cannot open it.
When opening lays out a dynamic XFA form, or writes any other revision,
the notes about damage repaired while reading the file now stay with the
re-read document, so Document Properties and `info` both list them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pq7HyCHD1R3rywQBPCHXZA

---------

Co-authored-by: mtlcl410 <chuanlin@niar.org.tw>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 08:30:37 +08:00
42b21e5362 fix(render): a form XObject that draws itself is drawn once (hayro-interpret patch 89) (#6515)
* M2: a form XObject that draws itself is drawn once (hayro-interpret patch 89)

A form whose content names itself, directly or through another form, a
pattern or a glyph, drew itself again at every level until the page's
nested-paint budget (50,000) ran out. PDFBOX-5782's poppler-748 page 2,
whose form names a /Pages dictionary as /X0 and so finds itself in the
page's resources, took 38 s.

hayro-interpret now keeps the forms being drawn on the context and skips
a form already on it, reporting ContentTruncated (ISO 32000-2 §8.10.1: a
form is a self-contained description). The lenient fallback from a form's
own resources to the page's stays: MuPDF, Poppler and PDFium all draw a
name from the page's resources when the form's /Resources has no
XObject subdictionary (MuPDF and Poppler also when it has an empty one).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pq7HyDBXygTf7jcqdsjcfn

* fix(render): a form that reaches itself through a pattern or a glyph is drawn once (hayro-interpret patch 89)

The forms being drawn are now kept per page and thread rather than per
context, so the tiling patterns, Type 3 glyphs, soft masks and groups
painted inside a form, which hayro interprets in contexts of their own,
see that the form is being drawn and skip it inside themselves. A form
drawn again after it has finished draws as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pq7HyCHD1R3rywQBPCHXZA

* chore: re-run CI after the Fill & Sign save comparison failed on the clock (#6066)

`fill_sign_enter_adds_lines_outside_click_commits_and_escape_cancels`
compares two saves whose /ModDate fell in different seconds; it passes
locally on this commit. No change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pq7HyCHD1R3rywQBPCHXZA

---------

Co-authored-by: mtlcl410 <chuanlin@niar.org.tw>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 08:30:14 +08:00
9b231f241d perf(render): undo TIFF predictor 2 a byte row at a time at 8 and 16 bits (#6505)
TIFF predictor 2 (ISO 32000-2 §7.4.4.4, Table 10) went through the
bit-level BitChunks/BitWriter path for every bit depth, re-reading the
previous output pixel through a new BitReader per pixel. Whole-byte
samples (8 and 16 bits per component) are now undone on byte slices,
each sample added to the same component of the pixel to its left,
wrapping at its width; 1-, 2- and 4-bit samples keep the bit-level path.
The output is byte-identical, including the dropped partial last row.

A page of 45 full-page 8-bit grey images so predicted (PDFBOX-1350)
renders in about 4 s instead of 23 s with the same pixels.

Vendored hayro-syntax patch 42.


Claude-Session: https://claude.ai/code/session_01Pq7HyDBXygTf7jcqdsjcfn

Co-authored-by: mtlcl410 <chuanlin@niar.org.tw>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 08:29:44 +08:00