如何用Python提取PDF的实际文件页码而非文档标注页码
解决PDF实际显示页码与PyPDF2提取索引不一致的问题
问题背景
使用PyPDF2提取指定文本所在页码时,返回的是PDF文档的内部页面索引(从0开始计数),但实际需要的是PDF文件显示的页码(比如代码输出7、22,但实际显示为8、23)。
解决方案
方案1:直接索引偏移(适用于页码连续从1开始的情况)
大多数PDF的实际显示页码是内部索引+1,只需将代码中输出的索引值加1即可:
import PyPDF2 import re # 新版本PyPDF2推荐使用PdfReader替代旧版PdfFileReader reader = PyPDF2.PdfReader(r"avnet_202209 (1).pdf") target_text = "Basis of presentation and new accounting pronouncements" # 遍历所有页面,enumerate返回索引和页面对象 for page_index, page in enumerate(reader.pages): page_text = page.extract_text() if re.search(target_text, page_text): # 索引+1得到实际显示页码 print(f"String Found on Page: {page_index + 1}")
方案2:解析PDF页码标签(适用于存在页码偏移的复杂情况)
如果PDF包含无页码的封面、目录等页面,实际页码并非从内部索引0开始计数,需要读取PDF的/PageLabels字典来获取准确的显示页码:
import PyPDF2 import re reader = PyPDF2.PdfReader(r"avnet_202209 (1).pdf") target_text = "Basis of presentation and new accounting pronouncements" # 获取所有页面的标签映射信息 page_label_info = reader.page_labels for page_index, page in enumerate(reader.pages): page_text = page.extract_text() if re.search(target_text, page_text): # 从标签信息中提取实际显示页码 actual_page = page_label_info[page_index]["number"] print(f"String Found on Page: {actual_page}")
注意:如果PDF未定义页码标签(
/PageLabels),page_labels会默认返回索引+1的数值,和方案1效果一致。
内容的提问来源于stack exchange,提问作者Anil Soren
相关产品推荐
相关产品推荐

