如何识别和不读取 Docx4j 中的域代码?

How do I identify and NOT read in field codes in Docx4j?

要从对象中获取文本,目前我正在使用:

String someText = TextUtils.extractText(obj, stringWriter);

其中 obj 通常是 运行,但实际上可以是任何东西。我在阅读字段代码时遇到问题,例如:

 " PAGE   \* MERGEFORMAT "

当我真的想忽略它的时候。有没有一种方法可以检测 运行 中的文本何时是域代码并忽略它?

谢谢

您可以 pre-process 您之前的字段 运行 TextUtils.extractText。

你可以想象一个小实用程序,你可以说,对于每个 field-type,你是想完全删除它,还是只保留结果(可能先更新它)。

docx4j 现在不包括这个,所以下面我概述了所涉及的内容。

请注意,有两种类型的字段:简单和复杂;进一步了解 http://webapp.docx4java.org/OnlineDemo/ecma376/WordML/XML.html

docx4j中有简单转复杂的代码;见 https://github.com/plutext/docx4j/blob/master/docx4j-core/src/main/java/org/docx4j/model/fields/FieldsPreprocessor.java

一旦您的字段处于“复杂”形式,例如:

<w:r>
  <w:fldChar w:fldCharType="begin"/>
</w:r>

<w:r>
  <w:instrText xml:space="preserve"> DATE </w:instrText>
</w:r>

<w:r>
  <w:fldChar w:fldCharType="separate"/>
</w:r>

<w:r>
  <w:t>12/31/2005</w:t>
</w:r>

<w:r>
  <w:fldChar w:fldCharType="end"/>
</w:r>

如果需要,您可以删除它们,只保留结果(即“separate”和“end”之间的位)。

docx4j 创建的表示实际上比上面的示例更容易使用;见 https://github.com/plutext/docx4j/blob/master/docx4j-core/src/main/java/org/docx4j/model/fields/FieldRef.java

请注意,有很多不同的字段,请参阅 http://webapp.docx4java.org/OnlineDemo/ecma376/WordML/file_2.html

您会想知道您的文档中有哪些,以及您希望如何处理它们。例如,您可能希望完全删除 PAGE 字段;但是 MERGEFIELD 你可能想保留结果。如果您需要先更新它,请参阅 https://github.com/plutext/docx4j/blob/master/docx4j-samples-docx4j/src/main/java/org/docx4j/samples/FieldsMailMerge.java

MAILMERGE 案例中结果的保存方式如下:https://github.com/plutext/docx4j/blob/master/docx4j-core/src/main/java/org/docx4j/model/fields/merge/MailMerger.java#L590

就这么简单,因为 XML 处于已知的可预测模式中。

有关 DOCPROPERTY 和 DOCVARIABLE 字段处理示例,请参阅 https://github.com/plutext/docx4j/blob/master/docx4j-samples-docx4j/src/main/java/org/docx4j/samples/FieldUpdaterExample.java