pypdf 提取图片遭遇 not enough data 的解决方案

python 代码如下

from pypdf import PdfReader
# 我这里导出的图片是 jp2 格式的,因此需要cv2来转换
import cv2
# numpy 用于将图片以字节流的形式读取
import numpy as np

reader = PdfReader("MyPDF.pdf")# 读取 PDF 文件
outpath = "output/{}".format# 构建输出文件名

for p, page in enumerate(reader.pages):
    for i, img in enumerate(page.images):
        print("hanling page {} image '{}'".format(i, img.name))
        bytes = cv2.imdecode(
            np.frombuffer(img.data, np.uint8), 
            cv2.IMREAD_COLOR
            )
        cv2.imwrite(outpath("{}-{}.png".format(p, i)), bytes)

遭遇如下报错

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Untitled-1.ipynb 单元格 6 in 1
----> 1 reader.pages[22].images

File c:\Users\SaltSakya\AppData\Local\Programs\Python\Python310\lib\site-packages\pypdf\_page.py:463, in PageObject.images(self)
    461 for obj in x_object:
    462     if x_object[obj][IA.SUBTYPE] == "/Image":
--> 463         extension, byte_stream = _xobj_to_image(x_object[obj])
    464         if extension is not None:
    465             filename = f"{obj[1:]}{extension}"

File c:\Users\SaltSakya\AppData\Local\Programs\Python\Python310\lib\site-packages\pypdf\filters.py:707, in _xobj_to_image(x_object_obj)
    705     img = Image.frombytes(mode, size, data)
    706 if G.S_MASK in x_object_obj:  # add alpha channel
--> 707     alpha = Image.frombytes("L", size, x_object_obj[G.S_MASK].get_data())
    708     img.putalpha(alpha)
    709 img_byte_arr = BytesIO()

File c:\Users\SaltSakya\AppData\Local\Programs\Python\Python310\lib\site-packages\PIL\Image.py:2843, in frombytes(mode, size, data, decoder_name, *args)
   2840     args = mode
   2842 im = new(mode, size)
-> 2843 im.frombytes(data, decoder_name, args)
   2844 return im

File c:\Users\SaltSakya\AppData\Local\Programs\Python\Python310\lib\site-packages\PIL\Image.py:798, in Image.frombytes(self, data, decoder_name, *args)
    795 s = d.decode(data)
    797 if s[0] >= 0:
--> 798     raise ValueError("not enough image data")
    799 if s[1] != 0:
    800     raise ValueError("cannot decode image data")

ValueError: not enough image data

导航至报错位置,是 pypdffilters.py 文件中的问题,位置在 707 行,是处理 alpha 通道的部分的代码。
由于我这里实际不需要 alpha 通道,因此直接把这三行代码注释掉。
注释部分
此后可以正确运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

舒服嘉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值