docx4j HTML转PDF时word-break样式失效问题求助
问题:HTML转PDF时保留
word-break: break-all换行样式 场景重现
HTML代码(已设置换行样式)
<html> <head> <style> p { word-break: break-all; } </style> </head> <body style="width: 500px"> <p> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</p> </body> </html>
在浏览器中,这段代码会让长串无空格文本在500px宽度内自动换行。
Java转换代码(当前实现)
@Test void contextLoads() throws Docx4JException, FileNotFoundException, MalformedURLException { File file = new File("C:\\Users\\zx\\Desktop\\data2.html"); WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(); XHTMLImporterImpl XHTMLImporter = new XHTMLImporterImpl(wordMLPackage); wordMLPackage.getMainDocumentPart().getContent().addAll(XHTMLImporter.convert(file.toURI().toURL())); Docx4J.toPDF(wordMLPackage, new FileOutputStream("C:\\Users\\zx\\Desktop\\3.pdf")); }
当前转换后的PDF中,长文本未按HTML样式换行,会超出页面宽度。
解决方案
Docx4J的XHTMLImporterImpl对CSS的word-break属性支持有限,需手动为段落设置Word的换行规则,同时匹配HTML的页面宽度:
修改后的Java代码
@Test void contextLoads() throws Docx4JException, FileNotFoundException, MalformedURLException { File file = new File("C:\\Users\\zx\\Desktop\\data2.html"); WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(); // 匹配HTML的body宽度:500px转换为Word的twip单位(1px=20twip,500*0.75磅=375磅,375*20=7500twip) PageDimensions pageDim = wordMLPackage.getDocumentModel().getSections().get(0).getPageDimensions(); pageDim.setPgW(7500); // 调整边距确保内容区域宽度匹配 pageDim.setMarLeft(1800); pageDim.setMarRight(1800); XHTMLImporterImpl XHTMLImporter = new XHTMLImporterImpl(wordMLPackage); XHTMLImporter.setCssEnabled(true); // 启用CSS解析 List<Object> content = XHTMLImporter.convert(file.toURI().toURL()); // 遍历段落,设置Word的"break-word"换行规则,对应CSS的break-all效果 for (Object obj : content) { if (obj instanceof P) { P paragraph = (P) obj; RPr rpr = paragraph.getRPr() != null ? paragraph.getRPr() : new RPr(); Wrap wrap = new Wrap(); wrap.setVal(Wrap.BREAK_WORD); rpr.setWrap(wrap); paragraph.setRPr(rpr); } } wordMLPackage.getMainDocumentPart().getContent().addAll(content); Docx4J.toPDF(wordMLPackage, new FileOutputStream("C:\\Users\\zx\\Desktop\\3.pdf")); }
关键说明
- 页面宽度匹配:将HTML的px单位转换为Word的twip单位,确保内容容器宽度一致。
- 手动设置换行规则:通过
Wrap.BREAK_WORD属性实现和CSSword-break: break-all相同的强制换行效果。 - 启用CSS解析:确保
XHTMLImporter读取HTML中的样式,为后续处理提供基础。
内容的提问来源于stack exchange,提问作者user21026782
相关产品推荐
相关产品推荐

