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

 更新时间:2026年02月05日 11:35:09   作者:Reboot  
这篇文章主要为大家详细介绍了Java基于的Spire.Doc实现Word文档(DOC/DOCX)文字水印添加的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

本文介绍如何在 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. 实现思路

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

  • DOCX:loadFromStream(..., FileFormat.Docx)
  • DOC:loadFromStream(..., FileFormat.Doc)
  • 或使用 loadFromFile(...) 从物理文件加载。

构造一个 TextWatermark 对象,设置水印文本、字号、颜色和布局。

通过文档的 Section 对象获取 Document 并调用 setWatermark(TextWatermark) 应用水印:官方推荐用 document.getSections().get(0).getDocument().setWatermark(...)

以相应的 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 文档的统一水印控制。

到此这篇关于Java基于的Spire.Doc实现Word文档(DOC/DOCX)文字水印添加的文章就介绍到这了,更多相关Java Word添加文字水印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot使用Log4j过程详解

    SpringBoot使用Log4j过程详解

    这篇文章主要介绍了SpringBoot使用Log4j过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python单元测试_使用装饰器实现测试跳过和预期故障的方法

    Python单元测试_使用装饰器实现测试跳过和预期故障的方法

    下面小编就为大家带来一篇Python单元测试_使用装饰器实现测试跳过和预期故障的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • SpringBoot+Vue项目打包部署完整步骤教程

    SpringBoot+Vue项目打包部署完整步骤教程

    这篇文章主要介绍了SpringBoot+Vue项目打包部署的相关资料,包括Vue项目的打包设置、SpringBoot的配置修改、跨域问题处理、使用Nginx配置反向代理以及最终的项目启动,教程假定开发者已具备完整的前后端分离项目和配置好环境的服务器,需要的朋友可以参考下
    2024-10-10
  • SpringBoot上传图片与视频不显示问题的解决方案

    SpringBoot上传图片与视频不显示问题的解决方案

    这篇文章主要介绍了关于springboot上传图片与视频不显示问题,最近做毕设时候需要上传视频的图片与视频,但是每次都需要重启前端才能展示出此图片,所以本文给大家介绍了SpringBoot上传图片与视频不显示问题的解决方案,需要的朋友可以参考下
    2024-03-03
  • maven一行命令引入第三方包打包的实现

    maven一行命令引入第三方包打包的实现

    在项目开发过程中,难免会用到第三方jar的时候,本文主要介绍了maven一行命令引入第三方包打包的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Spring @ConditionalOnMissingBean 注解的主要作用解析

    Spring @ConditionalOnMissingBean 注解的主要作用解析

    @ConditionalOnMissingBean是Spring Boot中用于条件化配置的注解,确保只有在指定Bean不存在时才创建,它在自动配置中广泛应用,提供默认配置并允许用户自定义Bean,本文给大家介绍Spring @ConditionalOnMissingBean注解的作用,感兴趣的朋友一起看看吧
    2026-01-01
  • Project Reactor 响应式范式编程

    Project Reactor 响应式范式编程

    这篇文章主要为大家介绍了Project Reactor 响应式范式编程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java中Lock锁基本使用方法详解

    Java中Lock锁基本使用方法详解

    锁是一种工具,用于控制对共享资源的访问Lock和synchronized是最常见的两个锁,他们都能够达到线程安全的目录,这篇文章主要给大家介绍了关于Java中Lock锁基本使用方法详解的相关资料,需要的朋友可以参考下
    2023-11-11
  • Kotlin委托机制使用方式和原理解析

    Kotlin委托机制使用方式和原理解析

    委托类(代理类)持有真实类的对象,然后委托类(代理类)调用真实类的同名方法,最终真正实现的是方法的是真实类,这其实就是代理模式,下面通过本文给大家介绍Kotlin委托机制使用方式和原理解析,感兴趣的朋友一起看看吧
    2025-06-06
  • Spring IoC容器与Bean管理项目实践指南

    Spring IoC容器与Bean管理项目实践指南

    IoC容器的主要作用是解决组件之间的耦合问题,通过将组件之间的依赖关系交给IoC容器来管理,可以在不改变组件的代码的情况下实现组件之间的解耦,这篇文章主要介绍了Spring IoC容器与Bean管理项目的相关资料,需要的朋友可以参考下
    2025-08-08

最新评论