微信公众号文章 → 工作纪实(Word + PDF)
将公众号文章(mp.weixin.qq.com)整理为符合机关/学校公文规范的工作纪实,输出 Word + PDF 双文件,
A4 版式、指定字体、—X— 页码、14×9cm 浮动活动照、右对齐三行落款,且控制在 5 页以内。
适用场景
- 用户提供
https://mp.weixin.qq.com/s/...链接,要求做成"工作纪实 / 简报 / 报道"。 - 需要 Word 与 PDF 两版,且 PDF 跨设备字体一致(内嵌子集)。
- 默认学校为陇西县渭州学校;如用户给出其他单位/类别,在 JSON 中覆盖即可。
环境准备(一次性)
脚本需要 python-docx、pymupdf、pywin32(仅 to_pdf 用)、Pillow。
使用 WorkBuddy 受管 Python 的隔离 venv,切勿污染用户环境:
PY="C:/Users/lenovo/.workbuddy/binaries/python/versions/3.13.12/python.exe"
# 本机 venv 已就绪,直接使用其 python:
# C:/Users/lenovo/.workbuddy/binaries/python/envs/default/Scripts/python.exe
# 如需重建:
# "$PY" -m venv "C:/Users/lenovo/.workbuddy/binaries/python/envs/default"
# "C:/Users/lenovo/.workbuddy/binaries/python/envs/default/Scripts/pip" install python-docx pymupdf pywin32 Pillow
- 字体依赖:仿宋_GB2312、黑体、宋体、华文中宋、方正小标宋简体(本机均已安装,其中方正/GB2312 系列为用户级安装,位于
C:\Users\lenovo\AppData\Local\Microsoft\Windows\Fonts)。
主标题默认即用"方正小标宋简体",无需在 JSON 覆盖。 若换机器/换账号导致该字体缺失,再在 JSON 里覆盖"fonts": {"title": "华文中宋"}兜底,否则 Word 会静默回退成宋体、标题显细不出效果。 - PDF 导出依赖 本机 Microsoft Word(
to_pdf.py走 Word COM)。
下文 <SKILL> = C:/Users/lenovo/.workbuddy/skills/wechat-article-workreport,
<PY> = C:/Users/lenovo/.workbuddy/binaries/python/envs/default/Scripts/python.exe。
工作流程
第 1 步:提取结构化正文
用 WebFetch 提取:主标题、副标题、全正文(保留小标题层级)、发布日期、活动类别。
记录关键事实(人名、书目、活动名称),缩写时不可删。
主标题 vs 副标题 区分规则
公众号文章标题层级常混乱,须按以下规则判定,避免把正文首句或封面口号误当标题:
- 主标题(title) = 文章最顶部、字号最大、最凝练的那一行:
- 多为对仗/口号式短语(如"方寸文本见天地,学段贯通融美育"),点明主题或立意,不含具体单位与日期;
- 通常位于封面图上方,或即og:title/<title>本身;
- 不以"——""·"开头,不带"开展/举办/召开/举行"等动作谓语。 - 副标题(subtitle) = 紧跟主标题之下、字号较小的说明行,用"单位 + 动作 + 事件"把主题落地:
- 典型形态以 "——" 破折号开头(如"——陇西县渭州学校开展语文主题教研活动");
- 含 学校/单位名 + 动词(开展/举办/召开/举行)+ 活动名;
- 无破折号时,也可是主标题正下方的居中说明句。 - 无显式副标题时:若正文首段即"X月X日,我校……"之类纪实开头,不要把它当副标题;副标题可留空(
"subtitle": ""),单位信息由落款体现,或按"——{学校}{开展}{活动}"自动补一行(活动名从正文/类别提炼)。 - 易错点:封面图上的装饰性大字、引导关注的引导语、文末模板口号,均不是主/副标题,切勿误取。
第 2 步:抓取文章图片
"$PY" <SKILL>/scripts/fetch_article.py "<文章URL>" --out-dir "<工作目录>"
产出 <工作目录>/img_raw/00.jpg … 与 img_urls.json,并打印每张候选图的前导正文上下文。
脚本已自动剔除文末"九年六礼/免责声明/长按识别"之后的模板图。
第 3 步:遴选真实活动照
- 读
fetch_article.py的控制台输出,按 [references/image_filtering.md] 规则剔除文首封面图与文末模板图。 - 必要时用
Read打开img_raw/NN.jpg缩略图确认。 - 每篇选 3–4 张真实活动照,复制到
<工作目录>/img/,文件名保持NN.jpg。
第 4 步:编写 article.json
按 [references/layout_spec.md] 的结构组织内容,示例:
{
"title": "方寸文本见天地,学段贯通融美育",
"subtitle": "——陇西县渭州学校开展语文主题教研活动",
"category": "教研活动",
"date": "2026年5月20日",
"school": "陇西县渭州学校",
"paragraphs": [
{"type":"body","text":"为深入落实……全校文科教师齐聚一堂……"},
{"type":"h1","text":"一、分学段示范授课:小切口里见大意境"},
{"type":"body","text":"活动以……三大环节有序开展……"},
{"type":"image","src":"img/02.jpg"},
{"type":"h1","text":"二、集中精准评课:梳理亮点明方向"},
{"type":"body","text":"在集中精准评课环节……"},
{"type":"image","src":"img/05.jpg"},
{"type":"space"}
]
}
- 段落类型:
body正文 /h1一级黑体小标题 /h2二级仿宋加粗小标题 /
image活动照 /space空一行。 - 图片
src相对--img-root(默认 JSON 同目录的img/)。 - 保留原文小标题结构;正文可精简但不得丢失事实要点。
第 5 步:生成 Word
"$PY" <SKILL>/scripts/build_docx.py "<工作目录>/article.json" \
"<工作目录>/out.docx" --img-root "<工作目录>/img"
如需压缩页数,加 --line-pt 24(最低 24pt)先观察效果。
第 6 步:转 PDF 并校验分页,迭代达标
"$PY" <SKILL>/scripts/to_pdf.py "<工作目录>/out.docx" "<工作目录>/out.pdf"
"$PY" <SKILL>/scripts/analyze.py "<工作目录>/out.pdf"
analyze.py 打印每页内容底部位置、图片框、末页行数。按 [references/layout_spec.md] 的
分页红线迭代:
- 前页未排满(gap > 40pt)→ 调整该页附近图文量,或增减 1 张图;
- 末页仅 1–3 行孤立正文 → 缩写前文约 3 行 / 调小行距至 24pt / 增减 1 张图;
- 总页数压到 ≤ 5 页:正文精简约一半、保留全部小标题、图片 3–4 张均匀穿插。
修改 article.json 后重跑第 5、6 步,直至 analyze.py 全部 OK 且末页行数 > 3。
输出与交付
- 默认产物目录:
D:\WorkBuddy\(本机无 E 盘,故改用 D 盘;用户指定其他路径则遵从)。 - 文件名:
{学校}{活动名}工作纪实.docx与同名.pdf。 - 用
present_files同时交付两个文件。
参考
- [references/layout_spec.md] — 完整版式规范(纸张/边距/字体/行距/缩进/页码/图片/落款/分页红线)
- [references/image_filtering.md] — 图片筛选规则与实战案例
- 脚本:
scripts/fetch_article.py(抓取+选图上下文)、scripts/build_docx.py(JSON→docx)、
scripts/to_pdf.py(Word COM→PDF)、scripts/analyze.py(分页校验)