pip install PyPDF2
pypdf2有PdfReader和PdfWriter两个对象分别用于读和写,reader()方法直接指定PDF文件的路径即可读取PDF文件,writer可以临时保存PDF内容,然后调用write()方法传入文件句柄即可保存到硬盘
from PyPDF2 import PdfReader, PdfWriter
reader = PdfReader("test.pdf") # 打开一个reader用于读取PDF文件
writer = PdfWriter() # 打开一个writer用于写入PDF
writer.add_page(reader.getPage(0)) # # 把PDF第一页添加到writer
# 保存PDF
with open("test2.pdf", "wb") as f:
writer.write(f)
添加空白页可以通过addBlankPage()方法,但注意,如果PdfWriter对象是空的,你需要指定宽高才能添加空白页,如果PdfWriter已有页面不指定宽高则采用上一页的宽高。可以通过PageObject对象的mediabox属性查看宽高信息
from PyPDF2 import PdfReader, PdfWriter
writer = PdfWriter()
writer.addBlankPage(612, 810) # 如果writer是一个空白的页面
writer.addBlankPage() # 添加一页空白页
print(writer.getPage(0).mediabox) # 查看页面宽高
with open("test2.pdf", "wb") as f:
writer.write(f)
我们可以通过下标获取页面或者直接遍历所有页面,返回得到PageObject对象
from PyPDF2 import PdfReader
reader = PdfReader("test.pdf")
# 获取总页数
page_count = reader.getNumPages()
# 下标取值,获取第1页
page = reader.getPage(0)
# 遍历所有页面
for page in reader.pages:
print(reader.getPageNumber(page)) # 获取page所在页码号
PageObject对象有一个extract_text()方法可以获取该页面的文本字符串,但是注意,官方文档提到只是简单获取文本,不保证公式等排版等信息是否正确
from PyPDF2 import PdfReader, PdfWriter
reader = PdfReader("test.pdf")
for index, page in enumerate(reader.pages): # 遍历所有页面
print(f"第{index}页文本:")
print(page.extract_text())
一份PDF可以保存标题、作者、修改时间等元数据信息,当然我们也可以修改
from PyPDF2 import PdfReader, PdfWriter
reader = PdfReader("test.pdf")
# 获取元数据信息
meta = reader.metadata # 返回一个类字典的DocumentInformation对象
# meta = reader.getDocumentInfo()) # 也reader.metadata等价
print(type(meta), len(meta), meta) # {'/Producer': 'Adobe LiveCycle PDF Generator', '/ModDate': ...}
print(meta.author) # 作者
print(meta.creator) # 创建者
print(meta.producer) # 制作者
print(meta.title) # 标题
print(meta.subject) # 子标题
print(meta.getText("/ModDate")) # 获取其他键值
# 更新元数据
meta.update({"/Author": "pan"})
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
writer.add_metadata(meta) # 该参数也可以直接是字典类型
with open("test2.pdf", "wb") as f:
writer.write(f)
如果某个元数据键值不存在则返回None
加密解密过程很简单,只需要传入秘钥调用对应的encrypt()和decrypt()即可
from PyPDF2 import PdfReader, PdfWriter
writer = PdfWriter()
writer.addBlankPage(612, 810)
secret = "fLa5fpao%3paH" # 密码
# 加密
writer.encrypt(secret)
with open("test2.pdf", "wb") as f:
writer.write(f)
reader = PdfReader("test2.pdf")
# 判断是否加密
if reader.is_encrypted:
# 解密
reader.decrypt(secret)
需要注意的是,调用decrypt()解密即使密码不对也不会报错,但后期你访问或操作该PDF会报错