--------------- <> -----------------
--- KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM ---
--- Học để đi cùng bà con trên thế giới ---

Tìm kiếm trong Blog

Ebook2LateX (2) - Phân tích hệ thống

Bài trước: Ebook2LateX (1) - Hiểu yêu cầu và chọn công nghệ
-----

2. Phân tích hệ thống

2.1 Cấu trúc thư mục dự án

Ebook2LateX/

├── .git/                   # Thư mục ẩn của Git

├── .gitignore              # Khai báo các tập không đưa vào Git

├── docker-compose.yml       # File điều phối toàn bộ hệ thống Docker

├── backend/                # Python (FastAPI)

│   ├── Dockerfile          # Cách đóng gói Backend

│   ├── app/

│   │   ├── main.py         # Điểm khởi đầu của API

│   │   ├── api/            # Các endpoint (upload, process, save)

│   │   ├── core/           # Cấu hình hệ thống, OCR model loading

│   │   ├── models/         # Định nghĩa bảng database (SQLAlchemy)

│   │   ├── services/       # Logic xử lý PDF & OCR (Parse tool)

│   │   └── schemas/        # Pydantic models (Validation dữ liệu)

│   ├── uploads/            # Lưu tạm file PDF người dùng gửi lên

│   ├── requirements.txt

│   └── .env                # Biến môi trường (DB_URL, API_KEY)

├── frontend/               # React (Vite)

│   ├── Dockerfile          # Cách đóng gói Frontend

│   ├── src/

│   │   ├── components/     # MathLiveEditor, PDFUploader, Preview

│   │   ├── hooks/          # Custom hooks xử lý logic LaTeX

│   │   ├── services/       # Kết nối API tới Backend

│   │   └── App.jsx

│   ├── package.json

│   └── public/

2.2 Các thành phần logic chính

A. Backend: Bộ máy Parse tool

Đây là phần quan trọng nhất để giải quyết yêu cầu [FR1]

- Xử lý PDF: Dùng thư viện PyMuPDF (fitz) để trích xuất hình ảnh từ PDF

- OCR Toán học: Để chuyển hình ảnh công thức sang LaTeX, sử dụng mô hình pix2tex (LaTeX-OCR)

- API: Khi nhận tập tin PDF, Backend sẽ cắt các vùng chứa công thức, chạy qua model OCR và trả về chuỗi LaTeX cho Frontend

B. Frontend: Trình soạn thảo hai chiều (React + MathLive)

Để giải quyết yêu cầu [FR2] (sửa bên này cập nhật bên kia):

- MathLive: Sử dụng thư viện mathlive (JavaScript). Thư viện này cung cấp một <math-field> có thể lắng nghe sự kiện thay đổi

- Logic đồng bộ: Tạo một State trong React (ví dụ: latexContent)

    + Khi người dùng gõ vào ô Textarea (LaTeX): Cập nhật State -> MathField render lại

    + Khi người dùng sửa trên MathField: Lấy giá trị .value (dạng latex) -> Cập nhật State -> Textarea cập nhật theo

C. Database: Lưu trữ (PostgreSQL)

Giải quyết yêu cầu [FR3]:

- Bảng dữ liệu cơ bản: Documents (ID, FileName, CreatedAt) và FormulaEntries (ID, DocumentID, RawLatex, Status)

2.3 Công nghệ chi tiết

- Backend Framework: FastAPI. Framework này chạy nhanh, hỗ trợ xử lý bất đồng bộ tốt khi gọi các model AI nặng

- OCR Library: pix2tex hoặc sử dụng API của Mathpix (nếu muốn độ chính xác tuyệt đối mà không cần tự train model)

- Frontend UI: Tailwind CSS (để dàn trang giao diện chỉnh sửa nhanh chóng)

- Frontend Framework: React.js — Dùng để quản lý trạng thái (State) của công thức toán học và điều khiển luồng dữ liệu giữa các thành phần

