我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python实现批量向PDF文件添加中文水印

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python实现批量向PDF文件添加中文水印

前言

可以通过设置批量PDF文件所在的路径及需要添加的水印名称可以实现批量添加PDF水印的效果。

实现思路是这样的,通过在批量PDF文件路径下面生成一个带有水印的PDF模板。最后,将批量文件的每个PDF页面和水印模板进行合并完成批量添加水印的效果。

图片

需要注意的是批量PDF文件必须和PDF模板水印文件的大小尺寸保持一致,这个可以在代码里面调节一下就成了。

实现步骤

首先将需要添加水印的PDF文件准备好放在一个文件夹下面。

图片

在代码中设置好PDF批量文件的路径及水印名称。

if __name__ == '__main__':
    main('C:/pdf', '我是一个水印')

内部实现过程都封装在main()函数里面了,这里改一下水印名称和批量PDF文件路径直接执行就好了。

启动以后,出现如下面的结果说明已经执行完成了。

图片

为了不覆盖原来的PDF文件,合并后的文件都是添加了"已合并"字样的PDF文件。

说完了怎么操作,看一下主要的代码块部分有哪些吧。

其中用到的第三方库有下面这些,里面我写了相关的注释。

import os  # 应用文件操作

# reportlab是Python的一个标准库,可以画图、画表格、编辑文字,最后可以输出PDF格式。
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

pdfmetrics.registerFont(TTFont('songti', 'C:/Windows/Fonts/simsun.ttc'))  # 加载宋体

# PyPDF2模块主要的功能是分割或合并PDF文件,裁剪或转换PDF文件中的页面。
from PyPDF2 import PdfFileWriter, PdfFileReader

import logging  # 日志打印库

日志模块的初始化也比较简单,前面的文章中都有过相关的调用。

# 初始化日志设置
logger = logging.getLogger('批量添加水印')
logging.basicConfig(format='%(asctime)s %(levelname)-8s: %(message)s')
logger.setLevel(logging.DEBUG)

日志初始化完成后在后面需要打印日志的地方调用就可以了。

实现过程主要有三个函数来实现的,一个是为了生成水印模板、另一个是使水印模板和批量PDF文件执行合并从而实现添加水印的功能、还有一个就是逐个遍历批量PDF文件使其能够逐个实现水印合并。

水印模板生成函数。

def generate_water_pdf(content):
    '''
    生成带有水印的PDF
    :param content: 水印名称
    :return:
    '''
    cans = canvas.Canvas('water_back.pdf', pagesize=(21 * cm, 29.7 * cm))
    cans.translate(10 * cm,
                   12 * cm)  # 移动原点坐标
    cans.setFont('songti', 23)  # 设置字体为宋体、大小为23号
    cans.setFillColorRGB(0.5, 0.5,
                         0.5)  # 设置字体背景颜色
    cans.rotate(45)  # 设置字体倾斜45度
    cans.drawString(-7 * cm, 0 * cm, content)
    cans.drawString(7 * cm, 0 * cm, content)
    cans.drawString(0 * cm, 7 * cm, content)
    cans.drawString(0 * cm, -7 * cm, content)
    cans.save()  # 保存水印的PDF文件

水印合成实现函数。

def insert_water_to_pdf(input_pdf, output_pdf, water_pdf):
    '''
    合并水印到PDF文件中
    :param input_pdf: 输入文件路径
    :param output_pdf: 输出文件路径
    :param water_pdf: 水印文件路径
    :return:
    '''
    water = PdfFileReader(water_pdf)  # 读取水印PDF
    water_page = water.getPage(0)  # 获取水印PDF的第一页
    pdf = PdfFileReader(input_pdf, strict=False)  # 读取需要添加水印的文件
    pdf_writer = PdfFileWriter()  # 创建PDF文件写入对象
    for page in range(pdf.getNumPages()):  # 遍历每一页PDF对象
        pdf_page = pdf.getPage(page)  # 获取PDF的当前页对象
        pdf_page.mergePage(water_page)  # 将水印页合并到当前页中
        pdf_writer.addPage(pdf_page)  # 将合并后的PDF对象页添加到PDF写入对象中
    output_file = open(output_pdf, 'wb')  # 打开PDF输出文件
    pdf_writer.write(output_file)  # 将文件写入到输出文件
    output_file.close()  # 关闭写入流

