java - 如何使用 docx4j 识别 TextBox 中的文本并替换占位符

标签 java jaxb docx4j

我的 docx 文件为 downloadable file现在我想用数据库中的实际值替换“#buyer_bill_no#”,比如“132564”,现在这对于普通文本检查文件作为引用工作正常,但是当文本位于文本框或矩形中(如文档中所示)时,它无法识别可替换元素,即“#buyer_bill_no#”

private static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) throws Docx4JException {


    List<Object> result = new ArrayList<Object>();
    if (obj instanceof JAXBElement<?>)
        obj = ((JAXBElement<?>) obj).getValue();

    if (obj.getClass().equals(toSearch)) {
        result.add(obj);
    } else if (obj instanceof ContentAccessor) {
        List<?> children = ((ContentAccessor) obj).getContent();
        for (Object child : children) {
            result.addAll(getAllElementFromObject(child, toSearch));
        }
    }

    return result;
}

上面的方法获取所有元素,在下面的方法中我打印文档中的所有元素

private void replacePlaceholder(WordprocessingMLPackage template, String name, String placeholder) throws Docx4JException {

    List<Object> texts = getAllElementFromObject(template.getMainDocumentPart(), Text.class);
    for (Object text : texts) {

        Text textElement = (Text) text;
        System.out.println("@@@@elements@@@@"+textElement.getValue());
        if (textElement.getValue().equals(placeholder)) {
            textElement.setValue(name);
        }
    }
}

输出为:@@@@elements@@@@购买订单号: @@@@elements@@@@#buyer_bill_no# @@@@元素@@@@

无法识别文档中文本框和矩形中的元素。

最佳答案

看起来您的方法 getAllElementFromObject 递归到 ContentAccessor 对象;显然 w:pict 或其后代之一没有实现 ContentAccessor 接口(interface):

    <w:pict>
      <v:rect >
        <v:textbox>
          <w:txbxContent>
            <w:p>
              <w:r>
                <w:t>#buyer_bill_no#</w:t>
              </w:r>

尝试 TraversalUtils,或 https://github.com/plutext/docx4j/tree/master/src/main/java/org/docx4j/utils 中的类之一

关于java - 如何使用 docx4j 识别 TextBox 中的文本并替换占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29555661/

相关文章:

java - OSX 上使用 javax.sound.midi 的 Midi 设备

java - Java/Android 中的 Rss feed 布局

java - JAXB 将嵌套元素解码为空

java - 如何使用docx4j读取/打印excel文件的内容?

java - 如何在 PrinterJob.pageDialog 中启用横向

java - 如何使用 Java 和 Eclipse 签署 Amazon API 的 REST 请求?

java - 如何使 xml 模式与 JTable、xml java 相关(链接)?

Java 解码 xml 元素

java - 如何使用 Docx4J 向现有表添加行

java - 添加边框并更改字体大小 - docx4j