iText HTML转PDF多字体失效:添加Cardo字体却用Times字体
我来帮你排查下这个字体不生效的问题,结合你用的iText 7.1.6和pdfHTML 2.1.3版本,大概率是这几个原因导致的,你可以一步步验证:
确认HTML中字体家族名的正确性
首先要确保你的HTML代码里正确指定了Cardo字体的家族名,比如:<style> body { font-family: 'Cardo', serif; } .bold-text { font-family: 'Cardo', serif; font-weight: bold; } </style>很多时候字体文件名(比如
Cardo-Bold.ttf)和字体内部的家族名可能不一致,你可以用系统自带的字体查看工具(比如Windows字体查看器)确认字体的实际家族名,必须和HTML里写的完全匹配。替换
addDirectory为手动加载单个字体文件DefaultFontProvider.addDirectory()有时候会因为字体元数据问题、目录内其他字体干扰等原因,无法正确识别并加载目标字体。建议你改为逐个加载字体文件,更可控:public static final String FONTS = "src/main/resources/fonts/"; public void createPdf(String src, String dest) throws IOException { ConverterProperties properties = new ConverterProperties(); FontProvider fontProvider = new DefaultFontProvider(); // 手动加载每个字体文件 fontProvider.addFont(FONTS + "Cardo-Regular.ttf"); fontProvider.addFont(FONTS + "Cardo-Bold.ttf"); properties.setFontProvider(fontProvider); HtmlConverter.convertToPdf(new File(src), new File(dest), properties); }检查字体路径的运行时有效性
你当前用的src/main/resources/fonts/是开发环境的路径,但当项目打包成JAR/WAR后,这个路径就不存在了。建议改用类路径来获取字体目录,确保运行时能访问到:// 获取类路径下的fonts目录 URL fontDirUrl = getClass().getResource("/fonts/"); String fontsPath = fontDirUrl.getPath(); // 之后用fontsPath来加载字体验证字体是否真的被加载
可以添加日志打印加载的字体列表,确认Cardo字体是否成功被加载:for (FontProgram font : fontProvider.getFonts()) { System.out.println("已加载字体: " + font.getFontNames().getFontFamily()); }如果输出里没有Cardo相关的字体,说明路径或者字体文件本身有问题(比如文件损坏)。
排查默认字体 fallback 逻辑
iText的DefaultFontProvider默认会包含Times、Helvetica等标准字体,如果自定义字体加载失败,就会自动 fallback到这些标准字体。所以如果上面的步骤确认字体加载失败,优先解决路径和字体文件的问题。
内容的提问来源于stack exchange,提问作者mdziob

