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"> </span>
2.30<span
style="mso-spacerun: yes"> </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中打开文档时,根本没有空格。
答案 0 :(得分:1)
我还没有深入挖掘docx4j来源,只需要打电话
String escaped = unescaped.replace(" ", "\u00A0");
不幸的是,在单词文档中,它变得像往常一样空间,但在我的情况下它并不重要。
答案 1 :(得分:0)
这有效!!
字符串转义= unescaped.replace(“,”,“ \ u00A0”);
&nbsp将被替换为\ u00A0,它将添加一个空格