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()
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)
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)
...
我们可以修改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)
ageObject的mediabox属性的单位是“用户默认空间单位(default user space units)”,其实就是我们常说的磅,1磅约等于0.3527 毫米,主要换算关系如下
1 磅 = 1 / 72 英寸
1 英寸 = 25.4 毫米
1 磅 = 1 / 72 * 25.4 = 0.35277777777… 毫米
比如说A4纸的大小是210毫米x297毫米,换成磅则是210 / (1 / 72 * 25.4) 约等于595.27磅,297 / (1 / 72 * 25.4) 约等于841.89磅
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())
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)