批量PDF文件遍历调用合成函数。

def main(diretory, current):
    if os.path.isdir(diretory):
        logger.info('文件夹[' + diretory + ']校验成功!')
        os.chdir(diretory)
        logger.info('当前路径为[' + os.getcwd() + ']')
        generate_water_pdf(current)
        logger.info('水印PDF文件生成成功!')
        for file_path, dir_names, file_names in os.walk(r'' + os.getcwd()):
            for file_name in file_names:
                try:
                    name = file_name.split('.')[0]
                    if name == 'water_back':
                        continue
                    else:
                        file_name_path = os.path.join(file_path, file_name)
                        output_file_path = file_name_path.split('.')[0] + '_已添加水印.pdf'
                        insert_water_to_pdf(file_name_path, output_file_path, 'water_back.pdf')
                        logger.info('[' + file_name_path + ']完成水印合并!')
                except Exception as e:
                    logger.error('[' + file_name_path + ']发生异常,执行下一个!')
                    logger.error('异常信息:' + repr(e))
    else:
        logger.info('文件夹[' + diretory + ']校验失败!')

主要实现过程就是通过上面三个函数来完成的,最后调用后台入口函数将mian()函数调用执行就可以了。

完整代码

# -*- coding:utf-8 -*-
# @author Python 集中营
# @date 2022/1/27
# @file test4.py

# done

# 批量向PDF文件添加中文水印

import os  # 应用文件操作

# reportlab是Python的一个标准库,可以画图、画表格、编辑文字,最后可以输出PDF格式。
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

pdfmetrics.registerFont(TTFont('songti', 'C:/Windows/Fonts/simsun.ttc'))  # 加载宋体

# PyPDF2模块主要的功能是分割或合并PDF文件,裁剪或转换PDF文件中的页面。
from PyPDF2 import PdfFileWriter, PdfFileReader

import logging  # 日志打印库

# 初始化日志设置
logger = logging.getLogger('批量添加水印')
logging.basicConfig(format='%(asctime)s %(levelname)-8s: %(message)s')
logger.setLevel(logging.DEBUG)


def generate_water_pdf(content):
    '''
    生成带有水印的PDF
    :param content: 水印名称
    :return:
    '''
    cans = canvas.Canvas('water_back.pdf', pagesize=(21 * cm, 29.7 * cm))
    cans.translate(10 * cm,
                   12 * cm)  # 移动原点坐标
    cans.setFont('songti', 23)  # 设置字体为宋体、大小为23号
    cans.setFillColorRGB(0.5, 0.5,
                         0.5)  # 设置字体背景颜色
    cans.rotate(45)  # 设置字体倾斜45度
    cans.drawString(-7 * cm, 0 * cm, content)
    cans.drawString(7 * cm, 0 * cm, content)
    cans.drawString(0 * cm, 7 * cm, content)
    cans.drawString(0 * cm, -7 * cm, content)
    cans.save()  # 保存水印的PDF文件


def insert_water_to_pdf(input_pdf, output_pdf, water_pdf):
    '''
    合并水印到PDF文件中
    :param input_pdf: 输入文件路径
    :param output_pdf: 输出文件路径
    :param water_pdf: 水印文件路径
    :return:
    '''
    water = PdfFileReader(water_pdf)  # 读取水印PDF
    water_page = water.getPage(0)  # 获取水印PDF的第一页
    pdf = PdfFileReader(input_pdf, strict=False)  # 读取需要添加水印的文件
    pdf_writer = PdfFileWriter()  # 创建PDF文件写入对象
    for page in range(pdf.getNumPages()):  # 遍历每一页PDF对象
        pdf_page = pdf.getPage(page)  # 获取PDF的当前页对象
        pdf_page.mergePage(water_page)  # 将水印页合并到当前页中
        pdf_writer.addPage(pdf_page)  # 将合并后的PDF对象页添加到PDF写入对象中
    output_file = open(output_pdf, 'wb')  # 打开PDF输出文件
    pdf_writer.write(output_file)  # 将文件写入到输出文件
    output_file.close()  # 关闭写入流


