基于 Java 的 Word 文档(DOC/DOCX)文字水印实现(Spire.Doc 示例)

6 阅读3分钟

本文介绍如何在 Java 中为 Word 文档(.doc.docx)添加页面文字水印,示例基于 Spire.Doc for Java,侧重通用实现方式,不依赖具体业务代码。


1. 方案概览

  • 目标:在 Word 文档的每一页添加斜向、浅灰色的文字水印(例如「xx公司」),以页面水印的形式呈现,不直接修改正文内容。

  • 适用格式.doc.docx(如需 .wps 等其他格式,可按同样思路扩展)。

  • 核心技术栈

    • Java 8+;
    • Spire.Doc for Java(本文使用其 Free 版本作为示例)。

2. Maven 依赖与仓库示例

<dependencies>
    <!-- Spire.Doc for Java(Free 版本示例,版本号可按需调整) -->
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.doc.free</artifactId>
        <version>5.2.0</version>
    </dependency>
</dependencies><repositories>
    <repository>
        <id>com.e-iceblue</id>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>

生产环境可根据许可证选择付费或更新版本,并统一管理版本号。


3. 实现思路

  1. 使用 Spire.Doc 的 Document 类从文件或输入流加载 Word 文档:

    • DOCX:loadFromStream(..., FileFormat.Docx)
    • DOC:loadFromStream(..., FileFormat.Doc)
    • 或使用 loadFromFile(...) 从物理文件加载。
  2. 构造一个 TextWatermark 对象,设置水印文本、字号、颜色和布局。

  3. 通过文档的 Section 对象获取 Document 并调用 setWatermark(TextWatermark) 应用水印:

    • 官方推荐用 document.getSections().get(0).getDocument().setWatermark(...)
  4. 以相应的 FileFormat 保存文档到新文件或输出流,得到带水印的 DOC/DOCX。


4. 示例一:为 DOCX 文档添加文字水印

4.1 从文件加载并输出到新文件


import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.TextWatermark;
import com.spire.doc.documents.WatermarkLayout;
​
import java.awt.Color;
​
public class DocxWatermarkExample {
​
    public static void addWatermarkToDocx(String inputPath, String outputPath, String watermarkText) {
        // 1. 加载 DOCX 文档
        Document document = new Document();
        document.loadFromFile(inputPath, FileFormat.Docx);
​
        // 2. 创建文字水印
        TextWatermark watermark = new TextWatermark();
        watermark.setText(watermarkText);              // 如:"xx公司"
        watermark.setFontSize(40);                     // 字号
        watermark.setColor(Color.lightGray);           // 颜色
        watermark.setLayout(WatermarkLayout.Diagonal); // 斜对角
​
        // 3. 通过 Section 的 Document 设置水印(官方推荐方式)
        if (document.getSections().getCount() > 0) {
            document.getSections().get(0).getDocument().setWatermark(watermark);
        } else {
            // 极端情况下没有 section,可退回到直接设置
            document.setWatermark(watermark);
        }
​
        // 4. 保存为新的 DOCX
        document.saveToFile(outputPath, FileFormat.Docx);
        document.close();
    }
}

4.2 从输入流到字节数组(适用于 Web 上传/下载场景)


import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.TextWatermark;
import com.spire.doc.documents.WatermarkLayout;
​
import java.awt.Color;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
​
public class DocxWatermarkUtil {
​
    public static byte[] addWatermarkToDocx(InputStream inputStream, String watermarkText) throws Exception {
        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
            Document document = new Document();
            document.loadFromStream(inputStream, FileFormat.Docx);
​
            TextWatermark watermark = new TextWatermark();
            watermark.setText(watermarkText);
            watermark.setFontSize(40);
            watermark.setColor(Color.lightGray);
            watermark.setLayout(WatermarkLayout.Diagonal);
​
            if (document.getSections().getCount() > 0) {
                document.getSections().get(0).getDocument().setWatermark(watermark);
            } else {
                document.setWatermark(watermark);
            }
​
            document.saveToStream(out, FileFormat.Docx);
            document.close();
            return out.toByteArray();
        }
    }
}

5. 示例二:为 DOC 文档添加文字水印

DOC 文档与 DOCX 实现方式基本相同,仅在 FileFormat 上有所差异。


import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import com.spire.doc.TextWatermark;
import com.spire.doc.documents.WatermarkLayout;
​
import java.awt.Color;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
​
public class DocWatermarkUtil {
​
    public static byte[] addWatermarkToDoc(InputStream inputStream, String watermarkText) throws Exception {
        try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
            Document document = new Document();
            document.loadFromStream(inputStream, FileFormat.Doc);
​
            TextWatermark watermark = new TextWatermark();
            watermark.setText(watermarkText);
            watermark.setFontSize(40);
            watermark.setColor(Color.lightGray);
            watermark.setLayout(WatermarkLayout.Diagonal);
​
            if (document.getSections().getCount() > 0) {
                document.getSections().get(0).getDocument().setWatermark(watermark);
            } else {
                document.setWatermark(watermark);
            }
​
            document.saveToStream(out, FileFormat.Doc);
            document.close();
            return out.toByteArray();
        }
    }
}

6. 关键点与实践建议

  • 水印文本设计:可以是固定文案(如「xx公司」「内部资料」),也可以结合用户名、时间戳、IP 等生成个性化水印,便于追责和防泄露。

  • 查看模式:Word 中建议使用「打印布局」查看水印;在某些阅读模式下水印可能被隐藏。

  • Free 版本限制:Spire.Doc Free 版对于页数或功能有一定限制,大规模生产使用时建议评估付费版本或其他库。

  • 与业务集成

    • 上传文件时在写入存储(本地/对象存储)前先加水印;
    • 或在线预览/下载前临时生成带水印副本,不改变原始文件;
    • 可以按租户、用户级别配置不同水印策略。
  • 性能考虑:对于大体积 Word 文档,建议在后台任务中进行水印处理,避免阻塞同步接口。


7. 总结

使用 Spire.Doc 在 Java 中为 Word 文档添加页面文字水印,核心是:加载文档 → 构造 TextWatermark → 通过 Section/Document 设置水印 → 以对应格式保存。上述示例将输入输出封装为 InputStream/byte[] 或文件路径形式,方便在上传、下载或批处理场景中复用,实现对 DOC/DOCX 文档的统一水印控制。