最近我们的团队已将 tomcat 版本 8.5 升级到 9,我们在报告生成中看到以下变化:
在 Tomcat 8.5 中
升级后
在 Tomcat 9 中 输入文件(Excel): Arial 字体 输出文件(PDF): Times New Roman
我们不提供任何字体配置,因此我们想了解 tomcat 中可能缺少的配置,这会导致字体发生变化。
我们还检查了与 tomcat 一起安装的默认字体包对于两个 tomcat 版本是否相同。
寻求您的指导,以了解当用户上传文件以将其转换为 PDF 时,如何保留原始字体(预计为 Arial)。
该问题似乎与从 Excel 文件生成 PDF 过程中的字体替换有关。
从 Tomcat 8.5 升级到 9 后的行为变化表明底层 PDF 生成库或其配置可能会受到 Tomcat 升级的影响。
查看PDF生成库: 验证您使用哪个库来生成 PDF(例如:
Apache POI
、iText
、PDFBox
)。确保它是最新的并且与 Tomcat 9 兼容。您可能需要更新库或其配置。
Apache POI
的示例:
Workbook workbook = WorkbookFactory.create(new File("input.xlsx"));
PdfOptions options = PdfOptions.create();
Font font = workbook.createFont();
font.setFontName("Arial");
options.setDefaultFont(font);
Pdf.save(workbook, new File("output.pdf"), options);
PdfOptions options = PdfOptions.create();
options.setEmbedFonts(true);
-Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel
将此添加到 Tomcat 的启动脚本中或 JAVA_OPTS
。
iText
这样的库,您可以实现自定义 FontMapper 以确保始终使用Arial:
public class ArialFontMapper implements FontMapper {
@Override
public Font getFont(String fontName, String encoding, boolean embedded, float size, int style, BaseColor color) {
return FontFactory.getFont("Arial", encoding, embedded, size, style, color);
}
@Override
public BaseFont awtToPdf(java.awt.Font font) {
return FontFactory.getFont("Arial").getBaseFont();
}
}
然后在 PDF 生成过程中使用此自定义 FontMapper。