Skip to content

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

TrườngGiá trị
StatusAccepted
Date2026-03-30
Decidersledger-team
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 chặt: header chính xác, khối chữ ký, quy ước số/ngày Việt Nam, bảng nhiều trang, và biến thể dọc/ngang theo từng mẫu.
  • Cùng dữ liệu đã validate cũng phải tạo một XLSX sửa được (xử lý riêng bởi ExcelJS).
  • Chúng ta cần PDF ổn định pixel, sẵn-in mà designer có thể lặp lại không cần recompile service.

Quyết định

Chúng ta sẽ render PDF bằng Typst qua @myriaddreamin/typst-ts-node-compiler. Template nằm dạng source .typ trong resources/templates/ (6 mẫu + common.typ dùng chung); PdfGeneratorService khởi tạo lazy một NodeCompiler duy nhất, inject dữ liệu đã validate dưới dạng shadow file (data.json), và render. Mỗi instance consumer có instance service riêng, nên path shadow-file cố định không bị chia sẻ đồng thời. File previews/ độc lập cho phép typst compile để debug bố cục không cần full pipeline.

Hệ quả

ƯuNhược
Template hướng markup, kiểm soát version; lặp nhanhNgôn ngữ mới cho team so với HTML/CSS
Bảng nhiều trang native, typography chính xác, nhúng fontCompiler là phụ thuộc native; cần font đóng gói
Macro common.typ dùng chung giữ 6 mẫu nhất quánCô lập shadow-file dựa vào giả định một-service-mỗi-consumer
Preview --root . cho phép kiểm tra trực quan nhanhMột lỗi compile yêu cầu 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, phân trang mong manh, bộ nhớ lớnQuá nặng cho render batch; kiểm soát phân trang kém
LaTeXTypography xuất sắcToolchain nặng, chậm, khó template từ JSONVận hành vụng
Thư viện PDF (pdf-lib / PDFKit)JS thuầnBố cục thủ công cho bảng nhiều trang phức tạpQuá thấp tầng cho 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.