当前位置:网站首页>【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)
边栏推荐
- [Excel知识技能] 将文本型数字转换为数值格式
- sqlmap combined with dnslog fast injection
- C语言篇,操作符之 移位运算符(>>、<<)详解
- 2. 依赖管理和自动配置
- Design and Realization of Employment Management System in Colleges and Universities
- [Data Visualization] Chart Design Principles
- 报错:Client does not support authentication protocol requested by server; consider upgrading MySQL cli
- “蔚来杯“2022牛客暑期多校训练营3 DF题解
- 12. 处理 JSON
- 【C语言篇】表达式求值(隐式类型转换,算术转换)
猜你喜欢
随机推荐
11. 自定义转换器
如果纯做业务测试的话,在测试行业有出路吗?
Dump file generation, content, and analysis
特殊类与类型转换
好用的翻译插件-一键自动翻译插件软件
阿里P7晒出1月工资单:狠补了这个,真香...
Server Tips
Is there a way out in the testing industry if it is purely business testing?
有哪些可以投稿软件工程/系统软件/程序设计语言类外文期刊、会议?
App regression testing, what are the efficient testing methods?
Pagoda Test-Building PHP Online Mock Exam System
开启新征程——枫叶先生第一篇博客
CF1534F2-Falling Sand (Hard Version)
电脑桌面删除的文件回收站没有,电脑上桌面删除文件在回收站找不到怎么办
逮到一个阿里 10 年老 测试开发,聊过之后收益良多...
Mysql.慢Sql
iNFTnews | In the Web3 era, users will have data autonomy
线上突然查询变慢怎么核查
如何便捷获取参考文献的引用格式?
Why do programming languages have the concept of variable types?