使用 Python 在 Word 文档中添加水印

0 阅读8分钟

在文档管理和版权保护场景中,为 Word 文档添加水印是一项常见且实用的需求。无论是标记文档的机密级别、添加公司标识,还是注明文档状态(如"草稿"、"最终版"),水印都能在不影响正文阅读的前提下提供重要的视觉提示。本文将深入探讨如何使用 Python 实现多种场景下的 Word 文档水印添加功能。

为什么需要添加水印

在商务、法律和出版领域,Word 文档水印有着广泛的应用:

  • 版权保护:在公司文档、报告中标注版权信息和所有权
  • 状态标识:标记文档为"草稿"、"机密"、"最终版"等状态
  • 品牌展示:在企业模板中添加公司 Logo 或名称
  • 安全警示:提醒读者文档的保密级别和使用限制
  • 防伪识别:为证书、授权书等重要文件添加防伪标识

通过 Python 自动化这一过程,可以实现批量添加水印、动态生成个性化水印和集成到更大的文档管理工作流中。

环境准备

在开始之前,需要安装支持 Word 文档操作的 Python 库。Spire.Doc for Python 提供了全面的 API 来处理 DOCX 格式文档的水印功能。

pip install Spire.Doc

安装完成后,在 Python 脚本中导入相关模块即可开始工作:

from spire.doc import *
from spire.doc.common import *

文本水印基础

Word 文档水印的核心是在页眉或页脚区域添加半透明的文本或图像。最简单的方法是直接使用 Watermark 属性来设置文本水印:

当你需要在整个文档中添加统一的文本水印时,可以使用 TextWatermark 类。这个方法简单直接,适用于快速添加"草稿"、"机密"、"样本"等标准水印文本。水印会自动应用于所有页面,并以对角线方式显示:

from spire.doc import *
from spire.doc.common import *

inputFile = "原始文档.docx"
outputFile = "添加水印文档.docx"

# 创建 Word 文档对象
document = Document()

# 从磁盘加载文档
document.LoadFromFile(inputFile)

# 创建文本水印对象
textWatermark = TextWatermark()
textWatermark.Text = "机密文档"
textWatermark.FontSize = 80
textWatermark.Color = Color.get_LightGray()
textWatermark.Layout = WatermarkLayout.Diagonal

# 应用水印到文档
document.Watermark = textWatermark

# 保存修改后的文档
document.SaveToFile(outputFile, FileFormat.Docx2013)
document.Close()

添加文本水印.jpg

上述代码展示了最基本的文本水印添加流程。TextWatermark 类提供了多个可配置属性:FontSize 控制字体大小,Color 设置水印颜色,Layout 决定水印布局方式(对角线或水平)。WatermarkLayout.Diagonal 表示水印以 45 度角斜向显示,这是最常见的布局方式。

自定义文本水印样式

除了基本设置,你还可以进一步自定义水印的字体、透明度、旋转角度等属性,使其与文档整体风格协调一致:

对于需要更精细控制的场景,可以调整水印的字体名称、透明度、位置偏移等参数。例如,你可能希望使用特定的企业字体,或者调整透明度以确保水印不会干扰正文阅读。这些自定义选项让你能够创建专业且美观的水印效果:

from spire.doc import *
from spire.doc.common import *

inputFile = "公司报告.docx"
outputFile = "带水印报告.docx"

document = Document()
document.LoadFromFile(inputFile)

# 创建自定义文本水印
textWatermark = TextWatermark()
textWatermark.Text = "内部资料 请勿外传"
textWatermark.FontSize = 72
textWatermark.FontName = "微软雅黑"
textWatermark.Color = Color.FromArgb(128200200200)  # 半透明灰色
textWatermark.Layout = WatermarkLayout.Diagonal
textWatermark.RotationAngle = -45  # 旋转角度

# 应用水印
document.Watermark = textWatermark

# 保存文档
document.SaveToFile(outputFile, FileFormat.Docx2013)
document.Close()

设置水印.jpg

Color.FromArgb() 方法允许你指定 Alpha 通道值(0-255)来控制透明度,其中 0 表示完全透明,255 表示完全不透明。使用 128 左右的值可以获得半透明效果,既能看清水印内容又不会影响正文阅读。

