文档解析
文档解析把文件中的文字、表格和版面转成可处理的结构,并保留它们原来的位置与关系。
理解与应用
文档解析是把 PDF、扫描件、表格等文件转换成程序可用内容的过程。它不仅要取出文字,还要知道哪些文字属于标题、哪一个数值对应哪一列,以及内容在原文件的什么位置。下游问答能否准确引用,往往从这一步就已经决定了。
以一张报销发票为例,页面上可能同时出现发票号码、开票日期、税额和价税合计。把这些字全部识别出来,并不等于读懂了发票;如果“1,200.00”被接到税额字段,后面的模型仍可能把错误结构当成可靠输入。可复制文本的 PDF 可以先抽取文本和位置,扫描图片通常还需要 OCR,复杂表格则需要恢复行列关系。
版面也会改变阅读顺序。两栏文件按横向坐标简单拼接,可能把两个句子交错在一起;跨页表格可能把第二页的数据与第一页表头分开;页脚里的“金额含税”又可能影响整张表。保留文件标识、页码和区域位置,能在发现可疑数字时回到原页复核,而不是只能对着一段失去来源的纯文本猜测。
解析完成后的质量检查应围绕任务展开。报销场景更关心金额、币种、抬头与日期是否对应正确,而不只是识别了多少个字。看不清的字符和不确定的结构应保留标记。文件内嵌的链接、脚本或“执行这条命令”的文字也仍是文档内容,解析器不应因此让文件获得执行权限。
动手试一试:正确读取带引号的发票明细 CSV
物品名称和金额内部都含逗号,直接按逗号切分会破坏字段。csv 模块能处理引号规则;本例另约定金额中的逗号是千位分隔符,并不把这个约定推广到其他地区的数字格式。
将代码保存为 example.py,使用 Python 3.10+ 运行 python3 example.py。仅使用标准库,无需密钥,不会调用外部模型。
Python 代码
import csv
from io import StringIO
source = 'item,amount\n"paper, A4","1,200"\npen,30\n'
reader = csv.DictReader(StringIO(source))
for record_number, row in enumerate(reader, start=1):
amount = int(row["amount"].replace(",", ""))
print(f'记录 {record_number}:{row["item"]},金额 {amount}')运行结果
记录 1:paper, A4,金额 1200 记录 2:pen,金额 30
常见误区
- 字符识别率高,仍可能把表格的行、列和单位对应错。
- 把阅读顺序、页码和脚注丢掉后,下游很难恢复完整的证据关系。
- 用记录序号代替原始行号时应标明含义,带换行的 CSV 记录可能跨越多行。
前置与延伸
建议先读
可直接开始阅读。
相关概念
参考与版本
Apollo 原创讲解与教学示例。参考资料用于核对技术定义;核验日不代表资料的发布日期。
- Docling 官方文档 ↗
核对文档结构、布局、表格与多格式转换定位;正文的 CSV 微实验不等价于 PDF/OCR 实现。 · 核验:2026-10-10
- Python:csv ↗
核对标准库 DictReader 与 CSV 引号字段处理;示例使用内存字符串,无文件或网络访问。 · 核验:2026-10-10