如何使用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
相关产品推荐
相关产品推荐

