Как правильно генерировать атрибуты RSID в файлах Word .docx с помощью Apache POI? - PullRequest
6 голосов
/ 11 февраля 2011

Я использую Apache POI для манипулирования файлами Microsoft Word .docx - т.е. открываю документ, который был изначально создан в Microsoft Word, изменяю его, сохраняю в новом документе.

Я заметил, что в новых абзацах, созданных Apache POI, отсутствует идентификатор сохранения ревизии , часто известный как RSID или rsidR . Это используется Word для определения изменений, внесенных в документ за один сеанс, скажем, между сохранениями. Это необязательно - пользователи могут отключить его в Microsoft Word, если захотят, - но на самом деле это есть практически у всех, поэтому почти в каждом документе полно RSID. Прочитайте это превосходное объяснение RSID , чтобы узнать больше об этом.

В документе Microsoft Word word/document.xml содержит такие абзацы:

<w:p w:rsidR="007809A1" w:rsidRDefault="007809A1" w:rsidP="00191825">
  <w:r>
    <w:t>Paragraph of text here.</w:t>
  </w:r>
</w:p>

Однако тот же абзац, созданный POI, будет выглядеть так в word/document.xml:

<w:p>
  <w:r>
    <w:t>Paragraph of text here.</w:t>
  </w:r>
</w:p>

Я понял, что могу заставить POI добавить RSID к каждому абзацу, используя такой код:

    byte[] rsid = ???;
    XWPFParagraph paragraph = document.createParagraph();
    paragraph.getCTP().setRsidR(rsid);
    paragraph.getCTP().setRsidRDefault(rsid);

Однако я не знаю, как мне генерировать RSID.

Есть ли у POI способ или генерировать и / или отслеживать RSID? Если нет, могу ли я гарантировать, что сгенерированный RSID не конфликтует с тем, который уже есть в документе?

1 Ответ

4 голосов
/ 04 апреля 2011

Похоже, что список допустимых записей rsid содержится в word / settings.xml в записи <w:rsids>.XWPF должен быть в состоянии дать вам доступ к этому уже.

Возможно, вы захотите сгенерировать случайное число длиной 8 шестнадцатеричных цифр, проверить, есть ли оно там, и заново сгенерировать, если оно есть.Если у вас есть уникальный, добавьте его в этот список, а затем пометьте его абзацами.

Я бы посоветовал вам присоединиться к списку разработчиков (подробности в списке рассылки) и мы можем помочь вам подготовить патч для него.Я думаю, что нужно сделать:

  • Обертка вокруг записи RSids в word / settings.xml, чтобы вы могли легко получить список и сгенерировать новый (уникальный)
  • Обертка вокруг различных записей RSid в абзаце и прогон
  • Методы для параграфов и прогоны, чтобы получить обертку RSid, добавить новую или очистить существующую

Мыследует взять это в список разработчиков, хотя:)

...