图片水印

除了文本水印,你还可以使用公司 Logo、签名图片或其他图像作为水印,这种方式更适合品牌展示和正式文件:

当需要使用图像作为水印时,可以通过 PictureWatermark 类来实现。图片水印特别适合添加公司标志、电子签名或防伪图案。你可以控制图片的缩放比例和在页面中的位置,确保水印既醒目又不突兀:

import os
from spire.doc import *
from spire.doc.common import *

# 定义路径
inputFile = "E:/Administrator/Python1/input/会议通知A.docx"
watermarkPath = "F:/备用图片/Logo1.png"
outputFile = "E:/Administrator/Python1/output/图片水印.docx"

# 检查水印图片是否存在,避免代码崩溃
if not os.path.exists(watermarkPath):
    print(f"错误:水印文件不存在 -> {watermarkPath}")
else:
    document = Document()
    document.LoadFromFile(inputFile)

    # 1. 创建图片水印对象
    picture = PictureWatermark()

    # 2. 设置图片水印属性
    # 根据你提供的参考代码,直接传入字符串路径即可
    picture.SetPicture(watermarkPath)
    
    # 设置缩放比例(100 表示 100%)
    picture.Scaling = 150 
    
    # 是否冲蚀(褪色效果),True 为淡化,False 为原图色
    picture.IsWashout = True 

    # 3. 将图片水印应用到文档
    document.Watermark = picture

    # 4. 保存文档
    # 建议使用 FileFormat.Docx 或 FileFormat.Docx2013
    document.SaveToFile(outputFile, FileFormat.Docx)
    
    document.Close()
    print(f"图片水印已成功添加并保存至:{outputFile}")

添加图片水印.jpg

IsWashout 属性控制是否应用褪色效果,设置为 True 时图片会变淡,类似于文本水印的半透明效果。Scale 参数以百分比形式指定图片缩放比例,100 表示原始大小,大于 100 放大,小于 100 缩小。

通过页眉添加复杂水印

对于需要更复杂布局或每页不同水印的场景,可以直接在页眉区域添加文本框或形状来实现自定义水印效果:

当你需要突破标准水印功能的限制时,可以直接操作页眉区域。这种方法允许你在页面的任意位置添加文本、图片、形状等元素,并精确控制其格式和位置。这对于创建复杂的背景图案或多元素组合水印非常有用:


    
    
    
  from spire.doc import *
from spire.doc.common import *

inputFile = "合同模板.docx"
outputFile = "带复杂水印.docx"

document = Document()
document.LoadFromFile(inputFile)

# 获取第一节的页眉
header = document.Sections[0].HeadersFooters.Header

# 添加段落用于放置水印
paragraph = header.AddParagraph()
paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center

# 添加艺术字作为水印
shape = paragraph.AppendShape(400100, ShapeType.TextWave4)
shape.VerticalPosition = 50
shape.HorizontalPosition = 150
shape.WordArt.Text = "合同专用章"
shape.FillColor = Color.FromArgb(10025500)  # 半透明红色
shape.StrokeColor = Color.get_Red()
shape.WrapFormat.Type = WrapSquareType.Behind

# 保存文档
document.SaveToFile(outputFile, FileFormat.Docx2013)
document.Close()

通过在页眉中添加形状(Shape),你可以创建各种艺术字效果。ShapeType.TextWave4 指定了文字的艺术样式,WrapFormat.Type = WrapSquareType.Behind 确保水印位于正文下方,不会遮挡文字内容。

实战:批量水印添加工具

结合以上技术,可以构建一个批量为多个文档添加水印的实用工具:

import os
from spire.doc import *
from spire.doc.common import *

