继上篇从PDF中提取图片数据之后,我们看如何使用PIL修改图片并写入到PDF文件。
先放两个相关链接:
使用PyPDF4提取pdf文件中的图片
PIL从内存中加载图片
先放代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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]是一个
最简单的修改方法:
- 打开PyPDF4模块中的generic.py
- 找到
EncodedStreamObject 类中的setData方法 - 将方法中的原有代码注释,添加
self._data = data
修改结果如下:

使用此方法要注意修改后的图片格式要和原图片格式保持一致,如果图片格式不一致,图片将无法正常显示。
另外pdf结构中保存了图片的宽度和高度等信息,如果更换后的图片大小(宽度*高度)和原图片的不一致,可能也会产生问题。