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.
3.5 KiB
3.5 KiB
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. - 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ằngcd 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ở & renderhello.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_pagenạ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).