Files
FoFreeXit/README.md
T
adminandClaude Fable 5 fed43b2fb7 Phase 4 Iteration 3: reflow đoạn văn 'như Word' (EditOp::ReflowText)
Engine:
- EditOp::ReflowText { indices, text }: engine tự suy hình học từ các run
  (lề trái/bề rộng từ bounds, baseline từ matrix.f gom cụm ±1pt, khoảng cách
  dòng = median hiệu baseline); bẻ dòng greedy đo bằng hmtx của font thật
  (fontmatch::wrap_lines + char_advance, ttf-parser); \n = ngắt dòng cứng,
  từ quá dài cắt theo ký tự, dòng rỗng giữ nhịp baseline
- Giữ font theo thang 4 mức nhất quán với iteration 2: (1) font nhúng parse
  được + phủ đủ glyph → nhúng lại chính bytes đó; (2) family base-14 + ASCII
  → font chuẩn PDF qua FPDFText_LoadStandardFont (BaseFont giữ tên chuẩn,
  không nhúng, file không phình; đo bằng font metric-compatible); (3) font
  hệ thống cùng họ; (4) fallback. FontLoad enum Bytes/Builtin cho pha nạp font
- Dòng mới giữ phần tuyến tính matrix của run neo (scale/nghiêng), Tf =
  unscaled run neo → cỡ hiển thị không đổi

UI + Tauri:
- paragraphLines: gom đoạn nhiều dòng (baseline cách đều ±25%, cỡ chữ tương
  đồng, giao ngang ≥30%); double-click đoạn ≥2 dòng → textarea sửa CẢ ĐOẠN
  WYSIWYG (đúng font/cỡ/màu/kiểu + line-height đúng nhịp baseline)
- Enter = xuống dòng cứng · Ctrl+Enter/bấm ra ngoài = áp dụng · Esc = huỷ;
  1 commit = 1 op reflowText = 1 nấc undo
- DTO reflowText (indices) trong Tauri

Test: 3 integration mới (wrap giữ font nhúng + tiếng Việt + baseline đều;
hard break; base-14 giữ BaseFont Helvetica chuẩn) + 3 unit wrap_lines.
Toàn bộ suite engine ngoài qpdf: 52/52 xanh.

Docs: 12 (Iteration 3 + giới hạn v1), 13 (E26–E30), 14 (mục 3.1 → đã giải,
cập nhật thứ tự việc tiếp theo), README.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HgnbPwSoRGNH7LHsDUmRpk
2026-07-15 01:34:34 +00:00

5.5 KiB
Raw Blame History

FoFreeXit

Mục tiêu dự án: Xây dựng một phần mềm chỉnh sửa PDF trên desktop có thể thay thế Foxit PDF Editor (và một phần Adobe Acrobat) cho các nhu cầu phổ biến — miễn phí / mã nguồn mở.

Dự án được thực hiện qua nhiều session Claude Code. Token và thời gian không phải là ràng buộc. Ưu tiên số 1: tạo ra được một sản phẩm dùng được, thay thế Foxit cho các tác vụ chính.

Tài liệu

File Nội dung
docs/01-research.md Khảo sát tính năng Foxit, tính năng "đáng tiền", khó khăn kỹ thuật, thuật toán Foxit/Adobe, khảo sát thư viện PDF
docs/02-tech-stack.md Phân tích & lựa chọn ngôn ngữ / framework / engine
docs/03-roadmap.md Lộ trình theo phase, mục tiêu, phương pháp, định nghĩa hoàn thành (DoD)
docs/04-architecture.md Kiến trúc kỹ thuật chi tiết (sẽ chi tiết hóa dần)
docs/14-foxit-gap-analysis.md Đánh giá định hướng/công nghệ/tiến độ so với tham vọng thay Foxit; các khoảng cách còn lại + giải pháp

