使用PyMuPDF添加PDF水印

使用Python添加PDF水印的博客文章。
C:\pythoncode\new\pdfwatermark.py
在这里插入图片描述
在这里插入图片描述

使用Python在PDF中添加水印

在日常工作中,我们经常需要对PDF文件进行处理。其中一项常见的需求是向PDF文件添加水印,以保护文件的版权或标识文件的来源。本文将介绍如何使用Python编程语言和PyMuPDF库在PDF文件中添加水印。

准备工作

在开始之前,确保已经安装了以下组件:

  • Python编程环境
  • PyMuPDF库

可以使用pip命令安装PyMuPDF库:


pip install PyMuPDF

编写代码

首先,我们需要导入所需的库:

import fitz

接下来,我们创建一个函数来添加水印到PDF文件的每一页:

def add_watermark_to_pdf(pdf_path, watermark_text, output_path):
    try:
        doc = fitz.open(pdf_path)
        watermark_text = str(watermark_text)

        for page in doc:
            textbox = fitz.Rect(100, 100, 300, 200)  # 设置水印的位置和大小
            page.insert_textbox(textbox, watermark_text, fontsize=20, rotate=90)

        doc.save(output_path)
        doc.close()

        print("水印添加成功!")
    except Exception as e:
        print("添加水印时出错:", str(e))

在上述代码中,我们打开PDF文件,遍历每一页,然后使用insert_textbox()方法将水印添加到每一页中。

使用示例

接下来,我们可以使用上述函数来添加水印。

pdf_path = "input.pdf"
watermark_text = "我的水印"
output_path = "output.pdf"

add_watermark_to_pdf(pdf_path, watermark_text, output_path)

在上述示例中,我们指定了输入PDF文件的路径、要添加的水印文本和输出文件的路径。运行代码后,将会在输出路径生成带有水印的PDF文件。

全部代码

import wx
import fitz

class WatermarkFrame(wx.Frame):
    def __init__(self, parent, title):
        super(WatermarkFrame, self).__init__(parent, title=title, size=(400, 200))
        
        panel = wx.Panel(self)
        
        # 创建选择文件按钮
        self.file_picker = wx.FilePickerCtrl(panel, style=wx.FLP_OPEN)
        
        # 创建水印文本输入框
        self.watermark_text = wx.TextCtrl(panel, style=wx.TE_PROCESS_ENTER)
        
        # 创建保存文件夹按钮
        self.save_folder_picker = wx.DirPickerCtrl(panel, style=wx.DIRP_USE_TEXTCTRL)
        
        # 创建生成按钮
        generate_button = wx.Button(panel, label='生成')
        generate_button.Bind(wx.EVT_BUTTON, self.on_generate_button_click)
        
        # 创建布局
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.file_picker, proportion=0, flag=wx.ALL|wx.EXPAND, border=10)
        sizer.Add(self.watermark_text, proportion=0, flag=wx.ALL|wx.EXPAND, border=10)
        sizer.Add(self.save_folder_picker, proportion=0, flag=wx.ALL|wx.EXPAND, border=10)
        sizer.Add(generate_button, proportion=0, flag=wx.ALL|wx.CENTER, border=10)
        panel.SetSizer(sizer)
        
    def on_generate_button_click(self, event):
        file_path = self.file_picker.GetPath()
        watermark_text = self.watermark_text.GetValue()
        save_folder = self.save_folder_picker.GetPath()
        
        if file_path and watermark_text and save_folder:
            try:
                doc = fitz.open(file_path)
                # watermark_text = watermark_text.encode('utf-8')
                watermark_text = str(watermark_text)
                
                for page in doc:
                    textbox = fitz.Rect(100, 100, 300, 200)  # 水印的位置和大小
                    # page.insert_textbox(textbox, watermark_text, fontsize=20, rotate=45)
                    page.insert_textbox(textbox, watermark_text, fontsize=20, rotate=90)
                    
                # output_file_path = f"{save_folder}/watermarked_{file_path.split('/')[-1]}"
                output_file_path = f"outputwatermark.pdf"
                doc.save(output_file_path)
                doc.close()
                
                wx.MessageBox("水印添加成功!", "成功", wx.OK | wx.ICON_INFORMATION)
                
            except Exception as e:
                wx.MessageBox(str(e), "错误", wx.OK | wx.ICON_ERROR)
        
        else:
            wx.MessageBox("请选择文件、输入水印文本和保存文件夹!", "错误", wx.OK | wx.ICON_ERROR)

