以下是基于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方法。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