使用Flying Saucer/xhtmlrenderer生成PDF时韩汉字符丢失求助
字体引用匹配错误
检查CSS中@font-face定义的font-family名称是否与HTML元素的font-family完全一致(包括大小写、空格),Flying Saucer对字体名称匹配要求严格,哪怕细微差异都会导致无法加载目标字体。同时确认@font-face的src路径是否可被程序正确读取,建议使用绝对路径或相对于classpath的路径。字体加载时机或参数错误
确保addFont方法在ITextRenderer实例创建后、setDocument调用前执行,避免渲染时字体未完成加载。另外,addFont的MIME类型参数要正确,ARIALUNI.TTF需指定为"application/x-font-ttf"或"font/ttf",部分版本的Flying Saucer对MIME类型有明确要求。字体子集化过滤字符
Flying Saucer默认会对字体做子集化处理,若子集化未识别汉字、韩文的字符范围,会导致这些字符被过滤。可通过两种方式关闭子集化:- 在CSS的
@font-face中添加font-display: swap; - 通过代码调用
renderer.getFontResolver().setSubset(false);(需对应版本的API,部分旧版方法名可能不同)。
- 在CSS的
字符编码与HTML元标签问题
确认HTML字符串采用UTF-8编码,且HTML头部存在<meta charset="UTF-8">标签,渲染时也要保证编码一致,避免字符解析错误导致无法匹配字体中的对应字形。字体文件完整性问题
即使文件大小为23MB,仍可能存在损坏或字符缺失的情况。用字体查看工具(如Windows字体查看器)打开ARIALUNI.TTF,确认其中包含汉字、韩文的字符集,若缺失需更换完整的Arial Unicode MS字体文件。
内容的提问来源于stack exchange,提问作者Erik Radisch

