首先,打开pdf文件, 检查是否加密:
import PyPDF4
pdf = PyPDF4.pdf.PdfFileReader("filename")
pdf.isEncrypted
如果pdf.isEncrypted
返回False,说明未加密,可以继续操作;若返回True,则需要使用pdf.decrypt(password)
解密后才能操作。
其次,找到图片所在页,使用pdf.getPage(pagenum)
获取那一页(页码从0开始编号),这里返回的是一个字典。如:
pg = pdf.getPage(7)
从这里可以看出只有一张图片,存储在['/Resources']['/XObject']
里,通过type
查看返现pg['/Resources']['/XObject']['/Im8']
是一个EncodedStreamObject,通过getData()方法可以获取它的数据,直接以二进制模式写入文件即可保存。
完整代码如下:
In [1]: import PyPDF4
In [2]: pdf = PyPDF4.pdf.PdfFileReader("pdffile.pdf")
PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be corrected. [pdf.py:1801]
In [3]: pdf.isEncrypted
Out[3]: False
In [4]: pg = pdf.getPage(7)
In [5]: pg.keys()
Out[5]: dict_keys(['/Type', '/Parent', '/MediaBox', '/Contents', '/Resources'])
In [6]: pg.values()
Out[6]: dict_values(['/Page', IndirectObject(901, 0), [0, 0, 514.4882, 665.7059], IndirectObject(917, 0), {'/XObject': {'/Im8': IndirectObject(15, 0)}, '/ProcSet': ['/ImageB']}])
In [7]: im8 = pg['/Resources']['/XObject']['/Im8'].getData()
In [8]: with open('im8.jpg', 'wb') as f:
...: f.write(im8)
...:
In [9]: