M5: the first save after placing a signature asks to lock it into the page (#2149)

A Fill & Sign signature stays a removable comment unless Flatten Fill &
Sign when saving is on, which sat only in Preferences. The first save
after a signature or initials is placed now asks: Lock and save flattens
the document's Fill & Sign marks, Keep editable saves as before, Cancel
saves nothing, and Don't ask again turns the answer into the
preference. The Sign menu carries the same switch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mtlcl410andClaude Opus 5.5 committed 2026-11-02 08:30:09 +08:00
1 parent 0cba87ae6f
commit 07a5f3f3a1
33 files changed
+354 -4

No files matched your search

+4
View File
@@ -106,6 +106,10 @@ impl PdfCraftApp {
system_text_scale: 1.0,
ui_scale_applied: None,
flatten_fill_sign_on_save: false,
ask_to_lock_signatures: true,
placed_signatures: Default::default(),
pending_lock: None,
lock_remember: false,
fill_text_size: fill_sign::TEXT_SIZE,
fill_text_color: [0.0; 3],
dialog: None,
+4
View File
@@ -101,6 +101,7 @@ impl PdfCraftApp {
// Null follows the system's text scaling.
"ui_scale": self.ui_scale,
"flatten_fill_sign": self.flatten_fill_sign_on_save,
"ask_to_lock_signatures": self.ask_to_lock_signatures,
"fill_text_size": self.fill_text_size,
"date_format": self.session.date_format(),
// Null follows the interface language.
@@ -284,6 +285,9 @@ impl PdfCraftApp {
if let Some(on) = v["flatten_fill_sign"].as_bool() {
self.flatten_fill_sign_on_save = on;
}
if let Some(on) = v["ask_to_lock_signatures"].as_bool() {
self.ask_to_lock_signatures = on;
}
if let Some(size) = v["fill_text_size"].as_f64().and_then(fill_sign::valid_text_size) {
self.fill_text_size = size;
}
+39
View File
@@ -50,6 +50,7 @@ struct Pending {
revert_now: bool,
overwrite_now: bool,
overwrite_elsewhere: bool,
lock_answer: Option<bool>,
summarize_now: bool,
optimize_now: bool,
duplicate_now: Option<Edit>,
@@ -275,6 +276,11 @@ fn dialog_body(ui: &mut egui::Ui, app: &mut PdfCraftApp, dialog: Dialog, req: &m
return false;
}
}
Dialog::LockSignatures => {
if !dialog_lock_signatures(ui, app, req) {
return false;
}
}
Dialog::Revert => {
if !dialog_revert(ui, app, req) {
return false;
@@ -1246,6 +1252,31 @@ fn dialog_summarize_comments(ui: &mut egui::Ui, app: &mut PdfCraftApp, req: &mut
false
}
/// `Dialog::LockSignatures` content (#2149). Returns `false` when it has its own buttons and no
/// footer is wanted.
fn dialog_lock_signatures(ui: &mut egui::Ui, app: &mut PdfCraftApp, req: &mut Pending) -> bool {
ui.label(egui::RichText::new(tl!("Lock your signature into the page?")).font(theme::semibold(18.0)));
ui.add_space(8.0);
ui.label(tl!("A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page."));
ui.add_space(8.0);
ui.add(widgets::checkbox(&mut app.lock_remember, tl!("Don't ask again")));
ui.add_space(12.0);
ui.with_layout(Layout::right_to_left(Align::Center), |ui| {
if widgets::pill_button(ui, tl!("Lock and save"), true).clicked() {
req.lock_answer = Some(true);
req.close = true;
}
if widgets::pill_button(ui, tl!("Keep editable"), false).clicked() {
req.lock_answer = Some(false);
req.close = true;
}
if widgets::pill_button(ui, tl!("Cancel"), false).clicked() {
req.close = true;
}
});
false
}
/// `Dialog::Revert` content. Returns `false` when it has its own buttons and no footer is wanted.
fn dialog_revert(ui: &mut egui::Ui, app: &mut PdfCraftApp, req: &mut Pending) -> bool {
let name = app.active_ids().and_then(|(_, id)| app.session.get(id)).map(|d| d.name.clone()).unwrap_or_default();
@@ -1762,6 +1793,14 @@ fn finish_requests(app: &mut PdfCraftApp, dialog: Dialog, modal_closed: bool, re
if dialog == Dialog::OverwriteChanged && (modal_closed || req.close) {
app.pending_overwrite = None;
}
if let Some(lock) = req.lock_answer {
let remember = std::mem::take(&mut app.lock_remember);
app.answer_lock_signatures(lock, remember);
} else if dialog == Dialog::LockSignatures && (modal_closed || req.close) {
// Cancelled or dismissed: nothing is saved.
app.pending_lock = None;
app.lock_remember = false;
}
}
/// Runs the document actions the dialog asked for.
+7
View File
@@ -10,6 +10,7 @@ mod close;
mod save;
pub use close::CloseRequest;
pub use save::PendingLock;
#[cfg(not(target_arch = "wasm32"))]
pub use save::PendingOverwrite;
#[cfg(target_arch = "wasm32")]
@@ -669,12 +670,18 @@ impl PdfCraftApp {
fn apply_queued_edit(&mut self, i: usize) -> bool {
let Some(edit) = self.views.get_mut(i).and_then(|v| v.pending_edit.take()) else { return true };
let signature_page = self.views.get_mut(i).and_then(|v| v.fill_signature_page.take());
let doc_id = self.views.get(i).map(|v| v.id);
let committed = self.views.get_mut(i).and_then(|v| v.forms.committed.take());
let typed = match (&edit, &committed) {
(Edit::SetFieldValue { name, .. }, Some(draft)) => *name == draft.name,
_ => false,
};
if self.apply_edit(edit) {
if signature_page.is_some()
&& let Some(id) = doc_id
{
self.placed_signatures.insert(id);
}
// Tab can wrap to the same field (including another widget of that field).
// Its new editor was opened before this edit ran, so it still holds the old
// value. Refresh from the accepted form before Save can commit that stale draft.
+47
View File
@@ -11,6 +11,14 @@ pub struct PendingOverwrite {
after: Box<dyn FnOnce(&mut PdfCraftApp) + Send>,
}
/// A save held back by [`Dialog::LockSignatures`](crate::Dialog::LockSignatures) (#2149).
pub struct PendingLock {
pub id: pdfcraft_engine::DocId,
target: SaveTarget,
/// What was to run once the document is written (close its tab, quit).
after: Box<dyn FnOnce(&mut PdfCraftApp) + Send>,
}
/// Where Save writes.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SaveTarget {
@@ -46,6 +54,13 @@ impl PdfCraftApp {
return false;
}
let Some(id) = self.views.get(index).map(|v| v.id) else { return false };
// A signature just placed with Fill & Sign is a removable comment unless it is flattened:
// ask once whether to lock it into the page (#2149).
if self.ask_to_lock_signatures && !self.flatten_fill_sign_on_save && self.placed_signatures.contains(&id) {
self.pending_lock = Some(PendingLock { id, target, after: Box::new(after) });
self.dialog = Some(crate::Dialog::LockSignatures);
return false;
}
let Some(doc) = self.session.get(id) else { return false };
let (name, path) = (doc.name.clone(), doc.path.clone());
#[cfg(not(target_arch = "wasm32"))]
@@ -154,6 +169,37 @@ impl PdfCraftApp {
}
}
/// The Lock signatures dialog answered (#2149): lock the document's Fill & Sign marks into
/// its pages first when `lock`, then save as was asked. With `remember`, the answer becomes
/// the preference (flatten on every save, or never ask again).
pub(crate) fn answer_lock_signatures(&mut self, lock: bool, remember: bool) {
let Some(p) = self.pending_lock.take() else { return };
self.placed_signatures.remove(&p.id);
if remember {
if lock {
self.flatten_fill_sign_on_save = true;
} else {
self.ask_to_lock_signatures = false;
}
}
if lock && !self.flatten_fill_sign_on_save {
let before = self.session.get(p.id).map(|d| d.edit_generation());
if let Err(e) = self.session.apply(p.id, pdfcraft_engine::Edit::FlattenFillSign) {
self.notify_error(e);
return;
}
if before != self.session.get(p.id).map(|d| d.edit_generation())
&& let Some(doc) = self.session.get(p.id)
&& let Some(view) = self.views.iter_mut().find(|v| v.id == p.id)
{
view.document_changed(&doc.info);
}
}
if let Some(index) = self.views.iter().position(|v| v.id == p.id) {
self.save_then(index, p.target, p.after);
}
}
/// Write document `id` to `dest` and make it the document's file. Returns `true` if written.
#[cfg(not(target_arch = "wasm32"))]
fn save_doc_to(&mut self, id: pdfcraft_engine::DocId, dest: &str, target: SaveTarget) -> bool {
@@ -192,6 +238,7 @@ impl PdfCraftApp {
match self.session.mark_saved(id, bytes, Some(dest.to_string())) {
Ok(()) => {
self.forget_recovery(id);
self.placed_signatures.remove(&id);
if let Some(doc) = self.session.get(id)
&& let Some(view) = self.views.iter_mut().find(|v| v.id == id)
{
+7
View File
@@ -2278,6 +2278,13 @@ calendar date December ديسمبر
Smaller pages صفحات أصغر
Reset page size إعادة ضبط حجم الصفحة
Flatten Fill & Sign when saving تسطيح التعبئة والتوقيع عند الحفظ
Lock your signature into the page? هل تريد تثبيت توقيعك في الصفحة؟
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. التوقيع الموضوع تعليق إلى أن يُثبَّت: يستطيع أي شخص لديه محرر PDF نقله أو إزالته. التثبيت يجعل نصوص التعبئة والتوقيع وعلاماتها وتواقيعها جزءًا من الصفحة.
Don't ask again عدم السؤال مرة أخرى
Lock and save التثبيت والحفظ
Keep editable إبقاؤه قابلًا للتحرير
Lock into the page when saving التثبيت في الصفحة عند الحفظ
Otherwise, ask on the first save after a signature is placed وإلا فاسأل عند أول حفظ بعد وضع توقيع
Text, marks and signatures become part of the page. Other comments stay editable. النص والعلامات والتوقيعات تصبح جزءًا من الصفحة. التعليقات الأخرى تبقى قابلة للتحرير.
Date format تنسيق التاريخ
Fill & Sign dates تواريخ التعبئة والتوقيع
Can't render this file because it contains an unexpected character in line 6 and column 47.
+7
View File
@@ -138,6 +138,13 @@
Side panels Странични панели
Enable Acrobat JavaScript Включи Acrobat JavaScript
Flatten Fill & Sign when saving Сплескай „Попълни и подпиши“ при запазване
Lock your signature into the page? Да се заключи ли подписът ви в страницата?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Поставеният подпис е коментар, докато не бъде заключен: всеки с PDF редактор може да го премести или премахне. Заключването прави текста, отметките и подписите от „Попълване и подписване“ част от страницата.
Don't ask again Не питай отново
Lock and save Заключване и запис
Keep editable Да остане редактируем
Lock into the page when saving Заключване в страницата при запис
Otherwise, ask on the first save after a signature is placed Иначе питай при първия запис след поставяне на подпис
Text, marks and signatures become part of the page. Other comments stay editable. Текстът, маркировките и подписите стават част от страницата. Другите коментари остават редактируеми.
OK OK
Cancel Отказ
Can't render this file because it contains an unexpected character in line 8 and column 16.
+7
View File
@@ -2299,6 +2299,13 @@ calendar date December prosince
Smaller pages Menší stránky
Reset page size Obnovit velikost stránek
Flatten Fill & Sign when saving Při ukládání sloučit obsah Vyplnit a podepsat se stránkou
Lock your signature into the page? Zamknout podpis do stránky?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Umístěný podpis je komentář, dokud není zamčen: kdokoli s editorem PDF ho může přesunout nebo odstranit. Zamčení udělá z textu, značek a podpisů Vyplnit a podepsat součást stránky.
Don't ask again Už se neptat
Lock and save Zamknout a uložit
Keep editable Ponechat upravitelné
Lock into the page when saving Při ukládání zamknout do stránky
Otherwise, ask on the first save after a signature is placed Jinak se zeptat při prvním uložení po umístění podpisu
Text, marks and signatures become part of the page. Other comments stay editable. Text, značky a podpisy se stanou součástí stránky. Ostatní komentáře zůstanou upravitelné.
Date format Formát data
Fill & Sign dates Datum pro Vyplnit a podepsat
Can't render this file because it contains an unexpected character in line 6 and column 47.
+7
View File
@@ -71,6 +71,13 @@
Side panels Seitenleisten
Enable Acrobat JavaScript Acrobat-JavaScript aktivieren
Flatten Fill & Sign when saving Ausfüllen und unterschreiben beim Speichern reduzieren
Lock your signature into the page? Unterschrift fest in die Seite übernehmen?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Eine platzierte Unterschrift ist ein Kommentar, bis sie fest übernommen wird: Jeder mit einem PDF-Editor kann sie verschieben oder entfernen. Beim Übernehmen werden Text, Markierungen und Unterschriften aus „Ausfüllen und unterschreiben“ Teil der Seite.
Don't ask again Nicht mehr fragen
Lock and save Übernehmen und speichern
Keep editable Bearbeitbar lassen
Lock into the page when saving Beim Speichern fest in die Seite übernehmen
Otherwise, ask on the first save after a signature is placed Andernfalls beim ersten Speichern nach dem Platzieren einer Unterschrift fragen
Text, marks and signatures become part of the page. Other comments stay editable. Text, Markierungen und Unterschriften werden Teil der Seite. Andere Kommentare bleiben bearbeitbar.
OK OK
Join our Discord Unserem Discord beitreten
Can't render this file because it contains an unexpected character in line 6 and column 51.
+7
View File
@@ -286,6 +286,13 @@
Failed Αποτυχία
Page {p} of {n} Σελίδα {p} από {n}
Flatten Fill & Sign when saving Ενσωμάτωση συμπληρώσεων και υπογραφών κατά την αποθήκευση
Lock your signature into the page? Κλείδωμα της υπογραφής σας στη σελίδα;
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Μια τοποθετημένη υπογραφή είναι σχόλιο μέχρι να κλειδωθεί: οποιοσδήποτε με επεξεργαστή PDF μπορεί να τη μετακινήσει ή να την αφαιρέσει. Το κλείδωμα κάνει το κείμενο, τα σημάδια και τις υπογραφές της Συμπλήρωσης και υπογραφής μέρος της σελίδας.
Don't ask again Να μην ερωτηθώ ξανά
Lock and save Κλείδωμα και αποθήκευση
Keep editable Να παραμείνει επεξεργάσιμη
Lock into the page when saving Κλείδωμα στη σελίδα κατά την αποθήκευση
Otherwise, ask on the first save after a signature is placed Διαφορετικά, ερώτηση στην πρώτη αποθήκευση μετά την τοποθέτηση υπογραφής
Text, marks and signatures become part of the page. Other comments stay editable. Το κείμενο, τα σημάδια και οι υπογραφές γίνονται μέρος της σελίδας. Τα υπόλοιπα σχόλια παραμένουν επεξεργάσιμα.
Current page — type a page number or label (such as iv) and press Enter Τρέχουσα σελίδα — πληκτρολογήστε αριθμό ή ετικέτα σελίδας (π.χ. iv) και πατήστε Enter
Zoom — type a percentage and press Enter Ζουμ — πληκτρολογήστε ένα ποσοστό και πατήστε Enter
1 # Greek (el) interface catalog. Columns: context <TAB> English source <TAB> Greek translation.
286
287
288
289
290
291
292
293
294
295
296
297
298
+7
View File
@@ -94,6 +94,13 @@
Side panels Paneles laterales
Enable Acrobat JavaScript Activar Acrobat JavaScript
Flatten Fill & Sign when saving Acoplar Rellenar y firmar al guardar
Lock your signature into the page? ¿Fijar su firma en la página?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Una firma colocada es un comentario hasta que se fija: cualquiera con un editor de PDF puede moverla o quitarla. Al fijarla, el texto, las marcas y las firmas de Rellenar y firmar pasan a formar parte de la página.
Don't ask again No volver a preguntar
Lock and save Fijar y guardar
Keep editable Mantener editable
Lock into the page when saving Fijar en la página al guardar
Otherwise, ask on the first save after a signature is placed Si no, preguntar al guardar por primera vez tras colocar una firma
Text, marks and signatures become part of the page. Other comments stay editable. El texto, las marcas y las firmas pasan a formar parte de la página. Los demás comentarios siguen siendo editables.
OK Aceptar
Join our Discord Únete a nuestro Discord
Can't render this file because it contains an unexpected character in line 6 and column 60.
+7
View File
@@ -71,6 +71,13 @@
Side panels Panneaux latéraux
Enable Acrobat JavaScript Activer Acrobat JavaScript
Flatten Fill & Sign when saving Aplatir Remplir et signer à l'enregistrement
Lock your signature into the page? Intégrer votre signature à la page ?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Une signature placée reste un commentaire tant qu’elle n’est pas intégrée : n’importe qui avec un éditeur PDF peut la déplacer ou la supprimer. L’intégration rend le texte, les marques et les signatures de Remplir et signer partie de la page.
Don't ask again Ne plus demander
Lock and save Intégrer et enregistrer
Keep editable Garder modifiable
Lock into the page when saving Intégrer à la page à l’enregistrement
Otherwise, ask on the first save after a signature is placed Sinon, demander au premier enregistrement après avoir placé une signature
Text, marks and signatures become part of the page. Other comments stay editable. Le texte, les marques et les signatures deviennent partie de la page. Les autres commentaires restent modifiables.
OK OK
Join our Discord Rejoindre notre Discord
Can't render this file because it contains an unexpected character in line 6 and column 39.
+7
View File
@@ -2255,6 +2255,13 @@ action wizard Start Indítás
Smaller pages Kisebb oldalak
Reset page size Oldalméret visszaállítása
Flatten Fill & Sign when saving Kitöltés és aláírás beégetése mentéskor
Lock your signature into the page? Rögzíti az aláírását az oldalba?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Az elhelyezett aláírás megjegyzés, amíg nincs rögzítve: bárki egy PDF-szerkesztővel áthelyezheti vagy eltávolíthatja. A rögzítés a Kitöltés és aláírás szövegét, jeleit és aláírásait az oldal részévé teszi.
Don't ask again Ne kérdezzen többet
Lock and save Rögzítés és mentés
Keep editable Szerkeszthető marad
Lock into the page when saving Mentéskor rögzítés az oldalba
Otherwise, ask on the first save after a signature is placed Különben kérdezzen rá az aláírás elhelyezése utáni első mentéskor
Text, marks and signatures become part of the page. Other comments stay editable. A szöveg, a jelek és az aláírások az oldal részévé válnak. A többi megjegyzés szerkeszthető marad.
Date format Dátumformátum
Fill & Sign dates Kitöltés és aláírás dátumai
Can't render this file because it contains an unexpected character in line 7 and column 44.
+7
View File
@@ -2215,6 +2215,13 @@
Files are combined in this order. Leave Pages empty to take every page. I file vengono combinati in quest'ordine. Lascia vuoto Pagine per prendere tutte le pagine.
Fill & Sign dates Date di Compila e firma
Flatten Fill & Sign when saving Appiattisci Compila e firma al salvataggio
Lock your signature into the page? Bloccare la firma nella pagina?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Una firma inserita è un commento finché non viene bloccata: chiunque abbia un editor PDF può spostarla o rimuoverla. Il blocco rende testo, segni e firme di Compila e firma parte della pagina.
Don't ask again Non chiedere più
Lock and save Blocca e salva
Keep editable Mantieni modificabile
Lock into the page when saving Blocca nella pagina al salvataggio
Otherwise, ask on the first save after a signature is placed Altrimenti, chiedi al primo salvataggio dopo aver inserito una firma
H / Space (hold) H / Spazio (tieni premuto)
Home / End Home / Fine
Inserted text Testo inserito
Can't render this file because it contains an unexpected character in line 6 and column 47.
+7
View File
@@ -2270,6 +2270,13 @@
@plural {n} page|{n} pages {n} ページ
signature pad Type 入力
Flatten Fill & Sign when saving 保存時に入力と署名を統合する
Lock your signature into the page? 署名をページに固定しますか?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. 配置した署名は固定するまで注釈です。PDF エディターを持つ人なら誰でも移動や削除ができます。固定すると、入力と署名のテキスト、マーク、署名がページの一部になります。
Don't ask again 今後は確認しない
Lock and save 固定して保存
Keep editable 編集可能のままにする
Lock into the page when saving 保存時にページに固定
Otherwise, ask on the first save after a signature is placed それ以外は、署名を配置した後の最初の保存時に確認する
Text, marks and signatures become part of the page. Other comments stay editable. テキスト、マーク、署名がページの一部になります。その他のコメントは引き続き編集できます。
Scroll tabs left タブを左にスクロール
Scroll tabs right タブを右にスクロール
Can't render this file because it contains an unexpected character in line 6 and column 47.
+7
View File
@@ -2187,6 +2187,13 @@ calendar date December Желтоқсан
Smaller pages Кішірек беттер
Reset page size Бет өлшемін қалпына келтіру
Flatten Fill & Sign when saving Сақтау кезінде «Толтыру және қол қою» мазмұнын жазықтау
Lock your signature into the page? Қолтаңбаңызды бетке бекіту керек пе?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Қойылған қолтаңба бекітілгенге дейін түсініктеме болып қалады: PDF өңдегіші бар кез келген адам оны жылжытып не жоя алады. Бекіту «Толтыру және қол қою» мәтінін, белгілерін және қолтаңбаларын беттің бөлігіне айналдырады.
Don't ask again Қайта сұрамау
Lock and save Бекіту және сақтау
Keep editable Өңделетін күйде қалдыру
Lock into the page when saving Сақтағанда бетке бекіту
Otherwise, ask on the first save after a signature is placed Әйтпесе, қолтаңба қойылғаннан кейінгі алғашқы сақтауда сұрау
Text, marks and signatures become part of the page. Other comments stay editable. Мәтін, белгілер мен қолтаңбалар беттің бөлігіне айналады. Басқа түсініктемелер өңделетін күйде қалады.
Date format Күн пішімі
Fill & Sign dates «Толтыру және қол қою» күндері
Can't render this file because it contains an unexpected character in line 885 and column 9.
+7
View File
@@ -590,6 +590,13 @@
Fixed what could be fixed; 1 problem remains Ištaisyta tai, ką buvo galima; liko 1 problema
Fixed what could be fixed; {n} problems remain Ištaisyta tai, ką buvo galima; liko problemų: {n}
Flatten Fill & Sign when saving Įrašant suplokštinti pildymo ir pasirašymo turinį
Lock your signature into the page? Įtvirtinti parašą puslapyje?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Padėtas parašas yra komentaras, kol neįtvirtintas: bet kas su PDF redaktoriumi gali jį perkelti ar pašalinti. Įtvirtinus užpildymo ir pasirašymo tekstas, žymės ir parašai tampa puslapio dalimi.
Don't ask again Daugiau neklausti
Lock and save Įtvirtinti ir įrašyti
Keep editable Palikti redaguojamą
Lock into the page when saving Įrašant įtvirtinti puslapyje
Otherwise, ask on the first save after a signature is placed Kitaip klausti pirmą kartą įrašant po parašo padėjimo
Flip Horizontal Apversti horizontaliai
Flip Vertical Apversti vertikaliai
Flip horizontal Apversti horizontaliai
Can't render this file because it contains an unexpected character in line 408 and column 9.
+7
View File
@@ -2249,6 +2249,13 @@
@plural {n} page|{n} pages {n} strona|{n} strony|{n} stron
signature pad Type Wpisz
Flatten Fill & Sign when saving Spłaszczaj elementy Wypełnij i podpisz przy zapisie
Lock your signature into the page? Utrwalić podpis na stronie?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Umieszczony podpis jest komentarzem, dopóki nie zostanie utrwalony: każdy z edytorem PDF może go przenieść lub usunąć. Utrwalenie sprawia, że tekst, znaki i podpisy z Wypełnij i podpisz stają się częścią strony.
Don't ask again Nie pytaj ponownie
Lock and save Utrwal i zapisz
Keep editable Zachowaj edytowalny
Lock into the page when saving Utrwalaj na stronie przy zapisie
Otherwise, ask on the first save after a signature is placed W przeciwnym razie pytaj przy pierwszym zapisie po umieszczeniu podpisu
Text, marks and signatures become part of the page. Other comments stay editable. Tekst, oznaczenia i podpisy stają się częścią strony. Pozostałe komentarze pozostają edytowalne.
Scroll tabs left Przewiń karty w lewo
Scroll tabs right Przewiń karty w prawo
Can't render this file because it contains an unexpected character in line 6 and column 47.
+7
View File
@@ -2208,6 +2208,13 @@ action wizard Start Iniciar
First Primeiro
First commit Primeiro commit
Flatten Fill & Sign when saving Nivelar Preencher e assinar ao salvar
Lock your signature into the page? Fixar sua assinatura na página?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Uma assinatura colocada é um comentário até ser fixada: qualquer pessoa com um editor de PDF pode movê-la ou removê-la. Fixar torna o texto, as marcas e as assinaturas de Preencher e assinar parte da página.
Don't ask again Não perguntar novamente
Lock and save Fixar e salvar
Keep editable Manter editável
Lock into the page when saving Fixar na página ao salvar
Otherwise, ask on the first save after a signature is placed Caso contrário, perguntar ao salvar pela primeira vez após colocar uma assinatura
H / Space (hold) H / Espaço (manter pressionado)
Home / End Home / End
Inserted text Texto inserido
Can't render this file because it contains an unexpected character in line 9 and column 16.
+7
View File
@@ -91,6 +91,13 @@
Side panels Боковые панели
Enable Acrobat JavaScript Включить Acrobat JavaScript
Flatten Fill & Sign when saving Расплющить «Заполнить и подписать» при сохранении
Lock your signature into the page? Закрепить подпись на странице?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Размещённая подпись остаётся комментарием, пока не закреплена: любой с редактором PDF может её переместить или удалить. Закрепление делает текст, отметки и подписи из «Заполнить и подписать» частью страницы.
Don't ask again Больше не спрашивать
Lock and save Закрепить и сохранить
Keep editable Оставить редактируемой
Lock into the page when saving Закреплять на странице при сохранении
Otherwise, ask on the first save after a signature is placed Иначе спрашивать при первом сохранении после размещения подписи
Text, marks and signatures become part of the page. Other comments stay editable. Текст, пометки и подписи становятся частью страницы. Остальные комментарии можно по-прежнему править.
OK OK
Join our Discord Присоединяйтесь к нашему Discord
Can't render this file because it contains an unexpected character in line 9 and column 16.
+7
View File
@@ -2203,6 +2203,13 @@ signature pad Type Vtipkaj
Document properties ({key}) Lastnosti dokumenta ({key})
Fill & Sign dates Datumi pri Izpolni in podpiši
Flatten Fill & Sign when saving Splošči Izpolni in podpiši ob shranjevanju
Lock your signature into the page? Zakleniti podpis v stran?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Postavljen podpis je komentar, dokler ni zaklenjen: vsak z urejevalnikom PDF ga lahko premakne ali odstrani. Zaklepanje naredi besedilo, oznake in podpise iz Izpolni in podpiši del strani.
Don't ask again Ne sprašuj več
Lock and save Zakleni in shrani
Keep editable Ohrani urejljivo
Lock into the page when saving Ob shranjevanju zakleni v stran
Otherwise, ask on the first save after a signature is placed Sicer vprašaj ob prvem shranjevanju po postavitvi podpisa
Font size 0 uses automatic sizing. Velikost pisave 0 pomeni samodejno velikost.
Import list… Uvozi seznam…
Larger pages Večje strani
Can't render this file because it contains an unexpected character in line 9 and column 16.
+8
View File
@@ -2503,6 +2503,14 @@ animation effects Off ఆఫ్
Send backward వెనుకకు పంపు
Send to back అందరికంటే వెనుకకు పంపు
Lock your signature into the page? మీ సంతకాన్ని పేజీలో లాక్ చేయాలా?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. ఉంచిన సంతకం లాక్ చేసే వరకు ఒక వ్యాఖ్య మాత్రమే: PDF ఎడిటర్ ఉన్న ఎవరైనా దాన్ని తరలించవచ్చు లేదా తొలగించవచ్చు. లాక్ చేయడం వల్ల నింపి సంతకం చేయి వచనం, గుర్తులు, సంతకాలు పేజీలో భాగమవుతాయి.
Don't ask again మళ్లీ అడగవద్దు
Lock and save లాక్ చేసి సేవ్ చేయి
Keep editable సవరించగలిగేలా ఉంచు
Lock into the page when saving సేవ్ చేసేటప్పుడు పేజీలో లాక్ చేయి
Otherwise, ask on the first save after a signature is placed లేకపోతే, సంతకం ఉంచిన తర్వాత మొదటి సేవ్‌లో అడుగు
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today ఈరోజు
@plural {n} reply|{n} replies {n} ప్రత్యుత్తరం|{n} ప్రత్యుత్తరాలు
Can't render this file because it contains an unexpected character in line 13 and column 16.
+7
View File
@@ -62,6 +62,13 @@
Side panels Yan paneller
Enable Acrobat JavaScript Acrobat JavaScript'i etkinleştir
Flatten Fill & Sign when saving Kaydederken Doldur ve İmzala'yı düzleştir
Lock your signature into the page? İmzanız sayfaya sabitlensin mi?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Yerleştirilen imza, sabitlenene kadar bir yorumdur: PDF düzenleyicisi olan herkes onu taşıyabilir veya kaldırabilir. Sabitlemek, Doldur ve İmzala metnini, işaretlerini ve imzalarını sayfanın parçası yapar.
Don't ask again Bir daha sorma
Lock and save Sabitle ve kaydet
Keep editable Düzenlenebilir bırak
Lock into the page when saving Kaydederken sayfaya sabitle
Otherwise, ask on the first save after a signature is placed Aksi halde, imza yerleştirildikten sonraki ilk kayıtta sor
Text, marks and signatures become part of the page. Other comments stay editable. Metin, işaretler ve imzalar sayfanın bir parçası olur. Diğer yorumlar düzenlenebilir kalır.
OK Tamam
Join our Discord Discord'umuza katılın
1 # Turkish (tr) catalog. Format: see the header of ja.tsv
62
63
64
65
66
67
68
69
70
71
72
73
74
+7
View File
@@ -2278,6 +2278,13 @@ calendar date December грудня
Smaller pages Менші сторінки
Reset page size Скинути розмір сторінок
Flatten Fill & Sign when saving Звести «Заповнення й підпис» під час збереження
Lock your signature into the page? Закріпити підпис на сторінці?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. Розміщений підпис є коментарем, доки його не закріплено: будь-хто з редактором PDF може його перемістити або видалити. Закріплення робить текст, позначки й підписи з «Заповнити й підписати» частиною сторінки.
Don't ask again Більше не питати
Lock and save Закріпити й зберегти
Keep editable Залишити редагованим
Lock into the page when saving Закріплювати на сторінці під час збереження
Otherwise, ask on the first save after a signature is placed Інакше питати під час першого збереження після розміщення підпису
Text, marks and signatures become part of the page. Other comments stay editable. Текст, позначки й підписи стають частиною сторінки. Інші коментарі залишаються редагованими.
Date format Формат дати
Fill & Sign dates Дати заповнення й підпису
Can't render this file because it contains an unexpected character in line 6 and column 47.
+7
View File
@@ -144,6 +144,13 @@
Side panels 侧边面板
Enable Acrobat JavaScript 启用 Acrobat JavaScript
Flatten Fill & Sign when saving 保存时拼合填写与签名
Lock your signature into the page? 将签名锁定到页面中?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. 放置的签名在锁定前只是注释:任何有 PDF 编辑器的人都能移动或删除它。锁定后,“填写和签名”的文字、标记和签名会成为页面的一部分。
Don't ask again 不再询问
Lock and save 锁定并保存
Keep editable 保持可编辑
Lock into the page when saving 保存时锁定到页面
Otherwise, ask on the first save after a signature is placed 否则,在放置签名后首次保存时询问
Text, marks and signatures become part of the page. Other comments stay editable. 文字、标记和签名会成为页面内容。其他注释仍可编辑。
OK 确定
Cancel 取消
Can't render this file because it contains an unexpected character in line 9 and column 16.
+8
View File
@@ -2544,6 +2544,14 @@ animation effects Off 關
Send backward 下移一層
Send to back 移到最下層
Lock your signature into the page? 將簽名鎖定到頁面中?
A placed signature is a comment until it is locked: anyone with a PDF editor can move or remove it. Locking makes your Fill & Sign text, marks and signatures part of the page. 放置的簽名在鎖定前只是註解:任何有 PDF 編輯器的人都能移動或移除它。鎖定後,「填寫與簽署」的文字、標記與簽名會成為頁面的一部分。
Don't ask again 不再詢問
Lock and save 鎖定並儲存
Keep editable 保持可編輯
Lock into the page when saving 儲存時鎖定到頁面
Otherwise, ask on the first save after a signature is placed 否則,在放置簽名後第一次儲存時詢問
# Date picker: Today button (#4274) (AI-assisted, not separately native-reviewed)
Today 今天
@plural {n} reply|{n} replies {n} 則回覆
Can't render this file because it contains an unexpected character in line 9 and column 16.
+9
View File
@@ -326,6 +326,15 @@ pub struct PdfCraftApp {
ui_scale_applied: Option<f32>,
/// Preferences: bake Fill & Sign marks into the page when saving. Off, so a normal save stays editable.
pub flatten_fill_sign_on_save: bool,
/// Ask on the first save after Fill & Sign places a signature or initials whether to lock
/// them into the page (#2149). Off once the user says not to ask again.
pub ask_to_lock_signatures: bool,
/// Documents with a signature or initials placed by Fill & Sign since they were last saved
/// (or asked about).
pub(crate) placed_signatures: std::collections::HashSet<pdfcraft_engine::DocId>,
/// A save waiting behind [`Dialog::LockSignatures`], and its Don't ask again box.
pub(crate) pending_lock: Option<editing::PendingLock>,
pub(crate) lock_remember: bool,
/// Point size for new Fill & Sign text and dates, kept across launches.
pub fill_text_size: f64,
/// Colour for new Fill & Sign text and dates, kept across launches.
+3
View File
@@ -142,6 +142,9 @@ pub enum Dialog {
Revert,
/// Save over a file that changed on disk since the document came from it (#2166).
OverwriteChanged,
/// Saving a document with a signature just placed by Fill & Sign: lock it into the page
/// first? (#2149)
LockSignatures,
/// Link Properties.
LinkProps,
/// Organize ▸ Extract (options), Rotate Pages.
+2
View File
@@ -398,6 +398,8 @@ pub(crate) fn signature_entries(ui: &mut egui::Ui, app: &mut crate::PdfCraftApp,
});
ui.add_space(4.0);
}
// Where the signing happens, not only in Preferences (#2149).
ui.add(crate::widgets::checkbox(&mut app.flatten_fill_sign_on_save, tl!("Lock into the page when saving")));
command
}
+4
View File
@@ -560,6 +560,10 @@ pub(crate) fn preferences_body(ui: &mut egui::Ui, app: &mut PdfCraftApp, t: &Tok
ui.add_space(8.0);
ui.label(egui::RichText::new(tl!("Fill & Sign")).font(theme::semibold(13.0)));
ui.add(widgets::checkbox(&mut app.flatten_fill_sign_on_save, tl!("Flatten Fill & Sign when saving")));
ui.add_enabled(
!app.flatten_fill_sign_on_save,
widgets::checkbox(&mut app.ask_to_lock_signatures, tl!("Otherwise, ask on the first save after a signature is placed")),
);
ui.label(
egui::RichText::new(tl!("Text, marks and signatures become part of the page. Other comments stay editable.")).small().color(t.text_muted),
);
+83 -1
View File
@@ -4,7 +4,7 @@ use egui::{Pos2, pos2};
use egui_kittest::Harness;
use egui_kittest::kittest::Queryable;
use pdfcraft_ui_egui::fill_sign::{FillTool, SavedSig};
use pdfcraft_ui_egui::{Dialog, PdfCraftApp, QuickTool};
use pdfcraft_ui_egui::{Dialog, PdfCraftApp, QuickTool, SaveTarget};
const FIXTURE: &[u8] = b"%PDF-1.7
1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj
@@ -1752,6 +1752,88 @@ fn photos_and_images_dropped_on_the_signature_pad_are_imported_not_opened() {
std::fs::remove_file(photo).unwrap();
}
/// #2149: the first save after Fill & Sign places a signature asks whether to lock it into the
/// page. Lock and save flattens it; Keep editable keeps it a comment; Don't ask again becomes
/// the preference; the Sign menu has the switch too.
#[test]
fn the_first_save_after_placing_a_signature_asks_to_lock_it() {
let out = std::env::temp_dir().join(format!("pdfcraft-lock-signature-{}.pdf", std::process::id()));
let mut h = harness();
h.state_mut().save_override = Some(out.to_string_lossy().into_owned());
h.state_mut().signature = Some(SavedSig::Typed("Ada Lovelace".into()));
h.state_mut().execute("sign.fill.signature");
h.run_steps(2);
click(&mut h, 40.0, 300.0);
let signed = |h: &Harness<'static, PdfCraftApp>| {
h.state().session.get(h.state().views[0].id).unwrap().info.annotations.iter().filter(|a| a.fill_sign).count()
};
assert_eq!(signed(&h), 1);
// Keep editable: saved, still a comment, and not asked again for this placement.
assert!(!h.state_mut().save_active(SaveTarget::InPlace), "asks first");
h.run_steps(2);
h.get_by_label("Lock your signature into the page?");
h.get_by_label("Keep editable").click();
h.run_steps(3);
assert!(!h.state().session.get(h.state().views[0].id).unwrap().dirty, "saved");
assert_eq!(signed(&h), 1, "still a removable comment");
assert!(h.state_mut().save_active(SaveTarget::InPlace), "no new signature: no question");
// A new signature asks again; Lock and save with Don't ask again flattens and remembers.
h.state_mut().execute("sign.fill.signature");
h.run_steps(2);
click(&mut h, 40.0, 200.0);
assert!(!h.state_mut().save_active(SaveTarget::InPlace));
h.run_steps(2);
h.get_by_label("Don't ask again").click();
h.run_steps(1);
h.get_by_label("Lock and save").click();
h.run_steps(3);
assert_eq!(signed(&h), 0, "locked into the page");
assert!(!h.state().session.get(h.state().views[0].id).unwrap().dirty);
assert!(h.state().flatten_fill_sign_on_save, "remembered as the preference");
// The Sign menu shows the same switch.
h.state_mut().flatten_fill_sign_on_save = false;
h.get_by_label("Fill & Sign").click();
h.run_steps(2);
h.get_by_label("Fill & Sign").click();
h.run_steps(2);
h.get_by_label("Lock into the page when saving").click();
h.run_steps(2);
assert!(h.state().flatten_fill_sign_on_save);
let _ = std::fs::remove_file(&out);
}
/// #2149: Cancel saves nothing, and Keep editable with Don't ask again turns the question off.
#[test]
fn cancelling_the_lock_question_saves_nothing() {
let out = std::env::temp_dir().join(format!("pdfcraft-lock-cancel-{}.pdf", std::process::id()));
let _ = std::fs::remove_file(&out);
let mut h = harness();
h.state_mut().save_override = Some(out.to_string_lossy().into_owned());
h.state_mut().signature = Some(SavedSig::Typed("Ada Lovelace".into()));
h.state_mut().execute("sign.fill.signature");
h.run_steps(2);
click(&mut h, 40.0, 300.0);
assert!(!h.state_mut().save_active(SaveTarget::InPlace));
h.run_steps(2);
h.get_by_label("Cancel").click();
h.run_steps(3);
assert!(!out.exists() && h.state().session.get(h.state().views[0].id).unwrap().dirty, "nothing saved");
assert!(!h.state_mut().save_active(SaveTarget::InPlace), "asked again");
h.run_steps(2);
h.get_by_label("Don't ask again").click();
h.run_steps(1);
h.get_by_label("Keep editable").click();
h.run_steps(3);
assert!(out.exists() && !h.state().ask_to_lock_signatures);
let restored = {
let mut a = PdfCraftApp::new();
a.restore(&h.state().persist());
a.ask_to_lock_signatures
};
assert!(!restored, "kept with the settings");
let _ = std::fs::remove_file(&out);
}
/// Where a mode bar tab is, by its label.
fn mode_tab(h: &Harness<'static, PdfCraftApp>, label: &str) -> egui::Rect {
h.get_all_by_role_and_label(egui::accesskit::Role::Button, label).map(|n| n.rect()).find(|r| r.bottom() < 120.0).expect("a mode tab")
+1 -1
View File
@@ -136,7 +136,7 @@ workflows, exchange edge cases and everything outside the mainstream slice are e
| Print | 8% | 55% | Good on macOS and Linux; Windows prints since #847 (#756), not yet re-scored |
| Highlight, sticky notes, text comments | 12% | 85% | All markup types, replies, properties |
| Fill in forms | 10% | 85% | Every AcroForm field type, Acrobat's formatting and calculations |
| Fill & Sign: typed, drawn or image signature | 10% | 85% | Fill & Sign tools; flatten on save |
| Fill & Sign: typed, drawn or image signature | 10% | 85% | Fill & Sign tools; flatten on save (opt-in, and asked on the first save after signing) |
| Rotate, delete, reorder and extract pages | 8% | 85% | Organize grid, drag reorder, thumbnails |
| Combine files | 6% | 85% | Combine tab with bookmarks per file |
| Fix a typo in existing text | 5% | 40% | Latin paragraphs only; font may be substituted |
+2 -2
View File
@@ -5441,8 +5441,8 @@ milestone = "M5"
status = "shipped"
commands = ["comment.flatten"]
tools = ["doc_save", "doc_flatten"]
evidence = ["crates/edit/src/tests.rs::fill_sign_flatten_bakes_marks_keeps_other_comments_and_does_not_reuse_pcfl0", "crates/engine/src/tests.rs::flattening_fill_and_sign_keeps_other_comments_fields_and_undoes", "crates/engine/src/tests.rs::flattening_fill_and_sign_is_refused_without_permission_to_change", "crates/automation/tests/it/automation.rs::saving_with_flatten_fill_sign_bakes_marks_and_leaves_other_comments", "crates/ui-egui/tests/it/fill_sign.rs::saving_flattens_fill_and_sign_only_when_the_preference_is_on"]
notes = "Preferences ▸ Fill & Sign, and doc_save flatten_fill_sign, bake text, marks and signatures into the page. The option defaults off, so a normal save leaves them editable. Other comments and form fields stay. Flatten comments still flattens every comment."
evidence = ["crates/edit/src/tests.rs::fill_sign_flatten_bakes_marks_keeps_other_comments_and_does_not_reuse_pcfl0", "crates/engine/src/tests.rs::flattening_fill_and_sign_keeps_other_comments_fields_and_undoes", "crates/engine/src/tests.rs::flattening_fill_and_sign_is_refused_without_permission_to_change", "crates/automation/tests/it/automation.rs::saving_with_flatten_fill_sign_bakes_marks_and_leaves_other_comments", "crates/ui-egui/tests/it/fill_sign.rs::saving_flattens_fill_and_sign_only_when_the_preference_is_on", "crates/ui-egui/tests/it/fill_sign.rs::the_first_save_after_placing_a_signature_asks_to_lock_it", "crates/ui-egui/tests/it/fill_sign.rs::cancelling_the_lock_question_saves_nothing"]
notes = "Preferences ▸ Fill & Sign, and doc_save flatten_fill_sign, bake text, marks and signatures into the page. The option defaults off, so a normal save leaves them editable; the first save after a signature or initials is placed asks whether to lock it into the page (Lock and save / Keep editable, with Don't ask again), and the Sign menu carries the same switch (#2149). Other comments and form fields stay. Flatten comments still flattens every comment."
[[feature]]
id = "form.autofill-profile"