class WatermarkAdder:
    def __init__(self):
        pass
    
    def add_text_watermark_to_file(self, input_file, output_file, watermark_text, 
                                   font_size=80, color=None, layout="diagonal"):
        """为单个文档添加文本水印"""
        
        if color is None:
            color = Color.FromArgb(128200200200)
        
        document = Document()
        document.LoadFromFile(input_file)
        
        textWatermark = TextWatermark()
        textWatermark.Text = watermark_text
        textWatermark.FontSize = font_size
        textWatermark.Color = color
        
        if layout == "diagonal":
            textWatermark.Layout = WatermarkLayout.Diagonal
        else:
            textWatermark.Layout = WatermarkLayout.Horizontal
        
        document.Watermark = textWatermark
        document.SaveToFile(output_file, FileFormat.Docx2013)
        document.Close()
        
        print("已为 {0} 添加水印".format(os.path.basename(input_file)))
    
    def add_image_watermark_to_file(self, input_file, output_file, image_path, 
                                    scale=150, is_washout=True):
        """为单个文档添加图片水印"""
        
        document = Document()
        document.LoadFromFile(input_file)
        
        pictureWatermark = PictureWatermark()
        pictureWatermark.Picture = Image.FromFile(image_path)
        pictureWatermark.Scale = scale
        pictureWatermark.IsWashout = is_washout
        pictureWatermark.Position = WatermarkPosition.Center
        
        document.Watermark = pictureWatermark
        document.SaveToFile(output_file, FileFormat.Docx2013)
        document.Close()
        
        print("已为 {0} 添加图片水印".format(os.path.basename(input_file)))
    
    def batch_add_watermark(self, input_folder, output_folder, watermark_text, 
                           watermark_type="text", image_path=None):
        """批量为文件夹中的所有文档添加水印"""
        
        if not os.path.exists(output_folder):
            os.makedirs(output_folder)
        
        doc_files = [f for f in os.listdir(input_folder) 
                    if f.endswith(('.docx''.doc'))]
        
        for filename in doc_files:
            input_path = os.path.join(input_folder, filename)
            output_path = os.path.join(output_folder, filename)
            
            if watermark_type == "text":
                self.add_text_watermark_to_file(
                    input_path, output_path, watermark_text
                )
            elif watermark_type == "image" and image_path:
                self.add_image_watermark_to_file(
                    input_path, output_path, image_path
                )
        
        print("批量处理完成!共处理 {0} 个文档".format(len(doc_files)))

# 使用示例
watermarker = WatermarkAdder()

# 批量添加文本水印
watermarker.batch_add_watermark(
    input_folder="待处理文档",
    output_folder="已加水印文档",
    watermark_text="内部机密",
    watermark_type="text"
)

# 为单个文档添加图片水印
watermarker.add_image_watermark_to_file(
    "重要合同.docx",
    "已加水印合同.docx",
    "公司印章.png",
    scale=120
)

这个工具类提供了:

  • 文本水印和图片水印两种模式
  • 单文件处理和批量处理功能
  • 可自定义水印文本、颜色、大小
  • 自动创建输出目录
  • 进度反馈和结果统计

常见问题与解决方案

问题 1:水印太明显影响阅读

调整水印颜色的透明度或使用更浅的颜色:

# 使用半透明颜色(Alpha 值设为 100-128)
textWatermark.Color = Color.FromArgb(100220220220)

问题 2:水印被正文遮挡

确保设置了正确的环绕方式:

shape.WrapFormat.Type = WrapSquareType.Behind  # 置于文字下方

问题 3:图片水印尺寸不合适

调整缩放比例或手动设置尺寸:

pictureWatermark.Scale = 100  # 调整为合适的大小

问题 4:水印未应用到所有页面

检查是否使用了文档级别的 Watermark 属性,而不是仅在特定节设置:

# 正确:应用到整个文档
document.Watermark = textWatermark

总结

在 Word 文档中添加水印是文档保护和品牌展示的重要技能。通过本文的介绍,我们学习了:

  1. 使用 TextWatermark 类添加基础文本水印
  2. 自定义水印的字体、颜色、透明度和布局
  3. 使用 PictureWatermark 类添加图片水印
  4. 通过页眉添加复杂的艺术字水印
  5. 构建批量水印添加工具的实战应用

这些技术可以直接应用于企业文档管理、合同签署、报告分发、证书制作等实际场景。掌握了基础的水印添加方法后,还可以进一步探索动态水印生成、基于文档内容自动添加不同水印、以及与其他 Office 应用的集成,构建更加完善的文档自动化系统。