自适应 PDF:同一文件,人类可读格式与机器 Markdown 文本自适应输出!
自适应 PDF:新技术的诞生背景
PDF 作为一种视觉格式,存储着在页面上绘制字形的指令。虽然规范支持“标签化 PDF”(Tagged PDF)用于标记标题、段落和列表,但实际中多数 PDF 是未标记的。像 LaTeX、Chrome 的打印成 PDF 功能及大多数导出工具都不会生成标签,文本提取器只能按从左到右、从上到下顺序读取绘制命令提取文本。在只有人类阅读 PDF 时,这种情况无关紧要,但如今多数 PDF 会被输入到大型语言模型(LLM)中,而从本身不携带结构信息的 PDF 格式中重建结构成了所有处理工具面临的问题。
自适应 PDF 的工作原理
自 2001 年发布的 PDF 1.4 版本起,PDF 规范中有一个属性允许为标记内容定义替换文本。渲染器会忽略这个替换文本,按内容流指令绘制,但支持该属性的文本提取器会返回替换文本而非视觉文本。在测试中,PyMuPDF 和 Poppler 都支持这个属性,主要的开源提取器也能处理它。该属性最初为连字和无法自然映射到 Unicode 的字符设计,但未广泛应用。现在将其应用到文档层面,通过标记内容序列,将替换文本附加到内容流中,支持该属性的提取器就会返回结构化的 Markdown 文本,同一个 PDF 文件对不同阅读者会产生不同输出,但渲染时外观相同。
提取器实际看到的内容对比
同一个 PDF 视觉外观相同,但普通 PDF 和智能 PDF 经 PyMuPDF 提取的内容差异明显。普通 PDF 提取的文本无层次结构,句子中间换行,项目符号与段落难区分,表格被拆分;而智能 PDF 提取的文本有 # 标题、Markdown 表格、 - 项目符号,句子不会在单词中间断开,LLM 无需猜测章节标题和列表内容,信息清晰。
自适应 PDF 的基准测试
使用自己的工具将多个 PDF 转换为智能 PDF,分别用 PyMuPDF 的 get_text() 方法和 https://www.pdf2go.com/ 从普通 PDF 和智能 PDF 中提取文本,都返回 Markdown 格式,通过 tiktoken(cl100k_base)统计标记数量。基准测试脚本可在代码仓库找到。测试结果显示,标记数量大致相同,该方法优势在于让相同标记携带结构信息,提高了每个标记的信息密度。对于大多数文件,大小开销在个位数百分比,教科书大小减小是因为 PyMuPDF 使用 garbage = 3 保存时移除未使用的 PDF 对象,这是通用优化方法。将智能 PDF 上传到 ChatGPT 和 Claude,要求复制粘贴原始文本,两者都返回含 #、##、 - 项目符号的 Markdown 格式,输出结果与嵌入的层次结构完全匹配。
自适应文档的优势
最终得到的自适应 PDF 是一种能根据阅读者自适应的文档。人类打开看到熟悉的格式化 PDF,机器读取得到简洁的 Markdown 文本,包含标题、列表和结构信息。只需一个文件,无需单独版本和转换步骤,根据阅读者不同自动呈现合适内容,无需管理和维护两份副本,文档本身会根据使用方式决定呈现内容。开发者正在积极探索更多相关内容,并计划为 Google Docs 开发扩展以简化过程,这只是首次尝试。
