Как я могу надежно получить список всех полей слияния из XWPFDocument? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть файл .docx, который содержит несколько полей слияния, и я пытаюсь получить их коллекцию надежным способом, используя Apache POI.

Используя приведенный ниже код, я могу получить списокиз CTSimpleField объектов:

private void doStuff(final XWPFParagraph paragraph) {
    final List<CTSimpleField> fields = paragraph.getCTP().getFldSimpleList();
    // Code to manipulate the fields goes here...
}

Однако поля будут найдены только в том случае, если их объявления в базовом XML-документе соответствуют следующему специальному формату:

<w:fldSimple w:instr=" MERGEFIELD  \* MERGEFORMAT ">
  <w:r>
    <w:rPr>
      <w:b />
      <w:bCs />
      <w:noProof />
      <w:lang w:val="en-GB" />
    </w:rPr>
    <w:t>Some Text</w:t>
  </w:r>
</w:fldSimple>

Это означает, что любое слияние почтыполя в следующем формате вообще не обнаруживаются:

<w:r>
  <w:fldChar w:fldCharType="begin" />
</w:r>
<w:r>
  <w:instrText xml:space="preserve"> MERGEFIELD  \* MERGEFORMAT </w:instrText>
</w:r>
<w:r>
  <w:fldChar w:fldCharType="separate" />
</w:r>
<w:r w:rsidR="00441006">
  <w:rPr>
    <w:b />
    <w:bCs />
    <w:noProof />
    <w:lang w:val="en-GB" />
  </w:rPr>
  <w:t>#DATE2#</w:t>
</w:r>
<w:r>
 <w:rPr>
   <w:b />
   <w:bCs />
   <w:noProof />
   <w:lang w:val="en-GB" />
 </w:rPr>
 <w:fldChar w:fldCharType="end" />
</w:r>

Кроме того, метод XWPFParagraph#getCTP() помечается @Internal, что гласит:

Программааннотированные элементы @Internal предназначены только для внутреннего использования.Такие элементы не являются общедоступными по своему замыслу и, вероятно, будут удалены, их сигнатура будет изменена или их уровень доступа будет уменьшен с открытого на защищенный, пакетный или закрытый в будущих версиях POI без предварительного уведомления.@ Внутренние элементы имеют право на немедленное изменение или удаление, и на них не распространяется политика проекта POI об устаревании элемента для двух основных выпусков перед удалением.

Что мне действительно нужно, так это возможность надежного обнаружения оба варианта полей слияния, чтобы я мог ими манипулировать.Как я могу это сделать?

Примечание. В идеале я хочу избегать использования методов @Internal, если могу помочь, но если это неизбежно, пусть будет так.

...