You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:00:57