从 tomcat 版本 8.5 升级到 9 后,服务器中的默认字体系列发生了变化

问题描述 投票:0回答:1

最近我们的团队已将 tomcat 版本 8.5 升级到 9,我们在报告生成中看到以下变化:

在 Tomcat 8.5 中

  • 当我们从 Excel 文件生成 pdf 报告时,我们在上传要转换为 pdf 格式的 excel 文件时注意到以下行为。 输入文件(Excel): Arial 字体 输出文件(PDF):Calibri 字体

升级后

在 Tomcat 9 中 输入文件(Excel): Arial 字体 输出文件(PDF): Times New Roman

我们不提供任何字体配置,因此我们想了解 tomcat 中可能缺少的配置,这会导致字体发生变化。

我们还检查了与 tomcat 一起安装的默认字体包对于两个 tomcat 版本是否相同。

寻求您的指导,以了解当用户上传文件以将其转换为 PDF 时,如何保留原始字体(预计为 Arial)。

tomcat9 font-family tomcat8.5
1个回答
0
投票

问题分析:

该问题似乎与从 Excel 文件生成 PDF 过程中的字体替换有关。

从 Tomcat 8.5 升级到 9 后的行为变化表明底层 PDF 生成库或其配置可能会受到 Tomcat 升级的影响。

可能原因:

  1. Tomcat 9 中类路径或库加载顺序的更改
  2. 更新 PDF 生成库(如果它是您的应用程序的一部分)
  3. 新环境中字体解析或替换方式的差异

建议解决方案:

  1. 查看PDF生成库: 验证您使用哪个库来生成 PDF(例如:

    Apache POI
    iText
    PDFBox
    )。确保它是最新的并且与 Tomcat 9 兼容。您可能需要更新库或其配置。

  2. 在 PDF 生成代码中显式指定字体: 修改 PDF 生成代码以明确将字体设置为 Arial。这是使用

    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);
    
    
  3. 使用字体嵌入: 如果您的 PDF 生成库支持,请启用字体嵌入以确保原始字体包含在 PDF 中。这可能看起来像:

    PdfOptions options = PdfOptions.create(); options.setEmbedFonts(true);
    
    
  4. 研究 JVM 字体设置: 该问题可能与 JVM 如何解析字体有关。您可以尝试设置以下系统属性:

    -Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel
    将此添加到 Tomcat 的启动脚本中或 

    JAVA_OPTS

  5. 使用自定义 FontMapper: 如果您使用像

    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。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.