因为最近一直在学习将各种文档转Markdown,所以尝试将一份PDF标准转成Markdown。心想这事儿简单,扔给微软的Markitdown应该分分钟搞定。
结果?翻车了。而且翻得挺彻底。
先说说我踩的7个坑
1. 标题被拆成一字一行
封面上明明写着"团体标准",转出来变成:
团体标准
我盯着屏幕愣了三秒,心想这就是我之前鼓吹的Markitdown?
2. 目次全是点号
本来该有的层级目录,变成了一串"........",看着像摩斯电码。
3. 引用文件两列对不齐
规范性引用文件那部分,PDF里是两列对齐的表格,转出来直接散成两堆文字,左边长右边短,完全对不上。
4. 术语定义编号混乱
"3.1 术语名"这种格式,编号和名字分了家,来源还单独占一行,读起来断断续续。
5. 条款编号和正文混在一起
"4.1.1"后面直接粘着正文,没有空格没有加粗,一眼扫过去根本分不清哪是编号哪是内容。
6. 页码页眉散落正文
第几页、标准编号这些页眉信息,全插到正文中间,得手动一个个删。
7. 单位符号乱码
摄氏度变成"摄 氏 度",立方米变成"m 3",化学式里的下标全丢了。
我的解决办法
既然Markitdown只管提取不管排版,那就自己写个后处理脚本兜底。
用WorkBuddy调用markitdown库提取原始文本,然后Python脚本走6步清洗:
前后对比
之前,人工整理:
•人工整理要花2-3小时•结构稀碎,基本没法直接用•符号错误率大概40%
之后,workbuddy帮你整理:
•跑完脚本直接可用•层级清楚,格式规范•符号准确率接近100%
核心代码片段
import redef normalize_clauses(text):# 匹配条款编号,比如 4.1.1pattern = r'^(\d+\.\d+\.\d+)\s+(.+)$'def replace_clause(match):number = match.group(1)content = match.group(2)return f"**{number}** {content}"return re.sub(pattern, replace_clause, text, flags=re.MULTILINE)
逻辑很简单:正则匹配条款编号,加粗处理,再把后面的内容并到同一行。
一点体会
Markitdown这类工具,定位就是"快速提取",别指望它能理解你的文档结构。标准文件、技术规范这种有严格排版格式的PDF,提取完必须得有个后处理环节。
要么写脚本,要么人工修,选一个。
我选写脚本。一次写好,以后同类文档都能用。
适用场景: 标准文档、技术规范、法规文件这类需要保留层级结构的正式PDF。
你的PDF转换工作流是怎么处理的?
夜雨聆风