Docs: iteration 4b da lam - phau thuat stream form (lopdf), kiem chung E2E tren CV Canva that

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-08 08:07:46 +07:00
co-authored by Claude Fable 5
parent c1756ffee3
commit a009568b9b
+19 -7
View File
@@ -92,13 +92,25 @@ HUỶ file tạm + trả lỗi rõ; UI hiển thị thông điệp và CHẶN m
trong form (xem/chú thích/tổ chức trang vẫn bình thường). File gói form đơn trong form (xem/chú thích/tổ chức trang vẫn bình thường). File gói form đơn
giản (đa số file xuất máy in ảo, fixture test) qua cổng → sửa thoải mái. giản (đa số file xuất máy in ảo, fixture test) qua cổng → sửa thoải mái.
**Kế hoạch iteration sau cho file Canva-phức-tạp** (đã chốt kiến trúc): **Iteration 4b — PHẪU THUẬT stream (ĐÃ LÀM, thay thế flatten ở UI)**:
KHÔNG regenerate qua PDFium — phẫu thuật content stream bằng lopdf: `formsurgery.rs` (lopdf): xoá đúng op vẽ chữ (Tj/TJ/'/") của run bị sửa
(1) xoá đúng các op vẽ chữ (Tj/TJ/'/") của run bị sửa trong stream form trong stream form — map text-child thứ k ↔ show-op thứ k, form con thứ n ↔
(map: text-child thứ k của form ↔ show-op thứ k, thứ tự parse tuần tự); Do-trỏ-form thứ n (thứ tự parse PDFium tuần tự); MỖI MỨC có bất biến kiểm
(2) chữ mới vẽ ở CẤP TRANG bằng PDFium như hiện tại (trang chỉ có Do + đếm (số op == số object PDFium thấy — lệch là từ chối); '/" thay bằng
path — regenerate trang không đụng nội dung form, không dính lỗi trùng tên T*/Tw+Tc+T* giữ hiệu ứng vị trí. Chữ mới vẽ ở CẤP TRANG (regenerate trang
font). Mọi byte khác của form giữ NGUYÊN — lossless by construction. không đụng stream form → không dính lỗi trùng tên font). `apply_edits`:
run nested trong ReflowText/Delete → phẫu thuật ở pha (A2) rồi MỞ LẠI
document (tầng-0 token gốc tắt cho anchor nested — token vô hiệu sau mở
lại); cổng an toàn `page_render_mismatch_masked`: pixel ngoài vùng khối sửa
lệch >0.5% → huỷ output. UI bỏ auto-flatten, sửa nested trong suốt qua đúp
chuột; SetText thuộc tính/kéo khối trong form chặn-với-thông-điệp.
Bẫy lopdf: `decompressed_content()` BÁO LỖI với stream không nén (thiếu
/Filter) → fallback bytes thô.
**Kiểm chứng E2E trên CV Canva thật (build 26)**: sửa 1 dòng trong form
(1155 object nested) → commit thành công, chữ mới đúng chỗ/đúng màu, ảnh
chân dung + toàn bộ chữ khác nguyên vẹn (PROFILE/CONTACT đủ glyph), cổng
masked pass, undo hoạt động. 2 test round-trip surgical (delete/reflow giữ
nguyên phần khác của form) + test SetText nested bị từ chối.
Giới hạn khác: Giới hạn khác:
- Flatten làm mất clip/ExtGState/transparency group đặt Ở MỨC FORM — các - Flatten làm mất clip/ExtGState/transparency group đặt Ở MỨC FORM — các