Form XObject vòng 2: rút object khỏi form thật sự — sửa trong form mới được LƯU
Build Windows portable / build (push) Canceled after 0s

CI vòng 1 bắt đúng lỗi thiết kế: FPDFText_SetText trên con trong form KHÔNG
đánh dấu dirty_streams của form (chỉ RemovePageObject/InsertPageObjectAtIndex
mới làm — xem cpdf_pageobjectholder.cpp) nên mọi sửa in-place trong form
không bao giờ được ghi ra file. Test canary fail chính xác ở điểm này.

- Đổi feature pdfium-render pdfium_latest(7543) -> pdfium_7350 (cả ff-engine
  lẫn app): mở remove_object cho Form XObject qua blanket impl
  PdfPageObjectsCommon (wrapper 0.8.37 sót gate 7543 dù binding có đủ);
  API 7350 là subset của DLL bblanchon mới, đã quét 0 hàm 7543-only.
- Mọi sửa/xoá con trong form = RÚT THẬT khỏi form (FPDFFormObj_RemoveObject,
  thứ tự path sâu trước + cùng cha con lớn trước) -> form dirty -> ProcessForm
  regenerate stream khi lưu. SetText con trong form = SetTextMode mới
  NestedRecreate: rút khỏi form + tạo lại ở cấp trang giữ font gốc qua token
  (probe như tầng 0 reflow; thiếu glyph -> nhúng lại bytes/cùng họ), matrix
  đã compose.
- CI test thêm --test-threads=1: PDFium serialize qua 1 mutex toàn cục,
  1 test panic khi giữ lock poison mutex làm 17 test song song chết oan.
Docs cập nhật theo (12-phase4-summary.md Iteration 4).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-08 02:00:10 +07:00
co-authored by Claude Fable 5
parent e66252681c
commit fd731255ac
6 changed files with 183 additions and 77 deletions
+5 -1
View File
@@ -10,7 +10,11 @@ ff-cos = { path = "../ff-cos" }
ff-pdmodel = { path = "../ff-pdmodel" }
anyhow.workspace = true
thiserror.workspace = true
pdfium-render = "0.8"
# default-features tắt để chọn pdfium_7350 thay vì pdfium_latest(7543):
# wrapper 0.8.37 chỉ mở FPDFFormObj_RemoveObject (rút object khỏi Form
# XObject — cần cho sửa file Canva) với gate 7350/future dù binding có cả
# 7543; DLL bblanchon mới hơn là superset của API 7350 nên tương thích.
pdfium-render = { version = "0.8", default-features = false, features = ["pdfium_7350", "thread_safe", "image"] }
image = "0.25"
lopdf = "0.36"
ttf-parser = "0.25"