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

如何使用Apache POI提取.docx文件中的水印文本?

如何使用Apache POI获取.docx文件中的水印文本

Apache POI 未提供直接读取水印的封装API,.docx格式的水印本质是存储在页眉/页脚中的VML形状对象,可通过手动解析页眉节点提取水印文本。

你可以将代码补充为以下形式:

private File file;

public MSDocParser(String filePath, DataSource dataSource) {
   super(dataSource);
   this.file = new File(filePath);
}

public void parse(RunnableTask task) throws ParserException {
   textExtractor = ExtractorFactory.createExtractor(file);
   if (textExtractor instanceof XWPFWordExtractor) {
        XWPFDocument d = (XWPFDocument) textExtractor.getDocument();
        XWPFHeaderFooterPolicy hf = d.getHeaderFooterPolicy();
        // 打印水印文本逻辑开始
        String watermarkText = "";
        // 水印默认存在默认页眉中,也可根据需要遍历所有页眉页脚
        XWPFHeader defaultHeader = hf.getDefaultHeader();
        if (defaultHeader != null) {
            for (XWPFParagraph paragraph : defaultHeader.getParagraphs()) {
                for (XWPFRun run : paragraph.getRuns()) {
                    // 遍历所有绘图对象,水印属于形状类绘图
                    for (CTDrawing drawing : run.getCTR().getDrawingList()) {
                        for (CTAnchor anchor : drawing.getAnchorList()) {
                            if (anchor.getDocPr().getName().startsWith("PowerPlusWaterMarkObject")) {
                                // 匹配水印对象特征,提取文本
                                if (anchor.getGraphic().getGraphicData().getSpTree() != null) {
                                    for (CTShape shape : anchor.getGraphic().getGraphicData().getSpTree().getSpList()) {
                                        if (shape.getTxBody() != null) {
                                            for (CTTextParagraph textParagraph : shape.getTxBody().getPList()) {
                                                for (CTTextRegularTextRun textRun : textParagraph.getRList()) {
                                                    watermarkText += textRun.getT();
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        System.out.println("提取到的水印文本为:" + watermarkText);
        // 打印水印文本逻辑结束
    }
}

注意事项

  • 上述代码匹配的是微软Word默认生成的水印特征,自定义水印可能需要调整对象名匹配规则
  • 部分特殊水印为图片格式,无法直接提取文本,需要额外做OCR识别
  • 如果你使用的POI版本低于4.0,部分类的调用方式可能需要做适配调整

内容的提问来源于stack exchange,提问作者Sahib Yar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:15:04