Python轻松给PDF文档加水印!

这篇文章是之前写的,最近翻出来的。

前言

最近在整理数据库技术的知识内容,期间想到一个需求,在PDF文档上添加一个水印,毕竟是自己辛辛苦苦整理出来的,那么应该怎么实现呢?其实非常简单,大家都知道在网络上有许许多多提供这样功能的网站,只是大部分网站都有一定的限制,比如文件大小什么的,还有一点就是你有没有考虑过安全性,虽说我们一般也不会有什么安全级别较高的机密性文件,但文件安全也时刻需要有警惕。

那需要怎么搞呢,对,就是自己想办法写工具,写代码去实现。办公自动化这方面,Python就可以大显身手了,操作也是非常的简单。

准备

在开始之前,首先要准备好你的水印PDF文档,以及需要加入水印的原文档。

注意:水印文档是.pdf格式的!

安装第三方库

 

在这里我们需要安装PyPDF2第三方库,使用其中的PdfFileReader, PdfFileWriter

相关文档:https://pythonhosted.org/PyPDF2/

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) 从这个输出中删除图像

微信关注

WeChat

阅读剩余
THE END