继上篇从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月,很可能不会再更新了。
EncodedStreamObject
类中的setData方法self._data = data
修改结果如下:
使用此方法要注意修改后的图片格式要和原图片格式保持一致,如果图片格式不一致,图片将无法正常显示。
另外pdf结构中保存了图片的宽度和高度等信息,如果更换后的图片大小(宽度*高度)和原图片的不一致,可能也会产生问题。