Quy trinh dich PDF giu nguyen layout
Pipeline 3 buoc: extract -> dich (model tu viet file trans) -> build -> verify bang render.
Cac script nam trong ${KIMI_SKILL_DIR}. Da test voi PyMuPDF 1.27 tren Python 3.12, Windows.
0. Moi truong (bat buoc)
- Dung Python co san PyMuPDF 1.27+. Tren may Windows cua user goc:
source ~/anaconda3/etc/profile.d/conda.sh && conda activate env-312 && python ...
(KHONG goi python truc tiep — khong co trong PATH). May khac thi dung env tuong duong.
- Script da co san dong
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
(console cp1252 se crash neu in tieng Viet). Neu viet script phu, phai co dong nay.
- Font chen: Times New Roman (
times.ttf, timesbd.ttf, timesi.ttf, timesbi.ttf),
mac dinh lay tu C:/Windows/Fonts; doi bang bien moi truong PDF_FONT_DIR.
Bat ky font serif nao du dau tieng Viet deu dung duoc neu dat dung 4 ten file tren.
1. Extract
python "${KIMI_SKILL_DIR}/extract_pdf.py" <ten>.pdf
Sinh ra <ten>_items.json (toa do de chen) va <ten>_dump.txt (de doc va dich).
Dump co 2 loai item:
[pX-Y] (para sz=...) — doan van ban thuan. Noi dung goc o cac dong tiep theo,
da danh dau <b>, <i> theo font goc.
[pX-Y-lZ] (mixed sz=...) — dong lan lon text + toan. Phan nam trong cap ⟨...⟩
la TOAN — giu nguyen, khong dich, khong chen.
Block code, block toan thuan, so trang o header (y<45) tu dong bi loai — neu can giu
nguyen mot item nao do (vd listing code bi bat nham), dung SKIP.
2. Viet file dich <ten>_trans.py
Doc <ten>_dump.txt, dich tung id, viet ra <ten>_trans.py trong thu muc lam viec:
# -*- coding: utf-8 -*-
TRANS = {
# para: chuoi HTML (duoc <b>, <i>, <br/>)
"p0-1": "Doan van da dich, co the <b>in dam</b>, <i>nghieng</i>.",
# para dang hang bang: list dung bang so dong/o
"p9-9": ["O 1", "O 2", "O 3"],
# mixed: list voi SO PHAN TU DUNG BANG so slot text (phan khong nam trong <>)
# None = giu nguyen ky tu goc (dung cho dau dac biet nhu † trong CMSY)
"p3-7-l1": ["Khi do", None, "ta co"],
# Phan tu co the la list [[style, text], ...], style thuoc "r"/"b"/"i"/"bi"
"p4-2-l0": [["b", "Dinh ly."], ["r", " Gia su ..."]],
}
SKIP = {"p2-4", "p5-1"} # id giu nguyen (code listing...)
MANUAL = {} # xu ly tay, xem muc 5
3. Build
python "${KIMI_SKILL_DIR}/build_pdf.py" <ten>.pdf [<ten>-vi.pdf]
Build se (1) validate: bao id thieu/thua, mixed sai so slot — phai sach moi chay tiep;
(2) redact text goc (giu anh + line-art nho PDF_REDACT_IMAGE_NONE +
PDF_REDACT_LINE_ART_NONE — vach phan so la line-art); (3) chen ban dich va in CANH BAO.
4. Xu ly canh bao (vong lap chinh)
[BOX] id: khong vua rect — para tran khung. Viet gon lai ban dich.
[SCALE] id: scale=0.9x — insert_htmlbox tu co chu. <= 0.95 thi nen viet gon lai;
0.95-1.0 co the chap nhan.
[OVER] id/sN: can Xpt, co Ypt — slot mixed tran vao toan/rai le. PHAI sua:
viet gon lai. Kinh nghiem: tieng Viet trong TNR rong hon uoc luong tay —
truoc khi chon van phong cho slot chat, DO bang:
fitz.Font(fontfile="<PDF_FONT_DIR hoac C:/Windows/Fonts>/times.ttf").text_length(text, size).
[SHRINK] — slot phai co font > 0.75pt. Nen viet gon hon.
- Slot thua cho (text lap < ~60% khe ho truoc span toan) -> keo dai cau chu cho
day, dung de khe ho — nhin se "thua space" nhu loi user tung phan nan.
5. MANUAL — khi co che slot thuong khong du
Dung khi can redact/ca chen tay (vd muon thay mot span "not" giua dong toan):
MANUAL = {
"p18-5-l0": {
"redact_text_slots": True, # redact tat ca slot text
"redact_math_slots": [3], # redact them math slot index 3 (trong it["slots"])
"redact_rects": [[x0,y0,x1,y1]], # redact rect tuy y
"strip_graphics": [[x0,y0,x1,y1]],# pass rieng: xoa CA line-art cham vao vung
# (vd vach phan so thua, gach chan goc). Para cung dung duoc.
"inserts": [
{"x": None, # x = dau slot text dau, limit = toan ke tiep
"segs": [["r", "Neu "], ["i", "khong"], ["r", " phai ..."]]},
{"x": "after_math1", # x = sau math slot index 1, limit = right margin
"segs": [["r", " thi ..."]]},
{"x": 97.5, "y": 516.3, "limit": 320.5, # y/limit tuy chon (y mac dinh = baseline item)
"segs": [["r", ", voi xac suat 3/4, ..."]]},
],
},
}
Luu y quan trong (kinh nghiem chap4, 71 trang):
- Redaction cua PyMuPDF xoa CA KY TU chi can bbox chay rect mot chut → span toan nho
(|+⟩, tu/mau so phan so chong, dau ^, can, Σ) de bi xoa nham boi rect slot lang gieng.
build_pdf.py da co co che RESTAMP tu dong: phat hien ky tu toan bi an va dap lai tu
ban goc bang show_pdf_page (clip theo bbox ky tu, nen trong suot). Canh bao [GHOST]
= trong vung dap lai co muc span khac → render kiem chung bang mat, thuong vo hai.
- Phan so chong (tu/mau bi extractor tach thanh cac "dong" lech baseline): dung MANUAL
gom ve 1 baseline, go inline "3/4", redact slot goc + math mau so, strip_graphics
vach phan so thua.
- Bang co vach ke doc: para dang hang bang (TRANS la list o) — o qua rong se wrap va
de vach; rut ngan text o theo be rong goc.
- Nhan trong hinh mach (vd C_in/C_out): khong duoc dai hon ban goc, day mach se de chu.
- Sach lon/nhieu trang: chia dump theo cum trang, dich song song bang subagent, merge
TRANS; check_fit.py (mo phong fit khong can build) giup vong lap nhanh.
6. Verify bang mat (bat buoc)
python "${KIMI_SKILL_DIR}/render_preview.py" <ten>-vi.pdf preview 110 # luoi tong quan
python "${KIMI_SKILL_DIR}/render_preview.py" <ten>-vi.pdf zoom 150 "0,4,8" # zoom trang nghi ngo
Mo PNG (ReadMediaFile) kiem tra: overlap chu/toan, chu de len hinh, space thua,
trang lech le. Cac trang chi xem qua thumbnail 110dpi la chua du cho trang day dac.
7. Quy tac dich thuat (da chot voi user)
- KHONG dich word-by-word; dich theo nghia chuyen nganh, van phong sach giao khoa.
- Giu nguyen tieng Anh cho thuat ngu nganh: quantum gate, qubit, Quirk, unitary,
bra-ket, collapse, Bloch sphere, ten phep bien doi (Pauli, Hadamard, Identity) trong o bang.
- Chuan hoa thuat ngu Viet (sach quantum/toan):
inner product = tich trong; outer product = tich ngoai;
orthogonal = truc giao; orthonormal = truc chuan; normalize = chuan hoa;
basis = co so; identity matrix = ma tran don vi (KHONG "ma tran dong nhat");
completeness relation = he thuc day du; invertible = kha nghich;
adjoint/conjugate transpose = chuyen vi lien hop; scalar = vo huong;
proof = chung minh (cho chat cho phep viet tat "CM").
- Code, ten ham, cu phap: giu nguyen, khong dich.
8. Cam bay da gap
insert_htmlbox o PyMuPDF 1.27 tra ve TUPLE (spare, scale), khong phai float.
- Luan redact voi
images=PDF_REDACT_IMAGE_NONE, graphics=PDF_REDACT_LINE_ART_NONE.
- Rect para phai mo rong xuong toi vat can ke tiep (tinh ca items LAN blocks) —
thieu buoc nay para se de len doan ben duoi.
- Right margin tinh RIENG tung trang (trang chan/le co the khac nhau, vd 369 vs 394).
- Slot giua hai span toan: can GIUA khe ho; slot canh le phai: limit = right margin.
- Dau † va ky hieu CMSY hep: de
None o slot tuong ung, giu ky tu goc.
1---2name: pdf-translate3description: Dich PDF hoc thuat/ky thuat (sach, bai bao co cong thuc toan) sang tieng Viet bang PyMuPDF — giu nguyen cau truc, cong thuc, hinh anh; chi thay phan text. Da kiem chung tren cac chuong sach quantum computing 19 va 71 trang.4---56# Quy trinh dich PDF giu nguyen layout78Pipeline 3 buoc: **extract -> dich (model tu viet file trans) -> build -> verify bang render**.9Cac script nam trong `${KIMI_SKILL_DIR}`. Da test voi PyMuPDF 1.27 tren Python 3.12, Windows.1011## 0. Moi truong (bat buoc)1213- Dung Python co san PyMuPDF 1.27+. Tren may Windows cua user goc:14 `source ~/anaconda3/etc/profile.d/conda.sh && conda activate env-312 && python ...`15 (KHONG goi `python` truc tiep — khong co trong PATH). May khac thi dung env tuong duong.16- Script da co san dong `sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")`17 (console cp1252 se crash neu in tieng Viet). Neu viet script phu, phai co dong nay.18- Font chen: Times New Roman (`times.ttf`, `timesbd.ttf`, `timesi.ttf`, `timesbi.ttf`),19 mac dinh lay tu `C:/Windows/Fonts`; doi bang bien moi truong `PDF_FONT_DIR`.20 Bat ky font serif nao du dau tieng Viet deu dung duoc neu dat dung 4 ten file tren.2122## 1. Extract2324```bash25python "${KIMI_SKILL_DIR}/extract_pdf.py" <ten>.pdf26```2728Sinh ra `<ten>_items.json` (toa do de chen) va `<ten>_dump.txt` (de doc va dich).29Dump co 2 loai item:3031- `[pX-Y] (para sz=...)` — doan van ban thuan. Noi dung goc o cac dong tiep theo,32 da danh dau `<b>`, `<i>` theo font goc.33- `[pX-Y-lZ] (mixed sz=...)` — dong lan lon text + toan. Phan nam trong cap `⟨...⟩`34 la TOAN — giu nguyen, khong dich, khong chen.3536Block code, block toan thuan, so trang o header (y<45) tu dong bi loai — neu can giu37nguyen mot item nao do (vd listing code bi bat nham), dung SKIP.3839## 2. Viet file dich `<ten>_trans.py`4041Doc `<ten>_dump.txt`, dich tung id, viet ra `<ten>_trans.py` trong thu muc lam viec:4243```python44# -*- coding: utf-8 -*-45TRANS = {46 # para: chuoi HTML (duoc <b>, <i>, <br/>)47 "p0-1": "Doan van da dich, co the <b>in dam</b>, <i>nghieng</i>.",4849 # para dang hang bang: list dung bang so dong/o50 "p9-9": ["O 1", "O 2", "O 3"],5152 # mixed: list voi SO PHAN TU DUNG BANG so slot text (phan khong nam trong <>)53 # None = giu nguyen ky tu goc (dung cho dau dac biet nhu † trong CMSY)54 "p3-7-l1": ["Khi do", None, "ta co"],55 # Phan tu co the la list [[style, text], ...], style thuoc "r"/"b"/"i"/"bi"56 "p4-2-l0": [["b", "Dinh ly."], ["r", " Gia su ..."]],57}58SKIP = {"p2-4", "p5-1"} # id giu nguyen (code listing...)59MANUAL = {} # xu ly tay, xem muc 560```6162## 3. Build6364```bash65python "${KIMI_SKILL_DIR}/build_pdf.py" <ten>.pdf [<ten>-vi.pdf]66```6768Build se (1) validate: bao id thieu/thua, mixed sai so slot — phai sach moi chay tiep;69(2) redact text goc (giu anh + line-art nho `PDF_REDACT_IMAGE_NONE` +70`PDF_REDACT_LINE_ART_NONE` — vach phan so la line-art); (3) chen ban dich va in CANH BAO.7172## 4. Xu ly canh bao (vong lap chinh)7374- `[BOX] id: khong vua rect` — para tran khung. Viet gon lai ban dich.75- `[SCALE] id: scale=0.9x` — insert_htmlbox tu co chu. <= 0.95 thi nen viet gon lai;76 0.95-1.0 co the chap nhan.77- `[OVER] id/sN: can Xpt, co Ypt` — slot mixed tran vao toan/rai le. PHAI sua:78 viet gon lai. Kinh nghiem: tieng Viet trong TNR rong hon uoc luong tay —79 truoc khi chon van phong cho slot chat, DO bang:80 `fitz.Font(fontfile="<PDF_FONT_DIR hoac C:/Windows/Fonts>/times.ttf").text_length(text, size)`.81- `[SHRINK]` — slot phai co font > 0.75pt. Nen viet gon hon.82- Slot thua cho (text lap < ~60% khe ho truoc span toan) -> keo dai cau chu cho83 day, dung de khe ho — nhin se "thua space" nhu loi user tung phan nan.8485## 5. MANUAL — khi co che slot thuong khong du8687Dung khi can redact/ca chen tay (vd muon thay mot span "not" giua dong toan):8889```python90MANUAL = {91 "p18-5-l0": {92 "redact_text_slots": True, # redact tat ca slot text93 "redact_math_slots": [3], # redact them math slot index 3 (trong it["slots"])94 "redact_rects": [[x0,y0,x1,y1]], # redact rect tuy y95 "strip_graphics": [[x0,y0,x1,y1]],# pass rieng: xoa CA line-art cham vao vung96 # (vd vach phan so thua, gach chan goc). Para cung dung duoc.97 "inserts": [98 {"x": None, # x = dau slot text dau, limit = toan ke tiep99 "segs": [["r", "Neu "], ["i", "khong"], ["r", " phai ..."]]},100 {"x": "after_math1", # x = sau math slot index 1, limit = right margin101 "segs": [["r", " thi ..."]]},102 {"x": 97.5, "y": 516.3, "limit": 320.5, # y/limit tuy chon (y mac dinh = baseline item)103 "segs": [["r", ", voi xac suat 3/4, ..."]]},104 ],105 },106}107```108109Luu y quan trong (kinh nghiem chap4, 71 trang):110111- Redaction cua PyMuPDF xoa CA KY TU chi can bbox chay rect mot chut → span toan nho112 (|+⟩, tu/mau so phan so chong, dau ^, can, Σ) de bi xoa nham boi rect slot lang gieng.113 build_pdf.py da co co che RESTAMP tu dong: phat hien ky tu toan bi an va dap lai tu114 ban goc bang show_pdf_page (clip theo bbox ky tu, nen trong suot). Canh bao [GHOST]115 = trong vung dap lai co muc span khac → render kiem chung bang mat, thuong vo hai.116- Phan so chong (tu/mau bi extractor tach thanh cac "dong" lech baseline): dung MANUAL117 gom ve 1 baseline, go inline "3/4", redact slot goc + math mau so, strip_graphics118 vach phan so thua.119- Bang co vach ke doc: para dang hang bang (TRANS la list o) — o qua rong se wrap va120 de vach; rut ngan text o theo be rong goc.121- Nhan trong hinh mach (vd C_in/C_out): khong duoc dai hon ban goc, day mach se de chu.122- Sach lon/nhieu trang: chia dump theo cum trang, dich song song bang subagent, merge123 TRANS; check_fit.py (mo phong fit khong can build) giup vong lap nhanh.124125## 6. Verify bang mat (bat buoc)126127```bash128python "${KIMI_SKILL_DIR}/render_preview.py" <ten>-vi.pdf preview 110 # luoi tong quan129python "${KIMI_SKILL_DIR}/render_preview.py" <ten>-vi.pdf zoom 150 "0,4,8" # zoom trang nghi ngo130```131132Mo PNG (ReadMediaFile) kiem tra: overlap chu/toan, chu de len hinh, space thua,133trang lech le. Cac trang chi xem qua thumbnail 110dpi la chua du cho trang day dac.134135## 7. Quy tac dich thuat (da chot voi user)136137- KHONG dich word-by-word; dich theo nghia chuyen nganh, van phong sach giao khoa.138- Giu nguyen tieng Anh cho thuat ngu nganh: quantum gate, qubit, Quirk, unitary,139 bra-ket, collapse, Bloch sphere, ten phep bien doi (Pauli, Hadamard, Identity) trong o bang.140- Chuan hoa thuat ngu Viet (sach quantum/toan):141 inner product = tich trong; outer product = tich ngoai;142 orthogonal = truc giao; orthonormal = truc chuan; normalize = chuan hoa;143 basis = co so; identity matrix = ma tran don vi (KHONG "ma tran dong nhat");144 completeness relation = he thuc day du; invertible = kha nghich;145 adjoint/conjugate transpose = chuyen vi lien hop; scalar = vo huong;146 proof = chung minh (cho chat cho phep viet tat "CM").147- Code, ten ham, cu phap: giu nguyen, khong dich.148149## 8. Cam bay da gap150151- `insert_htmlbox` o PyMuPDF 1.27 tra ve TUPLE (spare, scale), khong phai float.152- Luan redact voi `images=PDF_REDACT_IMAGE_NONE, graphics=PDF_REDACT_LINE_ART_NONE`.153- Rect para phai mo rong xuong toi vat can ke tiep (tinh ca items LAN blocks) —154 thieu buoc nay para se de len doan ben duoi.155- Right margin tinh RIENG tung trang (trang chan/le co the khac nhau, vd 369 vs 394).156- Slot giua hai span toan: can GIUA khe ho; slot canh le phai: limit = right margin.157- Dau † va ky hieu CMSY hep: de `None` o slot tuong ung, giu ky tu goc.