使用PyPDF4和PIL修改PDF文件中的图片

继上篇从PDF中提取图片数据之后,我们看如何使用PIL修改图片并写入到PDF文件。
先放两个相关链接:
使用PyPDF4提取pdf文件中的图片

PIL从内存中加载图片

先放代码:

import PyPDF4
from io import BytesIO
from PIL import Image, ImageDraw

def covertImg(bimg):
    img = Image.open(BytesIO(bimg))

    # 看你想实现什么功能了
	im = doSomething(img)
	
    stream = BytesIO()

    # 将图片保存到stream中
    # 注意,保存的格式要和pdf中原图片的格式保持一致
    im.save(stream, 'jpeg')

    img.close()
    return stream.getvalue()

pdf = PyPDF4.pdf.PdfFileReader("pdffile.pdf") 
newpdf = PyPDF4.pdf.PdfFileWriter()

for i in range(0, pdf.getNumPages()):
    pg = pdf.getPage(i)
    obj = pg['/Resources']['/XObject']

    for j in obj:
        img = obj[j].getData()
        stream = covertImg(img)

        # 在PyPDF4 1.27.0中,此方法未实现,需要修改
        obj[j].setData(stream)

    newpdf.addPage(pg)

with open('newpdf.pdf', 'wb') as f:
    newpdf.write(f)

划重点!!!

上面代码中的obj[j]是一个EncodedStreamObject的实例,在PyPDF4 1.27.0版本中,EncodedStreamObject类中的setData方法并未实现。此版本的发布时间是18年8月,很可能不会再更新了。

最简单的修改方法:
  1. 打开PyPDF4模块中的generic.py
  2. 找到EncodedStreamObject类中的setData方法
  3. 将方法中的原有代码注释,添加self._data = data

修改结果如下:
在这里插入图片描述
使用此方法要注意修改后的图片格式要和原图片格式保持一致,如果图片格式不一致,图片将无法正常显示。

另外pdf结构中保存了图片的宽度和高度等信息,如果更换后的图片大小(宽度*高度)和原图片的不一致,可能也会产生问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值