if __name__ == '__main__':
    app = wx.App()
    frame = WatermarkFrame(None, "添加水印")
    frame.Show()
    app.MainLoop()

总结

通过使用Python和PyMuPDF库,我们可以轻松地向PDF文件添加水印。可以根据需求定制水印的位置、大小和旋转角度。这种方法不仅简单高效,还可以自动化处理大量的PDF文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/87929.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++入门:内联函数,auto,范围for循环,nullptr

目录 1.内联函数 1.1 概念 1.2 特性 1.3 内联函数与宏的区别 2.auto关键字(C11) 2.1 auto简介 2.2 auto的使用细则 2.3 auto不能推导的场景 3.基于范围的for循环(C11) 3.1 范围for的语法 3.2 范围for的使用方法 4.指针空值nullptr(C11) 4.1 C98中的指针空值 1.内联…

C#使用自定义的比较器对版本号(编码)字符串进行排序

给定一些数据,如下所示: “1.10.1.1.1.2”, “1.1”, “2.2”, “1.1.1.1”, “1.1.3.1”, “1.1.1”, “2.10.1.1.1”, “1.1.2.1”, “1.2.1.1”, “2.5.1.1”, “1.10.1.1”, “1.10.2.1”, “1.11.3.1”, “1.11.12.1”, “1.11.11.1”, “1.11.3.1”, “1”, “…

rabbitmq的发布确认

生产者将信道设置成 confirm 模式,一旦信道进入 confirm 模式, 所有在该信道上面发布的 消息都将会被指派一个唯一的 ID (从 1 开始),一旦消息被投递到所有匹配的队列之后,broker 就会发送一个确认给生产者(包含消息的唯一 ID)&…

14、缓存预热+缓存雪崩+缓存击穿+缓存穿透

缓存预热缓存雪崩缓存击穿缓存穿透 ● 缓存预热、雪崩、穿透、击穿分别是什么?你遇到过那几个情况? ● 缓存预热你是怎么做到的? ● 如何避免或者减少缓存雪崩? ● 穿透和击穿有什么区别?它两一个意思还是截然不同&am…

如何提高企业生产效率与安全性?设备报修管理系统有什么用?

随着现代工业技术的不断发展,企业生产设备变得越来越复杂,出现故障的可能性也随之增加。设备故障不仅会降低企业的生产效率,还可能导致生产安全事故的发生。为了更好地管理维护生产设备,提高生产效率和安全性,本文将向…

RedisTemplate和StringRedisTemplate的区别、对比

学习 Jedis、RedisTemplate、StringRedisTemplate之间的比较 博客中提到:一. Jedis是Redis官方推荐的面向Java的操作Redis的客户端。 二. RedisTemplate,StringRedisTemplate是SpringDataRedis中对JedisApi的高度封装。SpringDataRedis相对于Jedis来说可以方便地更…

数据库(DQL,多表设计,事务,索引)

目录 查询数据库表中数据 where 条件列表 group by 分组查询 having 分组后条件列表 order by 排序字段列表 limit 分页参数 多表设计 一对多 多对多 一对一 多表查询 事物 索引 查询数据库表中数据 关键字:SELECT 中间有空格,加引…

day4 驱动开发

