繁体   English   中英

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

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

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

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

obj 通常是 Run,但实际上可以是任何东西。 我在读取域代码时遇到了一个问题,例如:

 " PAGE   \* MERGEFORMAT "

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

谢谢

您可以在运行 TextUtils.extractText 之前预处理字段。

可以想象一个小实用程序,您可以为每个字段类型配置一个小实用程序,无论您是希望完全删除它,还是只保留结果(可能先更新它)。

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>

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM