Skip to content

ADR-0003. Render PDF HKD chính thức bằng Typst

TrườngGiá trị
StatusAccepted
Date2026-03-30
DecidersPhat Nguyen
Supersedes-

Bối cảnh

  • Sổ HKD là biểu mẫu chính thức của nhà nước với bố cục nghiêm ngặt: tiêu đề đặt chính xác, khối chữ ký, quy ước viết số/ngày kiểu Việt Nam, bảng nhiều trang và bản dọc/ngang theo từng mẫu.
  • Cùng một bộ dữ liệu đã kiểm chứng cũng phải sinh ra một file XLSX có thể chỉnh sửa (do ExcelJS xử lý riêng).
  • Chúng ta cần file PDF ổn định đến từng pixel, sẵn sàng để in, mà designer có thể chỉnh đi chỉnh lại không cần biên dịch lại service.

Quyết định

Chúng ta sẽ render PDF bằng Typst qua @myriaddreamin/typst-ts-node-compiler. Các template tồn tại dưới dạng mã nguồn .typ trong resources/templates/ (6 mẫu + common.typ dùng chung); PdfGeneratorService khởi tạo trễ một NodeCompiler duy nhất, đưa dữ liệu đã kiểm chứng vào dưới dạng shadow file (data.json), rồi render. Mỗi consumer có một instance service riêng, nên đường dẫn shadow file cố định không bị dùng chung đồng thời. Các file previews/ độc lập cho phép chạy typst compile để soi lỗi bố cục mà không cần chạy toàn bộ pipeline.

Hệ quả

ƯuNhược
Template dạng markup, quản lý theo version; chỉnh sửa nhanhMột ngôn ngữ mới với team so với HTML/CSS
Hỗ trợ sẵn bảng nhiều trang, typography chính xác, nhúng fontCompiler là phụ thuộc native; cần đóng gói kèm font
Macro chung trong common.typ giữ 6 mẫu nhất quánViệc cô lập shadow file dựa vào giả định mỗi consumer một service
Preview --root . cho phép kiểm tra trực quan nhanhMột lỗi biên dịch buộc phải thay instance compiler

Phương án đã cân nhắc

Phương ánƯuNhượcVì sao loại
Headless Chromium (HTML→PDF)HTML/CSS quen thuộcRuntime nặng, ngắt trang dễ hỏng, tốn bộ nhớQuá nặng để render theo batch; kiểm soát ngắt trang kém
LaTeXTypography xuất sắcBộ công cụ cồng kềnh, chậm, khó dựng template từ JSONBất tiện khi vận hành
Thư viện PDF (pdf-lib / PDFKit)Thuần JSPhải tự dựng bố cục cho bảng nhiều trang phức tạpQuá thấp cấp cho các bố cục đa mẫu chính thức

Tham chiếu

  • ledger/src/services/generators/pdf-generator.service.ts
  • ledger/resources/templates/ (common.typ, s1a-hkd.typ..s2e-hkd.typ)
  • HKD Templates

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.