Phase 7: OCR & Convert — Tesseract lớp text ẩn (Việt+Anh), PDF→PNG/TXT/DOCX, Office↔PDF

Engine:
- ocr.rs MỚI: find_tesseract (sidecar như qpdf, env FOFREEXIT_TESSERACT_PATH);
  ocr_page_words (render 300 DPI → tesseract tsv → lọc confidence ≥30 → quy
  đổi pixel→điểm PDF); ocr_add_text_layer — thêm text object render-mode
  INVISIBLE đúng khung từng từ lên CHÍNH trang gốc (searchable PDF chuẩn,
  ảnh không đổi), font Unicode nhúng 1 lần, mặc định vie+eng
- convert.rs MỚI: export_images (PNG mỗi trang theo DPI), export_text,
  export_docx tự viết (gom char boxes thành dòng thị giác → đoạn Word với cỡ
  chữ xấp xỉ + ngắt trang; DOCX = zip STORE tự ghi kèm CRC-32, không thêm
  dependency); find_soffice + office_to_pdf + pdf_to_docx_via_soffice
  (LibreOffice headless, profile riêng -env:UserInstallation)

Tauri + UI (thanh 🔁 Chuyển đổi):
- Commands: ocr_run, convert_images, convert_txt, convert_docx (tự chọn
  LibreOffice nếu có → fallback bộ cơ bản, báo engine đã dùng),
  office_convert, convert_tools_status (UI disable nút + báo thiếu công cụ),
  pick_office_file, pick_save_as
- Nút: OCR (select Việt+Anh/Việt/Anh), Xuất PNG 150 DPI, Xuất TXT, Xuất Word,
  Office→PDF (mở luôn kết quả)

Test (6 mới → engine 73/73 xanh ngoài 2 fixture qpdf Linux):
- OCR tiếng Anh trên PDF-scan giả lập THẬT (xoá text chỉ còn ảnh render):
  extract + search thấy từ, toạ độ lớp ẩn khớp vùng chữ
- OCR tiếng Việt đúng dấu ("Việt Nam đất nước")
- export PNG 3 trang / TXT / DOCX (unzip hệ thống giải được, có ngắt trang)
- LibreOffice round-trip 2 chiều (tự bỏ qua nếu máy không có soffice)

