Initial commit: FoFreeXit Phase 1 (Viewer) + Phase 2 (Annotate)

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.
This commit is contained in:
2026-06-17 22:34:06 +07:00
commit 274012f854
52 changed files with 28479 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
# 06 — Tổng kết Phase 1 (Engine core + Viewer)
> Trạng thái: **HOÀN TẤT** các mục lõi. 10/10 test tự động xanh. Đã xác minh UI bằng screenshot & thao tác thực.
## 1. Đã xây dựng những gì
### Hạ tầng & toolchain
- Cài Rust 1.96 (MSVC) + Visual Studio Build Tools 2026 (workload C++) + WebView2.
- Tải PDFium prebuilt (`pdfium.dll`) qua [scripts/fetch-pdfium.ps1](../scripts/fetch-pdfium.ps1).
- **Cargo workspace**: `crates/ff-cos`, `crates/ff-pdmodel`, `crates/ff-engine`, `crates/ff-cli`.
- **App Tauri** tại `app/` (workspace tách riêng) — chạy bằng `cd app/src-tauri; cargo run`.
### Engine (`ff-engine`, dùng PDFium qua `pdfium-render`)
| Hàm | Chức năng |
|-----|-----------|
| `bind_pdfium` | Nạp thư viện PDFium động |
| `render_page` / `render_page_png` | Render trang ra ảnh (RGBA/PNG) theo chiều rộng |
| `page_count`, `page_dims` | Số trang & kích thước từng trang |
| `extract_text` | Trích text một trang |
| `search` | Tìm chuỗi (có/không phân biệt hoa thường) + **toạ độ rect** từng kết quả |
| `outline` | Đọc bookmarks + trang đích |
| `page_char_boxes` | Hộp bao từng ký tự (cho text-layer chọn/copy) |
### CLI (`ff`) — chạy mọi tính năng không cần UI (phục vụ test)
`info`, `render`, `pages`, `text`, `search`, `outline`.
### App desktop (Tauri + frontend tĩnh)
- **Mở file** qua hộp thoại native (`📂 Mở`) — lọc *.pdf.
- **Xem**: cuộn liên tục nhiều trang, **lazy render** (chỉ render trang trong tầm nhìn) → mở mượt file 1000+ trang.
- **Zoom** −/+/Fit (re-render sắc nét theo devicePixelRatio).
- **Thumbnails** sidebar (lazy-render, đánh dấu trang hiện tại).
- **Outline** sidebar (click → nhảy trang).
- **Tìm kiếm** + highlight chính xác từng kết quả, điều hướng ◀ x/y ▶, highlight bám đúng cả khi zoom.
- **Chọn & copy text**: text-layer trong suốt phủ đúng từng glyph; chọn bằng chuột/Shift+Click + Ctrl+C, hoặc nút **Copy** (cả trang).
## 2. Test tự động (10/10 xanh) — `cargo test`
- `render_smoke`: mở & render `hello.pdf`, trang không trắng trơn.
- `viewer_features` (6): `page_dims`, `extract_text`, `search` (số lượng+vị trí), phân biệt hoa thường, `outline`, `char_boxes` (ghép ký tự = nội dung + hộp nằm trong khổ trang).
- `big_doc` (3): file **1000 trang** — đúng số trang; render trang đầu/cuối < 5s & không trắng; search toàn tài liệu ra đúng 1 kết quả < 10s.
Hiệu năng đo thực tế trên `big-1000.pdf`: mở 55ms · render 1 trang 110ms · search toàn bộ 79ms.
## 3. Giới hạn đã biết của Phase 1 (sẽ tinh chỉnh)
- ~~Double-click chọn 1 ký tự~~ → **ĐÃ SỬA**: text-layer gom ký tự thành "từ", double-click chọn cả từ; copy giữ khoảng trắng (chèn text node giữa các từ). Đã verify: double-click → chọn nguyên từ "FoFreeXit".
- Chưa có: in ấn, xoay trang khi xem, nhớ file mở gần đây, kéo-thả file vào cửa sổ.
- `render_page` nạp lại tài liệu mỗi lần gọi (chưa cache document trong bộ nhớ) — đủ nhanh hiện tại, sẽ tối ưu bằng cache khi cần.
- Bản dev tìm `pdfium.dll` ở gốc workspace; bản phát hành (Phase 8) sẽ bundle.
## 4. Kiến trúc vẫn đúng định hướng
2 tầng COS/PD đã đặt khung (`ff-cos`, `ff-pdmodel`); engine tách hẳn UI, gọi được qua CLI + Tauri. Sẵn sàng cho Phase 2 (Annotate).