乔克视界 乔克视界
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档

乔克

云原生爱好者
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档
  • Docker

  • Golang

  • AIOps

  • Python

    • 基础知识

    • Django框架

    • 其他

      • Python代码规范
      • Python生成requirements
      • 用python给PDF打水印
        • 脚本如下
  • DevOps

  • 专栏
  • Python
  • 其他
乔克
2025-07-19
目录

用python给PDF打水印

# 脚本如下

import os
from PyPDF2 import PdfFileWriter, PdfFileReader
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
BASE_DIR = 'E:\\pdf'

# 添加中文字体
font_dir = os.path.join(BASE_DIR, "msyh.ttc")
pdfmetrics.registerFont(TTFont('msyh', font_dir))

def create_watermark(content):
    """创建PDF水印模板
    """
    watermark_pdf = os.path.join(BASE_DIR, 'watermark.pdf')
    # 使用reportlab来创建一个PDF文件来作为一个水印文件
    c = canvas.Canvas(watermark_pdf, pagesize= (30*cm, 30*cm))
    c.translate(10*cm, 5*cm)
    # 设置字体
    c.setFont('msyh', 80)

    # 设置水印文件
    c.saveState()
    c.translate(300, 15)
    # 设置不透明度
    c.setFillAlpha(0.3)
    # 旋转45度
    c.rotate(45)
    # 水印文字
    c.drawString(-10*cm, 0*cm, content)
    c.drawString(-10*cm, 6*cm, content)
    c.drawString(-10*cm, 12*cm, content)
    c.drawString(-10*cm, 18*cm, content)
    c.restoreState()
    # 保存水印文件
    c.save()
    pdf_watermark = PdfFileReader(open(watermark_pdf, "rb"))
    return pdf_watermark


#所有路径为绝对路径
def add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out):
    pdf_output = PdfFileWriter()
    input_stream = open(pdf_file_in, 'rb')
    pdf_input = PdfFileReader(input_stream)

    # 获取PDF文件的页数
    pageNum = pdf_input.getNumPages()
    #读入水印pdf文件
    pdf_watermark = pdf_file_mark
    # 给每一页打水印
    for i in range(pageNum):
        page = pdf_input.getPage(i)
        page.mergePage(pdf_watermark.getPage(0))
        page.compressContentStreams()   #压缩内容
        pdf_output.addPage(page)
    pdf_output.write(open(pdf_file_out, 'wb'))


if __name__ == "__main__":
    # 创建水印
    pdf_file_mark = create_watermark("个人证件禁止商业用途")
    # 需要打水印的pdf
    pdf_file_in = os.path.join(BASE_DIR, "身份证.pdf")
    # 打完水印后的文件
    pdf_file_out = os.path.join(BASE_DIR, "水印身份证.pdf")
    add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

执行结果如下

97974fe46de0bfa80982ed7ebb60b26d MD5

0e9ad2e9fcdc05da581db91a65741fbc MD5

作者:乔克

本文链接:https://jokerbai.com

版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!

上次更新: 2025/07/19, 11:33:23
Python生成requirements
Tekton系列之安装篇

← Python生成requirements Tekton系列之安装篇→

最近更新
01
使用 Generic Webhook Trigger 触发 Jenkins 多分支流水线自动化构建
07-19
02
使用Zadig从0到1实现持续交付平台
07-19
03
基于Jira的运维发布平台
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2025 乔克 | MIT License | 渝ICP备20002153号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式