Install
openclaw skills install @lingyu9495-source/cn-pdf-report-typeset中文报告做成 PDF,常见翻车三件套:**字体乱码、表格错位、字号小到客户在手机上根本看不清**。这套是交付级的排版标准加可直接跑的模板。 交付标准(按「客户在手机上看」倒推): - **大字号**:正文 ≥16pt、表格 ≥15pt、H2 ≥17pt、大标题 ≥30pt——不是 12pt 那种印出来都费劲的 - **紧凑不注水**:只在封面后分页一次,正文自然流动,禁止每章强制分页撑页数 - **表格智能换行**:单元格用 Paragraph 加中文断行,长内容不溢出页面 - **页面均衡**:生成后自查每页字符数,避免一页只有两行 - A4 竖排、边距 18-20mm、直接打印可用 附:微软雅黑系统字体直接调用(不用下载字体文件)、封面/页脚页码/核心结论框模板、**排版自检脚本**(自动查字号是否达标、有没有多余分页)。 适用:可行性研究报告、尽调报告、项目分析、任何要交付给客户的中文正式文档。纯本地 Python,零 API Key。 触发词:做成PDF、生成PDF、中文PDF、报告排版、雅黑、乱码、表格溢出、手机看不清、可研报告、交付文档。
openclaw skills install @lingyu9495-source/cn-pdf-report-typeset这套排版逻辑是标准,以后所有 PDF 和 Word 文档都参照执行:
Word 文档同逻辑:A4竖排、正文≥小四/四号(12-14pt)、表格列宽自适应不溢出、页面均衡。
python$V -m pip install reportlab(本机已装 5.0.0)C:/Windows/Fonts/msyh.ttc(常规,subfontIndex=0)C:/Windows/Fonts/msyhbd.ttc(粗体)C:/Windows/Fonts/msyhl.ttc(细体)MEDIA: 发到飞书聊天框,绝不能只存知识库 / 只给路径 / 只发要点。用户原话:"PDF文档你要发到飞书聊天框这里来,要不然我怎么看到呢?就是要形成铁律一样的东西。"
02-项目成果/ 只是备份,不是交付。<你的输出目录>/<文件名>.pdf(绝对路径)。templates/reportlab_chinese_template.py,只替换内容区(封面文字、章节、表格数据)Hermes工作成果/02-项目成果/(命名:<主题>项目可行性尽调与分析报告.pdf)MEDIA:D:\...pdf 路径 + 核心结论要点(30秒版),不啰嗦默认采用金土系配色:避开水(蓝/黑)与火(红/紫)色调。所有 PDF 一律用金土系配色,禁止再用蓝色。颜色变量见下方 palette。
backColor=#C9A227,textColor=white,borderPadding=(6,8,6,8))——金底白字,不是蓝色文字。header_bg=#C9A227,FONTNAME=MSYHBD)——金底白字。#1f1f1f。#B8860B(去红色)。#8a6d1f(去蓝色)。#FBF3DE(暖调,不是灰白)。#D9C9A3。C_DARK=colors.HexColor("#1f1f1f") # 正文近黑
C_RED=colors.HexColor("#B8860B") # 强调/副题-深土金
C_BLUE=colors.HexColor("#C9A227") # 表头/标题底-金属金
C_LGRAY=colors.HexColor("#FBF3DE") # 斑马纹-浅米金
C_MGRAY=colors.HexColor("#D9C9A3") # 网格线-浅土金
C_WHITE=colors.white
行内强调
S_CODE=st(..., textColor=colors.HexColor("#8a6d1f"));行内<span color='#B8860B'>(不用#c0392b红色)。
make_table() 表头金属金底白字 + 斑马纹(ROWBACKGROUNDS)+ grid + repeatRows=1,表格字号 13pt<b> / <span color='#B8860B'> 行内标记⚠️ 字号铁律(2026-08-18 用户强调):PDF 是给手机看的,正文≥15pt、表格≥13pt、H1≥21pt、标题≥34pt。原模板 10.5pt/9.3pt 太小,手机看不清——所有新报告必须用大字号。字号大导致页数变多是正常的(如5页→8页)。
keep(H2标题, 表格/段落) 防止表格被拆到两页、防止标题孤悬页底TA_JUSTIFY 会对中文段落强制把每行拉伸到右边界,某行字少时字间距被撑得极宽、极难看。所有正文/列表/段落一律用 TA_LEFT 左对齐。
b=dict(..., alignment=TA_JUSTIFY, ...)b=dict(..., alignment=TA_LEFT, ...)st() 且 alignment=TA_JUSTIFY,必改左对齐。return KeepTogether(t)(表格整体不跨页),配合只保留封面后一个 PageBreak,实测把 7 页(第5页仅 77 字)修成 6 页、每页 301/451/548/407/551/240 字。表格被分页切断、切出的 1–2 行独占一页,是孤页的头号成因;发现"某页只有表头/末行"先查这个。.ttc 字体必须 subfontIndex=0,否则报错或乱码<b> 标签在无粗体字体注册时静默不加粗< > 的转义要分两种情况(2026-09-10 实测踩坑):正文里的裸尖括号(如"精度<10mm")才转义成 </>;而 <b>、<span color=...> 是内联标记,必须原样传给 Paragraph 才生效。
.replace('<','<') 全转义 → 表格里的加粗会原样显示成 <b>字样(本会话第2页整列都印成 <b>点名支持…,交付前才发现)。&(v.replace('&','&')),保留内联标签;内容里的裸尖括号由调用方自己写 <。'<b>' in text 或 '</b>' in text 为真即说明标签被当文字渲染了,必须回查 make_table 的转义。wordWrap="CJK"。已在 make_table 内置 _cell_style() 处理——所有单元格自动换行。验证:用 pymupdf 查 get_text('words') 的 x2 是否越过内容区右边界。
A4[0] - rightMargin(A4 宽 595.3pt;16mm 边距 → 549.9pt,17mm → 547pt)。写死 540 会把正常换行误报成溢出,白折腾。w[4] != '页'),否则每次都有假警报。[w for w in page.get_text('words') if w[2] > page.rect.width - rightMargin + 1 and w[4] != '页']",字符串外层若用双引号定界,正文里的引号会提前闭合字面量 → 报 SyntaxError: invalid character '+' (U+FF0B) 之类(报错点看着像全角字符非法,真因是引号截断,会误导排查方向)。正文里的中文引号要么改用 「」,要么整条字符串用 '...' 包。open(f,'w').write(open(f,encoding='utf-8').read() + add) 会先把文件截断成 0 字节再读,结果是原文全丢、只剩追加段(本会话知识库笔记从 13KB 缩成 3.8KB,差点交了残档)。追加内容时先 txt = open(f).read() 存变量,再 open(f,'w').write(txt + add);或直接用 patch 工具改。$V -c "import pymupdf; d=pymupdf.open(r'D:\...\报告.pdf'); print(len(d)); print(d[0].get_text()[:120]); print('末页含结论:', '结论' in d[-1].get_text())"
feasibility-study-writing、dual-lens-business-analysis(双光研判出报告前先加载)report-reflection-reviewultimate-ppt-mastertemplates/reportlab_chinese_template.py(旧);templates/reportlab_gold_template.py(推荐):金色系 + 左对齐 + 17pt大字 + 17mm紧凑边距 + 无孤页。已修 make_table() 内联标签处理(表格单元格内 <b>/<span> 现在真正生效,不再被转义成字面文字),并内置生成后自检注释。九品锦锂e | 把踩过的坑封装成"拿来就能跑"的 skill,不写教科书。这个 skill 是我自己每天在用的版本。
微信:ly5419495(加时备注「SkillHub」,我优先通过) 公众号:初五Agent(微信搜一搜,复盘和方法都写在那儿,不加微信也能读)
我另外做的几个能直接跑的工具,都放在这个货架页(复制到浏览器打开): https://skillpay.alipay.com/public/jiupinjinlie
用的时候卡住了、或者有别的场景想让我封装成 skill,按上面任意方式找我就行。
