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

使用Python提取PDF文件字符时出现编码与格式异常问题求助

解决PyPDF2提取PDF文本时的字符乱码与空格丢失问题

你遇到的问题本质是PyPDF2对特定PDF的嵌入字体编码映射处理不足,以及文本布局的空格识别逻辑不够精准。下面是具体的分析和可行的解决方案:

问题根源

PyPDF2的文本提取主要依赖PDF内部存储的文本流编码信息,但部分老旧或专业排版生成的PDF会使用非标准嵌入字体,PyPDF2无法正确解析这些字体的字符映射规则,导致出现Õ(对应撇号)、‹(对应à)、Þ(对应fi连字)这类乱码;同时它对文本块的空格拆分处理不够细致,才会出现单词间空格丢失的情况。

而你复制到LibreOffice能正常显示,是因为LibreOffice采用了类似PDF阅读器的渲染引擎提取文本,会通过字形匹配来还原字符,比PyPDF2的纯文本流解析逻辑更可靠。

解决方案:换用更强大的PDF提取库

推荐使用PyMuPDF(fitz)或pdfplumber,这两个库对复杂PDF的文本提取支持远优于PyPDF2,能更好地处理字体编码和文本布局。

方案1:使用PyMuPDF(fitz)

PyMuPDF是目前最受欢迎的PDF处理库之一,提取文本的准确率高,用法也简单:

首先安装库:

pip install pymupdf

修改提取函数:

def extractTextFromPdf(filename, ignore_newline=False):
    import fitz  # 导入PyMuPDF
    doc = fitz.open(filename)
    content = ''
    for page in doc:
        content += page.get_text()
    if ignore_newline:
        content = content.replace('\n', '')
    return content

estrazione_prova = extractTextFromPdf('input/document-page259.pdf')
print(estrazione_prova)

这个方法应该能正确还原撇号、à、fi等字符,同时保留单词间的正确空格分隔。

方案2:使用pdfplumber

pdfplumber更侧重结构化提取,对文本位置和格式的保留更精准,适合需要处理表格或复杂布局的场景:

安装库:

pip install pdfplumber

示例代码:

def extractTextFromPdf(filename, ignore_newline=False):
    import pdfplumber
    content = ''
    with pdfplumber.open(filename) as pdf:
        for page in pdf.pages:
            content += page.extract_text()
    if ignore_newline:
        content = content.replace('\n', '')
    return content

estrazione_prova = extractTextFromPdf('input/document-page259.pdf')
print(estrazione_prova)

为什么原代码的编码排查没用?

你尝试的encode()方法只是把已经乱码的字符串转成字节流,并没有解决源头的字符映射错误——PyPDF2已经把PDF中的字符错误映射成了乱码字符,后续的编码转换自然无法还原正确内容。

额外提示

如果需要保留更精准的格式(比如表格结构),pdfplumber还支持提取表格、文本块位置等信息;PyMuPDF则在提取速度和通用文本准确率上更有优势,可以根据你的需求选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:43:13