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

Java 使用docx4j遍历docx文件时复制(和修改)docx文件,java,docx4j,Java,Docx4j,我找到了一个遍历现有docx文件并在标准输出上打印原始XML的示例。我想将这样的示例转换为一段代码,在遍历文档时将其复制到一个新文件中,而不是简单地将其打印到标准输出中。我的目标是最终复制它,并添加一些规定的文本 我不知道如何准确地修改下面的代码段,以便在原始的WordprocessingMLPackage中遇到新的WordprocessingMLPackage中重新创建元素 new TraversalUtil(主体, 新回调函数(){ 字符串缩进=”; @凌驾 公共列表应用(对象o){ 字符串

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

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

new TraversalUtil(主体,
新回调函数(){
字符串缩进=”;
@凌驾
公共列表应用(对象o){
字符串包裹=”;
if(o JAXBElement实例)
wrapped=“(用JAXBElement包装)”;
o=XmlUtils.unwrap(o);
字符串文本=”;
if(o instanceof org.docx4j.wml.Text)
text=((org.docx4j.wml.text)o.getValue();
System.out.println(缩进+o.getClass().getName()+wrapped+“\”“
+文本+“\”);
返回null;
}
//其他代码
}//回调()的结束({…}
);

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

复制对象很容易;您可以使用XmlUtils.deepCopy:

但是WordML的许多部分与XML文件的其他部分有隐式或显式的形式关系,您需要管理这些关系才能获得预期的结果。进一步看


例如,如果对象引用图像,则需要包含该图像。如果段落引用了缺少的样式,则将取消样式设置。etc etc

我尝试了
java公共静态void main(String[]args)抛出异常{JAXBContext context=org.docx4j.jaxb.context.jc;String input_file=“src/main/resources/sample.docx”;String output_file=“src/main/resources/sample1.docx”;WordprocessingMLPackage中的wordpackage=WordprocessingMLPackage.load(new java.io.File(input_File));WordprocessingMLPackage out_wordMLPackage=XmlUtils.deepCopy(in_wordMLPackage);out_wordMLPackage.save(new java.io.File(output_File));}
org.docx4j.openpackaging.packaging.WordprocessingMLPackage对此一无所知……您不能在包或部件上使用deepCopy;只能在JaxbXmlPart中JAXB对象树中的对象上使用它。