【ioctl函数的使用】 1.概述 linux有意将对设备的功能选择和设置以及硬件数据的读写分成不同的函数来实现。让read/write函数专注于数据的读写,而硬件功能的设备和选择通过ioctl函数来选择 2.ioctl函数分析 int ioctl(int fd,unsigned long request) 通过&…

[Linux]进程状态

[Linux]进程状态 文章目录 [Linux]进程状态进程状态的概念阻塞状态挂起状态Linux下的进程状态孤儿进程 进程状态的概念 了解进程状态前,首先要知道一个正在运行的进程不是无时无刻都在CPU上进行运算的,而是在操作系统的管理下,和其他正在运行…

开启元宇宙农场的绝世盛宴——Fram world

近年科技突飞猛进,元宇宙横扫游戏与金融领域,其中震惊全球的Fram world,不仅为玩家带来崭新娱乐,更在游戏与经济的融合中掀起惊人革命!凭借Cardano基金会的强大支持,与英国英利区块链研究所的密切合作&…

无公网IP内网穿透使用vscode配置SSH远程ubuntu随时随地开发写代码

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

网络安全等级保护2.0

等保介绍 信息系统运维安全管理规定(范文)| 资料 等保测评是为了符合国家法律发挥的需求,而不是安全认证(ISO) 一般情况没有高危安全风险一般可以通过,但若发现高位安全风险则一票否决 二级两年一次 三…

SpringSession

Spring Session 是 Spring 的项目之一。Spring Session 提供了一套创建和管理 Servlet HttpSession 的方案,默认采用外置的 Redis 来存储 Session 数据,以此来解决 Session 共享的 问题。(springsession储存session数据的方式有很多,我们常…

ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示)

1.目标: a.数码管显示相同的值 0000 1111 ......9999; b.数码管显示不同的值 1234; 2.分析m74hc595芯片内部框图; 真值表: 3.代码; ---spi.h头文件--- #ifndef __SPI_H__ #define __SPI_H__#include &quo…

守护进程(精灵进程)

目录 前言 1.如何理解前台进程和后台进程 2.守护进程的概念 3.为什么会存在守护进程 4.如何实现守护进程 5.测试 总结 前言 今天我们要介绍的是关于守护进程如何实现,可能有小伙伴第一次听到守护进程这个概念,感觉很懵,知道进程的概念&…

RK3568评估板外接屏幕修改竖屏为横屏显示

问题 使用RK3568评估板外接HDMI屏幕时竖屏显示内容,需要修改为横屏显示。 解决办法 修改weston.ini配置文件,配置output输出参数 查看显示屏名称 使用ls /sys/class/drm/ 命令查看显示屏名称,如下图所示,示例屏为HDMI屏&#xff0…

装备制造企业如何执行精益管理?

导 读 ( 文/ 2358 ) 精益管理是一种以提高效率、降低成本和优化流程为目标的管理方法。装备制造行业具备人工参与度高,产成品价值高,质量要求高的特点。 在装备制造企业中实施精益管理可以帮助企业提高竞争力、提升生产效率并提供高质量的产品。本文将…

java+springboot+mysql农业园区管理系统

项目介绍: 使用javaspringbootmysql开发的农业园区管理系统,系统包含超级管理员、管理员、用户角色,功能如下: 超级管理员:管理员管理;用户管理;土地管理(租赁)&#x…

Window Server 与 Windows 系统开关机日志查看方法

目录 Windows/Windows Server 查看日志Windows 系统常用的事件 ID 环境:Windows Server 2019 (也适用于 Windows 其他系统)。 不同版本的 Windows 图标可能有所不同,但是服务器级 Windows Server 与普通桌面级 Windows 还会有些操…

企业微信电脑端开启chrome调试

首先: Mac端调试开启的快捷键:control shift command d Window端调试开启的快捷键: control shift alt d 这边以Mac为例,我们可以在电脑顶部看到调试的入口: 然后我们点击 『浏览器、webView相关』菜单,勾选上…