乐于分享
好东西不私藏

PDF转Markdown翻车记

PDF转Markdown翻车记

因为最近一直在学习将各种文档转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步清洗:

步骤
干了什么
效果
把拆散的标题页眉重新拼成封面
像份正经文档了
目次改成带锚点的链接列表
能点击跳转
引用文件整理成Markdown表格
终于对齐了
术语定义统一成###小节+块引用
结构清晰
条款编号加粗,段落合并
一眼看清层级
符号批量替换
℃、m³、μm、NOₓ都对了

前后对比

之前,人工整理:

人工整理要花2-3小时结构稀碎,基本没法直接用符号错误率大概40%

之后,workbuddy帮你整理:

跑完脚本直接可用层级清楚,格式规范符号准确率接近100%


核心代码片段

import redef normalize_clauses(text):    # 匹配条款编号,比如 4.1.1    pattern = 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转换工作流是怎么处理的?

Markdown入门指南微软开源了一个让我扔掉格式转换工具的利器:MarkItDown