XWPFRun генерирует прогоны с обрезанными пробелами

Я разработал код Java, который заменяет некоторые строковые шаблоны в шаблоне, а затем генерирует выходной файл docx с использованием Apache POI. Заменить шаблоны в заголовках и абзацах было легко, но у меня возникла проблема при попытке заменить текстовые поля внутри. Я использую код, предоставленный Акселем Ритчером в Замените текст в текстовом поле docx с помощью Apache POI, но проблема в том, что он обрезает некоторые пробелы при каждом запуске.

Например:

cp -r basedir destination

Становится:

cp-r basedir destination

Часть кода, отвечающая за выполнение этой замены, следующая (параметры функции: doc_buffer - это XWPFDocument, шаблон и замена - это строки):

for (XWPFParagraph paragraph : doc_buffer.getParagraphs()) {
        XmlCursor cursor = paragraph.getCTP().newCursor();
        cursor.selectPath(
                "declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' .//*/w:txbxContent/w:p/w:r");

        List<XmlObject> ctrsintxtbx = new ArrayList<XmlObject>();

        while (cursor.hasNextSelection()) {
            cursor.toNextSelection();
            XmlObject obj = cursor.getObject();
            ctrsintxtbx.add(obj);
        }

        for (XmlObject obj : ctrsintxtbx) {
            CTR ctr = CTR.Factory.parse(obj.toString());
            XWPFRun bufferrun = new XWPFRun(ctr, (IRunBody) paragraph);
            String text = bufferrun.getText(0);
            if ((text != null) && (text.contains(pattern))) {
                text = text.replaceAll(pattern, replacement);
                bufferrun.setText(text, 0);
            }
            obj.set(bufferrun.getCTR());
        }
    }

Если вам нужна дополнительная информация, дайте мне знать.

Заранее спасибо!


person Leonardo    schedule 08.11.2018    source источник


Ответы (1)


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

Для метода CTR.Factory.parse, использованного в примере, требуется тип String, но если вы отметите XmlObject.Factory docs, существует множество функций синтаксического анализа, для которых требуются различные типы параметров. Итак, я изменил эту строку:

CTR ctr = CTR.Factory.parse(obj.toString());

К методу, который принимает XMLInputStream в качестве аргумента, а затем создает новый InputStream для XmlObject:

CTR ctr = CTR.Factory.parse(obj.newInputStream());
person Leonardo    schedule 08.11.2018
comment
Да вы правы. Это потому, что XmlObject.toString пытается создать красиво напечатанный XML. Что, кажется, означает <element>-r</element> вместо <element> -r </element>. На мой взгляд, не очень красиво. Но XmlTokenSource.xmlText работает так же хорошо, как XmlTokenSource.newInputStream, поскольку оба не пытаются быть красивее, чем хорошо. - person Axel Richter; 08.11.2018
comment
Спасибо! Я обнаружил это решение, но не был уверен, почему оно так работает. Теперь мне стало понятнее. - person Leonardo; 08.11.2018