将PDF法律合同精准拆分为结构化HTML并提取章节内容

本文介绍如何使用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_co

ntract_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到结构化文本的转化,至此完成闭环。此方案兼顾准确性、可复现性与工程落地性,适用于批量处理数百份合同场景。