当前位置: 首页 > 知识库问答 >
问题:

Java 11没有字体?

东方飞捷
2023-03-14

我将Java 11 Corretto Spring Boot与Apache POI一起使用,但在AWS Lambda上使用时遇到了问题。如果我以“普通”API运行,效果很好,但在AWS lambda中运行servless时失败。

try (ByteArrayOutputStream out = new ByteArrayOutputStream(); SXSSFWorkbook workbook = new SXSSFWorkbook(1000)) {
    SXSSFSheet sheet = workbook.createSheet("test"); //error here!!
    } ...

原因:java。lang.错误:可能的致命错误:找不到物理字体。在java。桌面/阳光。字体。SunFontManager。java上的lambda$getDefaultPhysicalFont$0(未知源代码)。基本/java。util。可选择的orElseThrow(未知源代码)位于java。桌面/阳光。字体。SunFontManager。java上的getDefaultPhysicalFont(未知源)。桌面/阳光。字体。CompositeFont。java上的DoDeferredInitialization(未知源)。桌面/阳光。字体。CompositeFont。java上的getSlotFont(未知源)。桌面/阳光。字体。CompositeGlyphMapper。java上的initMapper(未知源)。桌面/阳光。字体。CompositeGlyphMapper。(未知源代码)位于java。桌面/阳光。字体。CompositeFont。java上的getMapper(未知源)。桌面/阳光。字体。CompositeFont。java上的canDisplay(未知源代码)。桌面/java。awt。字体。canDisplayUpTo(未知源代码)位于java。桌面/java。awt。字体。文本布局。java上的singleFont(未知源)。桌面/java。awt。字体。文本布局。(未知来源)位于组织。阿帕奇。poi。不锈钢。util。SheetUtil。位于org的getDefaultCharWidth(SheetUtil.java:285)。阿帕奇。poi。xssf。流动。AutoSizeColumnTracker。(AutoSizeColumnTracker.java:117)位于org。阿帕奇。poi。xssf。流动。SXSSF表。(SXSSFSheet.java:84)位于org。阿帕奇。poi。xssf。流动。SXSSF工作手册。在org上创建andregistersxssfsheet(SXSSFWorkbook.java:705)。阿帕奇。poi。xssf。流动。SXSSF工作手册。createSheet(SXSSFWorkbook.java:724)

我试图创建一个修复字体但我不知道如何进行

@PostConstruct
public void loadFonts() {
    URL configURL = getClass().getClassLoader().getResource("fontconfig.properties");
    String path = configURL != null ? configURL.getPath() : null;
    Properties props = System.getProperties();
    LOGGER.info("Loading font config file: {}", path);
    props.put("sun.awt.fontconfig", path);

    String[] fonts;
    try {
        GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
    } catch (Throwable ex) {
        LOGGER.warn("Reloading Fonts");
    }
    try {
        fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();

        for (String font : fonts) {
            LOGGER.info("Available Font: {}", font);
        }
    } catch (Throwable ex) {
        LOGGER.error("Could not load Fonts");
    }
}

配置文件

version=1
sequence.allfonts=default

在AWS Lambda上运行时,它会将一些字体输出到日志中,所以我不明白为什么会出现这个错误:

2022-05-31 16:00:14  INFO  Starting Lambda Container Handler
2022-05-31 16:00:18  INFO  Loading font config file: /var/task/fontconfig.properties
2022-05-31 16:00:18  INFO  Available Font: Dialog
2022-05-31 16:00:18  INFO  Available Font: DialogInput
2022-05-31 16:00:18  INFO  Available Font: Monospaced
2022-05-31 16:00:18  INFO  Available Font: SansSerif
2022-05-31 16:00:18  INFO  Available Font: Serif

知道如何添加物理字体吗?为什么POI不能使用输出到日志的可用字体?

编辑:我也试图运行无头,但我得到了同样的错误:

`props.setProperty("java.awt.headless", "true");`

