Commit Graph
4058 Commits
Author SHA1 Message Date
aiongg d77066be2b Merge PR #2577: M7: rewrap a paragraph at a slant at the width its rows have 2026-10-16 14:02:18 +00:00
aiongg 28942c4c7d Merge PR #2558: fix(edit): emit rewritten paragraph after backgrounds between its rows (#2377) 2026-10-16 14:02:18 +00:00
aiongg 6ad30957c3 Merge PR #2590: fix(edit): keep overlapping watermarks and distinct paragraphs on text edit (#1756) 2026-10-16 14:02:17 +00:00
aiongg 62f3375297 Merge PR #2594: M7: write a full font program compressed and find it again on any page 2026-10-16 14:02:17 +00:00
aiongg 5406355729 Integration: #2681 make the self-reply assertion able to fail 2026-10-16 14:02:13 +00:00
aiongg dfcb844340 Merge PR #2794: Fix wrapped revision buttons overlapping Binding 2026-10-16 14:02:10 +00:00
aiongg bb695240f0 Merge PR #2525: fix(cos): an incremental save of a file with bytes before its header counts from the header 2026-10-16 14:02:08 +00:00
aiongg 9477e2a3fd Merge PR #2793: M10: preserve component Decode in lossless image export 2026-10-16 14:02:08 +00:00
aiongg 405ad489c2 Merge PR #2681: Replace Text: give the caret its own /NM (#2666) 2026-10-16 14:02:08 +00:00
aiongg eb403f84ec Merge PR #2702: Remove security also from files with /Encrypt inline in the trailer 2026-10-16 14:02:08 +00:00
aiongg fae7f4451c Merge PR #2532: fix(redact): removed links and comments leave the structure tree too (#2447) 2026-10-16 14:02:08 +00:00
aiongg c2a634ec4c Merge PR #2816: M10: running text is not a table row in Word, HTML and PowerPoint export (#2806) 2026-10-16 14:02:08 +00:00
aiongg a17794f170 Merge PR #2698: M8: the redaction audit finds a cover over one word of a long line (#2662) 2026-10-16 14:02:08 +00:00
aiongg 5ed4b67bab Merge PR #2754: Keep leading spaces and tabs when wrapping plain text into a PDF 2026-10-16 14:02:08 +00:00
aiongg 8c5074b982 Merge PR #2600: Shorten over-long part file names in doc_split by bookmarks 2026-10-16 14:02:08 +00:00
aiongg 0b68d0e3c6 Merge PR #2679: fix(annot): percent-encode non-ASCII bytes written into link /URI 2026-10-16 14:02:08 +00:00
aiongg e902b975fa Merge PR #2678: Round FormCalc Str and Format exact ties away from zero 2026-10-16 14:02:07 +00:00
aiongg 624e6343fb Merge PR #2587: M3: single-page view turns pages without a blank frame 2026-10-16 14:02:07 +00:00
aiongg 938d171652 Merge PR #2730: M3: closing PdfCraft while minimized no longer saves a 0 x 0 window 2026-10-16 14:02:07 +00:00
aiongg c859bf2aac Merge PR #2602: Don't treat a date ending in "Sep" as PM in AFDate/AFTime parsing 2026-10-16 14:02:07 +00:00
aiongg ca443792d3 Merge PR #2810: fix(select): a picked picture that is edited away no longer leaves its highlight behind 2026-10-16 14:02:07 +00:00
aiongg d3ca9ea7aa Merge PR #2606: M14: no PdfCraft lion over PDF thumbnails and the preview pane 2026-10-16 14:02:07 +00:00
aiongg 77f2b295cc Merge PR #2687: fix(inspect): report /OpenAction JavaScript in document info 2026-10-16 14:02:07 +00:00
aiongg 17b7effd6f Merge PR #2704: M3: ⌘G and ⇧⌘G step through matches from the find field (#2669) 2026-10-16 14:02:07 +00:00
aiongg cc898fc382 Merge PR #2601: Web: host mode needs a parent page on the same origin 2026-10-16 14:02:07 +00:00
aiongg 3eaff53a94 Merge PR #2642: Let the page range select page 1 alone 2026-10-16 14:02:07 +00:00
aiongg 2b3bbd0690 Merge PR #2625: fix(ui): Reveal in File Explorer selects files whose path has a space (#2579) 2026-10-16 14:02:07 +00:00
aiongg e947aa6754 Merge PR #2757: fix(ui): Save asks where to keep an Apple Mail attachment 2026-10-16 14:02:07 +00:00
Guillem Hermida cdb1010f40 fix(edit): a paragraph's width handle rewraps it from its whole handle, not just the inner half (#2276)
In Edit text & images, a paragraph's width handle is drawn centred on its
box's edge, and the edge grabs from up to 6 px outside the box. Object
selection sees a press first, though, and handed it to the paragraph tool only
on the box itself. A press on the outer half of the handle started an area
selection instead: its rectangle followed the pointer like a resized frame,
and on release the paragraph kept its old width and the text never moved.

