You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Apache POI在Java中为旧版.doc文件添加文本背景水印?

如何使用Apache POI在Java中为旧版.doc文件添加文本背景水印?

当然可以用Apache POI实现!旧版的.doc文件需要用到POI的HWPF组件来处理——不过要注意,HWPF没有直接提供添加水印的API,我们得通过给页眉添加一个特殊样式的文本框来模拟背景水印效果,这样就能让水印在每一页都显示,而且是半透明斜向的。

下面是完整的实现代码,我会给你标注关键细节:

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DocWatermarkUtil {
    public static void addTextWatermarkToDoc(String inputPath, String outputPath, String watermarkText) throws IOException {
        // 打开旧版.doc文档
        try (HWPFDocument doc = new HWPFDocument(new FileInputStream(inputPath))) {
            // 获取文档的页眉(如果没有则创建)
            Range headerRange = doc.getHeaderStoryRange();
            if (headerRange == null) {
                headerRange = doc.createHeader();
            }

            // 创建文本框承载水印文本
            TextBox textBox = new TextBox(headerRange);
            // 设置文本框覆盖整个A4页面(单位:缇,1缇=1/20磅)
            textBox.setLeft(0);
            textBox.setTop(0);
            textBox.setWidth(8500);
            textBox.setHeight(11000);

            // 让文本框透明无框,不遮挡正文
            textBox.setFilled(false);
            textBox.setLineVisible(false);
            textBox.setLineWidth(0);

            // 写入水印文本并设置样式
            Range textBoxRange = textBox.getRange();
            Paragraph para = textBoxRange.insertBefore(watermarkText);
            CharacterRun cr = para.getCharacterRun(0);
            
            cr.setFontSize(48); // 设置大号字体
            cr.setColor(0xC0C0C0); // 浅灰色模拟半透明
            cr.setTextRotation(45); // 45度斜向
            cr.setItalic(true); // 可选:让水印更柔和

            // 将文本框添加到页眉
            headerRange.insertAfter(textBox);

            // 保存修改后的文档
            try (FileOutputStream out = new FileOutputStream(outputPath)) {
                doc.write(out);
            }
        }
    }

    // 测试用例
    public static void main(String[] args) throws IOException {
        addTextWatermarkToDoc("input.doc", "output.doc", "CONFIDENTIAL");
    }
}

关键细节说明:

  • 页眉文本框方案:因为HWPF没有原生水印支持,利用页眉会在每一页重复显示的特性,把覆盖全页的文本框放在页眉里,就实现了类似背景水印的效果。
  • 样式控制:用浅灰色替代真正的透明度(HWPF对文本透明度支持有限),斜向旋转让水印更符合常见需求,同时去掉文本框的边框和填充,避免遮挡正文内容。
  • 页面适配:代码里用的是A4纸的缇单位尺寸,如果你的文档是其他规格,可以调整width和height的值。

依赖注意事项:

要确保项目引入了HWPF对应的依赖,比如Maven中添加:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>4.1.2</version> <!-- 建议使用稳定版本 -->
</dependency>

备注:内容来源于stack exchange,提问作者msl12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:39:32