Docs: 19-phase7-summary (+ giới hạn v-sau), 20-phase7-user-tests (C1–C10 kèm
hướng dẫn cài Tesseract/LibreOffice trên Windows), README, roadmap (Phase 7
HOÀN TẤT lõi), 14 (kế tiếp: Phase 8 phát hành).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HgnbPwSoRGNH7LHsDUmRpk
This commit is contained in:
2026-07-16 01:33:57 +00:00
co-authored by Claude Fable 5
parent ccdb839fca
commit b09bd7d750
12 changed files with 1075 additions and 15 deletions
+4 -4
View File
@@ -56,11 +56,11 @@ Một ứng dụng desktop có thể **xem, chú thích, tổ chức trang, và
- [x] Tạo field: text/checkbox/combo (radio-group/list/pushbutton: follow-up); import/export dữ liệu FDF + export CSV.
**DoD:** ✅ điền & lưu giữ dữ liệu (gồm tiếng Việt); tạo form mới; export/import FDF round-trip. Follow-up: XFDF, radio-group/list/pushbutton khi tạo.
## Phase 7 — OCR & Convert
## Phase 7 — OCR & Convert ✅ HOÀN TẤT lõi (73/73 test — xem [docs/19-phase7-summary.md](19-phase7-summary.md))
**Mục tiêu:** Hai tính năng "đáng tiền" còn lại, qua dự án mở.
- **OCR**: Tesseract + tiền xử lý ảnh + layout → tạo searchable PDF (lớp text vô hình khớp toạ độ). Đa ngôn ngữ gồm tiếng Việt.
- **Convert**: PDF→ảnh (sẵn từ PDFium); Office↔PDF qua **LibreOffice headless**; PDF→Word/Excel (giữ layout — bài toán khó, làm bản "đủ dùng" trước).
**DoD:** OCR scan tạo PDF search được (Việt + Anh); convert Office↔PDF ổn; PDF→Word giữ được text & bố cục cơ bản.
- [x] **OCR**: Tesseract → searchable PDF (lớp text vô hình khớp toạ độ trên trang GỐC). Việt + Anh, test đúng dấu. (Tiền xử lý ảnh deskew/denoise: follow-up.)
- [x] **Convert**: PDF→ảnh PNG; Office↔PDF qua **LibreOffice headless**; PDF→Word bản "đủ dùng" tự viết (text + bố cục cơ bản) + bản LibreOffice khi có; PDF→TXT. (PDF→Excel: follow-up.)
**DoD:** ✅ OCR scan search được (Việt + Anh, kiểm toạ độ); ✅ Office↔PDF round-trip; ✅ PDF→Word giữ text & bố cục cơ bản.
## Phase 8 — Hoàn thiện & Phát hành
- So sánh 2 PDF (compare); in ấn đúng; preferences; đa ngôn ngữ UI (Việt/Anh); accessibility.
+11 -10
View File
@@ -102,8 +102,8 @@ Xếp theo mức độ ảnh hưởng trải nghiệm:
|---|---|---|
| ~~Bảo mật, redaction, chữ ký số PAdES (Phase 5)~~ ✅ ĐÃ LÀM | AES-256+quyền, redaction thật (tỉa ký tự), **chữ ký số PKCS#7/CMS + xác thực + phát hiện giả mạo** (`sign.rs`), lưu tối ưu — 62/62 test | Đã giải; còn lại timestamp/LTV/PFX/multi-sig (docs/15 mục 6.6) |
| ~~Form AcroForm (Phase 6)~~ ✅ ĐÃ LÀM | Liệt kê/điền/tạo field (lopdf) + flatten (PDFium) + FDF/CSV — 67/67 test (`form.rs`) | Đã giải; còn XFDF, radio-group/list/pushbutton khi tạo (docs/17 mục 6) |
| OCR (Phase 7) | Tesseract (tiếng Việt có traineddata chuẩn) + lớp text ẩn — kỹ thuật giống watermark.rs đã làm | Thấp, chủ yếu là chất lượng tiền xử lý ảnh |
| Convert Office↔PDF (Phase 7) | LibreOffice headless; PDF→Word "đủ dùng" trước | PDF→Word giữ layout hoàn hảo là bài khó với CẢ Foxit — đặt kỳ vọng "tương đương Foxit" chứ không hơn |
| ~~OCR (Phase 7)~~ ✅ ĐÃ LÀM | Tesseract sidecar → lớp text ẩn khớp toạ độ, Việt+Anh có test đúng dấu (`ocr.rs`) | Đã giải; còn tiền xử lý deskew/denoise, OCR theo vùng |
| ~~Convert Office↔PDF (Phase 7)~~ ✅ ĐÃ LÀM | LibreOffice headless 2 chiều + PDF→DOCX/TXT/PNG tự viết fallback (`convert.rs`) | Đã giải mức "đủ dùng"; PDF→Excel + layout hoàn hảo là follow-up |
| So sánh PDF, in ấn, installer (Phase 8) | render diff đã có nền; Tauri bundler | Thấp |
## 4. Đánh giá định hướng công nghệ (giữ hay đổi?)
@@ -136,16 +136,17 @@ redaction thật kiểm chứng được, xoá metadata — docs/15)**.
**Phase 5 đã HOÀN TẤT** (iter 1+2): mã hoá+quyền, gỡ mật khẩu, redaction thật
+ tỉa ký tự, xoá metadata, **chữ ký số PKCS#7/PAdES + xác thực**, lưu tối ưu.
**Phase 6 đã HOÀN TẤT lõi**: liệt kê/điền/tạo field, flatten, FDF/CSV.
**Phase 6 + 7 đã HOÀN TẤT lõi**: form đầy đủ; OCR Việt+Anh; convert
PNG/TXT/DOCX + Office↔PDF.
Thứ tự đề xuất tiếp theo, bám giá trị người dùng:
1. **Phase 7 — OCR & Convert**: OCR Tesseract (Việt+Anh) tạo lớp text ẩn;
convert Office↔PDF qua LibreOffice headless; PDF→Word/Excel "đủ dùng".
2. Phase 8 — phát hành (installer, so sánh PDF, in ấn, đa ngôn ngữ UI).
3. Song song, rải theo từng phase: mở rộng font matching (3.4), nấc 1 của
hiệu năng phiên sửa (3.2) khi chạm file lớn thực tế, v2 của reflow
(justify/xoay — mục 3.1), nâng chữ ký (timestamp/LTV/PFX/multi-sig), và
nâng form (XFDF, radio-group/list/pushbutton, appearance riêng).
1. **Phase 8 — Hoàn thiện & Phát hành**: installer Windows (MSI/winget qua
Tauri bundler), in ấn, so sánh 2 PDF, preferences, đa ngôn ngữ UI (Việt/
Anh), tối ưu hiệu năng + bộ test hồi quy đầy đủ.
2. Song song, rải dần: mở rộng font matching (3.4), nấc 1 hiệu năng phiên
sửa (3.2), reflow v2 (justify/xoay — 3.1), nâng chữ ký (timestamp/LTV/
PFX/multi-sig), nâng form (XFDF, radio-group), OCR tiền xử lý ảnh,
PDF→Excel.
## 6. Checklist FINAL TARGET & RULE cho chính tài liệu này
- [x] Đối chiếu từng tính năng với hành vi Foxit làm chuẩn nghiệm thu.
+66
View File
@@ -0,0 +1,66 @@
# 19 — Tổng kết Phase 7 (OCR & Convert)
> Trạng thái: **HOÀN TẤT lõi.** OCR Tesseract (Việt + Anh) tạo lớp text ẨN
> khớp toạ độ lên trang gốc; PDF→PNG/TXT/DOCX; Office↔PDF qua LibreOffice.
> 6 test mới, tổng engine **73/73 xanh** (ngoài 2 fixture qpdf Linux).
## 1. Khảo sát Foxit (chuẩn nghiệm thu)
- **OCR (Recognize Text)**: chọn ngôn ngữ → chạy trên tài liệu scan → file
thành searchable/copy được, hình ảnh gốc GIỮ NGUYÊN (text ẩn dưới ảnh).
- **Convert**: PDF→ảnh/Word/Excel/text; Office→PDF.
## 2. Kiến trúc — sidecar CLI như qpdf
- **Tesseract** (OCR) và **LibreOffice headless** (Office↔PDF) là công cụ
ngoài, tìm qua env (`FOFREEXIT_TESSERACT_PATH`/`FOFREEXIT_SOFFICE_PATH`) →
PATH. Không có thì các tính năng khác vẫn chạy, nút liên quan báo rõ.
- PDF→PNG/TXT/DOCX cơ bản tự làm bằng PDFium + code riêng — không phụ thuộc gì.
## 3. Đã làm — Engine
### `ocr.rs`
- `ocr_page_words`: render trang **300 DPI** → `tesseract ... tsv` → parse
bảng từ (bbox pixel + confidence, lọc <30) → quy đổi pixel→điểm PDF.
- `ocr_add_text_layer`: OCR các trang rồi thêm text object **render mode
Invisible** đúng khung từng từ lên CHÍNH trang gốc (không đổi hình ảnh) —
đúng cơ chế searchable PDF chuẩn. Font Unicode (đủ dấu tiếng Việt) nhúng 1
lần. Ngôn ngữ `vie+eng` mặc định.
### `convert.rs`
- `export_images(dpi)`: mỗi trang 1 PNG `<tên>-pN.png`.
- `export_text`: toàn bộ text các trang → .txt.
- `export_docx` (tự viết, "đủ dùng"): gom char boxes thành DÒNG thị giác
(cùng heuristic UI edit) → mỗi dòng 1 đoạn Word với **cỡ chữ xấp xỉ** +
ngắt trang giữa các trang; DOCX = zip tự ghi (method STORE, CRC-32 tự tính,
không thêm dependency) — Word/LibreOffice/unzip đọc chuẩn.
- `office_to_pdf` / `pdf_to_docx_via_soffice`: LibreOffice headless với
profile riêng (`-env:UserInstallation`) để không đụng LibreOffice đang mở;
PDF→DOCX dùng `--infilter=writer_pdf_import` (layout tốt hơn bản tự viết).
## 4. Tauri + UI (thanh "🔁 Chuyển đổi")
- Commands: `ocr_run` (chọn ngôn ngữ), `convert_images`, `convert_txt`,
`convert_docx` (**tự chọn engine**: LibreOffice nếu có → fallback bộ cơ bản,
báo rõ đã dùng gì), `office_convert`, `convert_tools_status` (UI disable
nút + hiện thiếu công cụ nào).
- Nút: 🔍 OCR (select Việt+Anh/Việt/Anh), 🖼 Xuất PNG (150 DPI), 📄 Xuất TXT,
📘 Xuất Word, 📥 Office→PDF (mở luôn PDF kết quả).
## 5. Test (6 mới → engine 73/73)
- `ocr_makes_scanned_pdf_searchable_english` — dựng PDF-scan giả lập THẬT
(xoá hết text, chỉ còn ảnh render — extract rỗng như scan) → OCR → từ tìm
được qua extract + search, **toạ độ lớp ẩn khớp vùng chữ** trên ảnh.
- `ocr_vietnamese_diacritics` — "Việt Nam đất nước" nhận dạng ĐÚNG DẤU.
- `export_images_per_page` (3 trang → 3 PNG đúng cỡ); `export_text_all_pages`.
- `export_docx_basic_layout` — docx là zip chuẩn (unzip hệ thống giải được),
document.xml chứa text + ngắt trang.
- `libreoffice_round_trip_when_available` — PDF→DOCX (LibreOffice) và
DOCX→PDF: PDF kết quả mở được, nội dung giữ nguyên. Tự bỏ qua nếu máy
không có soffice.
## 6. Giới hạn (v-sau, không chặn dùng)
- OCR: chưa tiền xử lý ảnh (deskew/denoise) cho scan nghiêng/mờ; chưa chọn
vùng OCR; lớp ẩn đặt theo khung TỪ (chuẩn phổ biến), chưa scale ngang từng
glyph (Tz) nên bôi chọn có thể lệch nhẹ ở từ rất dài.
- PDF→DOCX bản tự viết: giữ text + thứ tự đọc + cỡ chữ tương đối; KHÔNG tái
tạo cột/bảng/ảnh (LibreOffice lo phần đó khi máy có cài). PDF→Excel chưa làm.
- Windows: cần cài Tesseract (UB Mannheim build, tick gói Vietnamese) và/hoặc
LibreOffice; ghi trong docs/05 + checklist docs/20.
+37
View File
@@ -0,0 +1,37 @@
# 20 — Checklist test thủ công Phase 7 (OCR & Convert)
Chuẩn bị trên Windows:
- **Tesseract**: cài bản UB Mannheim (github tesseract-ocr), tick thêm gói
ngôn ngữ **Vietnamese**; hoặc đặt `FOFREEXIT_TESSERACT_PATH`.
- **LibreOffice** (cho Office↔PDF chất lượng cao): cài bản thường; hoặc đặt
`FOFREEXIT_SOFFICE_PATH` trỏ tới soffice.exe.
## Chạy
```powershell
cd c:\Project\FoFreeXit\app\src-tauri
cargo run
```
## Bảng test
| # | Thao tác | Kỳ vọng | KQ |
|---|----------|---------|----|
| C1 | Bấm **🔁 Chuyển đổi** | Hiện thanh; nếu thiếu Tesseract/LibreOffice có ghi chú + nút tương ứng mờ | |
| C2 | Mở 1 PDF **scan** (hoặc ảnh chụp tài liệu in ra PDF) → **🔍 OCR** (Việt + Anh) → lưu | Chạy xong báo số từ; file mới nhìn Y HỆT bản gốc | |
| C3 | Trong file C2: Ctrl+F tìm 1 từ có trong ảnh; bôi chọn & copy đoạn chữ | Tìm THẤY, vị trí highlight đúng chỗ; copy ra đúng chữ (kể cả **tiếng Việt có dấu**) | |
| C4 | Mở file C2 ở Foxit/Adobe → search/copy | Hoạt động như C3 (lớp text ẩn chuẩn) | |
| C5 | **🖼 Xuất PNG** → chọn thư mục | Mỗi trang 1 file PNG rõ nét (150 DPI) | |
| C6 | **📄 Xuất TXT** | File .txt chứa đủ text các trang | |
| C7 | **📘 Xuất Word** (máy CÓ LibreOffice) → mở .docx bằng Word | Mở được; chữ + bố cục gần bản gốc; status ghi "LibreOffice" | |
| C8 | **📘 Xuất Word** (máy KHÔNG LibreOffice) → mở .docx bằng Word | Mở được; đủ text đúng thứ tự, cỡ chữ tương đối, ngắt trang đúng; status ghi "bộ chuyển cơ bản" | |
| C9 | **📥 Office → PDF**: chọn 1 file .docx → thư mục ra | PDF tạo ra mở được trong app, nội dung đúng | |
| C10 | OCR file 20+ trang | Chạy hết (có thể vài phút), không crash, số từ hợp lý | |
## Mẫu phản hồi
```
[Mã] (vd C3) — Phần mềm mở: <Foxit/Adobe/Chrome/Word> — Hiện tượng: <mô tả> —
Kỳ vọng: <...> — Ưu tiên: cao/vừa/thấp
```
> Giới hạn đã biết: OCR chưa tiền xử lý scan nghiêng/mờ; PDF→Word bộ cơ bản
> không tái tạo cột/bảng/ảnh (cài LibreOffice để có layout tốt); PDF→Excel
> chưa làm — xem `docs/19-phase7-summary.md` mục 6.