作者:xiaoyi
不知道你有没有这样的经历:自己辛辛苦苦、通宵熬夜做的 PDF 文档被别人随意拿来传播,更有甚者被用来卖钱。
我们都说传播无罪,但是做这种事的人,你的良心不会痛吗?
今天就来说说如何保护自己的权益,保护自己费尽心血的 PDF 文档。
其实有一个很简单的方法,就是 PDF 水印
和 图片批量加水印!三步轻松搞定! 的方法很类似,PDF 文档加水印也只需要简单的三步即可完成。
另外,本次的 PDF 文档选择文章 一键爬取基金历年季度报数据!附源码 中爬取到的基金报告,该报告一共 46 页。
ok,下面直接开始!
生成水印PDF
首先,生成一个带有水印的 PDF 文件作为底图。
最简单的方式就是生成一张空白图片,在图片上添加水印,然后将水印图片插入到 word 中,最后保存成 PDF 文件即可。
而在图片上添加水印,甚至自定义水印内容、颜色、大小、透明度等操作,在 图片批量加水印!三步轻松搞定! 一文中已经详细介绍过,直接运行一遍代码即可
根据 PDF 文件定义图片的尺寸,一般都是A4纸大小:29.7×21厘米
生成的水印图片如下:
添加水印
涉及到 PDF 文档的读取,写入操作,所以本小节需要先安装 PyPDF2
安装方式比较简单:
pip install PyPDF2
关于 PyPDF2 这个包详细的内容可以阅读官网:https://pythonhosted.org/PyPDF2/
添加水印的逻辑就是将每一页的 PDF 文档合并到水印 PDF 上,形成一页新的内容
对于每一页 PDF 都进行同样的合并操作,最终添加到 PdfFileWriter 中即可
相应的核心代码如下:
for page_index in range(pdf_reader.getNumPages()):
current_page = pdf_reader.getPage(page_index)
# 复制水印PDF
new_page = copy(watermark_page)
# 核心代码
new_page.mergePage(current_page)
pdf_writer.addPage(new_page)
这里有一个小细节,完整的 PDF 第一页都是封面,封面一般来说都是不添加水印的
所以,代码可以这样设置:
for page_index in range(pdf_reader.getNumPages()):
current_page = pdf_reader.getPage(page_index)
# 封面页不添加水印
if page_index == 0:
new_page = current_page
else:
new_page = copy(watermark_page)
new_page.mergePage(current_page)
pdf_writer.addPage(new_page)
3. 保存水印 PDF
最后一步就比较简单,直接将对应的 PdfFileWriter 输出成 文件即可
对应的代码就一行:
# 保存水印后的文件
with open(save_filepath, "wb") as out:
pdf_writer.write(out)
最后看一下效果吧:
对于文字和表格内容,水印都可以在其下方成功显示,而文中的图片也可以正常显示,不会被水印遮挡
搞定!
代码内容比较少,直接贴在文末供大家参考学习,代码如下:
import os
from copy import copy
from PyPDF2 import PdfFileReader, PdfFileWriter
if __name__ == '__main__':
dirpath = 'pdf_file'
filename = '易方达中小盘混合型证券投资基金2020年中期报告'
filepath = os.path.join(dirpath, filename+'.pdf')
"""添加水印"""
watermark_filepath = os.path.join(dirpath, 'watermark.pdf')
save_filepath = os.path.join(dirpath, filename+'【带水印】.pdf')
"""读取PDF水印文件"""
# 可以先生成一个空白A4大小的png图片,通过 https://mp.weixin.qq.com/s/_oJA6lbsdMlRRsBf6DPxsg 教程的方式给图片加水印,将图片插入到word中并最终生成一个水印PDF文档
watermark = PdfFileReader(watermark_filepath)
watermark_page = watermark.getPage(0)
pdf_reader = PdfFileReader(filepath)
pdf_writer = PdfFileWriter()
for page_index in range(pdf_reader.getNumPages()):
current_page = pdf_reader.getPage(page_index)
# 封面页不添加水印
if page_index == 0:
new_page = current_page
else:
new_page = copy(watermark_page)
new_page.mergePage(current_page)
pdf_writer.addPage(new_page)
# 保存水印后的文件
with open(save_filepath, "wb") as out:
pdf_writer.write(out)
以上就是本节的全部内容,关于PDF 的操作后续会持续分享。
包括:拆分、合并、加密、解密、转换等,基本都是在工作上会用到的,希望在保护大家权益的同时,也希望能够对大家有所帮助。