使用PyMuPDF与pytesseract读取PDF内图片时遇KeyError: 'PNG'问题
解决PyMuPDF转PIL Image后pytesseract报KeyError: 'PNG'的问题
问题原因
该错误源于PyMuPDF的Pixmap转换得到的PIL Image存在格式兼容性问题——尤其是带有Alpha通道(RGBA模式)的图像,在pytesseract处理时,临时保存图像文件会触发格式识别错误。
修正后的代码
import fitz from PIL import Image import pytesseract import pandas as pd # 原代码遗漏该依赖导入 # 打开PDF文件 pdf_file = fitz.open("file") text_list = [] for page_number in range(pdf_file.page_count): page = pdf_file[page_number] # 获取当前页面的图片(推荐使用page.get_images()) images = page.get_images() for img in images: xref = img[0] pix = fitz.Pixmap(pdf_file, xref) # 处理带Alpha通道的图像,转换为RGB格式 if pix.n == 4: pix = fitz.Pixmap(fitz.csRGB, pix) # 转换为PIL Image对象 image_mode = "RGB" if pix.n == 3 else "L" image = Image.frombytes(image_mode, [pix.width, pix.height], pix.samples) # 识别图片文本 text = pytesseract.image_to_string(image) text_list.append(text) # 释放Pixmap资源,避免内存泄漏 pix = None # 转换为DataFrame并输出 df = pd.DataFrame(text_list, columns=["识别文本"]) print(df)
关键修复点
- 处理Alpha通道:对RGBA模式的
Pixmap,通过fitz.Pixmap(fitz.csRGB, pix)转换为纯RGB格式,消除pytesseract处理时的格式冲突。 - 资源释放:手动释放
Pixmap对象,避免长时间运行导致内存占用过高。 - 补全依赖:添加
pandas的导入语句,原代码使用pd.DataFrame但未声明依赖。
内容的提问来源于stack exchange,提问作者Diego Kenny
相关产品推荐
相关产品推荐

