使用PyPDF4读取PDF文本出现乱码,寻求解决方法及替代工具
解决PyPDF4提取PDF文本乱码问题的方案
针对PyPDF4的排查与修复
- 尝试编码转码:部分PDF采用非标准字体编码,PyPDF4提取后可能出现编码错位,可尝试对提取的文本进行编码转换:
# 在提取文本后添加转码逻辑 raw_text = pageObj.extractText() # 尝试常见编码组合,比如latin-1转gbk/utf-8 try: text = raw_text.encode('latin-1').decode('gbk') except UnicodeDecodeError: try: text = raw_text.encode('latin-1').decode('utf-8') except UnicodeDecodeError: text = raw_text # 保留原始文本,避免报错 - 更新PyPDF4版本:旧版本可能存在编码兼容缺陷,执行
pip install --upgrade PyPDF4升级到最新版再测试。
替代的Python PDF处理包
如果PyPDF4无法解决问题,以下包对复杂编码PDF的文本提取支持更稳定:
1. PyMuPDF(fitz)
文本提取精度高,对各类编码和复杂PDF兼容性好:
import glob import fitz relevant_path = 'C:\\_Personal\\Mega\\PycharmProjects\\PDFHandler\\docs\\input\\' if __name__ == '__main__': for PDFFile in glob.iglob(relevant_path + '*.pdf', recursive=True): print('Processing File: ' + PDFFile.split('\\')[-1]) doc = fitz.open(PDFFile) num_pages = len(doc) print(num_pages) text = '' for page in doc: text += page.get_text() print(text)
安装命令:pip install pymupdf
2. pdfplumber
专注文本提取,能保留文本布局,编码处理能力较强:
import glob import pdfplumber relevant_path = 'C:\\_Personal\\Mega\\PycharmProjects\\PDFHandler\\docs\\input\\' if __name__ == '__main__': for PDFFile in glob.iglob(relevant_path + '*.pdf', recursive=True): print('Processing File: ' + PDFFile.split('\\')[-1]) with pdfplumber.open(PDFFile) as pdf: num_pages = len(pdf.pages) print(num_pages) text = '' for page in pdf.pages: text += page.extract_text() print(text)
安装命令:pip install pdfplumber
3. pdfminer.six
pdfminer的Python3分支,可自定义编码参数,适配更多特殊PDF:
import glob from pdfminer.high_level import extract_text relevant_path = 'C:\\_Personal\\Mega\\PycharmProjects\\PDFHandler\\docs\\input\\' if __name__ == '__main__': for PDFFile in glob.iglob(relevant_path + '*.pdf', recursive=True): print('Processing File: ' + PDFFile.split('\\')[-1]) text = extract_text(PDFFile) print(text)
安装命令:pip install pdfminer.six
内容的提问来源于stack exchange,提问作者Spiffo
相关产品推荐
相关产品推荐

