使用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结构中保存了图片的宽度和高度等信息,如果更换后的图片大小(宽度*高度)和原图片的不一致,可能也会产生问题。

你可能感兴趣的:(Python)