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
相关产品推荐
相关产品推荐

