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

Java中使用iText转HTML为PDF时<strong>与<em>标签失效求助

解决iText HTML转PDF时<strong>和<em>标签不生效的问题

看起来你碰到了iText处理HTML样式时的常见坑——粗体和斜体标签失效。我帮你梳理几个最可能的原因和对应的解决方案,应该能解决你的问题:

1. 核心原因:字体缺少粗体/斜体变种或未正确加载

iText不会自动"模拟"字体的粗体或斜体效果,必须依赖字体文件本身包含对应的粗体(Bold)、斜体(Italic)变种。如果你的配置里没有加载支持这些样式的字体,<strong>和<em>自然不会生效。

解决方案(iText 7 版本,当前主流)

修改你的转换代码,添加字体提供者配置,确保加载包含粗体/斜体的字体:

public static boolean html2pdf(String htmlContent, String path) {
    try (FileOutputStream fos = new FileOutputStream(path)) {
        // 创建字体提供者,开启系统字体加载 + 标准字体 + CJK字体支持
        FontProvider fontProvider = new DefaultFontProvider(true, true, true);
        
        // (可选)如果系统字体不够,手动添加自定义字体(需确保字体文件包含对应样式)
        // fontProvider.addFont("src/main/resources/fonts/NotoSans-Regular.ttf");
        // fontProvider.addFont("src/main/resources/fonts/NotoSans-Bold.ttf");
        // fontProvider.addFont("src/main/resources/fonts/NotoSans-Italic.ttf");
        // fontProvider.addFont("src/main/resources/fonts/NotoSans-BoldItalic.ttf");

        // 配置转换属性,绑定字体提供者
        ConverterProperties converterProperties = new ConverterProperties();
        converterProperties.setFontProvider(fontProvider);

        // 执行HTML转PDF
        HtmlConverter.convertToPdf(htmlContent, fos, converterProperties);
        return true;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}

解决方案(iText 5 版本,旧项目)

如果你的项目还在使用iText 5,需要通过XMLWorker配置字体和CSS解析:

public static boolean html2pdf(String htmlContent, String path) {
    try (FileOutputStream fos = new FileOutputStream(path)) {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, fos);
        document.open();

        // 加载系统所有可用字体
        FontFactory.registerDirectories();
        
        CSSResolver cssResolver = XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
        HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
        // 绑定字体提供者
        htmlContext.setFontProvider(new CssAppliersImpl(new FontFactoryImp()));
        htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());

        // 构建处理管道
        Pipeline<?> pipeline = new CssResolverPipeline(cssResolver, 
                new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer)));
        XMLWorker worker = new XMLWorker(pipeline, true);
        XMLParser parser = new XMLParser(worker);
        
        parser.parse(new ByteArrayInputStream(htmlContent.getBytes()));
        document.close();
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

2. 排查HTML本身的样式冲突

有时候<strong>和<em>的样式会被内联CSS或外部样式表覆盖。你可以先测试极简HTML:

<!DOCTYPE html>
<html>
<body>
    普通文本 <strong>加粗测试</strong> <em>斜体测试</em>
</body>
</html>

如果这个极简HTML转换后样式生效,说明你原HTML里有样式冲突,比如存在font-weight: normal覆盖了<strong>的样式,或者font-style: normal覆盖了<em>。

3. 确认依赖完整性

确保你的项目引入了正确的iText依赖:

  • iText 7:需要itext7-core和itext7-html2pdf两个核心依赖
  • iText 5:需要itextpdf和xmlworker依赖

按以上步骤排查,应该能解决你的<strong>和<em>标签失效问题。

内容的提问来源于stack exchange,提问作者elaine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:19:01