- Math Library: MathLive — Thư viện chuyên biệt nhúng vào React để hiển thị và chỉnh sửa ký hiệu toán học trực quan

- ORM: SQLAlchemy (để làm việc với PostgreSQL một cách chuyên nghiệp)

3. Các giai đoạn thực hiện

3.1 Giai đoạn 1: Thiết lập nền tảng và Cơ sở dữ liệu

Giai đoạn này chuẩn bị môi trường để thực hiện yêu cầu [FR3]

[GD1.1] Khởi tạo dự án

- Tạo cấu trúc thư mục gồm tên dự án Ebook2LateX, backend/ và frontend/ như sơ đồ

- Khởi tạo Git

- Tạo file: .gitignore

- Tạo repo trên Github

[GD1.2] Cài đặt PostgreSQL: Thiết lập database và tạo các bảng Documents và FormulaEntries để lưu trữ dữ liệu

[GD1.3] Cấu hình Backend: Cài đặt FastAPI và SQLAlchemy. Kết nối thành công từ Python đến PostgreSQL để sẵn sàng ghi dữ liệu

[GD1.4] Docker hóa môi trường phát triển

- Tạo Dockerfile cho Backend: Định nghĩa môi trường chạy Python, cài đặt các thư viện OCR và FastAPI

- Tạo Dockerfile cho Frontend: Định nghĩa môi trường chạy Node.js để build ứng dụng React

- Tạo docker-compose.yml: Đây là "nhạc trưởng" điều phối 3 dịch vụ: db: Chạy hình ảnh của PostgreSQL; backend: Chạy mã FastAPI; frontend: Chạy mã React

3.2 Giai đoạn 2: Xây dựng "Parse tool" (Xử lý PDF & OCR)

Giai đoạn này tập trung vào việc giải quyết yêu cầu [FR1]

[GD2.1] Trích xuất hình ảnh từ PDF: Sử dụng thư viện PyMuPDF để đọc tập tin PDF và cắt ra các vùng chứa công thức toán học

[GD2.2] Tích hợp Model OCR: Cài đặt mô hình pix2tex (LaTeX-OCR) vào thư mục services/

[GD2.3] Tạo API xử lý: Viết endpoint trong FastAPI để nhận tập tin PDF từ người dùng, chạy qua quy trình OCR và trả về chuỗi ký tự LaTeX

3.3 Giai đoạn 3: Phát triển Giao diện và Logic đồng bộ

Giai đoạn này hiện thực hóa yêu cầu [FR2] về tính tương tác

[GD3.1] Khởi tạo Frontend: Sử dụng React (Vite) và Tailwind CSS để dựng giao diện cơ bản gồm khu vực tải tập tin và khu vực biên tập

[GD3.2] Tích hợp MathLive: Nhúng thành phần <math-field> vào ứng dụng để hiển thị công thức trực quan

[GD3.3] Lập trình đồng bộ hai chiều:

    + Tạo State latexContent trong React

    + Viết logic để khi sửa ô văn bản (LaTeX raw), công thức trong MathLive tự động cập nhật

    + Ngược lại, khi sửa bằng biểu tượng trong MathLive, nội dung text LaTeX cũng thay đổi tương ứng

3.4 Giai đoạn 4: Hoàn thiện quy trình dữ liệu (Submit)

Kết nối các thành phần lại để hoàn tất yêu cầu [FR3]

[GD4.1] Kết nối Front-End và Back-End: Sử dụng thư viện axios để gửi nội dung LaTeX cuối cùng từ giao diện về API của FastAPI

[GD4.2] Xử lý lưu trữ: Backend nhận dữ liệu và sử dụng SQLAlchemy để lưu bản ghi vào PostgreSQL

3.5 Giai đoạn 5: Kiểm thử và Triển khai

[GD5.1] Kiểm thử (Testing): Thử nghiệm với các tập tin PDF toán học có độ phức tạp khác nhau để tinh chỉnh model OCR

