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

使用Apache POI为已有页眉的docx文档添加水印的问题咨询

解决方案

核心思路是绕开XWPFHeaderFooterPolicy.createHeader()的存在即跳过逻辑,单独抽离水印段落生成逻辑,分场景处理已有页眉的情况:

  • 第一步:先查询目标类型的页眉是否存在
XWPFDocument doc = new XWPFDocument(new FileInputStream("待加水印的文档路径.docx"));
XWPFHeaderFooterPolicy headerFooterPolicy = doc.getHeaderFooterPolicy();
// 可根据需求替换为HeaderFooterType.FIRST/HeaderFooterType.EVEN对应不同场景的页眉
HeaderFooterType targetHeaderType = HeaderFooterType.DEFAULT;
XWPFHeader existHeader = headerFooterPolicy.getHeader(targetHeaderType);
  • 第二步:单独生成包含水印的XWPFParagraph实例,这部分可以直接复用POI内部生成水印段落的源码逻辑,无需调整
// 以下为水印段落生成示例,可根据自己的需求调整水印文本、颜色、旋转角度、透明度等参数
XWPFParagraph watermarkPara = doc.createParagraph();
watermarkPara.setAlignment(ParagraphAlignment.CENTER);
watermarkPara.setVerticalAlignment(TextAlignment.CENTER);
// 省略水印具体生成逻辑:包含创建文本框、设置水印样式、绑定到段落的代码
  • 第三步:根据页眉存在状态选择插入方式
if (existHeader == null) {
    // 页眉不存在时走原有逻辑创建页眉并插入水印段落
    headerFooterPolicy.createHeader(targetHeaderType, new XWPFParagraph[]{watermarkPara});
} else {
    // 页眉已存在时直接把水印段落插入到现有页眉中,插入到最开头可避免遮挡原有页眉内容
    existHeader.addParagraph(0, watermarkPara);
}

补充注意:如果文档包含多个节且各节页眉独立,需要遍历所有节的页眉重复执行上述逻辑;若出现水印遮挡原有页眉内容的情况,可调整水印形状的z-index属性设置为底层显示。

内容的提问来源于stack exchange,提问作者Marcelo D. Ré

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 16:21:03