PyPDF2 extract_text()提取PDF文本乱码,该如何解决?
解决PDF文本提取乱码及按最后单词裁剪问题
一、换用更可靠的文本提取工具
- 弃用默认的
extract_text(),改用PyMuPDF(fitz)的文本提取方法,它对非拉丁字符的编码兼容性更好:import fitz doc = fitz.open("目标文件.pdf") target_page = doc[页码] # 提取纯文本,也可用"blocks"获取带位置的结构化文本 raw_text = target_page.get_text("text") - 若仍有异常,尝试
get_text("raw")获取更底层的文本数据,再做编码修正。
二、手动清理异常字符
针对提取出的乱码(比如示例中的á),可通过正则过滤或字符映射修正:
- 保留目标字符集(以你示例中的梵语系字符为例),过滤无关字符:
import re # 仅保留梵语字符、空格和/符号,移除其他异常字符 cleaned_text = re.sub(r'[^\u0900-\u097F\s/]', '', raw_text) - 若已知错误字符的对应关系,可直接批量替换,比如
cleaned_text = raw_text.replace("á", "")。
三、用OCR提取视觉文本(针对字体编码损坏的PDF)
如果PDF内嵌字体编码有问题,直接通过视觉识别提取准确文本:
import pytesseract from PIL import Image import fitz doc = fitz.open("目标文件.pdf") target_page = doc[页码] # 将PDF页面转为图片 pix = target_page.get_pixmap() img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples) # 指定对应语言包(梵语为"san",需提前安装tesseract对应语言包) accurate_text = pytesseract.image_to_string(img, lang="san")
四、提取正确文本后裁剪PDF
确认最后一个单词所在的页面或位置后,用PyMuPDF裁剪PDF:
output_doc = fitz.open() # 假设需要保留到第n页(从0开始计数) for page_idx in range(n + 1): output_doc.insert_pdf(doc, from_page=page_idx, to_page=page_idx) output_doc.save("裁剪后的文件.pdf") # 关闭文档释放资源 output_doc.close() doc.close()
内容的提问来源于stack exchange,提问作者AmanKP
相关产品推荐
相关产品推荐

