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 初始化多维数组代码
Sep 06 Python
python翻译软件实现代码(使用google api完成)
Nov 26 Python
python多线程threading.Lock锁用法实例
Nov 01 Python
Python中使用Tkinter模块创建GUI程序实例
Jan 14 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
Aug 10 Python
使用Python写一个量化股票提醒系统
Aug 22 Python
Python中按值来获取指定的键
Mar 04 Python
django的ORM操作 增加和查询
Jul 26 Python
Python基于smtplib协议实现发送邮件
Jun 03 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 Python
搭建pypi私有仓库实现过程详解
Nov 25 Python
详解BeautifulSoup获取特定标签下内容的方法
Dec 07 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
PHP递归实现层级树状展开
2016/04/01 PHP
浅谈PHP5.6 与 PHP7.0 区别
2019/10/09 PHP
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
用js实现小球的自由移动代码
2013/04/22 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
JavaScript学习笔记之基础语法
2015/01/22 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
使用python实现BLAST
2018/02/12 Python
Python封装原理与实现方法详解
2018/08/28 Python
pandas数据集的端到端处理
2019/02/18 Python
Python with标签使用方法解析
2020/01/17 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
会计专业毕业自荐书范文
2014/02/08 职场文书
个性与发展自我评价
2014/02/11 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
小学五一劳动节活动总结
2015/02/09 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
2015团员个人年度总结
2015/11/24 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
分析设计模式之模板方法Java实现
2021/06/23 Java/Android
MySQL Innodb索引机制详细介绍
2021/11/23 MySQL