使用docx4j遍历时复制(和修改)docx文件

时间:2019-05-03 20:29:09

标签: java docx4j

我发现here是一个遍历现有docx文件并在标准输出上打印其原始XML的示例。我想将这样的示例转换为一段代码,该代码可以在遍历文档时将文档复制到新文件中,而不是简单地将其打印到标准输出中。我的目标是最终将其复制并添加一些规定的文本。

我不知道如何正确修改下面的代码段,以便在原始的WordprocessingMLPackage中遇到新元素时重新创建它们。

new TraversalUtil(body,
            new Callback() {
              String indent = "";
              @Override
              public List<Object> apply(Object o) {
                String wrapped = "";
                if (o instanceof JAXBElement)
                  wrapped =  " (wrapped in JAXBElement)";
                o = XmlUtils.unwrap(o);
                String text = "";
                if (o instanceof org.docx4j.wml.Text)
                  text = ((org.docx4j.wml.Text) o).getValue();
                System.out.println(indent + o.getClass().getName() + wrapped + "  \""
                        + text + "\"");
                return null;
              }
              // other code
            } // end of Callback(){ ... }
);

我还尝试了另一种方法:修改原始XML,解压缩docx并处理文件“ word / document.xml”。当我向后压缩解压缩的文件夹并将其重命名为docx时,MS Word无法打开它。

1 个答案:

答案 0 :(得分:1)

复制对象很容易;您可以使用XmlUtils.deepCopy:https://github.com/plutext/docx4j/blob/master/docx4j-core/src/main/java/org/docx4j/XmlUtils.java#L1022

但是,WordML的许多位与XML文件的其他部分具有隐式或显式的正式关系,您需要管理这些XML关系以获得所需的结果。进一步查看https://www.docx4java.org/blog/2010/11/merging-word-documents/

例如,如果对象引用图像,则需要包含该图像。如果段落引用了缺少的样式,它将变为无样式。等等