【问题标题】:Copy (and modify) docx file while traversing it with docx4j在使用 docx4j 遍历时复制(和修改)docx 文件
【发布时间】:2019-09-22 09:46:23
【问题描述】:

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

我不确切知道如何修改下面的 sn-p 以便在新的 WordprocessingMLPackage 中重新创建在原始 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 无法打开它。

【问题讨论】:

    标签: java docx4j


    【解决方案1】:

    复制对象很容易;你可以使用 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/

    例如,如果对象引用图像,则需要包含该图像。如果一个段落引用了一个缺失的样式,它将没有样式。等等等等

    【讨论】:

    • 我试过java public static void main(String[] args) throws Exception { JAXBContext context = org.docx4j.jaxb.Context.jc; String input_file = "src/main/resources/sample.docx"; String output_file = "src/main/resources/sample1.docx"; WordprocessingMLPackage in_wordMLPackage = 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.packages.WordprocessingMLPackage 对此并不了解...
    • 你不能在一个包或一个零件上使用 deepCopy;您只能在 JaxbXmlPart 内的 JAXB 对象树中的对象上使用它。
    猜你喜欢
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多