如何在Python中读取横向PDF?解决PyPDF2提取横版文本乱码问题
解决竖版PDF中横版页面文本提取乱码的问题
我之前也碰到过一模一样的情况——当PDF里混了旋转过的横版页面时,PyPDF2直接提取文本会因为排版方向不匹配,把文本顺序彻底打乱,看起来就像乱码。核心原因是PyPDF2默认不会自动处理页面的旋转状态,文本读取逻辑跟着旋转后的坐标走,自然就输出了看不懂的内容。下面给你两种实用的解决方法:
方法一:用PyPDF2手动修正页面旋转
首先,你需要先检查每个页面的旋转角度,把旋转的页面转回正常方向后再提取文本。PyPDF2的Page对象自带rotation属性,可以直接获取页面的旋转角度(通常是90、180、270这几个值)。
示例代码:
from PyPDF2 import PdfReader # 读取目标PDF文件 pdf_reader = PdfReader("your_portrait_with_landscape.pdf") for page_num, page in enumerate(pdf_reader.pages): # 获取当前页面的旋转角度 page_rotation = page.rotation print(f"第{page_num+1}页旋转角度: {page_rotation}") # 如果页面有旋转,先转回0度(正常竖版方向) if page_rotation != 0: # rotate方法参数为旋转角度,负号表示反向旋转(比如原页面顺时针转90,这里就逆时针转90) corrected_page = page.rotate(-page_rotation) extracted_text = corrected_page.extract_text() else: extracted_text = page.extract_text() # 输出提取的文本(或者做后续业务处理) print(f"第{page_num+1}页提取文本:\n{extracted_text}\n")
这种方法能解决大部分因页面旋转导致的乱码问题,但如果你的PDF使用了特殊嵌入字体或非标准排版,PyPDF2可能还是会有提取不准确的情况。
方法二:换用PyMuPDF(fitz)处理复杂排版
如果PyPDF2的效果不理想,我强烈推荐用PyMuPDF——这个库对各种PDF排版的兼容性极好,不管是旋转页面、原生横向页面还是复杂布局,它都能自动识别并正确提取文本,几乎不需要额外处理旋转逻辑。
首先安装库:
pip install pymupdf
示例代码:
import fitz # PyMuPDF的常用别名 # 打开PDF文件 pdf_doc = fitz.open("your_portrait_with_landscape.pdf") for page_num, page in enumerate(pdf_doc): # 直接调用get_text(),库会自动处理所有排版问题 extracted_text = page.get_text() print(f"第{page_num+1}页提取文本:\n{extracted_text}\n")
我自己处理各种复杂PDF时,PyMuPDF的提取准确率比PyPDF2高很多,尤其是这种混排场景,基本不会出现乱码问题。
补充说明
你遇到的“乱码”本质上不是真的编码错误,而是文本的读取顺序因为页面旋转被彻底打乱了——比如横版页面的文本是横向排列的,PyPDF2按竖版的坐标顺序读取,就会把一行文字拆成零散的混乱片段。只要把页面转回正确方向,或者用能自动识别排版的库,就能解决这个问题。
内容的提问来源于stack exchange,提问作者Daniel Micoski
相关产品推荐
相关产品推荐

