Java基于的Spire.Doc实现Word文档(DOC/DOCX)文字水印添加
作者:Reboot
本文介绍如何在 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添加文字水印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
