Python 实现给 pdf 文件自动识别标题并增添大纲
·
以下是基于Python实现PDF文件标题识别与大纲添加的完整解决方案,结合了PDF文本解析、正则匹配和书签添加技术:
import re
import csv
from PyPDF2 import PdfReader, PdfWriter
import pdfplumber
def is_title(text):
"""识别标题的正则规则(支持多级标题)"""
patterns = [
r'^第[一二三四五六七八九十]+章\s+.+', # 中文章节
r'^\d+(\.\d+)*\s+[^\d]+$', # 数字编号标题(如1.2.3)
r'A-Z][a-z]+(\s[A-Z][a-z]+)*$', # 英文标题格式
r'IVX]+\.\s+.+$' # 罗马数字标题
]
return any(re.match(p, text.strip()) for p in patterns)
def process_pdf(input_path, output_path, csv_path=None):
"""主处理函数"""
titles = []
reader = PdfReader(input_path)
writer = PdfWriter()
# 复制原始PDF内容
for page in reader.pages:
writer.add_page(page)
# 使用pdfplumber提取文本分析
with pdfplumber.open(input_path) as pdf:
for i, page in enumerate(pdf.pages):
text = page.extract_text()
if not text:
continue
for line in text.split('\n'):
if is_title(line):
titles.append({
'page': i + 1,
'title': line.strip(),
'level': line.count('.') + 1 # 根据点号数量判断层级
})
# 可选:保存标题到CSV
if csv_path:
with open(csv_path, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=['page', 'title', 'level'])
writer.writeheader()
writer.writerows(titles)
# 添加书签
for item in titles:
writer.add_outline_item(
title=item['title'],
pagenum=item['page'] - 1, # PyPDF2页码从0开始
parent=None,
italic=False,
bold=True,
color='0 0 0',
fit='/Fit'
)
# 保存结果
with open(output_path, 'wb') as f:
writer.write(f)
if __name__ == '__main__':
input_pdf = 'input.pdf' # 输入文件路径
output_pdf = 'output_with_outline.pdf' # 输出文件路径
csv_file = 'titles.csv' # 可选标题记录文件
process_pdf(input_pdf, output_pdf, csv_file)
核心功能说明
1.标题识别:采用多模式正则匹配,支持中文章节(如"第一章 引言")、数字编号(如"1.2.3 方法")、英文标题和罗马数字格式。
2.层级判断:通过标题中的点号数量自动确定大纲层级(如"1.2"为二级标题)。
3.文本提取:使用pdfplumber进行精确的页面文本定位,保留原始格式信息。
4.大纲生成:通过PyPDF2的add_outline_item方法创建可点击的书签导航。
扩展建议
1.对于扫描版PDF,可结合OCR技术预处理。
2.复杂文档建议增加标题人工校验环节(通过生成的CSV文件)。
3.需要处理表格内容时可集成pdfplumber的extract_table方法。
更多推荐
所有评论(0)