簡體   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