使用 docx4j 遍历时复制(和修改)docx 文件
Copy (and modify) docx file while traversing it with 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 无法打开它。
复制对象很容易;你可以使用 XmlUtils.deepCopy: https://github.com/plutext/docx4j/blob/master/docx4j-core/src/main/java/org/docx4j/XmlUtils.java#L1022
但是 WordML 的许多位与 XML 文件的其他部分有隐式或显式的正式关系,您需要管理这些关系以获得您期望的结果。进一步了解 https://www.docx4java.org/blog/2010/11/merging-word-documents/
例如,如果对象引用了图像,则您需要将其包含在内。如果一个段落引用了一个缺失的样式,它将没有样式。等等等等
我发现 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 无法打开它。
复制对象很容易;你可以使用 XmlUtils.deepCopy: https://github.com/plutext/docx4j/blob/master/docx4j-core/src/main/java/org/docx4j/XmlUtils.java#L1022
但是 WordML 的许多位与 XML 文件的其他部分有隐式或显式的正式关系,您需要管理这些关系以获得您期望的结果。进一步了解 https://www.docx4java.org/blog/2010/11/merging-word-documents/
例如,如果对象引用了图像,则您需要将其包含在内。如果一个段落引用了一个缺失的样式,它将没有样式。等等等等