使用PyPDF2与PyPDF4提取PDF文本返回空白如何解决?
问题根本原因
PyPDF2/PyPDF4仅支持提取标准编码、非扫描版PDF的可编辑文本内容,返回空白通常是以下几种情况:
- PDF本身是扫描件生成的影像版PDF,所有内容都是嵌入的图片,不存在可直接读取的文本层
- PDF使用了自定义字体编码,没有内置字符映射关系,库无法解码识别内容
- PDF设置了内容提取权限限制,虽然可以读取页数等元数据,但无法直接提取文本
解决方案
1. 先排查PDF是否加密或有权限限制
先在代码中增加解密逻辑,部分PDF的权限限制可以直接通过内置方法解除:
import PyPDF4 as p2 pdffile = open("XXXX.pdf","rb") pdfread=p2.PdfFileReader(pdffile) # 新增解密逻辑 if pdfread.isEncrypted: # 无密码的加密PDF直接传空字符串解密 pdfread.decrypt('') print(pdfread.getNumPages()) pageinfo=pdfread.getPage(0) print(pageinfo.extractText())
如果运行后还是返回空白,排除权限限制问题,继续往下排查。
2. 替换为兼容性更强的文本提取库
优先使用pdfplumber,它对非标准编码PDF的兼容性远高于PyPDF系列,安装和使用代码如下:
安装命令:pip install pdfplumber
提取代码:
import pdfplumber with pdfplumber.open("XXXX.pdf") as pdf: # 输出总页数 print(len(pdf.pages)) # 提取第一页文本 first_page = pdf.pages[0] print(first_page.extract_text())
如果该方法仍然返回空白,说明你的PDF是扫描版影像PDF,需要用OCR方案提取。
3. 扫描版PDF使用OCR提取文本
可以用pytesseract+pdf2image的组合方案,把PDF每页转成图片后识别文本内容:
依赖安装(注意需要提前安装tesseract OCR引擎到本地):pip install pytesseract pdf2image
提取代码示例:
from pdf2image import convert_from_path import pytesseract # 把PDF第一页转成PIL图片对象 pages = convert_from_path("XXXX.pdf", first_page=1, last_page=1) # 识别图片中的中文+英文文本,只识别英文可以去掉lang参数 text = pytesseract.image_to_string(pages[0], lang='chi_sim+eng') print(text)
内容的提问来源于stack exchange,提问作者War_Pig
相关产品推荐
相关产品推荐

