Docx4j программно добавляет управление содержимым w:sdt

Я создаю небольшую программу Java для тестирования всех функций, связанных с документами, которые мне нужно использовать с помощью docx4j для выполнения требований моего проекта. Вкратце: возможность создавать шаблоны с «элементами управления содержимым», которые будут предлагаться пользователям как «сырые шаблоны». Позвольте пользователю улучшить их, чтобы, наконец, заполнить их данными. Я имею дело с «docx4j» из-за «повторяющихся и условных» функций.

Это был мой прогресс программно:

1) Создать пустой документ (ГОТОВО)

2) Добавьте пользовательскую часть xml с данными xml (part3.xml в примере со счетом). (ГОТОВО)

3) Добавьте пользовательскую xml-часть со ссылкой xml xpaths (part4.xml в примере со счетом-фактурой). (ГОТОВО)

4) Добавить элемент управления содержимым (ОЖИДАНИЕ)

Это должно быть что-то похожее на этот отрывок из примера счета:

<w:sdt>
  <w:sdtPr>
    <w:alias w:val="Customer name" />
    <w:tag w:val="od:xpath=x1&customer name=customer name" />
    <w:id w:val="1418037941" />
    <w:placeholder>
      <w:docPart w:val="DefaultPlaceholder_22675703" />
    </w:placeholder>
    <w:dataBinding w:xpath="/invoice[1]/customer[1]/name[1]" w:storeItemID="{8B049945-9DFE-4726-9DE9-CF5691E53858}" />
    <w:text />
  </w:sdtPr>
  <w:sdtContent>
    <w:p>
      <w:r>
        <w:t>Joe Bloggs</w:t>
     </w:r>
    </w:p>
  </w:sdtContent>
</w:sdt>

И вот мой вопрос: как сгенерировать этот xml? Можно ли сделать с помощью Java-кода или только из Word? Что такое и как генерируются значения «1418037941» и «DefaultPlaceholder_22675703»? Думаю, я не могу их «изобрести», и на них ссылаются где-то еще. Я искал какой-то метод в классе MainDocumentPart для этого, но не смог его найти. Я что-то неправильно понимаю?

Другие шаги почти в порядке для меня:

5) Выполнить "предварительную обработку" (ГОТОВО)

6) Выполнить "процесс" (ГОТОВО)

7) Выполнить "стрип" (ВЫПОЛНЕНО, кроме удаления тегов репат)

Большое спасибо за Вашу помощь! Дэйвид


person David    schedule 15.10.2012    source источник


Ответы (1)


Вы, безусловно, можете программно создать элемент управления содержимым, используя docx4j. Тем не менее, обычный подход к созданию «шаблона» заключается в использовании инструмента разработки, такого как этот.

Чтобы ответить на ваши конкретные вопросы: -

  • Вы можете опустить w:placeholder.

  • В спецификации указано, что w:id имеет тип xsd:int, представляющий собой целое число от -2147483648 до 2147483647. Вы можете сгенерировать его случайным образом или может быть опущен.

person JasonPlutext    schedule 16.10.2012
comment
Спасибо за ваш ответ. Какой метод я должен вызвать, чтобы добавить этот сгенерированный xml в document.xml? Я пробовал wordMLPackage.getMainDocumentPart().addAltChunk(AltChunkType.Xml,...), но это портит текстовый документ... - person David; 16.10.2012
comment
Предполагая, что у вас есть объект JAXB sdt (что-то в пространстве имен org.docx4j.wml), вы можете использовать wordMLPackage.getMainDocumentPart().getContent().add. Если у вас есть строка XML, вам нужно сначала преобразовать ее в объект JAXB, используя XmlUtils.unmarshalString. - person JasonPlutext; 16.10.2012
comment
Я обнаружил одну странную вещь. Когда генерируется ‹w:sdt›, вложенный тег ‹w:sdtPr›...‹/w:sdtPr› в порядке, но вложенный тег ‹w:sdtContent›‹w:p›‹w:r›‹w :t›Joe Bloggs‹/w:t›‹/w:r›‹/w:p›‹/w:sdtContent› отображается пустым, например ‹w:sdtContent/›. Когда я открываю docx в Word, элемент управления содержимым присутствует, но отсутствует текст по умолчанию Joe Bloggs. Спасибо еще раз. Я опубликую здесь свой эксперимент, когда закончу :-D - person David; 16.10.2012
comment
Если вам нужен совет о том, почему элемент sdtContent пуст, возможно, вы могли бы создать новый вопрос и опубликовать свой код. Но обычно это может произойти, если вы добавили недействительный контент. - person JasonPlutext; 16.10.2012