当前位置:网站首页>【pypdf2】合并PDF、旋转、缩放、裁剪、加密解密、添加水印

【pypdf2】合并PDF、旋转、缩放、裁剪、加密解密、添加水印

2022-08-10 23:50:00 冰冷的希望

1.合并PDF

pypdf2有一个PdfMerger对象用于合并多个PDF文件
使用方法很简单,只需要把需要合并的PDF文档的路径append进去即可

from PyPDF2 import PdfMerger

merger = PdfMerger()

# 按照顺序合并合并test1.pdf、test2.pdf、test3.pdf三个PDF文件
merger.append("test1.pdf")
merger.append("test2.pdf")
merger.append("test3.pdf")

merger.write("已合并.pdf")  # 保存到硬盘
merger.close()  # 不要忘了关闭句柄

如果你需要合并某些文档的某些页面,可以通过merge()方法,主要指定位置、合并的文档、文档范围三个参数,即指定从哪个文档插入哪些页面到哪个位置

from PyPDF2 import PdfReader, PdfWriter, PdfMerger

merger = PdfMerger()

pdf2 = open("test2.pdf", "rb")
pdf3 = open("test3.pdf", "rb")
# 添加test1的所有页面
merger.append("test1.pdf")
# 把test2的前三页插入到文档第一页
merger.merge(position=0, fileobj=pdf2, pages=(0, 3))
# 再把test3的第2、3页插入到文档当前第2页
merger.merge(position=1, fileobj=pdf3, pages=(1, 3))

merger.write("已合并.pdf")
merger.close()

2.旋转

PageObject对象有一个rotate()方法对自身进行旋转,但是旋转角度取值是0、90、270、180等,即90的倍数,正数是顺时针,负数是逆时针

from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("test1.pdf")
writer = PdfWriter()

page = reader.getPage(0).rotate(90)  # 顺时针旋转90度
writer.add_page(page)

writer.add_page(reader.pages[1])
writer.getPage(1).rotate(-90)  # 逆时针旋转90度

with open("旋转.pdf", "wb") as f:
    writer.write(f)

3.缩放

PageObject对象提供了第一个方法缩放页面,例如scale_by()可以指定一个浮点型的缩放因子进行等比缩放,例如缩放为原来的1.5倍

from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("test1.pdf")
writer = PdfWriter()

page = reader.getPage(0)
# 查看页面尺寸
print(page.mediabox)
# 缩放为原来的1.5倍
page.scale_by(1.5)
print(page.mediabox)
writer.add_page(page)
with open("缩放.pdf", "wb") as f:
    writer.write(f)

当然你也可以直接指定宽度和高度

...
page.scale_to(600, 1000)
...

4.裁剪

我们可以修改PageObject对象的mediabox的属性达到裁剪的目的
值得注意的是,页面左下角为坐标原点,向下为X轴正方向,向右为Y轴正方向
下面是裁剪页面左下角250x300的区域

from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("test1.pdf")
writer = PdfWriter()

page = reader.getPage(1)
print(page.mediabox)
# 裁剪页面左下角250x300的区域
page.mediabox.upper_left = (0, 0)
page.mediabox.upper_right = (250, 0)
page.mediabox.lower_left = (0, 300)
page.mediabox.lower_right = (250, 300)

writer.add_page(page)

with open("裁剪.pdf", "wb") as f:
    writer.write(f)

5.加密解密

PdfReader对象有提供encrypt()和decrypt()用于加密和解密文档,is_encrypted属性判断是否加密,如果文档加密了但没有界面后续访问就会报错。还需要注意的是尽管调用decrypt()进行解密,但密码不对它不会有任何提示,后续访问正常报错

from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("test1.pdf")
writer = PdfWriter()

writer.add_page(reader.getPage(0))
# 加密
writer.encrypt("12345")
with open("加密.pdf", "wb") as f:
    writer.write(f)

reader2 = PdfReader("加密.pdf")
# 解密
if reader2.is_encrypted:
    reader2.decrypt("12345")

print(reader2.getPage(0).extract_text())

6.添加水印

PageObject对象有提供merge_page()用于合并页面,这个合并并不是上面那种多个页面按顺序排在一起,而是把多个页面叠加为一个页面,所以我们可以通过这种方法达到添加水印的目的。首先你要自己准备一个PDF页面当成是水印(可以使用Acrobat等软件制作),样式自己设置好,然后把它合并到需要添加水印的PDF的每一页即可

from PyPDF2 import PdfReader, PdfWriter
# 打开准好好的水印PDF并读取水印页面
watermark_reader = PdfReader("watermark.pdf")
watermark_page = watermark_reader.getPage(0)
# 读取需要被添加水印的PDF
reader = PdfReader("test1.pdf")
writer = PdfWriter()
# 遍历所有页面
for page in reader.pages:
    # 合并水印页面
    page.merge_page(watermark_page)
    writer.add_page(page)

with open("水印.pdf", "wb") as f:
    writer.write(f)

原网站

版权声明
本文为[冰冷的希望]所创,转载请带上原文链接,感谢
https://binglengdexiwang.blog.csdn.net/article/details/125683882