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

