PDFplumber提取PDF文本时输出错乱、返回异常符号求助
文本提取错乱的核心成因
- 字体映射缺失:目标PDF使用了未嵌入标准
ToUnicode映射表的自定义CID字体。pdfplumber提取文本时会直接解析PDF内部的原始字符编码,缺少编码到通用Unicode的对应关系时,就会出现大小写穿插、字符错位、随机乱码的问题,这类问题和排版调整无关,靠修改提取参数无法解决。 - 参数使用错误:
pdfplumber.open()方法仅支持读取本地文件路径或传入类文件对象,不支持直接传入在线URL字符串。直接传入网络地址会导致无法正确加载目标PDF,读取到错误的二进制流,进一步加剧字符错乱的程度。 - 额外说明:你设置的
y_tolerance=20仅用于调整文本行合并的垂直偏移阈值,属于排版优化参数,在字体映射完全缺失的场景下,调整该参数无法解决根本的乱码问题。
准确提取文本的调整方案
- 先修正文件加载逻辑:
pdfplumber.open()无法直接解析在线URL,可选择两种加载方式,一是将目标PDF提前下载到本地后传入正确的本地路径,二是先通过网络请求获取PDF的二进制流,再将内存中的流对象传入pdfplumber.open(),核心加载逻辑示例:
# 方式1:本地文件加载 import pdfplumber with pdfplumber.open(r"C:\data\multicare-philippines-2018.pdf") as pdf: for page in pdf.pages: extracted_text = page.extract_text() print(extracted_text) # 方式2:在线文件流加载(无需本地存储) import requests from io import BytesIO import pdfplumber resp = requests.get("目标PDF的在线访问地址") pdf_stream = BytesIO(resp.content) with pdfplumber.open(pdf_stream) as pdf: for page in pdf.pages: extracted_text = page.extract_text() print(extracted_text)
- 若加载本地文件/内存流后依然存在乱码(因PDF本身缺失字体映射),需切换为OCR提取路径:通过pdfplumber将PDF页面渲染为高清图像,再调用本地OCR引擎识别图像中的文本,示例代码片段:
import pytesseract with pdfplumber.open(pdf_stream) as pdf: for page in pdf.pages: # 以300DPI分辨率渲染页面为图像,保证识别精度 page_image = page.to_image(resolution=300).original # 调用OCR引擎提取英文文本 recognized_text = pytesseract.image_to_string(page_image, lang="eng") print(recognized_text)
- 可优化的提取策略:若该PDF对应发布方提供了带可访问性标签的版本,这类文件会补全字体的ToUnicode映射关系,无需OCR流程即可直接通过原生解析提取到完整可读的正常文本。
内容的提问来源于stack exchange,提问作者Nikhil T
相关产品推荐
相关产品推荐

