
本文介绍如何使用pdftohtml工具将带层级标题的pdf法律合同转换为语义化html,再借助beautiful soup解析标题与正文,批量生成独立文本文件,实现自动化章节提取。
在处理法律合同类PDF时,其核心价值往往在于清晰的章节结构(如“第一条 合同主体”“第二条 权利义务”)。但PDF本质是布局导向的格式,直接提取结构化文本困难重重。最高效路径是:先转换为语义化HTML → 再按DOM结构精准提取。
✅ 第一步:PDF转HTML(保留标题层级)
推荐使用开源命令行工具 pdftohtml(基于Poppler),它能将PDF中的逻辑结构(如字体加粗/字号变化)智能映射为
– 标签,并保留段落
和列表结构:
# macOS(通过Homebrew安装) brew install pdftohtml # Linux(Ubuntu/Debian) sudo apt-get install pdftohtml # 转换命令(生成带CSS样式的HTML,便于后续解析) pdftohtml -c -s -i input_contract.pdf output_contract.html
- -c:启用CSS样式输出(辅助识别标题层级)
- -s:单文件模式(避免生成碎片化图片资源)
- -i:忽略图像(法律合同通常无关键图,可提速)
⚠️ 注意:pdftohtml 对扫描版PDF无效(需先OCR)。若PDF是图片型,请先用 pdf2image + pytesseract 进行文字识别。
✅ 第二步:HTML解析与章节拆分(Python示例)
将生成的HTML加载进Beautiful Soup,利用标题标签(h1–h6)作为章节分隔符,逐段提取内容:
from bs4 import BeautifulSoup
import re
def split_contract_by_heading(html_path, output_dir="sections"):
with open(html_path, "r", encoding="utf-8") as f:
soup = BeautifulSoup(f, "html.parser")
# 查找所有标题标签(按层级降序,确保h1优先于h2)
headings = soup.find_all(["h1", "h2", "h3", "h4", "h5", "h6"],
recursive=True)
for i, h in enumerate(headings):
# 获取当前标题文本(清理多余空格/换行)
title = re.sub(r"\s+", " ", h.get_text(strip=True))
if not title.strip():
continue
# 获取该标题后直到下一个标题前的所有兄弟节点(含段落、列表等)
content_nodes = []
sibling = h.next_sibling
while sibling and not sibling.name in ["h1", "h2", "h3", "h4", "h5", "h6"]:
if sibling.name and sibling.get_text(strip=True): # 过滤空白标签
content_nodes.append(sibling)
sibling = sibling.next_sibling
# 合并内容文本(保留段落换行)
content = "\n".join([node.get_text(strip=False) for node in content_nodes])
# 保存为独立文件(命名含序号和标题关键词)
filename = f"{output_dir}/section_{i+1}_{re.sub(r'[\\/:*?"<>|]', '_', title[:40])}.txt"
with open(filename, "w", encoding="utf-8") as f:
f.write(f"{title}\n{'='*len(title)}\n\n{content}")
print(f"✓ 已保存: {filename}")
# 执行
split_contract_by_heading("output_contract.html")✅ 关键优化建议
-
标题识别增强:若PDF中标题未正确转为
,可在pdftohtml后用正则预处理HTML,例如匹配“第[零一二三四五六七八九十]+条[ ]+[^\n]+”并包裹为 。
- 内容去噪:法律合同常含页眉页脚,添加 soup.find("div", class_="footer").decompose() 提前移除。
- 编码兼容性:务必指定 encoding="utf-8",避免中文乱码;若仍异常,尝试 encoding="gb18030"。
最终,你将获得一组命名清晰的 .txt 文件,每个文件严格对应一个合同条款——从PDF到结构化文本的转化,至此完成闭环。此方案兼顾准确性、可复现性与工程落地性,适用于批量处理数百份合同场景。
立即学习“前端免费学习笔记(深入)”;