def main(diretory, current):
    if os.path.isdir(diretory):
        logger.info('文件夹[' + diretory + ']校验成功!')
        os.chdir(diretory)
        logger.info('当前路径为[' + os.getcwd() + ']')
        generate_water_pdf(current)
        logger.info('水印PDF文件生成成功!')
        for file_path, dir_names, file_names in os.walk(r'' + os.getcwd()):
            for file_name in file_names:
                try:
                    name = file_name.split('.')[0]
                    if name == 'water_back':
                        continue
                    else:
                        file_name_path = os.path.join(file_path, file_name)
                        output_file_path = file_name_path.split('.')[0] + '_已添加水印.pdf'
                        insert_water_to_pdf(file_name_path, output_file_path, 'water_back.pdf')
                        logger.info('[' + file_name_path + ']完成水印合并!')
                except Exception as e:
                    logger.error('[' + file_name_path + ']发生异常,执行下一个!')
                    logger.error('异常信息:' + repr(e))
    else:
        logger.info('文件夹[' + diretory + ']校验失败!')


if __name__ == '__main__':
    main('C:/pdf', '我是一个水印')

到此这篇关于Python实现批量向PDF文件添加中文水印的文章就介绍到这了,更多相关Python PDF添加水印内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python实现批量向PDF文件添加中文水印

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python怎么实现批量向PDF文件添加中文水印

本文小编为大家详细介绍“Python怎么实现批量向PDF文件添加中文水印”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python怎么实现批量向PDF文件添加中文水印”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
2023-06-29

如何添加或删除PDF文件中的水印

这篇文章将为大家详细讲解有关如何添加或删除PDF文件中的水印,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、怎样添加水印步骤一:在电脑中找到并打开我们需要使用的迅捷PDF编辑器,进入软件后把需要添加水印
2023-06-05

Vue使用pdf-lib实现为文件流添加水印并预览

这篇文章主要为大家详细介绍了Vue如何使用pdf-lib实现为文件流添加水印并预览的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
2023-03-15

Java如何实现给Word文件添加文字水印

这篇文章主要为大家展示了“Java如何实现给Word文件添加文字水印”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java如何实现给Word文件添加文字水印”这篇文章吧。方法思路在给Word每一
2023-06-29

Vue怎么使用pdf-lib实现为文件流添加水印并预览

今天小编给大家分享一下Vue怎么使用pdf-lib实现为文件流添加水印并预览的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首
2023-07-05

Java使用pdfbox实现给pdf文件加图片水印

有时候需要给pdf加水印,市面上工具都是收费的要会员,还是自食其力吧;尝试过spire.pdf.free那个超过10页就不行了!所以本文还是使用了pdfbox,感兴趣的可以了解一下
2022-11-16

Python实现给图片添加文字或图片水印

在现今的数字化时代,网络上的图片泛滥,盗图现象也越来越严重。因此,在发布文章时,为了保护自己的原创作品版权,很多人选择使用水印来保护他们的图片。本文就和大家分享了Python实现给图片添加文字或图片水印的方法,需要的可以收藏一下
2023-05-19

在linux下采用shell脚本实现批量为指定文件夹下图片添加水印

这篇文章主要介绍“在linux下采用shell脚本实现批量为指定文件夹下图片添加水印”,在日常操作中,相信很多人在在linux下采用shell脚本实现批量为指定文件夹下图片添加水印问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
2023-06-09

python 实现批量文件加密功能

目录一、源码1、结果展示2、源码二、源码注释1、所使用依赖包2、函数功能3、代码拓展三、可运行环境一、源码 1、结果展示 python自动化办公现在可不是一个陌生的词,也随着人们对自己隐私越来越看重,就会出现这样的需求:每人一个PDF文件,
2022-06-02

linux下采用shell脚本实现批量为指定文件夹下图片添加水印的方法

要实现linux下采用shell脚本批量为指定文件夹下图片添加水印,首先需要安装imagemagick: CentOS上安装:yum install ImageMagick -yDebian上安装:apt-get install Image
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录