共有1个答案

柏修洁
2023-03-14

知道如何添加物理字体吗

Oracle的Oracle JDK产品从Java11起停止捆绑字体。

OpenJDK项目不捆绑字体,至少在最新版本中不捆绑字体。

Amazon产品中的Corretto JDK基于OpenJDK代码库。根据你的报告,显然他们没有捆绑字体。

您必须选择:

  • 依靠主机操作系统提供的字体。
  • 在您的Java应用程序中捆绑字体。小心研究许可条款。有些字体允许这样的捆绑,有些不允许。有些需要费用,有些不需要。有些需要确认,有些不需要。
  • 从包含字体的供应商处获取JDK。

我知道至少有一家这样的供应商:Azul Systems将字体与Azul平台的核心商业产品捆绑在一起。

我不知道还有其他这样的供应商。许多供应商提供JDK二进制文件和安装程序。这些供应商包括Adoptium、SAP、BellSoft、Microsoft、Azul Systems、Amazon、Oracle、Red Hat/IBM、Pivotal等。

为什么POI不能使用输出到日志的可用字体

日志中列出的字体是逻辑字体,而不是物理字体。Javadoc中清楚地记录了字体的区别。

要使用逻辑字体名称,您必须有一些后备物理字体。如果您的应用程序、JDK或主机操作系统中不存在字体,则逻辑字体无法工作。

关于在AWS Lambda中提供字体,这两个页面可能会有所帮助。(感谢jarmod提供的链接。)

  • 为AWS Lambda配置字体

基本思想是在软件包中创建一个字体文件夹。包括字体。内的conf文件,带有XML配置元素。将捆绑的字体文件放在该配置文件旁边。

 类似资料:
  • 主要内容:Java11 Optional类 的示例Java 11 向 Optional 类引入了新方法 isEmpty() 来检查值是否存在。如果值存在,则 isEmpty() 返回 false,否则返回 true。 它可以用作 isPresent() 方法的替代方法,该方法通常需要否定以检查值是否不存在。 Java11 Optional类 的示例 ApiTester.java 输出结果为  

  • 主要内容:Java11的新功能Java 11 是继 Java 8 之后的第一个 LTS 长期支持功能版本。它遵循 Java 发布节奏推出 Java 10,并于 2018 年 9 月发布,距 Java 10 发布仅六个月。 Java 9 和 Java 10 是非 LTS 版本。Java 11 版本是 LTS 版本。 Java11的新功能 以下是 Java 11 中引入的主要新功能。 JEP 321 : HTTP 客户端 API

  • 有没有可能在fo:块中禁用文本片段的断字功能?我的问题是不可能在fo:inline上设置hyphenate="false ",因为它不是一个属性。fo:block内部的fo:block创建一个新行... fo-示例: 更新: 我尝试了 soulution 由 @DanielNorberg 发布,因为所有解决方案都无法正常工作。这似乎是一种解决方法,但仍然没有提供我想要的输出。 我使用此模板: fo

  • 我试图在Mac OS上运行一个示例JavaFX应用程序。 Build.Gradle Java类 怎么啦?由于某种原因,JavaFX库没有正确加载。可能是MacOS或openjfx的错误吗?

  • 试图通过遍历查看以下PDF文件中的所有字段,但它是“空的”。但如果我保存到一个新文件: 田地是否“隐蔽”?有办法得到他们吗?(我的最终目标是自动填写其中的一些内容)

  • 我正在尝试用Java11编译我的项目。 我尝试用各种方法来修复它,比如更改环境变量,更新路径,将%JAVA_HOME%指向Java11。 我的计算机上的命令及其结果如下: 我正在使用IntelliJ IDEA,并按照本教程中的建议进行了必要的更改。 我的pom.xml看起来如下所示: 我如何将Maven指向Java11?或者,如果这不是问题所在,如何解决这一问题?我不认为这个问题是无效目标版本:1