【问题标题】:Resolve unreadable content message in Word with Docx4J v. 3.3.3使用 Docx4J v. 3.3.3 解决 Word 中不可读的内容消息
【发布时间】:2022-11-22 06:29:37
【问题描述】:

我们正在处理使用 Word 365 创建的 Word 模板 (版本 2202 内部版本 16.0.14931.20648) 在 Docx4J 中。一旦我们的 Java 应用程序修改了文件,Word 将在我们打开文档时显示一条错误消息。该消息将说明该文件包含不可读的内容那个词需要修复它。这工作正常,文档最终会打开,但是,消息很烦人。

我假设错误信息是与名称空间问题有关see this question)。该问题已通过 docx4j v. 8.2.9 解决,它正确定义了缺失的命名空间。

但是,我坚持使用 docx4j 3.3.3,无法更新。GitHub commit 中的修复似乎相当简单,所以我想知道是否有任何方法可以自己解决这个问题。我的代码中只有一个 WordprocessingMLPackage 对象。我可以以某种方式向该对象或其子属性添加或附加命名空间定义吗?

【问题讨论】:

    标签: java ms-word docx docx4j legacy-code


    【解决方案1】:

    您不能将命名空间定义添加到 WordprocessingMLPackage 对象。

    您需要从https://github.com/plutext/docx4j/tree/docx4j-3.3.3 获取 3.3.3 的源代码,然后将新的 NamespacePrefixMappings 内容复制到其中,然后构建它。然后您可以部署这个新的 jar 文件。

    如果您想尝试避免编译源代码,您可以尝试两种选择(因为 docx4j 没有在那里实现策略模式)。我不希望这些工作!

    一种是在运行时替换相关的类。为此,请参阅How to replace classes in a running application in java ?

    另一种是替换你的 jar 文件中的相关类,它只是一个 zip 文件。

    您需要从 docx4j 8.2.9 获取新类。

    请注意,有时 ContentTypeManager 和 ContentTypes 也会发生变化;参见例如https://github.com/plutext/docx4j/commit/d4d02d3fa6e7bf98f35d1f0520e62eb8aef06cba

    该提交引入了新部分,如果您在没有这些的情况下更新 ContentTypeManager,您将遇到问题。

    因此,您可能想尝试替换现有 jar 中的 NamespacePrefixMappings。

    但是它实现的接口在https://github.com/plutext/docx4j/commit/65fb843a26b5893200a1824c04c826db2db7940c#diff-70242e2f5ec56be77fe15322526f4530b02e8eafdcb9ae16b60b2220f62e0632发生了变化

    进一步查看https://github.com/plutext/docx4j/commits/VERSION_8_3_8/docx4j-core/src/main/java/org/docx4j/jaxb/NamespacePrefixMappings.java,这会给您带来麻烦。

    结果是您需要从https://github.com/plutext/docx4j/tree/docx4j-3.3.3 获取 3.3.3 的源代码,然后将新的 NamespacePrefixMappings 内容复制到其中(即接口更改除外),然后构建它。如果这样做,您还不如部署新的 jar 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      • 2015-01-24
      • 2015-10-17
      • 1970-01-01
      • 2018-11-10
      相关资源
      最近更新 更多