[GD5.1] Đóng gói dự án: Viết tập tin docker-compose.yml để có thể chạy toàn bộ hệ thống (Web, API, DB) chỉ bằng một câu lệnh

-----
Bài sau:

Ebook2LateX (1) - Hiểu yêu cầu và chọn công nghệ

1. Yêu cầu hệ thống

1.1 Sơ đồ hệ thống


1.2 Mô tả yêu cầu

[FR1] Hệ thống đọc tài liệu Ebook toán học dạng PDF, chỉ đọc các công thức toán học, đưa lên Giao diện

[FR2] Trên Giao diện: chuyển công thức toán từ ebook sang dạng LateX và dạng biểu thức toán học tương ứng, cho phép người dùng sửa nội dung trên giao diện. Khi sửa nội dung bên LateX thì bên Mathlive Symbol sẽ cập nhật theo, và ngược lại, sửa bên Mathlive Symbol thì bên LateX cũng cập nhật 

[FR3] Khi người dùng bấm nút Submit, nội dung LateX sẽ được lưu xuống Database

1.3 Lựa chọn công nghệ

- Loại ứng dụng: Web app

- Back-end: Python (FastAPI)

- Front-end: React

- Database: PostgreSQL

1.4 Bài tập và câu hỏi

Bài tập

Trả lời các câu hỏi sau, ghi lại vào trong sổ tay môn học.

Câu 1a. Tài liệu dạng PDF là gì? Tại sao được sử dụng nhiều?

Câu 1b. Tài liệu dạng LateX là gì? Dùng để làm gì?

Câu 1c. Mathlive symbol là gì? Dùng để làm gì? Tại sao lại phải chuyển đổi qua lại giữa PDF - LateX; LateX - Mathlive symbol?

Câu 1d. Ứng dụng trên làm bằng Desktop app hay Web app thì tốt hơn? Giải thích tại sao?

Câu 1e. Phân tích ưu và nhược điểm khi lựa chọn giải pháp CSR (client-side rendering) và SSR (server-side rendering)

Câu hỏi ôn tập

Câu 1.1 Bạn có thể sử dụng các hệ quản trị cơ sở dữ liệu sau để lưu trữ dữ liệu? Đáp án nào không đúng?

A. React

B. PostgreSQL

C. MongoDB

D. SQLite

Câu 1.2 Bạn có thể sử dụng các công nghệ sau đây để xây dựng phần Backend của hệ thống, đáp án nào không đúng?

A. Node.js (Express)

B. PHP (Laravel)

C. Python (FastAPI)

D. JavaScript (ReactJS)

Câu 1.3 Giả sử bạn đang xây dựng ứng dụng OCR toán học cho các giáo viên ở vùng sâu vùng xa, nơi kết nối Internet rất chập chờn nhưng họ cần xử lý hàng trăm trang tài liệu mỗi ngày. Lựa chọn nào sau đây là tối ưu nhất về mặt kỹ thuật?

A. Xây dựng ứng dụng chạy trên nền tảng Cloud (SaaS)

B. Xây dựng Web App với giải pháp Server-Side Rendering (SSR)

C. Xây dựng Web App sử dụng Client-Side Rendering (CSR)

D. Xây dựng Desktop App chạy offline hoàn toàn trên máy tính

Câu 1.4 Nếu ưu tiên quan trọng nhất của dự án là tối ưu hóa SEO để các công thức toán học lưu trong Database có thể được tìm thấy dễ dàng trên Google, bạn nên áp dụng chiến lược nào cho phần Front-end?

A. Sử dụng React với Client-Side Rendering (CSR) thuần túy

B. Chỉ sử dụng Desktop App và không cần làm bản Web

C. Sử dụng Server-Side Rendering (SSR) để trả về nội dung HTML hoàn chỉnh

D. Lưu tất cả công thức dưới dạng hình ảnh thay vì LaTeX

-----

Bài sau: Ebook2LateX (2) - Phân tích hệ thống