方法一:word版本的水印
首先用WPS做一个水印文件
然后另存为水印.pdf文件
from PyPDF2 import PdfReader,PdfWriter
# 导⼊包含⼀个⽔印的pdf⽂件,只要有⼀⻚即可
watermark_pdf=PdfReader('水印.pdf')
# 获取第⼀⻚
watermake = watermark_pdf.pages[0]
# 把想要加⽔印的pdf⽂件加载进来
input_pdf=PdfReader('test.pdf')
# 创建⼀个writer对象,⼀会⼉⽤来写新⽣成的pdf
writer=PdfWriter()
page = len(input_pdf.pages)
# 逐⻚读取pdf内的内容
for i in range(page):
page=input_pdf.pages[i]
# 将当前⻚与⽔印⻚合并
page.merge_page(watermake)
# 将当前⻚加⼊到待写⼊区域
writer.add_page(page)
# 将全部合并完的pdf保存到⽂件
with open('test含水印.pdf','wb') as f:
writer.write(f)
方法二:安装额外的库reportlab
安装:pip install reportlab
放到要运行的文件夹下面
若要想ReportLab支持中文,可以去下载SimSun.ttf字体,并把它放在/ python3.8/site-packages/reportlab/fonts文件夹下。字体下载链接:https://github.com/StellarCN/scp_zh/tree/master/fonts
电脑自带的字体
C:\\Windows\\Fonts\\msyhbd.ttf'
from PyPDF2 import PdfReader, PdfWriter
from reportlab.lib.units import cm
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
def create_watermark(content):
"""水印信息"""
# 默认大小为21cm*29.7cm
file_name = "mark.pdf"
c = canvas.Canvas(file_name, pagesize=(30 * cm, 30 * cm))
# 设置字体
try:
pdfmetrics.registerFont(TTFont('yahei', 'C:\\Windows\\Fonts\\AdobeHeitiStd-Regular.otf'))
# pdfmetrics.registerFont(TTFont('yahei', 'C:\\Windows\\Fonts\\msyhbd.ttf')) #可能电脑里没有这种字体,程序运行后只显示方块
c.setFont('yahei', 50)
# pdfmetrics.registerFont(TTFont("SimSun", "SimSun.ttf"))
# c.setFont("SimSun", 30)
except:
# 默认字体,只能够显示英文
c.setFont("Helvetica", 30)
# 移动坐标原点(坐标系左下为(0,0))
c.translate(10 * cm, 5 * cm)
# 指定描边的颜色
c.setStrokeColorRGB(0, 1, 0)
# 指定填充颜色
c.setFillColorRGB(0, 1, 0)
# 旋转45度,坐标系被旋转
c.rotate(30)
# 指定填充颜色
c.setFillColorRGB(0, 0, 0, 0.1)
# 设置透明度,1为不透明
# c.setFillAlpha(0.1)
# 画几个文本,注意坐标系旋转的影响
# c.drawString(0 * cm, 3 * cm, content)
for i in range(5):
for j in range(10):
a = 10 * (i - 1)
b = 5 * (j - 2)
c.drawString(a * cm, b * cm, content)
c.setFillAlpha(0.1)
# 关闭并保存pdf文件
c.save()
return file_name
def add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out):
"""把水印添加到pdf中"""
pdf_output = PdfWriter()
input_stream = open(pdf_file_in, 'rb')
pdf_input = PdfReader(input_stream, strict=False)
# 获取PDF文件的页数
pageNum = len(pdf_input.pages)
# 读入水印pdf文件
pdf_watermark = PdfReader(open(pdf_file_mark, 'rb'), strict=False)
# 给每一页打水印
for i in range(pageNum):
page = pdf_input.pages[i]
page.merge_page(pdf_watermark.pages[0])
page.compress_content_streams() # 压缩内容
pdf_output.add_page(page)
pdf_output.write(open(pdf_file_out, 'wb'))
if __name__ == '__main__':
pdf_file_in = 'test.pdf'
pdf_file_out = 'out2.pdf'
pdf_file_mark = create_watermark('confidential') #输入英文,该库默认不支持中文
add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out)
效果: