当前位置:首页>python>《别再傻傻手动给Word加水印了!用Python批量搞定图片/文字水印,省力省心事半功倍,从此告别加班》

《别再傻傻手动给Word加水印了!用Python批量搞定图片/文字水印,省力省心事半功倍,从此告别加班》

  • 2026-10-11 08:04:54
《别再傻傻手动给Word加水印了!用Python批量搞定图片/文字水印,省力省心事半功倍,从此告别加班》

“带你横跨办公自动化的数据江海”

@摸鱼

前言

关于摸鱼

(

ABOUT MOYU

)

闻道有先后,术业有专攻。

各位大佬朋友们好!

~我依旧是你们的老朋友摸鱼~

在职场摸爬滚打的这十多年里,我用Python悄悄干了不少“正事”——不知不觉攒下了一整套办公自动化的实用项目技巧。去年10月初创立了公众号 「码海听潮」 ,初衷很简单:把重复的劳动交给代码,把摸鱼的时间留给生活。

目前已经吭哧吭哧更新了100多篇原创文章,每一篇都是实操干货,不讲虚的,只聊怎么用代码真正解放双手,帮大家早点下班、准点摸鱼

好了,多了不说,少了不唠,今天给大佬们分享一款本人原创的批量设置word文档水印的小工具,这款工具相比手动逐个添加水印,效率提升数十倍,特别适合需要批量处理大量Word文档的场景!

《办公工具成品展示:》

《该办公工具核心功能亮点:》

01

 亮点1:批量处理能力 ⭐

        • 支持递归遍历文件夹,自动识别所有 .doc 和 .docx 文件

        • 一键批量添加水印,无需逐个文档手动操作

        • 实时进度显示,支持中途取消操作

        • 处理完成后提供详细的成功/失败统计

        02

         亮点2:双水印类型支持 🎨

            • 图片水印:支持 PNG、JPG、JPEG、BMP 格式

            • 文字水印:自定义文字内容,支持多种字体、颜色、透明度

            • 可同时启用两种水印,或单独使用其中一种

            03

            亮点3:灵活的水印样式设置 ⚙️

            • 缩放控制:自动、100%、200%、50%、自定义百分比

            • 冲蚀效果:一键实现半透明水印效果

            • 版式选择:水平(0°)或倾斜(315°)

            • 位置精确控制:水平/垂直对齐方式(居中、左/右对齐、顶/底对齐)

            • 偏移量微调:支持厘米级精确定位(-20cm 到 +20cm)

            • 透明度调节:文字水印 0-100% 透明度可调

            《该办公工具代码展示:》

            下面,我就用python代码让各位大佬见识一下,什么叫"传统文化"遇上"赛博效率"

            import sysfrom PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,							 QGroupBox, QCheckBox, QPushButton, QLabel, QLineEdit,							 QComboBox, QSpinBox, QDoubleSpinBox, QFileDialog,							 QFrame, QSplitter, QSizePolicy)from PyQt6.QtCore import Qtfrom PyQt6.QtGui import QFontclass WatermarkApp(QMainWindow):	def __init__(self):super().__init__()self.setWindowTitle("Word文档水印批量设置工具(欢迎关注微信公众号:码海听潮)")self.setMinimumSize(900, 700)self.current_image_path = ""  # 存储当前选择的图片路径self.current_folder_path = ""  # 存储当前选择的文件夹路径self.init_ui()	def init_ui(self):		main_widget = QWidget()self.setCentralWidget(main_widget)		main_layout = QHBoxLayout(main_widget)		main_layout.setContentsMargins(10, 10, 10, 10)		main_layout.setSpacing(20)		# ================= 左侧:水印设置区域 =================		left_widget = QWidget()		left_layout = QVBoxLayout(left_widget)		left_layout.setSpacing(15)		# ----- 批量处理文件夹分组 -----		folder_group = QGroupBox("批量处理设置")		folder_layout = QVBoxLayout(folder_group)		folder_layout.setSpacing(8)		# 选择文件夹		folder_select_layout = QHBoxLayout()self.btn_select_folder = QPushButton("选择文件夹")self.btn_select_folder.setFixedWidth(80)self.btn_select_folder.clicked.connect(self.select_folder)self.folder_path_edit = QLineEdit()self.folder_path_edit.setReadOnly(True)self.folder_path_edit.setPlaceholderText("未选择文件夹")self.folder_path_edit.setStyleSheet("color: gray;")		folder_select_layout.addWidget(self.btn_select_folder)		folder_select_layout.addWidget(self.folder_path_edit, 1)		folder_layout.addLayout(folder_select_layout)		left_layout.addWidget(folder_group)		# ----- 水印设置主分组(带边框) -----		watermark_group = QGroupBox("水印设置")		watermark_layout = QVBoxLayout(watermark_group)		watermark_layout.setSpacing(8)		# 1. 图片水印分组(带边框)self.pic_watermark_group = QGroupBox("图片水印")		pic_watermark_layout = QVBoxLayout(self.pic_watermark_group)		pic_watermark_layout.setSpacing(8)		# 图片水印复选框self.pic_watermark_check = QCheckBox("启用图片水印")self.pic_watermark_check.toggled.connect(self.on_pic_watermark_toggled)		pic_watermark_layout.addWidget(self.pic_watermark_check)		# 图片水印选项(默认启用)self.pic_options_widget = QWidget()		pic_options_layout = QVBoxLayout(self.pic_options_widget)		pic_options_layout.setSpacing(8)		pic_options_layout.setContentsMargins(20, 5, 0, 5)		# 选择图片		pic_select_layout = QHBoxLayout()self.btn_select_pic = QPushButton("选择图片")self.btn_select_pic.setFixedWidth(80)self.btn_select_pic.clicked.connect(self.select_picture)self.pic_path_edit = QLineEdit()self.pic_path_edit.setReadOnly(True)self.pic_path_edit.setPlaceholderText("未选择图片")self.pic_path_edit.setStyleSheet("color: gray;")		pic_select_layout.addWidget(self.btn_select_pic)		pic_select_layout.addWidget(self.pic_path_edit, 1)		pic_options_layout.addLayout(pic_select_layout)		# 缩放与冲蚀		scale_chongshi_layout = QHBoxLayout()		scale_label = QLabel("缩放")		scale_label.setFixedWidth(60)		scale_chongshi_layout.addWidget(scale_label)self.scale_combo = QComboBox()self.scale_combo.addItems(["自动", "100%", "200%", "50%", "自定义"])		scale_chongshi_layout.addWidget(self.scale_combo, 1)self.scale_spin = QDoubleSpinBox()self.scale_spin.setRange(10, 500)self.scale_spin.setSuffix("%")self.scale_spin.setVisible(False)		scale_chongshi_layout.addWidget(self.scale_spin)self.chongshi_check = QCheckBox("冲蚀")		scale_chongshi_layout.addWidget(self.chongshi_check)		pic_options_layout.addLayout(scale_chongshi_layout)		# 版式(只有水平和倾斜两个选项)		pic_layout_row = QHBoxLayout()		pic_layout_label = QLabel("版式")		pic_layout_label.setFixedWidth(60)		pic_layout_row.addWidget(pic_layout_label)self.pic_layout_combo = QComboBox()self.pic_layout_combo.addItems(["水平", "倾斜"])		pic_layout_row.addWidget(self.pic_layout_combo, 1)		pic_options_layout.addLayout(pic_layout_row)		# 水平对齐		pic_h_layout = QHBoxLayout()		pic_h_label = QLabel("水平对齐")		pic_h_label.setFixedWidth(60)		pic_h_layout.addWidget(pic_h_label)self.pic_h_align = QComboBox()self.pic_h_align.addItems(["居中", "左对齐", "右对齐"])		pic_h_layout.addWidget(self.pic_h_align, 1)self.pic_h_offset = QDoubleSpinBox()self.pic_h_offset.setRange(-20, 20)self.pic_h_offset.setSuffix(" cm")self.pic_h_offset.setValue(0.00)self.pic_h_offset.setFixedWidth(80)		pic_h_layout.addWidget(self.pic_h_offset)		pic_options_layout.addLayout(pic_h_layout)		# 垂直对齐		pic_v_layout = QHBoxLayout()		pic_v_label = QLabel("垂直对齐")		pic_v_label.setFixedWidth(60)		pic_v_layout.addWidget(pic_v_label)self.pic_v_align = QComboBox()self.pic_v_align.addItems(["居中", "顶端对齐", "底端对齐"])		pic_v_layout.addWidget(self.pic_v_align, 1)self.pic_v_offset = QDoubleSpinBox()self.pic_v_offset.setRange(-20, 20)self.pic_v_offset.setSuffix(" cm")self.pic_v_offset.setValue(0.00)self.pic_v_offset.setFixedWidth(80)		pic_v_layout.addWidget(self.pic_v_offset)		pic_options_layout.addLayout(pic_v_layout)		pic_watermark_layout.addWidget(self.pic_options_widget)		watermark_layout.addWidget(self.pic_watermark_group)		# 2. 文字水印分组(带边框)self.text_watermark_group = QGroupBox("文字水印")		text_watermark_layout = QVBoxLayout(self.text_watermark_group)		text_watermark_layout.setSpacing(8)		# 文字水印复选框self.text_watermark_check = QCheckBox("启用文字水印")self.text_watermark_check.toggled.connect(self.on_text_watermark_toggled)		text_watermark_layout.addWidget(self.text_watermark_check)		# 文字水印选项self.text_options_widget = QWidget()		text_options_layout = QVBoxLayout(self.text_options_widget)		text_options_layout.setSpacing(8)		text_options_layout.setContentsMargins(20, 5, 0, 5)		# 内容		content_layout = QHBoxLayout()		content_label = QLabel("内容")		content_label.setFixedWidth(60)		content_layout.addWidget(content_label)self.text_content = QLineEdit("严禁复制")		content_layout.addWidget(self.text_content, 1)		text_options_layout.addLayout(content_layout)		# 字体		font_layout = QHBoxLayout()		font_label = QLabel("字体")		font_label.setFixedWidth(60)		font_layout.addWidget(font_label)self.text_font = QComboBox()self.text_font.addItems(["微软雅黑", "宋体", "黑体", "楷体", "Arial"])		font_layout.addWidget(self.text_font, 1)		text_options_layout.addLayout(font_layout)		# 字号		size_layout = QHBoxLayout()		size_label = QLabel("字号")		size_label.setFixedWidth(60)		size_layout.addWidget(size_label)self.text_size = QSpinBox()self.text_size.setRange(8, 200)self.text_size.setValue(60)		size_layout.addWidget(self.text_size, 1)		text_options_layout.addLayout(size_layout)		# 颜色		color_layout = QHBoxLayout()		color_label = QLabel("颜色")		color_label.setFixedWidth(60)		color_layout.addWidget(color_label)self.text_color = QComboBox()self.text_color.addItems(["灰色", "自动", "红色", "蓝色", "绿色", "黑色"])		color_layout.addWidget(self.text_color, 1)		text_options_layout.addLayout(color_layout)		# 版式(只有水平和倾斜两个选项)		text_layout_row = QHBoxLayout()		text_layout_label = QLabel("版式")		text_layout_label.setFixedWidth(60)		text_layout_row.addWidget(text_layout_label)self.text_layout_combo = QComboBox()self.text_layout_combo.addItems(["水平", "倾斜"])		text_layout_row.addWidget(self.text_layout_combo, 1)		text_options_layout.addLayout(text_layout_row)		# 水平对齐		text_h_layout = QHBoxLayout()		text_h_label = QLabel("水平对齐")		text_h_label.setFixedWidth(60)		text_h_layout.addWidget(text_h_label)self.text_h_align = QComboBox()self.text_h_align.addItems(["居中", "左对齐", "右对齐"])		text_h_layout.addWidget(self.text_h_align, 1)self.text_h_offset = QDoubleSpinBox()self.text_h_offset.setRange(-20, 20)self.text_h_offset.setSuffix(" cm")self.text_h_offset.setValue(0.00)self.text_h_offset.setFixedWidth(80)		text_h_layout.addWidget(self.text_h_offset)		text_options_layout.addLayout(text_h_layout)		# 垂直对齐		text_v_layout = QHBoxLayout()		text_v_label = QLabel("垂直对齐")		text_v_label.setFixedWidth(60)		text_v_layout.addWidget(text_v_label)self.text_v_align = QComboBox()self.text_v_align.addItems(["居中", "顶端对齐", "底端对齐"])		text_v_layout.addWidget(self.text_v_align, 1)self.text_v_offset = QDoubleSpinBox()self.text_v_offset.setRange(-20, 20)self.text_v_offset.setSuffix(" cm")self.text_v_offset.setValue(0.00)self.text_v_offset.setFixedWidth(80)		text_v_layout.addWidget(self.text_v_offset)		text_options_layout.addLayout(text_v_layout)		# 透明度		opacity_layout = QHBoxLayout()		opacity_label = QLabel("透明度")		opacity_label.setFixedWidth(60)		opacity_layout.addWidget(opacity_label)self.text_opacity = QSpinBox()self.text_opacity.setRange(0, 100)self.text_opacity.setValue(50)self.text_opacity.setSuffix("%")		opacity_layout.addWidget(self.text_opacity, 1)		text_options_layout.addLayout(opacity_layout)		text_watermark_layout.addWidget(self.text_options_widget)		watermark_layout.addWidget(self.text_watermark_group)		left_layout.addWidget(watermark_group)		# ----- 确定/取消按钮(居中排布) -----		btn_layout = QHBoxLayout()		btn_layout.addStretch()self.btn_ok = QPushButton("确定")self.btn_cancel = QPushButton("取消")self.btn_ok.clicked.connect(self.apply_watermark)self.btn_cancel.clicked.connect(self.close)		btn_layout.addWidget(self.btn_ok)		btn_layout.addWidget(self.btn_cancel)		btn_layout.addStretch()		left_layout.addLayout(btn_layout)		# ================= 右侧:预览区域 =================		right_widget = QWidget()		right_widget.setMinimumWidth(350)		right_layout = QVBoxLayout(right_widget)		preview_group = QGroupBox("预览与选项")		preview_inner_layout = QVBoxLayout()		# 预览图片/文字区域self.preview_label = QLabel()self.preview_label.setMinimumHeight(400)self.preview_label.setStyleSheet("border: 1px solid #aaa; background-color: #f5f5f5;")self.preview_label.setAlignment(Qt.AlignmentFlag.AlignCenter)self.preview_label.setText("预览区域")		preview_inner_layout.addWidget(self.preview_label)		# 应用于整篇文档		apply_layout = QHBoxLayout()self.apply_to_all = QCheckBox("应用于整篇文档")self.apply_to_all.setChecked(True)		apply_layout.addWidget(self.apply_to_all)		apply_layout.addStretch()		preview_inner_layout.addLayout(apply_layout)		preview_group.setLayout(preview_inner_layout)		right_layout.addWidget(preview_group)		# 使用分割器让左右可调整		splitter = QSplitter(Qt.Orientation.Horizontal)		splitter.addWidget(left_widget)		splitter.addWidget(right_widget)		splitter.setSizes([500, 400])		main_layout.addWidget(splitter)		# 初始状态self.pic_watermark_check.setChecked(True)self.text_watermark_check.setChecked(False)		# 连接信号self.scale_combo.currentIndexChanged.connect(self.on_scale_mode_changed)	def select_folder(self):"""选择文件夹"""		folder_path = QFileDialog.getExistingDirectory(self, "选择文件夹", "")if folder_path:self.current_folder_path = folder_pathself.folder_path_edit.setText(folder_path)self.folder_path_edit.setStyleSheet("color: black;")	def on_pic_watermark_toggled(self, checked):"""图片水印复选框状态改变时"""self.pic_options_widget.setEnabled(checked)	def on_text_watermark_toggled(self, checked):"""文字水印复选框状态改变时"""self.text_options_widget.setEnabled(checked)	def on_scale_mode_changed(self, idx):if self.scale_combo.currentText() == "自定义":self.scale_spin.setVisible(True)else:self.scale_spin.setVisible(False)	def select_picture(self):		file_path, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "图片文件 (*.png *.jpg *.jpeg *.bmp)")if file_path:self.current_image_path = file_pathself.pic_path_edit.setText(file_path)self.pic_path_edit.setStyleSheet("color: black;")	def apply_watermark(self)		passdef main():	app = QApplication(sys.argv)	window = WatermarkApp()	window.show()	sys.exit(app.exec())if __name__ == "__main__":	main()

            通过上面Python自动化脚本,仅用几秒钟的时间就完成原需手动操作数小时甚至数天的工作任务。从最初准备手动人工机械操作的麻木到用python实现高效自动化的畅快,工作效率获得指数级提升,终于实现了不加班熬夜的自由!

            大佬们也可以举一反三,参照上面的代码思路根据自己工作中的实际情况来具体问题具体分析,实现自己定制化的需求。

            《该办公工具的演示视频:》

            《该办公工具的应用场景:》

            结语

            当Python遇见办公,牛马打工人终于笑出了猪叫声

            【职场人必看】每天早上一睁眼,想到又要面对:

            1.📊 堆积如山的Excel表格

            2.📑 机械重复的复制粘贴

            3.✍️ 永远改不完的各类文档

            4.诸如此类的更多........

            是不是连Ctrl+Alt+Delete的心都有了?

            别慌!别急,摸鱼这位“职场外挂”已经带着Python代码来拯救你了!

            感谢各位大佬观看,还望各位大佬抬抬贵手一键三连,多多关注点赞转发评论,大佬们的支持才是摸鱼孜孜不倦更新原创干货的动力!有需要的大佬私信摸鱼君获取!

            最新文章

            随机文章