Commit Graph
4320 Commits
Author SHA1 Message Date
jonathanwxh-cell 87e68246c8 style(render): rustfmt CropBox condition (#2838) 2026-10-18 22:43:01 +08:00
PerchAnton 57c5dde167 M7: preserve rotation and index regressions on current main 2026-10-18 17:39:44 +03:00
jonathanwxh-cell c6bf3d0dbd fix(render): avoid emitting full ActualText replacement when span is partially cropped (#2838) 2026-10-18 22:39:15 +08:00
alehelandClaude Opus 5.5 23ed4cca65 M3: All tools view keeps Escape for dialogs, leaves with the mode option, and searches Arabic
Review follow-ups for the expanded All tools view:

- Escape closed the view even when a dialog or prompt over it owned the key.
  It now checks modal_open() first.
- set_option("mode", …) changed workspace without clearing the view, so
  leaving and coming back to All tools reopened it. Another workspace now puts
  it away, as switch_mode does.
- Right-to-left translations are stored in display order, so a multi-word
  Arabic query typed in logical order missed its tool. Such a query now matches
  word by word, as the command palette's search does.

Each test was seen to fail with its fix reverted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 16:33:12 +02:00
PerchAnton e45a1db89f M1: reject partial resource-fork copies and integrate current main 2026-10-18 17:30:26 +03:00
alehelandClaude Opus 5.5 eca16e6bd5 fix(edit): backdrop copies keep the stream dictionary and every slot
Review of #2815 (CodeRabbit):

- A content stream whose bytes live in an external file (`/F`) draws
  those, not its inline bytes, so it is never taken for a backdrop.
- The copy keeps the original stream dictionary, unknown entries
  included, less `Length` and `DL` (Flate re-encodes it); it had started
  from an empty dictionary.
- Every `/Contents` slot that lists the original stream gets the copy: a
  page listing the same stream twice painted the white fill again over
  the background.
- The Background dialog starts with replacing on each time it opens.
  Update restores backdrops before re-applying, so a replaced page shows
  no fill and no checkbox, and a choice left off from an earlier dialog
  hid the background again unseen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 16:24:14 +02:00
aiongg b6b02a1b27 Merge upstream main 1952a8880 into next
ROADMAP.md, docs/roadmap.md: union of both sides' lines, each once.
parity/acrobat-features.toml: the XFA entry has both sides' evidence and notes (#2604 page areas, #2813 CLI layout).
2026-10-18 14:22:30 +00:00
jonathanwxh-cell b2727ac15b M2: refresh footnote reference line selection against current main (#2960) 2026-10-18 22:22:19 +08:00
jonathanwxh-cell 76d1bea652 M2: refresh CropBox text clipping against current main (#2838) 2026-10-18 22:17:35 +08:00
alehel 522c1dcd22 Merge remote-tracking branch 'origin/main' into feat/all-tools-expand-view
# Conflicts:
#	ATTRIBUTION.toml
2026-10-18 16:17:28 +02:00
PerchAnton 6425df5038 M12: reconcile current accessibility and XFA roadmap status 2026-10-18 17:15:06 +03:00
jonathanwxh-cell 6c611edc61 M2: refresh clip-mode text extraction against current main (#3116) 2026-10-18 22:14:54 +08:00
PerchAnton 02fe96c528 M12: reconcile current accessibility and XFA roadmap status 2026-10-18 17:14:42 +03:00
PerchAnton d743760624 M12: reconcile current accessibility and XFA roadmap status 2026-10-18 17:14:18 +03:00
mtlcl410andClaude Opus 5.5 4899072089 fix(forms): read dynamicRender only from the configuration packet itself (#3180)
Review follow-up: in a whole-XDP stream, a config/acrobat/acrobat7/
dynamicRender path inside xfa:datasets/xfa:data came before the real
config packet and decided the form type. The lookup now follows direct
children only: the config child of the xdp root (or the config packet
itself), then acrobat, acrobat7 and dynamicRender.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Gv2WwdgjmBz33GWkwgNn3Q
2026-10-18 22:14:02 +08:00
PerchAnton 2493253821 M12: reconcile current accessibility and XFA roadmap status 2026-10-18 17:13:59 +03:00
alehel 911147126c Merge remote-tracking branch 'origin/main' into fix/background-hidden-by-page-backdrop
# Conflicts:
#	ATTRIBUTION.toml
2026-10-18 16:05:19 +02:00
Ozt-y 4945677717 fix(content): restrict '>EI' terminator detection to ASCIIHex filter 2026-10-18 19:32:09 +05:30
jonathanwxh-cell ff5a2fc9eb M2: retain clipping text in filtered extraction (#3116) 2026-10-18 22:00:21 +08:00
jonathanwxh-cell 3c94700447 M11: document partial PDF version compatibility (#3227) 2026-10-18 21:54:58 +08:00
1952a88801 fix(cli): use laid-out pages for dynamic XFA forms (#2813)
Fixes #1645. For a dynamic XFA form, `info` reported the placeholder
page and field counts, and `text` and `render` read the placeholder
pages, while the app and the automation tools lay the template out.

The CLI now opens dynamic XFA forms through the engine session and uses
its laid-out document for page and field metadata, text and pixels.
`info` keeps the input's file size and also reports the original counts
as `pdf_pages` and `acroform_fields`; `text` checks the copy permission
before extracting. The input file is never written.

Checks run (rustc 1.99.0): cargo fmt --check; cargo clippy -p
pdfcraft-cli --all-targets -- -D warnings; cargo test -p pdfcraft-cli;
cargo xtask layers; cargo xtask assets.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-18 09:54:00 -04:00
6525140955 M3: type an exact zoom into the rail's zoom field (#1755)
* M3: type an exact zoom into the rail's zoom field

The rail's zoom percentage was a read-only label. It is now a text field:
Enter applies a typed percentage (150, 150%, 62.5 %), Escape or unparsable
input keeps the current zoom. The control channel's zoom option uses the
same parser.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* M3: document parse_zoom_percent

* i18n: Vietnamese for the zoom field's tooltip

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-18 09:53:24 -04:00
Marco ArnulfoandBrandon Thomas b68b3c1119 M3: the Pages panel follows the current page (#2785)
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-18 09:52:40 -04:00
2c4989413f M7: the Edit text caret is as tall as the row it is on (#2462)
In a region that mixes sizes (a 24 pt title over 12 pt lines), the
inline editor's caret on a small row was as tall as the region's first
size and reached into the row below. egui draws the caret at least one
row of the TextEdit's font tall, and that font had the paragraph's first
size. Each row already carries its source row's height, so the
TextEdit's font is now half the region's smallest size and only sets
that floor.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-18 09:51:52 -04:00
Andrew BarnesandBrandon Thomas 6ce3bc198b fix(gpu): request adapter-supported device limits (#2383) (#2433)
Clamp the surface device descriptor to the adapter's capabilities while
preserving its maximum 2D texture extent. Cover V3D shader variables,
lower GL capabilities, alignment ordering and capable-device defaults.

Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-18 09:50:42 -04:00
Ian HollowayandBrandon Thomas 1581cd1edd M10: keep the OCR scan fixture at its original page size (#2399)
Assisted-by: GPT-6

Signed-off-by: IanHollow <72767437+IanHollow@users.noreply.github.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-18 09:50:16 -04:00
a50ddd4de1 fix(i18n): zh-hant catalog uses Taiwan vocabulary consistently (#2856)
Several entries carried mainland-Chinese computing terms in a catalog
written in the vocabulary used in Taiwan:

- 丟失 → 遺失 (unsaved-changes warning)
- 郵政編碼 → 郵遞區號 (Zip Code field formats)
- 自簽名 → 自我簽署 (self-signed digital IDs, three entries)
- 灰度 → 灰階 (Grayscale Images, Print in grayscale; the rest of the
  file already used 灰階)
- 匹配 → 相符 (ten search/match entries; 符合 stays for the
  fit/conform sense: 符合頁面, 符合 PDF/A)

Translation column only — source keys, placeholders and ellipses
unchanged. ATTRIBUTION.toml hash re-pinned.

Generated with [Devin](https://devin.ai)

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-18 09:49:36 -04:00
2eb1639097 Find credit card numbers followed by an expiry, year or CVV (#2969)
* Find credit card numbers followed by an expiry, year or CVV

Found while testing crates/redact/src/patterns.rs:180-190 (credit_card, via digit_run at :53)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Redact: a card followed by a number drops at most four trailing digits

A longer grouped number (an IBAN's digits) no longer matches on a Luhn-valid prefix; the run is
read far enough to see the tail and refused when it goes on past that.

---------

Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-18 09:49:13 -04:00
MarekSpodBiedryandBrandon Thomas 25495b959b Keep a subscript or superscript in its line when extracting text (#3174) (#3244)
* Keep a subscript or superscript in its line when extracting text (#3174)

* Text extraction: only a glyph right beside the previous one gets the sub/superscript centre limit

A large negative gap (a small glyph drawn back under a large one) kept the wider limit.

---------

Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-18 09:48:49 -04:00
mtlcl410andClaude Opus 5.5 2bd6d1357d M5: flattening comments leaves 3D, multimedia and print-production annotations (#3087) (#3089)
doc_flatten with comments chose every non-widget annotation except Link
and Popup, so a comments-only flatten baked in and deleted 3D, Screen,
Movie, RichMedia, PrinterMark, TrapNet and Watermark annotations with
their data (a 3D annotation's U3D model and default view). The comments
branch now uses pdfcraft_annot::is_comment_subtype, the classifier the
comment list uses; widgets follow `fields` only.


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

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 09:48:26 -04:00
mtlcl410andClaude Opus 5.5 f0c275669a M7: never encode typed text with CID 0 (#3223) (#3235)
Word's Type 0 subsets map CID 0 (.notdef) as well as the real space glyph
to U+0020 in ToUnicode and list a width for CID 0. encode keeps the lowest
code for each character, so an edited line wrote every space as <0000> and
drew a box where each space was. CID 0 is .notdef whatever ToUnicode says,
so has_glyph now refuses it and the space takes the real CID.


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

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 09:48:14 -04:00
NetterSilverandClaude Haiku 5.5 7e3f413f52 Redact email addresses whose local part starts with punctuation (#2948)
Found while testing crates/redact/src/patterns.rs:141-146 (email)

Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-18 09:48:02 -04:00
PerchAnton 1946bcdab6 M12: keep roadmap status blockquotes valid 2026-10-18 16:44:19 +03:00
PerchAnton 607354ffd2 M12: keep roadmap status blockquotes valid 2026-10-18 16:43:55 +03:00
PerchAnton bf542a7676 M12: keep roadmap status blockquotes valid 2026-10-18 16:43:30 +03:00
PerchAnton 85e6d33073 M12: keep roadmap status blockquotes valid 2026-10-18 16:43:06 +03:00
PerchAnton 2d97486757 M7: keep roadmap status blockquotes valid 2026-10-18 16:42:17 +03:00
PerchAnton 34e4aac28e M1: keep roadmap status blockquotes valid 2026-10-18 16:41:32 +03:00
PerchAnton eb85314b5b M7: keep roadmap status blockquotes valid 2026-10-18 16:41:08 +03:00
Ozt-y d1b0293a5d fix(content): accept inline image EI without preceding whitespace (#3108) 2026-10-18 19:05:46 +05:30
Claude a30a0ab713 G14: Romanian (ro) interface catalog
Add a clean-room Romanian translation of the UI catalog (2,670 entries,
every bundled key), the CLDR plural rule for Romanian (one / few /
other, "20 de pagini"), the ATTRIBUTION.toml entry, coverage and plural
tests, and the localization docs and roadmap entries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JadgGo4G2GHaAMNb3qyygk
2026-10-18 16:27:09 +03:00
PerchAnton 68c9bb6d22 M12: retain product notes while integrating current main 2026-10-18 16:13:21 +03:00
aiongg ce57fc1fcf Merge PR #2688 (new head 089778978)
crates/xfdf/README.md, parity/acrobat-features.toml: next's text, which has the same sentences without the formula-cell one the #2688 integration fix removed.
crates/xfdf/src/tests.rs: the XML comments test once, where next has it.
ROADMAP.md, docs/roadmap.md: union of both sides' lines, each once.
2026-10-18 13:13:12 +00:00
aiongg 68f0be91df Merge PR #2604 (new head db1102185)
ROADMAP.md : union of both sides' lines, each once.
2026-10-18 13:12:45 +00:00
aiongg fb8ad60471 Merge PR #2558 (new head 958914e72) 2026-10-18 13:12:45 +00:00
aiongg c24bdd29f1 Merge PR #1919 (new head a694e5dbb)
ROADMAP.md, docs/roadmap.md: union of both sides' lines, each once.
2026-10-18 13:12:45 +00:00
aiongg 7f718ecc62 Merge upstream main 50f261d70 into next
ROADMAP.md, docs/roadmap.md: union of both sides' log lines and milestone rows, each line once.
parity/acrobat-features.toml, crates/xfdf/README.md: next's text, a superset of main's (#1917, #2686 plus #2688).
crates/edit/src/tests.rs: both sides' new tests (#2558 and #3084).
crates/ui-egui/src/editing.rs: the picked picture is cleared on every edit, and a new drawing commits its raster (#3149).
2026-10-18 13:12:21 +00:00
PerchAnton 52cdb9260c M12: retain product notes while integrating current main 2026-10-18 16:09:57 +03:00
PerchAnton f9b8284819 M12: retain product notes while integrating current main 2026-10-18 16:05:46 +03:00
PerchAnton be6a66dd79 M12: retain product notes while integrating current main 2026-10-18 16:00:08 +03:00