Object selection now also leaves a press on a closed paragraph's edge grip to
the paragraph tool, through edit_text_ui::grabs_edge. That uses the same edge
test, box and upright-page rule as the tool itself, so the two can't drift
apart. The rewrap is the existing EditTextBlock with a width, so undo, redo
and save are unchanged.

Fixes #2276
2026-10-16 15:59:12 +02:00
mixlnwuu 299af11786 i18n(th): translate the 80 strings added upstream since 0.8.0
Word count, untagged content, image crop, print as image, signature labels, full screen prompt and the other new interface strings. th.tsv now covers every key any bundled catalog translates (2,672).
2026-10-16 20:10:21 +07:00
jonathanwxh-cellandGuillem Hermida cba63a26e4 M3: wait for OS-open preparation before removing its fixture
The open worker can still be reading after the harness's four startup frames.
Removing the synthetic file then asserted zero tabs before opening completed.
A fixture-specific 300 ms delay reproduced the exact ui.rs:843 failure on
644f7ab6; waiting by state passes under the same delay. Keep the file until
its tab opens, retaining the one-tab, filename and OS-quit assertions.
The diagnostic delay is removed. CropBox production code is unchanged.

Narrowly adapted from Guillem Hermida's OS-event test repair in upstream
https://github.com/storytold/pdfcraft/pull/2812 at
47e5398b6b (MIT OR Apache-2.0).
No other changes from that PR are included.

Validation: controlled red/green; final UI suite 52 passed, zero ignored;
CropBox render regression passed with its fully qualified exact test name;
strict UI Clippy all targets, formatting, layers, assets and wasm (31 crates).
The CLI CropBox acceptance test will also be verified in automatic exact-head CI.

Co-authored-by: Guillem Hermida <guillemhr2@gmail.com>
2026-10-16 20:29:42 +08:00
mixlnwuu d5bbf60efe i18n: add Thai (th) interface language
A clean-room Thai catalog covering every key the bundled catalogs translate, its LANGUAGES row (one plural form) and Thai month and weekday names in DATE_LANGUAGES.
2026-10-16 19:22:00 +07:00
midasmatterhorn 1cb113f110 Audit: find opaque square annotations over text 2026-10-16 15:18:39 +03:00
midasmatterhorn 4f0493cc21 organize: split a combined field/widget so every copied page owns its widget 2026-10-16 15:05:53 +03:00
mtlcl410andClaude Opus 5.5 942be18504 parity: form.fill-sign-date has 14 presets now
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RUNQSPVXx3dDBabRZHAnjz
2026-10-16 19:20:48 +08:00
mtlcl410andClaude Opus 5.5 b97e59190f M5: year-first slash dates (yyyy/mm/dd, yyyy/m/d) for Fill & Sign and headers
Taiwan, Japan and China write dates year first with slashes (Windows'
zh-TW short date is yyyy/M/d), and neither the Fill & Sign presets nor
the header and footer date tokens offered it. Both now have yyyy/mm/dd
and yyyy/m/d. The header and footer list gains them at its end, since
its selection is an index.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RUNQSPVXx3dDBabRZHAnjz
2026-10-16 19:20:48 +08:00
mtlcl410andClaude Opus 5.5 30c174be9e M3: closing PdfCraft while minimized no longer saves a 0 x 0 window
eframe stores the window's size and place just before App::save. A
minimized window has none: Windows reports 0 x 0 at (-32000, -32000),
and the next start opened at egui's 64-point floor in the screen's
corner (seen on a 6K display at 225%: a 144 x 206 px window). While the
window is minimized the app now puts back the last settings it was
shown with (or none), and a window that opens at that floor from
settings saved before this fix is given a usable size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RUNQSPVXx3dDBabRZHAnjz
2026-10-16 19:20:47 +08:00
boneylandandClaude Opus 5.5 bf2eb470ed M6: detected form fields get no border or fill
Prepare a form ▸ Detect form fields places each field on a line or box the
page already draws, but every new widget got a grey /MK /BC and an opaque
white /MK /BG, so the fill hid the printed form underneath. Detected fields
now clear both in the same undoable step; fields drawn by hand keep the
defaults.

