生成水印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)

  

 
posted @ 2022-03-12 00:13  青竹之下  阅读(70)  评论(0编辑  收藏  举报