docx4j XHTMLImporter ignores   (non-breaking space)



来自docx4j的XHTMLImporter没有转换&nbsp转换为MS WORD非中断空格。

使用以下代码:

public void convert() throws Exception {

    String stringFromFile = FileUtils.readFileToString(new File("tmp.xhtml"), "UTF-8");
    String unescaped = stringFromFile;
    System.out.println("Unescaped: " + unescaped);

    // Setup font mapping
    RFonts rfonts = Context.getWmlObjectFactory().createRFonts();
    rfonts.setAscii("Century Gothic");
    XHTMLImporterImpl.addFontMapping("Century Gothic", rfonts);
    // Create an empty docx package
    WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
    NumberingDefinitionsPart ndp = new NumberingDefinitionsPart();
    wordMLPackage.getMainDocumentPart().addTargetPart(ndp);
    ndp.unmarshalDefaultNumbering();
    // Convert the XHTML, and add it into the empty docx we made
    XHTMLImporter XHTMLImporter = new XHTMLImporterImpl(wordMLPackage);
    XHTMLImporter.setHyperlinkStyle("Hyperlink");
    wordMLPackage.getMainDocumentPart().getContent().addAll(
            XHTMLImporter.convert(unescaped, null) );
    System.out.println(
            XmlUtils.marshaltoString(wordMLPackage.getMainDocumentPart().getJaxbElement(), true, true));
    wordMLPackage.save(new java.io.File("OUT_from_XHTML.docx") );
}

当XHTML输入类似于:时

<p style="LINE-HEIGHT: 120%; MARGIN: 0in 0in 0pt"
class="MsoNormal"><span
style="LINE-HEIGHT: 120%; FONT-FAMILY: 'Courier New'; FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'">Up
to Age 30<span
style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
2.30<span
style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
3.30</span></p>

则docx输出如下:

<w:r>
                <w:rPr>
                    <w:rFonts w:ascii="Courier New"/>
                    <w:b w:val="false"/>
                    <w:i w:val="false"/>
                    <w:color w:val="000000"/>
                    <w:sz w:val="20"/>
                </w:rPr>
                <w:t>
2.30</w:t>
            </w:r>
            <w:r>
                <w:rPr>
                    <w:rFonts w:ascii="Courier New"/>
                    <w:b w:val="false"/>
                    <w:i w:val="false"/>
                    <w:color w:val="000000"/>
                    <w:sz w:val="20"/>
                </w:rPr>
                <w:t>
3.30</w:t>
            </w:r>

在Word 2013中打开文档时,文档中没有空格。

我没有深入挖掘docx4j源代码,只是调用

String escaped = unescaped.replace("&nbsp;", "u00A0");

不幸的是,在单词document中,它变成了通常的空间,但对我来说并不重要。

这很管用!!

字符串转义=未转义.replaced(" ","\u00A0");

&nbsp将被替换为\u00A0它将添加一个空格

相关内容

  • 没有找到相关文章

最新更新