Python将PDF转JPEG遇错误:无法识别BytesIO图像文件
问题描述
尝试用Python将PDF转换为JPEG用于OCR操作时,持续触发以下错误:
cannot identify image file <_io.BytesIO object at 0x7cf34c6276a0>
相关转换代码如下:
def convert_pdf_to_jpeg(self, jpeg_output_dir='jpeg_output'): try: os.makedirs(jpeg_output_dir, exist_ok=True) pages = convert_from_path(self.input_path, fmt='jpeg', poppler_path = '/usr/bin') image_paths=[] for i, page in enumerate(pages): image_path = os.path.join(jpeg_output_dir, f'page_{i+1}.jpg') page.save(image_path,'JPEG', quality=self.image_quality) image_paths.append(image_path) logging.info(f'Page {i+1} saved as JPEG at {image_path} with quality {self.image_quality}') return image_paths except Exception as e: logging.error(f'PDF to JPEG conversion failed: {e}') import traceback traceback.print_exc() raise
调用该功能的代码:
pages = convert_from_path('/content/3031358-TTI_SN20210823-004(01SEP).pdf', dpi = 200, poppler_path='/usr/bin')
解决方法
这个错误大多是pdf2image返回的BytesIO对象无法被PIL正确解析,或是Poppler路径、PDF文件本身存在问题,可尝试以下修复方案:
确认Poppler路径正确性
执行终端命令which pdftoppm,找到Poppler核心工具的实际路径,替换代码中的poppler_path参数。注意路径要指向包含pdftoppm等二进制文件的目录,而非泛用的/usr/bin(部分系统中Poppler可能安装在/usr/local/bin)。显式转换BytesIO为PIL Image
如果convert_from_path返回的是BytesIO流而非Image对象,手动转换后再保存:from PIL import Image import io # 修改转换逻辑 pages = convert_from_path(self.input_path, fmt='jpeg', poppler_path='/usr/bin') image_paths = [] for i, page in enumerate(pages): if isinstance(page, io.BytesIO): page = Image.open(page) image_path = os.path.join(jpeg_output_dir, f'page_{i+1}.jpg') page.save(image_path, 'JPEG', quality=self.image_quality) image_paths.append(image_path)移除冗余格式参数
删掉fmt='jpeg',让pdf2image默认返回PIL Image对象,再手动保存为JPEG格式:pages = convert_from_path(self.input_path, dpi=200, poppler_path='/usr/bin') # 后续保存逻辑保持不变检查PDF文件状态
手动打开目标PDF,确认文件未损坏、未加密。也可尝试用其他工具(如系统自带的PDF查看器)转换一页为图片,验证文件本身是否可用。升级依赖库
更新pdf2image和Pillow到最新版本,修复已知兼容性问题:pip install --upgrade pdf2image pillow
内容的提问来源于stack exchange,提问作者Alvin Joseph
相关产品推荐
相关产品推荐