Trạng thái hiện tại

  • Phase 0 — Nghiên cứu & lập kế hoạch
  • Đã chốt stack: Rust + Tauri (App/UI) trên engine PDFium + QPDF (xem docs/02-tech-stack.md)
  • Phase 1 — Engine core + Viewer ✅ HOÀN TẤT (10/10 test xanh)
    • Cargo workspace + app Tauri; engine render qua PDFium
    • CLI ff: info/render/pages/text/search/outline
    • Engine: render, page_dims, extract_text, search(+toạ độ), outline, page_char_boxes
    • Viewer: mở file (hộp thoại), cuộn liên tục + lazy render (file 1000+ trang), zoom/Fit, thumbnails, outline, tìm kiếm + highlight, chọn & copy text (text-layer)
    • Tổng kết: docs/06-phase1-summary.md · Checklist test cho bạn: docs/07-phase1-user-tests.md
  • Phase 2 — Annotate ✅ lõi hoàn tất (13/13 test xanh)
    • Engine: 6 loại annotation (Highlight/Underline/Strikeout/Square/FreeText/Note) + lưu file + đọc lại — round-trip test
    • UI: thanh công cụ + vẽ bằng chuột + preview + chọn màu + tab Chú thích + lưu qua hộp thoại
    • Follow-up: Ink, sửa/di chuyển annotation đã lưu, XFDF — xem docs/08-phase2-summary.md
    • Checklist test cho bạn: docs/09-phase2-user-tests.md
  • Phase 3 — Organize trang + lưu file vững ✅ lõi hoàn tất (36/36 test xanh)
    • Engine: chèn/xoá/xoay/trích/thay/đảo trang, merge/split, crop, watermark, header/footer + đánh số trang
    • Lưu file vững: QPDF repair file hỏng + mã hoá lại an toàn (qpdf.rs)
    • UI: chế độ "Tổ chức trang" (lưới + kéo-thả + multi-select), undo/redo toàn cục (chú thích + tổ chức trang chung 1 stack), dialog cho mọi thao tác (có xem trước thật cho Watermark/Header-Footer)
    • Follow-up: preview thật cho Insert/Extract/Replace/Crop, tách theo outline, watermark ảnh — xem docs/10-phase3-summary.md
    • Checklist test cho bạn: docs/11-phase3-user-tests.md
  • Phase 4 — Chỉnh sửa nội dung (Edit) ⭐ tính năng lõi/moat ✅ Iteration 1 + 2 + 3 hoàn tất (52/52 test xanh ngoài qpdf)
    • Engine edit.rs: liệt kê object + sửa text run (tiếng Việt), xoá, di chuyển/resize, thêm chữ/ảnh, thay ảnh — round-trip test
    • UI chế độ "Sửa nội dung": overlay đối tượng, sửa text tại chỗ WYSIWYG, thêm chữ/ảnh, xoá, cỡ chữ/màu, undo/redo, lưu
    • Iteration 2 — GIỮ FONT khi sửa (chuẩn Foxit): sửa tại chỗ giữ nguyên font gốc/nhúng (kể cả tiếng Việt); thiếu glyph mới thay font CÙNG HỌ (fontmatch.rs); đổi cỡ/màu không đụng font (fix bug phóng đại kép); sửa CẢ DÒNG (gộp run); WYSIWYG khi gõ; B/I + đổi font family; kéo-thả live; dọn file tạm
    • Iteration 3 — Reflow đoạn "như Word": double-click đoạn nhiều dòng → sửa cả đoạn, tự bẻ dòng theo bề rộng khối (đo hmtx bằng ttf-parser), giữ font (nhúng lại bytes gốc / font chuẩn base-14 / cùng họ), giữ nhịp baseline; Enter = ngắt cứng
    • Follow-up: reflow v2 (justify, khối xoay, đa font), xoay/lật/clip, viền/opacity/căn lề, convert text→path — xem docs/12-phase4-summary.md
    • Checklist test cho bạn: docs/13-phase4-user-tests.md (mới: E17–E30)
  • Phase 5 — Bảo mật & Chữ ký (kế tiếp) — xem docs/03-roadmap.md

Build & chạy: xem docs/05-dev-setup.md.

Nguyên tắc làm việc qua nhiều session

  1. Tài liệu là nguồn chân lý. Mọi quyết định kiến trúc phải được ghi vào docs/.
  2. Mỗi phase có Definition of Done rõ ràng và test kèm theo.
  3. Không viết lại engine PDF từ con số 0 ở giai đoạn đầu — đứng trên vai người khổng lồ (PDFium/QPDF), tự xây phần "editor" và "UX".
  4. Ưu tiên giấy phép permissive (BSD/Apache/MIT) để sản phẩm có thể tự do phân phối.