使用Python提取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

