【问题标题】:XWPFRun generating runs with whitespaces trimmedXWPFRun 生成运行并修剪空格
【发布时间】:2019-04-11 23:20:20
【问题描述】:

我开发了一个 Java 代码,它替换模板中的一些字符串模式,然后使用 Apache POI 生成一个输出 docx 文件。替换标题和段落中的模式很容易,但是在尝试替换文本框内时遇到了问题。我正在使用 Axel Ritcher 在Replace text in text box of docx by using Apache POI 中提供的代码,但问题是它在每次运行时都会修剪一些空白。

例如:

cp -r basedir destination

变成:

cp-r basedir destination

负责做这个替换的部分代码是this(函数的参数是:doc_buffer是一个XWPFDocument,pattern和replacement都是String):

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());
        }
    }

如果您需要任何其他信息,请告诉我。

提前致谢!

【问题讨论】:

    标签: java apache-poi wordprocessingml


    【解决方案1】:

    不知何故,我设法找到了导致此问题的问题。我会在这里发布,如果有人有同样的问题,他们可以看到我是如何解决的。

    示例中使用的方法 CTR.Factory.parse 需要 String 类型,但是如果您检查XmlObject.Factory docs,则有许多 parse 函数需要使用不同类型的参数。所以我改变了这一行:

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

    到接受 XMLInputStream 作为参数的方法,然后为 XmlObject 创建一个新的 InputStream:

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

    【讨论】:

    • 是的,你是对的。那是因为XmlObject.toString 尝试创建“漂亮打印”的 XML。这似乎意味着&lt;element&gt;-r&lt;/element&gt; 而不是&lt;element&gt; -r &lt;/element&gt;。在我看来并不是真的“漂亮”。但是XmlTokenSource.xmlTextXmlTokenSource.newInputStream 一样好用,因为两者都没有试图变得漂亮而不是好。
    • 谢谢!我发现了这个解决方案,但不确定为什么它会这样工作。现在我更清楚了。
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 2020-04-25
    • 2012-05-23
    • 2017-10-23
    • 2012-03-14
    • 2020-09-09
    相关资源
    最近更新 更多