mirror of
https://github.com/storytold/pdfcraft.git
synced 2026-10-31 21:48:09 -06:00
The tag on a page's backdrop copy, `/PCBackdrop << /Original ref /At /Len >>`, kept the page's original content stream reachable. After Add background, then Redact (or Remove Hidden Information, or Edit text) and a full save, the text taken off the page was still in the file, in the original stream the tag pointed at. Text extraction didn't show it; reading the file's bytes did. Restore also gave up after any edit, so the fill stayed off without a word. The tag is now `/PCBackdrop << /Index n /Op (f) /Before <SHA-256> /Was [num gen] >>`: how many of the copy's operators come before the `n`, the fill it stands in for, a hash of those operators by value (redaction writes the stream out again with other spacing), and the original's number as two integers, which keep nothing alive. Remove background turns the fill back on in the copy when the operators before it still hash the same and a scan with the fill restored finds it painted first, covering the page. Edits and redactions after the fill are kept. When the original stream is still there with the same bytes, the page points at it again. Otherwise the copy stays as it is, and Remove background says which pages keep their own backdrop off: `EditNotice::BackdropsLeftOff` (engine), a toast in the app, `warnings` from `doc_remove_marks`. `edit_notices` holds `EditNotice` now, with the undrawn-text notice as one of its kinds. The two new UI strings are in all 33 catalogues. `sha2` (already in the lock file) becomes a dependency of `pdfcraft-edit`. Tests, each seen failing with its piece of the fix reverted: - `the_tag_holds_no_reference_and_a_full_save_keeps_no_second_copy_of_the_page` and `removed_text_leaves_the_file_when_a_background_replaced_the_pages_backdrop` (automation, redaction and Remove Hidden Information through a full save): fail with `/Original` back. - `a_fill_that_would_cover_content_painted_before_it_stays_off`: fails without the re-scan. - `a_copy_written_out_again_with_other_spacing_still_comes_back` and the automation test: fail when the raw bytes are hashed instead of the operators. - `an_edit_after_the_fill_is_kept_and_the_backdrop_still_comes_back`: fails under the old rule (only an unchanged copy comes back). - `remove_background_names_the_pages_whose_own_backdrop_stays_off` (engine), `remove_background_warns_about_pages_whose_own_backdrop_stays_off` (automation), `remove_background_says_which_pages_keep_their_own_backdrop_off` (UI): fail without the notice. - `a_change_before_the_fill_leaves_it_off_and_names_the_page`, `a_tag_that_does_not_add_up_is_left_alone` (hostile and old-format tags, never a panic), `operators_hash_by_value_not_by_spelling`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
27 lines
852 B
TOML
27 lines
852 B
TOML
[package]
|
|
name = "pdfcraft-edit"
|
|
description = "Page content editing: headers and footers, watermarks, backgrounds, Bates numbers (ISO 32000-2 §14.8)"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[dependencies]
|
|
pdfcraft-annot = { workspace = true }
|
|
pdfcraft-cos = { workspace = true }
|
|
pdfcraft-content = { workspace = true }
|
|
pdfcraft-fonts = { workspace = true }
|
|
pdfcraft-model = { workspace = true }
|
|
thiserror = { workspace = true }
|
|
# A backdrop copy's tag records a hash of the operators before the fill it turned off (backdrop.rs).
|
|
sha2 = "0.11"
|
|
kurbo = { workspace = true }
|
|
# Display order of right-to-left lines in added text, and reading and writing order in Edit text;
|
|
# already in the tree via the interface.
|
|
unicode-bidi = "0.3"
|
|
|
|
[dev-dependencies]
|
|
hayro-syntax = { workspace = true }
|