🧠 图解记忆:解析结果要结构正确、位置可追溯、质量可度量;点击图片可查看原图。
💡 答案要点
为什么文档解析是 RAG 项目的基础能力?
"Garbage in, Garbage out" — 如果文档解析质量差,Embedding 就建立在错误内容上
实际项目经验:
- 简历解析:表格布局、多栏设计、照片都要识别
- 合同解析:法务条款、签名位置、日期都要提取
- 论文解析:数学公式、参考文献、图表标题都是关键信息2026年文档解析技术栈:
| 格式 | 推荐工具 | 难点 |
|---|---|---|
| PDF(扫描件) | PaddleOCR + 布局检测 | 旋转、阴影、水印 |
| PDF(文字版) | PyMuPDF / pdfplumber | 表格、多栏、页眉页脚 |
| Word (.docx) | python-docx / Mammoth | 宏、嵌入对象、样式继承 |
| HTML | BeautifulSoup / Trafilatura | 广告移除、JS 渲染内容 |
| Markdown | 正则 + 语法解析 | 层级结构、代码块 |
生产级 PDF 解析 pipeline:
展开 Python 代码示例(54 行)
python
from paddleocr import PaddleOCR
from pdf2image import convert_from_path
import fitz # PyMuPDF
def parse_pdf_advanced(pdf_path: str) -> list[dict]:
"""
生产级 PDF 解析:自动识别扫描件 / 文字版 / 表格
"""
results = []
# Step 1: 判断是扫描件还是文字版
doc = fitz.open(pdf_path)
first_page_text = doc[0].get_text()
is_scanned = len(first_page_text.strip()) < 100 # 文字太少 → 扫描件
if is_scanned:
# 扫描件:用 PaddleOCR 识别
ocr = PaddleOCR(use_angle_cls=True, lang='ch')
images = convert_from_path(pdf_path)
for page_num, image in enumerate(images):
result = ocr.ocr(np.array(image), cls=True)
for line in result[0]:
results.append({
"page": page_num + 1,
"text": line[1][0],
"bbox": line[0],
"confidence": line[1][1]
})
else:
# 文字版:用 PyMuPDF 提取文字 + 表格
for page_num, page in enumerate(doc):
blocks = page.get_text("blocks")
tables = page.extract_tables()
for block in blocks:
if block[4].strip(): # 非空文本块
results.append({
"page": page_num + 1,
"text": block[4],
"bbox": block[:4],
"type": "text"
})
# 表格单独处理
for table in tables:
table_text = table_to_markdown(table)
results.append({
"page": page_num + 1,
"text": table_text,
"type": "table"
})
return results表格解析专项(合同、财务报表):
python
importtabula # Java 写的表格提取,准确性高
import camelot # Python 表格提取,API 更友好
def extract_tables_with_camelot(pdf_path: str) -> list[str]:
"""用 camelot 提取表格,转 Markdown"""
tables = camelot.read_pdf(pdf_path, pages='all', flavor='stream')
markdown_tables = []
for table in tables:
# camelot 会自动检测表格边界
df = table.df
# 转成 Markdown 格式,方便后续 Chunk
md = df.to_markdown(index=False)
markdown_tables.append(md)
return markdown_tables面试话术:
示例表达(仅在能用本人经历或可复现实验佐证时使用): "我的项目里 PDF 解析遇到过两个坑:一是扫描件用纯文字提取是空的,必须上 OCR;二是合同表格用 naive 提取会把一格拆成多格。后来我用了'分层解析'策略——先判断是扫描件还是文字版,再分别走 PaddleOCR 和 PyMuPDF,表格再用 Camelot 二次提取。生产环境准确率从 70% 提到了 95%。简历、合同、论文不同文档类型要选对工具,不能一套方案打天下。"
