如何用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
相关产品推荐
相关产品推荐

