当前位置:   article > 正文

【pypdf2】安装、读取和保存、访问页面、获取文本、读写元数据、加密解密

pypdf2
1.安装pypdf2
pip install PyPDF2
  • 1
2.打开和保存PDF文件

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

添加空白页可以通过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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
3.获取页面

我们可以通过下标获取页面或者直接遍历所有页面,返回得到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所在页码号
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
4.获取PDF文本内容

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())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
5.读写元数据

一份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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

如果某个元数据键值不存在则返回None

6.加密解密

加密解密过程很简单,只需要传入秘钥调用对应的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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

需要注意的是,调用decrypt()解密即使密码不对也不会报错,但后期你访问或操作该PDF会报错

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/761775
推荐阅读
相关标签
  

闽ICP备14008679号