Refs #294, #2831.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 18:59:09 +08:00
jonathanwxh-cell 644f7ab685 fix(render): clip extracted text to the page CropBox (#2670) 2026-10-16 18:51:55 +08:00
hade0ntemaandClaude Sonnet 5.5 37a9346629 fix(select): clear the picked picture in the edit itself, not on the next frame
The first fix dropped a stale pick while painting the next frame. The window only redraws on
the next input, so after deleting a picture in Edit text & images its highlight stayed on screen
until the user clicked. Clear the pick in apply_edit, in the same step as the edit, and ask for a
repaint. drop_stale stays for the paths that change the document without apply_edit (Undo, Redo).

An edit-level test checks the pick right after apply_edit with no frame in between; it fails
without the change. The earlier one-frame test could not tell, the test harness redraws more
often than the app does.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 11:49:06 +02:00
mtlcl410andClaude Opus 5.5 96478f325d fix(ui): test that the Explorer argument reaches the process as written (#2579)
Review of #2625: the test checked the argument reveal_command builds but
not how it is passed, so it still passed with raw_arg replaced by args.
The process is now built by reveal_process, and a Windows test runs it
on `cmd /c echo`, which prints its command line back: with Rust's own
quoting the argument comes back wrapped in quotes with the inner ones
escaped, and the test fails.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RUNQSPVXx3dDBabRZHAnjz
2026-10-16 17:40:55 +08:00
alehelandClaude Opus 5.5 93df949e3e fix(assets): refresh the catalogue hashes for the backdrop translations
The 22 interface catalogues are registered assets; adding the Add
Background strings changed their SHA-256. Provenance is unchanged
(contributor-original translations).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 11:40:07 +02:00
alehelandClaude Opus 5.5 b5d34d439f fix(ui): translate the Add Background backdrop messages
The six new dialog strings (the backdrop offer, its note, the scan
warning and "Checking pages…") were missing from every catalogue, which
the *_covers_ui_literals tests require. Languages with several plural
forms use the "label: {n}" pattern so any count reads correctly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 11:14:10 +02:00
mtlcl410andClaude Opus 5.5 f9db1e31fd M10: running text is not a table row in Word, HTML and PowerPoint export (#2806)
Table detection took a sentence whose link was set in another colour
and font, split into blocks that run on into each other, for two table
columns, and took a paragraph's lines, whose box overlaps the line
before, for a cell beside it. The table it built put the paragraph's
first line in one cell, a fragment of the link in another, and dropped
the paragraph's later lines. A block that starts where another on the
same line ends now adds no column of its own, and a row whose cells
overlap is not a table row; a superscript beside a number stays in its
table.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RUNQSPVXx3dDBabRZHAnjz
2026-10-16 16:47:49 +08:00
alehelandClaude Opus 5.5 a9b0db12c6 fix(edit): show backgrounds on pages that paint their own white backdrop
Add Background draws behind the page content, so on a page that first
fills itself with opaque white (browsers' Save as PDF, print drivers) the
background was hidden completely and the tool looked broken.

- pdfcraft-edit: new `backdrop` module. A strictly detected backdrop (one
  axis-aligned `re`, opaque white in a device colour space, painted before
  anything else and covering the crop box) is replaced by turning that one
  fill into `n` in a per-page copy of its stream; the original stream is
  left untouched for other pages. Remove background restores it, unless
  the copy was edited since. Page-sized pictures (scans) are reported only.
- Background gains `replace_backdrop` (default on); the default colour is
  a visible light yellow instead of near-white.
- Dialog: offers to replace the backdrop, warns about scanned pages,
  checks pages a few per frame, preview draws text over the colour.
- Automation: `doc_background` takes `replace_backdrop`; new read-only
  `doc_backdrops` lists pages with a backdrop.

Acrobat's behaviour on such pages is unobserved; recorded as our choice
in parity/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 10:46:02 +02:00
hade0ntemaandClaude Sonnet 5.5 da48b84b8c fix(select): a picked picture that is edited away no longer leaves its highlight behind
With the Select tool a click picks a picture and draws a blue highlight over it. The pick was
only cleared by Escape, a drag or another click. Picking a picture, then entering Edit text &
images and deleting it left the highlight on the empty spot, with nothing left to click to
remove it.

The pick now remembers the document's edit generation and is dropped once the document has been
edited since (a delete, a move, Undo), the same condition under which the copy shortcut already
refused it as stale.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-16 10:33:24 +02:00
Enrico SitaandClaude Opus 5.5 c66384f92b fix(ui): Read mode hides the quick toolbar (#2646)
Read mode hides the tools, not the navigation panes, as Acrobat's does
and as switch_mode already says, but the floating quick toolbar was
still drawn over the page there. It is now hidden in Read mode, and
entering Read mode puts the current tool down (back to Select), so no
markup tool stays active without a toolbar to show it. The right rail,
the page navigation and the V/H shortcuts are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 10:27:59 +02:00
Ahmad Mujahid 4f3f2fe1d2 M5: batch Comments panel thread and page lookups (#2669) 2026-10-16 12:03:40 +04:00
Enrico SitaandClaude Opus 5.5 26051871d0 M11: remove PDF/A or PDF/X identification (optimize.remove-standards-id)
A file edited after it was made PDF/A or PDF/X can keep claiming a
standard it no longer meets. organize::remove_standard_id removes the
claim: the pdfaid: XMP properties for PDF/A, or GTS_PDFXVersion and
GTS_PDFXConformance in the document information and as pdfxid: XMP
properties for PDF/X. Output intents and other claims (PDF/UA) stay.

The XMP is edited with the packet editor Document Properties already
uses (sync_info and the new remove_properties share its read and write),
so the rest of the packet stays byte for byte and unsafe packets are left
alone. It is one undoable edit, in Standards ▸ PDF/A as a button worded
like its undo label, and the standards_remove_id tool (pdfa or pdfx).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 09:45:31 +02:00
Ahmad Mujahid e447749109 Fix wrapped revision controls overlapping Binding (#2739) 2026-10-16 11:22:54 +04:00