You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PyPDF2智能跳过PDF目录、致谢页,仅提取正文内容

智能提取PDF核心正文(跳过目录、致谢等非正文页面)

我用PyPDF2读取页数≥100页的PDF,目标是只提取核心正文,跳过目录、致谢等非正文页面。当前代码会把目录也提取出来,而且因为要处理大量PDF,没法固定跳过的页码范围,求智能跳过的方法。

用户原代码:

# importing required modules
import PyPDF2

# creating a pdf file object
pdfFileObj = open(r"/content/IFA Manual 2020.pdf", 'rb')

# creating a pdf reader object
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

document=''
for i in range(0,pdfReader.numPages):
    # creating a page object
    pageObj = pdfReader.getPage(i)
    # extracting text from page
    document=document+pageObj.extractText()

# closing the pdf file object
pdfFileObj.close()

document = document.replace('\n', '')
document

给你几个实用的智能过滤方法:

方法1:基于内容特征过滤页面

通过识别非正文关键词或目录特有的章节-页码格式,判断是否跳过当前页面。

import PyPDF2
import re

def is_non_body_page(text):
    # 可根据PDF语言/内容扩展非正文关键词
    non_body_keywords = ["CONTENTS", "目录", "ACKNOWLEDGEMENTS", "致谢", "FOREWORD", "前言", "PREFACE", "序"]
    # 检查是否包含非正文关键词
    for keyword in non_body_keywords:
        if keyword.lower() in text.lower():
            return True
    # 检查是否为目录格式:匹配多次出现的「章节编号 标题 页码」模式
    pattern = r"\d+(\.\d+)?\s+.+\s+\d+"
    matches = re.findall(pattern, text)
    if len(matches) > 5:
        return True
    return False

pdfFileObj = open(r"/content/IFA Manual 2020.pdf", 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

document = ''
for i in range(pdfReader.numPages):
    page_text = pdfReader.getPage(i).extractText()
    if not is_non_body_page(page_text):
        document += page_text

pdfFileObj.close()
document = document.replace('\n', '')
print(document)

方法2:定位正文的起始与结束页

找到正文开始的第一个章节页(如「Chapter 1」「第1章」)作为起始,找到附录、参考文献等标识页作为结束,只提取中间内容。

import PyPDF2

def find_body_range(pdf_reader):
    start_page = 0
    end_page = pdf_reader.numPages - 1
    # 正文起始标识,按需调整
    start_triggers = ["Chapter 1", "第1章", "1.1 Introduction", "1.1 引言"]
    # 正文结束标识,按需调整
    end_triggers = ["APPENDIX", "附录", "REFERENCES", "参考文献", "ACKNOWLEDGEMENTS", "致谢"]
    
    for i in range(pdf_reader.numPages):
        page_text = pdf_reader.getPage(i).extractText().lower()
        # 定位起始页
        if start_page == 0:
            for trigger in start_triggers:
                if trigger.lower() in page_text:
                    start_page = i
                    break
        # 定位结束页
        if end_page == pdf_reader.numPages - 1:
            for trigger in end_triggers:
                if trigger.lower() in page_text:
                    end_page = i - 1
                    break
        # 找到起止后提前退出循环
        if start_page != 0 and end_page != pdf_reader.numPages - 1:
            break
    return start_page, end_page

pdfFileObj = open(r"/content/IFA Manual 2020.pdf", 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

start, end = find_body_range(pdfReader)
document = ''
for i in range(start, end + 1):
    document += pdfReader.getPage(i).extractText()

pdfFileObj.close()
document = document.replace('\n', '')
print(document)

方法3:利用PDF书签(大纲)提取正文

如果PDF包含结构化书签,直接提取书签指向的正文章节页面,跳过目录、致谢这类非正文书签对应的页面。

import PyPDF2

def get_body_pages_from_bookmarks(pdf_reader):
    body_pages = set()
    # 获取PDF大纲(书签)
    outline = pdf_reader.getOutlines()
    for item in outline:
        if isinstance(item, dict):
            title = item.get("/Title", "").lower()
            # 跳过非正文书签
            if any(key in title for key in ["contents", "acknowledgements", "foreword", "前言", "序"]):
                continue
            # 获取书签对应的页码(0-based)
            page_num = pdf_reader.getDestinationPageNumber(item)
            body_pages.add(page_num)
            # 处理子书签对应的页面
            if "/Kids" in item:
                for kid in item["/Kids"]:
                    kid_page = pdf_reader.getDestinationPageNumber(kid)
                    body_pages.add(kid_page)
    return sorted(body_pages)

pdfFileObj = open(r"/content/IFA Manual 2020.pdf", 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

body_pages = get_body_pages_from_bookmarks(pdfReader)
document = ''
for page_num in body_pages:
    document += pdfReader.getPage(page_num).extractText()

pdfFileObj.close()
document = document.replace('\n', '')
print(document)

内容的提问来源于stack exchange,提问作者Vinay Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 15:45:47