Как дефрагментировать файлы docx для использования с Apache POI 3.8?

Я пытаюсь найти и заменить текстовые фрагменты в файлах docx на POI 3.8, как описано здесь.

Это прекрасно работает, если я вставляю свои теги при первом запуске. Но как только я снова открываю файл docx и вношу некоторые изменения, Word фактически фрагментирует фрагменты текста. Так, например, «привет, мир» может быть:

<w:r><w:t>Hello wo</w:t></w:r><w:r w:rsidR="00FB0672"><w:t>rld</w:t></w:r>

Я думаю, что такая фрагментация будет связана с такими вещами, как отслеживание изменений, форматирование и проверка орфографии.

Кто-нибудь знает, как...

а) ... отключить эту функцию в MS Word?

б) ... как-то потом дефрагментировать файл docx?

в) ... любое другое решение, чтобы избавиться от этой фрагментации?

Я уже пытался сохранить файл как .doc/.odt и пересохранить файл в .docx. Но эти фрагментации все еще сохраняются...

Любая помощь высоко ценится — заранее спасибо за вашу помощь!


person salocinx    schedule 15.11.2012    source источник


Ответы (1)


В Word функции, которые вы хотите и можете отключить, — это проверка орфографии и грамматики, а также вставка rsid.

Это для docx4j (проект, которым я управляю), а не для POI, а для VariablePrepare показывает, что необходимо сделать для дефрагментации, если вы не можете предотвратить ее в Word. Поскольку POI использует аналогичный подход к маршаллингу/демаршаллингу XML (хотя XML Beans, а не JAXB), вы должны иметь возможность преобразовать этот код для использования API POI.

person JasonPlutext    schedule 20.11.2012
comment
Спасибо за ваш ответ! Я попробовал ваш класс VariablePrepare, и он работает. Но это потребляет 130 МБ памяти для словарного файла hello-world. Это нормально? Теперь я получаю исключение OutOfMemoryException при вызове в моем приложении. Есть ли в MS Word 2010 возможность отключить вставку rsid? Я не нашел. Заранее спасибо! - person salocinx; 21.11.2012
comment
В этом случае память используется инициализацией контекста JAXB и XSLT. Вам нужно будет профилировать его, чтобы узнать, сколько каждый использует. Но 130 МБ меня не удивляют; Вы можете выделить больше (-Xmx и т. д.)? - person JasonPlutext; 21.11.2012
comment
Относительно RSID см. docx4java.org/forums/docx-java-f6/ IN summary Центр управления безопасностью › Параметры конфиденциальности › Снимите флажок Сохранить случайное число для повышения точности комбинирования - person JasonPlutext; 21.11.2012
comment
Большое спасибо, Джейсон. Я использовал -XX:MaxPermSize=196M, чтобы предоставить больше памяти, так как у меня есть пространство java.lang.OutOfMemoryError: PermGen. - person salocinx; 21.11.2012