You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows7下Python2.7提取LibreOffice生成PDF文本异常求助

解决Windows下Python 2.7提取LibreOffice生成PDF文本的乱码与编码错误问题

我完全懂你的困扰——不同PDF生成器的文本存储逻辑差异很大,PyPDF2在处理LibreOffice这类工具生成的文件时确实容易栽跟头,而Python2.7默认的ASCII编码又会给PDFMiner添乱。下面给你两个简单可行的Windows专属解决方案:

方案一:改用PyMuPDF(fitz)——最省心的选择

PyMuPDF对各种PDF的兼容性远优于PyPDF2和旧版PDFMiner,尤其是处理LibreOffice生成的文件,提取文本几乎不会出现乱码,而且安装和使用都很简单。

  1. 安装适配Python2.7的PyMuPDF版本
    在命令行执行以下命令(1.19.6是支持Python2.7的最后一个稳定版本):
pip install pymupdf==1.19.6
  1. 替换你的提取代码
import fitz  # 即PyMuPDF

filePath = "你的PDF文件路径"
pageText = ""
doc = fitz.open(filePath)
# 逐页提取文本
for page in doc:
    pageText += "\n" + page.get_text()
doc.close()

# 复用你原有的字符串检测逻辑
extInfo = pageText  # 原代码里逐个字符拼接的循环完全多余,直接赋值即可
stringPresent = string2search.replace(' ','') in extInfo

这个方案能直接解决乱码问题,而且编码处理更友好,不会轻易触发ASCII编码错误。

方案二:修复PDFMiner的Unicode编码错误

如果你坚持要用PDFMiner,只需手动指定编码,避开Python2.7默认的ASCII限制即可:

  1. 安装Python2.7兼容的PDFMiner版本
pip install pdfminer==20191125
  1. 修改PDFMiner使用代码
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

def extract_text_from_pdf(file_path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'  # 明确指定UTF-8编码,避免默认ASCII导致的错误
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = open(file_path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    
    # 遍历所有页面提取文本
    for page in PDFPage.get_pages(fp, set(), maxpages=0, password="", caching=True, check_extractable=True):
        interpreter.process_page(page)

    text = retstr.getvalue()
    # 清理资源
    fp.close()
    device.close()
    retstr.close()
    return text

# 调用函数提取文本
pageText = extract_text_from_pdf(filePath)
extInfo = pageText
stringPresent = string2search.replace(' ','') in extInfo

核心是在TextConverter中指定codec='utf-8',强制用UTF-8处理非ASCII字符,解决UnicodeEncodeError。

小提示:原PyPDF2代码的冗余问题

你原代码里这段循环完全没必要:

for line in pageText:
    extInfo = extInfo + line

pageText本身就是完整字符串,直接extInfo = pageText即可,逐个字符拼接既低效又容易引入不必要的问题。

内容的提问来源于stack exchange,提问作者Budlog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:14:54