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>
PDF viewer (render/search/text-select/thumbnails/outline) and annotation
engine (Highlight/Underline/Strikeout/Square/FreeText/Note) over PDFium +
lopdf, with Unicode font embedding for Vietnamese text and undo/redo.