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

使用Flying Saucer(xhtmlrenderer)转HTML为PDF时粗体模糊如何解决

问题根源

仅向字体解析器注册了常规字重的arial.ttf文件,未注册对应粗体字重的原生字体文件。当渲染HTML中font-weight: bold的内容时,Flying Saucer会自动对常规字体做算法模拟加粗,这种模拟渲染出来的文字就会出现边缘发虚、模糊的问题,和提供的效果截图表现一致。

修复步骤
  • 准备Arial字体家族对应不同样式的字体文件:常规体arial.ttf、粗体arialbd.ttf、斜体ariali.ttf、粗斜体arialbi.ttf,存入项目可读取的资源路径。
  • 修改字体注册逻辑,将不同字重、样式的字体文件全部注册到解析器,不要只注册常规体:
ITextRenderer renderer = new ITextRenderer();
// 注册常规字重
renderer.getFontResolver().addFont("arial.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
// 注册粗体字重,解决模拟加粗模糊问题
renderer.getFontResolver().addFont("arialbd.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
// 有斜体、粗斜体渲染需求时一并注册
renderer.getFontResolver().addFont("ariali.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
renderer.getFontResolver().addFont("arialbi.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);

renderer.setDocumentFromString(htmlAsString);
renderer.layout();
renderer.createPDF(output);
  • 确认HTML中的CSS字体声明和注册的字体名匹配,粗体元素明确指定font-weight: bold,参考配置:
body {
  font-family: Arial, sans-serif;
}
b, strong {
  font-weight: bold;
}

注意:该规则适用于所有自定义字体,只要需要渲染不同字重、样式的文字,就必须将对应变体的字体文件单独注册,不要依赖Flying Saucer的自动模拟样式功能,否则都会出现渲染模糊、字形走样的问题。如果需要渲染中文内容,将编码参数从BaseFont.CP1252改为BaseFont.IDENTITY_H即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:33:18