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.
158 lines
12 KiB
Markdown
158 lines
12 KiB
Markdown
# 01 — Nghiên cứu: Tính năng, Khó khăn, Thuật toán, Thư viện
|
||
|
||
## A. Tính năng của Foxit PDF Editor
|
||
|
||
Foxit có 3 dòng: **PDF Editor**, **PDF Editor Pro**, **PDF Editor Pro+** (subscription, kèm AI/cloud).
|
||
Giá tham khảo (2025–2026): subscription từ ~$11.99/tháng; **lifetime/perpetual ~$159–$210**; Pro+ chỉ bán subscription. Enterprise báo giá riêng.
|
||
|
||
### Nhóm tính năng (theo mức độ quan trọng với người dùng)
|
||
|
||
#### 1. Xem & điều hướng (View) — *table stakes, miễn phí ở mọi reader*
|
||
- Render PDF chính xác, mượt; zoom, fit, thumbnails, bookmarks/outline, search full-text.
|
||
- Continuous scroll, two-page, reading mode, dark mode.
|
||
- Mở file lớn nhanh (lazy load từng trang).
|
||
|
||
#### 2. Chú thích (Annotate / Comment) — *quan trọng, dùng hằng ngày*
|
||
- Highlight, underline, strikethrough, squiggly.
|
||
- Sticky notes, text box, callout, stamp, drawing (pencil/shapes), measure.
|
||
- Reply/threads cho comment, import/export annotation (FDF/XFDF).
|
||
|
||
#### 3. **Chỉnh sửa nội dung (Edit) — TÍNH NĂNG "ĐÁNG TIỀN" SỐ 1** ⭐
|
||
- **Sửa text trực tiếp** trên trang (reflow trong đoạn, đổi font/size/màu).
|
||
- Thêm/xoá/di chuyển/đổi kích thước **ảnh** và **đối tượng** (object).
|
||
- Edit cả paragraph, link/unlink text box, OCR rồi sửa text trên ảnh scan.
|
||
- Đây là rào cản kỹ thuật lớn nhất và là lý do chính người dùng trả tiền — các reader miễn phí (đa số) **không** làm được.
|
||
|
||
#### 4. Tổ chức trang (Organize) — *quan trọng, đáng tiền*
|
||
- Chèn/xoá/xoay/trích/thay/đảo trang, **merge & split**, crop, đánh số, header/footer, watermark, background.
|
||
- Sắp xếp kéo-thả thumbnail.
|
||
|
||
#### 5. Chuyển đổi (Convert) — *rất đáng tiền* ⭐
|
||
- PDF ↔ Word/Excel/PowerPoint, PDF → ảnh, ảnh/Office → PDF.
|
||
- Chất lượng chuyển đổi (giữ layout) là điểm bán hàng then chốt.
|
||
|
||
#### 6. **OCR** — *rất đáng tiền* ⭐
|
||
- Nhận dạng text trên scan (đa ngôn ngữ), tạo "searchable PDF".
|
||
- Foxit 2025.2 quảng cáo OCR vượt Adobe ở chữ số/checkbox/handwriting.
|
||
|
||
#### 7. Form (AcroForm / XFA) — *đáng tiền với doanh nghiệp*
|
||
- Điền form, **tạo form** (text field, checkbox, radio, dropdown, button), nhận dạng field tự động, import/export dữ liệu form.
|
||
|
||
#### 8. Bảo mật & chữ ký — *đáng tiền với doanh nghiệp* ⭐
|
||
- Mật khẩu (mở/permission), **mã hoá AES**, redaction (bôi đen vĩnh viễn), xoá metadata ẩn.
|
||
- **Chữ ký số** (digital signature/PKI), chứng thực, timestamp; **eSign** (cloud).
|
||
|
||
#### 9. So sánh & cộng tác
|
||
- Compare 2 phiên bản PDF, shared review, cloud collaboration (Pro+).
|
||
|
||
#### 10. AI (Pro+) — *xu hướng mới*
|
||
- Tóm tắt, hỏi-đáp tài liệu, dịch, chat với PDF.
|
||
|
||
### ➜ Kết luận: Tính năng khiến người dùng phải mua license
|
||
Theo thứ tự "moat" (khó làm + người dùng sẵn sàng trả tiền):
|
||
1. **Edit text/object trực tiếp** (rào cản kỹ thuật cao nhất).
|
||
2. **Convert PDF→Office giữ layout** (Word/Excel).
|
||
3. **OCR** chất lượng cao, đa ngôn ngữ.
|
||
4. **Bảo mật**: redaction thật, mã hoá, chữ ký số.
|
||
5. **Tạo & xử lý form** (AcroForm).
|
||
6. **Organize**: merge/split/crop hàng loạt.
|
||
|
||
> Chiến lược FoFreeXit: chiếm các tính năng (1), (4), (6), (organize) trước — vốn có thể tự làm tốt trên nền engine mở. (2) Convert và (3) OCR sẽ tận dụng dự án mở khác (LibreOffice headless, Tesseract). AI để sau cùng.
|
||
|
||
---
|
||
|
||
## B. Khó khăn kỹ thuật (xếp theo độ khó)
|
||
|
||
### B1. Bản chất định dạng PDF
|
||
- PDF **không phải định dạng để chỉnh sửa**: nó mô tả "vẽ gì ở toạ độ nào", không lưu cấu trúc đoạn/dòng/bảng như Word. Text là chuỗi lệnh `Tj/TJ` đặt glyph theo toạ độ → **không có khái niệm "đoạn văn"**.
|
||
- Đặc tả PDF (ISO 32000) cực lớn; vô số file "hợp lệ một phần", file hỏng, file sinh bởi công cụ lạ → cần **độ bền (robustness)** rất cao.
|
||
|
||
### B2. Sửa text trực tiếp (khó nhất) ⭐
|
||
- Phải **tái dựng dòng/đoạn** từ các glyph rời rạc (gom theo toạ độ, baseline, khoảng cách) → suy ra "text run".
|
||
- Khi sửa: cần **đo lại chiều rộng glyph** theo font thật, **reflow** phần còn lại của dòng/đoạn, xử lý ligature, kerning, justification.
|
||
- **Font**: file có thể nhúng font subset (chỉ chứa glyph đã dùng) → muốn gõ ký tự mới phải có glyph đó; nếu không, phải **substitute font** giống nhất rồi nhúng/subset lại. Encoding phức tạp (CID, CMap, Type0, Type3).
|
||
- Văn bản phức tạp: RTL (Ả Rập/Do Thái), chữ Đông Á (CJK), **tiếng Việt dấu** (tổ hợp dấu), shaping (HarfBuzz).
|
||
|
||
### B3. Render chính xác
|
||
- Render giống Acrobat: blend modes, transparency groups, soft mask, shading/gradient, pattern, overprint, ICC color management, CMYK.
|
||
- Hiệu năng: file hàng nghìn trang, ảnh độ phân giải cao → cần cache, tile, đa luồng, GPU (tuỳ chọn).
|
||
|
||
### B4. OCR
|
||
- Tích hợp engine (Tesseract), tiền xử lý ảnh (deskew, denoise, binarize), bố cục (layout analysis), khớp toạ độ text vào trang để tạo lớp text vô hình → searchable PDF.
|
||
|
||
### B5. Convert PDF → Office
|
||
- "Bài toán ngược": từ glyph dựng lại đoạn/bảng/cột/heading của Word. **Rất khó giữ layout**. Đây là nơi cả Adobe lẫn Foxit đều chưa hoàn hảo.
|
||
|
||
### B6. Bảo mật làm đúng
|
||
- **Redaction**: phải **xoá thật** nội dung khỏi content stream + metadata + ảnh, không chỉ vẽ hộp đen lên trên (lỗi này từng làm lộ tài liệu chính phủ).
|
||
- Mã hoá RC4/AES, permission, public-key security handler; **chữ ký số** đúng chuẩn PAdES (byte range, /ByteRange, incremental update không phá chữ ký cũ).
|
||
|
||
### B7. Ghi file an toàn
|
||
- **Incremental update** (ghi thêm cuối file, giữ chữ ký) vs **full rewrite** (gọn, tối ưu). Cần xử lý xref/xref-stream, object stream, linearization ("fast web view").
|
||
- Không làm hỏng file gốc; undo/redo cho thao tác sửa.
|
||
|
||
### B8. UX desktop chất lượng cao
|
||
- Tương tác mượt (chọn text qua nhiều trang, kéo object), đa nền tảng, in ấn đúng, accessibility, đa ngôn ngữ UI.
|
||
|
||
---
|
||
|
||
## C. Thuật toán & kiến trúc của Foxit / Adobe (học hỏi được gì)
|
||
|
||
> Foxit & Adobe là mã đóng; dưới đây là suy luận từ tài liệu SDK công khai, cấu trúc đặc tả PDF, và kiến trúc các engine mở tương đương. Mục tiêu: **học mô hình kiến trúc**, không sao chép.
|
||
|
||
### C1. Foxit
|
||
- **Core engine viết bằng C++**; cung cấp SDK với binding C++, C#, C, Java, Python. Kiến trúc tách lớp rõ: **Core (parser + render + edit) → API → UI**.
|
||
- Render engine riêng (không dùng PDFium công khai), tối ưu tốc độ & bộ nhớ — Foxit nổi tiếng "nhẹ và nhanh".
|
||
- Mô hình edit dựa trên **page object model**: trang = tập object (text/path/image/form-xobject), edit = thao tác trên object rồi serialize lại content stream.
|
||
|
||
### C2. Adobe Acrobat
|
||
- Lõi C/C++ lâu đời (PDF do Adobe phát minh). **PDFL (PDF Library)** + Acrobat core; tách "Cos layer" (Carousel Object System — model object thấp tầng: dict/array/stream) và "PD layer" (Page Description — trang, annotation, form).
|
||
- Bài học quan trọng: **mô hình 2 tầng**:
|
||
- *Tầng object thấp (COS)*: đọc/ghi cấu trúc PDF (dictionary, stream, xref) — tương ứng QPDF/pikepdf.
|
||
- *Tầng tài liệu cao (PD)*: trang, annotation, form, content stream parsed thành object — tương ứng PDFium/MuPDF.
|
||
- Liquid Mode (mobile reflow) của Adobe dùng ML để suy ra cấu trúc đọc → cho thấy hướng "tái dựng cấu trúc" là bài toán AI/heuristic.
|
||
|
||
### ➜ Bài học kiến trúc áp dụng cho FoFreeXit
|
||
1. **Tách 2 tầng**: `cos` (cấu trúc) và `pdmodel` (trang/object/annotation) — đúng như Adobe/PDFBox làm.
|
||
2. **Page Object Model** cho editing: parse content stream → cây object → sửa → serialize.
|
||
3. **Undo/redo** ở tầng model bằng command pattern.
|
||
4. Tách hẳn **engine** (không phụ thuộc UI) khỏi **UI**, để test tự động và tái dùng (CLI, server).
|
||
|
||
---
|
||
|
||
## D. Khảo sát thư viện PDF (mọi ngôn ngữ) & giấy phép
|
||
|
||
> Giấy phép là yếu tố sống còn: muốn phân phối tự do, **tránh AGPL** (MuPDF, iText) trừ khi chấp nhận copyleft hoặc mua license.
|
||
|
||
| Thư viện | Ngôn ngữ | Render | Edit text/obj | Cấu trúc/repair | Giấy phép | Ghi chú |
|
||
|----------|----------|:------:|:------:|:------:|----------|------|
|
||
| **PDFium** | C/C++ | ⭐ rất tốt | ✔ có API (`FPDFPageObj_*`, `FPDFText_*`) | một phần | **BSD-3 (permissive)** | Engine của Chrome; binary prebuilt sẵn (bblanchon/pdfium-binaries). Nền tảng lý tưởng. |
|
||
| **QPDF** | C++ | ✘ | ✘ (cấu trúc) | ⭐ xuất sắc | Apache-2.0 | Repair, linearize, encrypt, object stream. Bổ trợ cho PDFium. |
|
||
| pikepdf | Python | ✘ | ✘ | ⭐ (wrap QPDF) | MPL-2.0 | Bản Python của QPDF, tốt cho prototype. |
|
||
| MuPDF | C | ⭐ | ✔ | ✔ | **AGPL/commercial** | Mạnh nhưng copyleft → tránh cho bản đóng. |
|
||
| PyMuPDF | Python | ⭐ | ✔ | ✔ | **AGPL/commercial** | Tốt để prototype/nghiên cứu, không ship. |
|
||
| iText | Java/.NET | một phần | ✔ tạo | ✔ | **AGPL/commercial $$$** | Tránh trừ khi mua. |
|
||
| Apache PDFBox | Java | ✔ ok | ✔ | ✔ | **Apache-2.0** | Permissive, full-feature, tham khảo thuật toán rất tốt (mã đọc được). |
|
||
| PDF.js | JS | ✔ (web) | ✘ (gần như render-only) | một phần | Apache-2.0 | Của Mozilla; tốt cho web viewer, không edit sâu. |
|
||
| pdf-lib | JS/TS | ✘ | ✔ (tạo/sửa cơ bản) | ✔ | MIT | Thuần JS, tạo & sửa nhẹ. |
|
||
| pdfcpu | Go | ✘ | thao tác trang | ✔ | Apache-2.0 | CLI mạnh cho organize/encrypt. |
|
||
| lopdf / pdf-rs / printpdf | Rust | một phần | ✔ thấp tầng / tạo | ✔ | MIT/Apache | Ecosystem Rust đang lớn, chưa bằng PDFium. |
|
||
| Tesseract | C++ | — | — (OCR) | — | Apache-2.0 | Engine OCR mở tốt nhất. |
|
||
| HarfBuzz | C++ | — | text shaping | — | MIT | Bắt buộc cho shaping (Việt/CJK/RTL). |
|
||
| FreeType | C | — | font rasterize | — | FTL/GPL | Đọc & render font. |
|
||
| LibreOffice (headless) | C++ | — | convert | — | MPL-2.0 | Dùng `soffice --convert-to` cho PDF↔Office. |
|
||
|
||
### ➜ Tận dụng được gì
|
||
- **Nền engine**: PDFium (render + edit object) + QPDF (cấu trúc/encrypt/repair) — cả hai permissive → **không phải viết parser/renderer từ đầu**.
|
||
- **OCR**: Tesseract. **Shaping**: HarfBuzz. **Font**: FreeType. **Convert Office**: LibreOffice headless.
|
||
- **Tham khảo thuật toán** (đọc mã được): Apache PDFBox (Java, permissive) cho cách dựng text run, content stream, form; pdf.js cho rendering model.
|
||
- **Tránh**: MuPDF/PyMuPDF/iText cho bản phân phối (AGPL) — chỉ dùng để học/prototype.
|
||
|
||
## Nguồn tham khảo
|
||
- [Foxit vs Adobe 2025](https://pdfpro.com/blog/general/foxit-vs-adobe) · [Foxit pricing](https://www.trustradius.com/products/foxit-pdf-editor/pricing) · [Foxit Editor blog](https://www.foxit.com/blog/the-new-foxit-pdf-editor-and-pdf-editor/)
|
||
- [Foxit PDF SDK for C++](https://developers.foxit.com/developer-hub/document/developer-guide-pdf-sdk/)
|
||
- [PDFium fpdf_edit.h](https://pdfium.googlesource.com/pdfium/+/refs/heads/main/public/fpdf_edit.h) · [PDFium LICENSE](https://pdfium.googlesource.com/pdfium/+/main/LICENSE)
|
||
- [pikepdf](https://github.com/pikepdf/pikepdf) · [Survey of Open-Source PDF Solutions (PDFA)](https://pdfa.org/wp-content/uploads/2021/06/Survey-of-OpenSource-Solutions.pdf)
|
||
- [Comparing open source PDF libraries (2025) — Joyfill](https://joyfill.io/blog/comparing-open-source-pdf-libraries-2025-edition) · [awesome-pdf](https://github.com/py-pdf/awesome-pdf)
|
||
- [MuPDF license](https://mupdf.readthedocs.io/en/1.27.0/license.html)
|