Побочный эффект Apache POI replaceText(), изменение межстрочного интервала

Я использую POI 3.15 на Java, чтобы заменить некоторый текст в моем шаблоне .doc.

private HWPFDocument replaceText(HWPFDocument doc, String findText, String replaceText) {
    Range r = doc.getRange();
    for (int i = 0; i < r.numSections(); ++i) {
        Section s = r.getSection(i);
        for (int j = 0; j < s.numParagraphs(); j++) {
            Paragraph p = s.getParagraph(j);
            for (int k = 0; k < p.numCharacterRuns(); k++) {
                CharacterRun run = p.getCharacterRun(k);
                String text = run.text();
                if (text.contains(findText)) {
                    run.replaceText(findText, replaceText);
                }
            }
        }
    }
    return doc;
}

После сохранения документа. Все содержимое внутри правильное. Но стиль документа - нет. Расстояние между строками изменено. Первоначальный разрыв между строками отсутствует. Все линии плотно упакованы вместе.

Почему? Как сохранить стиль моего шаблона?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
135
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Библиотека HWPF может не поддерживать все функции, существующие в вашем файле doc, и это может привести к изменению форматов. Это также может привести к нечитаемым файлам.

Несколько лет назад я создал специализированную библиотеку HWPF, которая могла корректно модифицировать и записывать широкий спектр файлов документов для одного из моих клиентов, и я приобрел большой опыт работы с форматом файлов документов и библиотекой HWPF.

Проблема в том, что нужно должным образом поддерживать все функции HWPF, которые могут присутствовать в файле doc. Например, если клипарт включен в файл, будут отдельные таблицы, в которых сохраняется положение и свойства клипартов. Если содержание (текст) изменено без корректировки адресов в других внутренних таблицах, форматы и т. д. могут быть смещены, проигнорированы или потеряны. (или в худшем случае документ не читается)

Я не уверен в статусе HWPF в наши дни, но я ожидаю, что он не полностью поддерживает основные функции doc-файла.

Если вы хотите использовать HWPF для изменения/записи файлов документов, вы можете добиться успеха с файлами, которые имеют уменьшенный «набор функций». Например, никаких таблиц, картинок, текстовых полей и тому подобного. Если вам нужно поддерживать практически любой документ, который может предоставить пользователь, я бы порекомендовал найти другое решение.

Одним из вариантов может быть использование файлов rtf, которые называются .doc. Или используйте библиотеку XWPF, которая работает с .docx файлами.

Я думаю, вы правы. Я проверил те же методы с DOCX, и он поддерживает формат и макет.

Maxi Wu 31.05.2019 04:48

Другие вопросы по теме