Python轻松给PDF文档加水印!
这篇文章是之前写的,最近翻出来的。
前言
最近在整理数据库技术的知识内容,期间想到一个需求,在PDF文档上添加一个水印,毕竟是自己辛辛苦苦整理出来的,那么应该怎么实现呢?其实非常简单,大家都知道在网络上有许许多多提供这样功能的网站,只是大部分网站都有一定的限制,比如文件大小什么的,还有一点就是你有没有考虑过安全性,虽说我们一般也不会有什么安全级别较高的机密性文件,但文件安全也时刻需要有警惕。
那需要怎么搞呢,对,就是自己想办法写工具,写代码去实现。办公自动化这方面,Python就可以大显身手了,操作也是非常的简单。
准备
在开始之前,首先要准备好你的水印PDF文档,以及需要加入水印的原文档。
注意:水印文档是.pdf格式的!
安装第三方库
在这里我们需要安装PyPDF2
第三方库,使用其中的PdfFileReader, PdfFileWriter
。
PyCharm 安装:File -> Default Settings -> Project Interpreter
注:PyCharm是Python使用较为广泛的集成开发工具,这里不过多的赘述。
也可以使用pip包管理工具进行命令式安装,在控制台或终端窗口输入以下命令:
pip3 install PyPDF2
代码实现
导入第三方库
from PyPDF2 import PdfFileReader, PdfFileWriter
读入水印pdf文件
pdf_file_mark = r'C:\Users\文文\Desktop\三级数据库\watermark.pdf'
pdf_watermark = PdfFileReader(open(pdf_file_mark, 'rb'), strict=False)
读入原文件并获取页数
pdf_file_in = r'C:\Users\文文\Desktop\三级数据库\故障管理\故障管理.pdf'
input_stream = open(pdf_file_in, 'rb')
pdf_input = PdfFileReader(input_stream, strict=False)
pageNum = pdf_input.getNumPages()
实例化输出文档对象
pdf_output = PdfFileWriter()
遍历每一页并添加水印
for i in range(pageNum):
page = pdf_input.getPage(i)
page.mergePage(pdf_watermark.getPage(0))
page.compressContentStreams() # 压缩内容
pdf_output.addPage(page)
输出生成文档
pdf_file_out = r'C:\Users\文文\Desktop\三级数据库\故障管理\故障管理water.pdf'
pdf_output.write(open(pdf_file_out, 'wb'))
实现效果
图丢了.....
完整代码
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 = r'C:\Users\文文\Desktop\三级数据库\11故障管理\11故障管理.pdf'
pdf_file_out = r'C:\Users\文文\Desktop\三级数据库\11故障管理\11故障管理water.pdf'
pdf_file_mark = r'C:\Users\文文\Desktop\三级数据库\water.pdf'
add_watermark(pdf_file_in, pdf_file_mark, pdf_file_out)
总结
PdfFileReader
构造方法:
PyPDF2.PdfFileReader(stream,strict = True,warndest = None,overwriteWarnings = True)
初始化一个 PdfFileReader 对象,此操作可能需要一些时间,因为 PDF 流的交叉引用表被读入内存。
参数:
- stream:*File 对象或支持与 File 对象类似的标准读取和查找方法的对象,也可以是表示 PDF 文件路径的字符串。
- strict(bool): 确定是否应该警告用户所用的问题,也导致一些可纠正的问题是致命的,默认是 True
- warndest : 记录警告的目标(默认是 sys.stderr)
- overwriteWarnings(bool):确定是否 warnings.py 用自定义实现覆盖 Python 模块(默认为 True)
PdfFileReader 对象的属性和方法
属性和方法 | 描述 |
---|---|
getDestinationPageNumber(destination) | 检索给定目标对象的页码 |
getDocumentInfo() | 检索 PDF 文件的文档信息字典 |
getFields(tree = None,retval = None,fileObj= None) | 如果此 PDF 包含交互式表单字段,则提取字段数据, |
getFormTextFields() | 从文档中检索带有文本数据(输入,下拉列表)的表单域 |
getNameDestinations(tree = None,retval= None) | 检索文档中的指定目标 |
getNumPages() | 计算此 PDF 文件中的页数 |
getOutlines(node = None,outline = None,) | 检索文档中出现的文档大纲 |
getPage(pageNumber) | 从这个 PDF 文件中检索指定编号的页面 |
getPageLayout() | 获取页面布局 |
getPageMode() | 获取页面模式 |
getPageNumber(pageObject) | 检索给定 pageObject 处于的页码 |
getXmpMetadata() | 从 PDF 文档根目录中检索 XMP 数据 |
isEncrypted | 显示 PDF 文件是否加密的只读布尔属性 |
namedDestinations | 访问该getNamedDestinations()函数的只读属性 |
PdfFileWriter
属性和方法 | 描述 |
---|---|
addAttachment(fname,fdata) | 在 PDF 中嵌入文件 |
addBlankPage(width= None,height=None) | 追加一个空白页面到这个 PDF 文件并返回它 |
addJS(javascript) | 添加将在打开此 PDF 是启动的 javascript |
addLink(pagenum,pagedest,rect,border=None,fit=’/fit’,*args) | 从一个矩形区域添加一个内部链接到指定的页面 |
addPage(page) | 添加一个页面到这个PDF 文件,该页面通常从 PdfFileReader 实例获取 |
getPage(pageNumber) | 从这个 PDF 文件中检索一个编号的页面 |
insertBlankPage(width=None,height=None,index=0) | 插入一个空白页面到这个 PDF 文件并返回它,如果没有指定页面大小,就使用最后一页的大小 |
insertPage(page,index=0) | 在这个 PDF 文件中插入一个页面,该页面通常从 PdfFileReader 实例获取 |
removeLinks() | 从次数出中删除连接盒注释 |
removeText(ignoreByteStringObject = False) | 从这个输出中删除图像 |
微信关注
阅读剩余
版权声明:
作者:理想
链接:https://www.imyjs.cn/archives/636
文章版权归作者所有,未经允许请勿转载。
THE END