本卡屬 FR-145(母卡 CM-2854),追加卡 8:修卡 3(CM-2857)產出的階段結案報告 Word/PDF 排版。決策者 2026-10-17 看 PDF 後裁「跟畫面長相差很多」。等卡 5(CM-2859)回來再派——卡 5 也動同一支 docx 產生器,先派會撞。
下載的 Word/PDF 是交給客戶的正式文件,現在長得像草草貼上去的表格。首腦實際下載 DEV 輪次 1199 的報告轉 PDF 看到:
畫面(網頁)與 Word(A4)本來就不會一樣,這張卡不是要「長得一樣」,是要 Word 自己有正式報告的樣子:欄寬跟著內容走、數字對齊、表格字級比正文小一級、封面像封面。
app/closing_report/service/closing_report_docx_generator.py(214 行):_table_after() :196 用 doc.add_table 動態插表,沒設任何欄寬,每欄被 Word 均分(實測八欄各 0.85 吋);cell 文字走 FR-142 的 _cell_text(ar_docx_generator.py:154,固定 _TABLE_PT = 10),但範本 Normal 是 14pt,正文與表格差距過大。_family_cell() :190 把三個數字串成「a / b / c」一格;畫面 ClosingReportChapters.vue 是每 pass 三子欄。_annex() :113 已走橫式節+_landscape_section,欄寬也沒設。app/oscal/templates/closing/stage_report_template.docx:從 FR-142 ar_report_template.docx 複製,Normal 14pt Times New Roman、Heading 1 14pt、Heading 2 13pt;封面是 docxtpl 變數逐行渲染,沒有表格或分欄。ar_docx_generator.py:113-116:(label, width_cm) 配對逐欄 tbl.columns[i].width = Cm(width * scale) 再逐 cell 設一次(python-docx 只設 column 不生效的坑已踩過)。沿用這個做法,不另寫。format_plan_range() 回「2026 年 06 月 02 日上午 10:00-12:30」給稽核計畫用;報告表格內要短格式 YYYY-MM-DD,ap_report_export_service 裡找有沒有短格式 helper,沒有就在本模組加一個。git log --oneline -5 -- app/closing_report/service/closing_report_docx_generator.py 看卡 5 落了什麼,排版修法要同時套到 stage 與 final 兩條。app/closing_report/service/closing_report_docx_generator.py 表格插入、族群矩陣、附件一(主要改這支;超 260 行就把表格排版抽新檔 closing_report_docx_tables.py)
app/oscal/templates/closing/stage_report_template.docx 範本:Normal 字級、封面版面
app/flow_control/service/ar_docx_generator.py 只 import 欄寬/cell helper,不改它(FR-142 稽核報告也在用)
(標題, 寬度 cm) 配對,照 ar_docx_generator.py:113-116 的做法逐欄逐 cell 設寬。表 2-1 建議:稽核次 3.2/稽核日期 2.6/評估目標 1.8/符合 1.5/不符合 1.5/不適用 1.5/符合率 1.8/說明 2.6(直式 A4 內容寬約 17.3 cm,scale 依頁寬算)。表 3-1:風險 1.6/評估目標 2.8/項目 5.5/稽核發現 3.7/稽核建議 3.7。表 4-1 與附件一照同一原則配。