Генерация прогонов XWPFRun с урезанными пробелами - PullRequest
0 голосов
/ 08 ноября 2018

Я разработал код 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());
        }
    }

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

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

1 Ответ

0 голосов
/ 08 ноября 2018

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

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

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

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

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