PyPDF2是否支持横向模式PDF的文本提取?为何提取失败?
问题分析与解决方案
PyPDF2本身支持读取横向模式的PDF文档,页面方向(纵向/横向)通常不是直接导致文本提取失败的核心原因,但会和字体嵌入情况、PDF内部文本结构共同影响提取结果。结合你的情况,提取失败更可能和以下因素有关:
可能的原因
- 字体嵌入问题:Rockwell这类Slab Serif字体如果未被完整嵌入PDF,或仅嵌入了子集,PyPDF2无法识别字符与字形的映射关系,导致提取失败。而Helvetica是通用无衬线字体,多数PDF会正确嵌入,或PyPDF2内置了该字体的映射规则。
- 文本渲染方式:如果横向页面的文本是扫描生成的图像,或通过矢量路径绘制(而非可选择的文本对象),PyPDF2的文本提取功能无法识别这类内容,因为它仅处理PDF中存储的结构化文本。
- 页面旋转的坐标偏移:部分横向PDF实际是纵向页面旋转90度生成的,PyPDF2提取时可能因坐标系统未修正,导致文本解析混乱,出现提取为空或乱码的情况。
- PyPDF2的字体支持局限性:PyPDF2对非标准字体、特殊编码的支持较弱,相比PyMuPDF等现代库,处理复杂字体的能力不足。
解决方法
检查文本是否可选择
打开目标PDF,尝试选中横向页面的文本:- 如果无法选中,说明文本是图像化内容,需要结合OCR工具(如pytesseract)提取。
- 如果可以选中,继续尝试以下步骤。
修正页面旋转
在提取前先处理页面的旋转属性,确保坐标系统正确:text = "" pdf = PdfFileReader('TEST.pdf', 'rb') for i in range(pdf.getNumPages()): page = pdf.getPage(i) # 修正页面旋转角度 rotate_angle = page.get('/Rotate') or 0 if rotate_angle != 0: page = page.rotateClockwise(-rotate_angle) text += page.extractText() print(text)更换更强大的文本提取库
推荐使用PyMuPDF(fitz),它对复杂字体、各种页面方向的PDF支持更完善:import fitz # 需先安装:pip install pymupdf text = "" doc = fitz.open('TEST.pdf') for page in doc: text += page.get_text() print(text)检查字体嵌入状态
通过PDF阅读器的「文件-属性-字体」查看Rockwell字体的嵌入状态:- 如果显示“未嵌入”或“子集嵌入”,可尝试重新生成PDF时完整嵌入字体,再进行提取。
内容的提问来源于stack exchange,提问作者Lofton Gentry
相关产品推荐
相关产品推荐

