Python实现给PDF添加水印的方法


Posted in Python onJanuary 25, 2021

前言

利用 PyPDF2 处理 PDF 文件,相关文档:https://pythonhosted.org/PyPDF2/

本文针对 仅有 PDF 文件,而无相关 PDF 编辑器的情况下,给 PDF 添加水印。

一、前期准备

安装 PyPDF2 ,命令提示框输入:

pip install PyPDF2

新建 watermark.pdf 文件
实际的水印,可以在此文件里修改水印文字的字体和位置。
实现步骤: 新建 watermark.word ,【设计】 → \to → 【水印】【自定义水印】 → \to → 【文字水印】输入【文字】,修改【字体】、【自号】、【颜色】和【板式】

Python实现给PDF添加水印的方法

Python实现给PDF添加水印的方法

效果

Python实现给PDF添加水印的方法

另存为 watermark.pdf

watermark.pdf.py 文件放在同一目录下

Python实现给PDF添加水印的方法

二、代码实现

// =============================================
# @Time  : 2021-01-24
# @Author : AXYZdong
# @CSDN  : https://axyzdong.blog.csdn.net/
# @FileName: PDFset.py
# @Software: Python IDE
// =============================================
from PyPDF2 import PdfFileReader, PdfFileWriter

def add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out):
  """把水印添加到pdf中"""
  pdf_output = PdfFileWriter()
  input_stream = open(pdf_file_in, 'rb')
  pdf_input = PdfFileReader(input_stream, strict=False)

  # 获取PDF文件的页数
  pageNum = pdf_input.getNumPages()

  # 读入水印pdf文件
  pdf_watermark = PdfFileReader(open(pdf_file_mark, 'rb'), strict=False)
  # 给每一页打水印
  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_in = '基于matlab的控制系统与仿真-1_AXYZdong的博客-CSDN博客.pdf'
  pdf_file_out = 'watermarked.pdf'
  pdf_file_mark = 'watermark.pdf'
  add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out)

效果

Python实现给PDF添加水印的方法 

三、其他方法

// =============================================
# @Time  : 2021-01-24
# @Author : AXYZdong
# @CSDN  : https://axyzdong.blog.csdn.net/
# @FileName: PDFSet.py
# @Software: Python IDE
// =============================================
from PyPDF2 import PdfFileReader, PdfFileWriter
from reportlab.lib.units import cm
from reportlab.pdfgen import canvas


def create_watermark(content):
  """水印信息"""
  # 默认大小为21cm*29.7cm
  file_name = "mark.pdf"
  c = canvas.Canvas(file_name, pagesize=(30*cm, 30*cm))
  # 移动坐标原点(坐标系左下为(0,0))
  c.translate(10*cm, 5*cm)

  # 设置字体
  c.setFont("Helvetica", 30)
  # 指定描边的颜色
  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)
  # 画几个文本,注意坐标系旋转的影响
  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 = PdfFileWriter()
  input_stream = open(pdf_file_in, 'rb')
  pdf_input = PdfFileReader(input_stream, strict=False)

  # 获取PDF文件的页数
  pageNum = pdf_input.getNumPages()

  # 读入水印pdf文件
  pdf_watermark = PdfFileReader(open(pdf_file_mark, 'rb'), strict=False)
  # 给每一页打水印
  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_in = '基于matlab的控制系统与仿真-1_AXYZdong的博客-CSDN博客.pdf'
  pdf_file_out = 'watermarked.pdf'
  pdf_file_mark = create_watermark('CSDN@AXYZdong')
  add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out)

效果

Python实现给PDF添加水印的方法

四、总结

  •  Python通过PyPDF2实现PDF添加水印,实际上就是将两个PDF文件合并实现添加水印;
  • 第一种方法的水印文件是通过 word 另存为 PDF,第二种方法是自动创建一个 PDF 文件;
  • 第二种方法与第一种相比,水印的字体不能随意改变,不支持中文,省去了方法一中手动生成 PDF 水印的步骤;
  • 第一种方法可以任意修改水印的位置和字体。

参考文献

[1]:python pdf加水印
[2]:Python中通过PyPDF2实现PDF添加水印

到此这篇关于Python实现给PDF添加水印的方法的文章就介绍到这了,更多相关Python PDF添加水印内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python使用xauth方式登录饭否网然后发消息
Apr 11 Python
python实现的udp协议Server和Client代码实例
Jun 04 Python
在Python的web框架中中编写日志列表的教程
Apr 30 Python
python实现彩票系统
Jun 28 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
基于Python的Post请求数据爬取的方法详解
Jun 14 Python
python关闭占用端口方式
Dec 17 Python
Python函数式编程实例详解
Jan 17 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
使用python创建生成动态链接库dll的方法
May 09 Python
解决TensorFlow程序无限制占用GPU的方法
Jun 30 Python
Python pyecharts案例超市4年数据可视化分析
Aug 14 Python
2021年值得向Python开发者推荐的VS Code扩展插件
Jan 25 #Python
numba提升python运行速度的实例方法
Jan 25 #Python
python中K-means算法基础知识点
Jan 25 #Python
python中HTMLParser模块知识点总结
Jan 25 #Python
pycharm配置QtDesigner的超详细方法
Jan 25 #Python
Python扫描端口的实现
Jan 25 #Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 25 #Python
You might like
PR值查询 | PageRank 查询
2006/12/20 PHP
php通过字符串调用函数示例
2014/03/02 PHP
php常见的魔术方法详解
2014/12/25 PHP
迁移PHP版本到PHP7
2015/02/06 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
使用vs code编辑调试php配置的方法
2019/01/29 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
使用js的replace()方法查找字符示例代码
2013/10/28 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
js模拟淘宝网的多级选择菜单实现方法
2015/08/18 Javascript
JavaScript原型及原型链终极详解
2016/01/04 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
2016/04/14 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
AngularJS入门教程之链接与图片模板详解
2016/08/19 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
JavaScript实现单英文金山打字通
2020/07/24 Javascript
laypage+SpringMVC实现后端分页
2019/07/27 Javascript
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python del()函数用法
2013/03/24 Python
10种检测Python程序运行时间、CPU和内存占用的方法
2015/04/01 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
pytorch梯度剪裁方式
2020/02/04 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
numba提升python运行速度的实例方法
2021/01/25 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
美国美发品牌:Bumble and Bumble
2016/10/08 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
信用卡工资证明范本
2015/06/19 职场文书