我正在使用Java 11 Corretto + Spring Boot与Apache POI,但在AWS Lambda上使用时遇到问题。如果我以“正常”的API运行,它可以正常工作,但是在AWS Lambda中运行则失败。
try (ByteArrayOutputStream out = new ByteArrayOutputStream(); SXSSFWorkbook workbook = new SXSSFWorkbook(1000)) {
SXSSFSheet sheet = workbook.createSheet("test"); //error here!!
} ...
由:java.lang.Error: 可能是致命错误:未找到物理字体。 在 java.desktop/sun.font.SunFontManager.lambda$getDefaultPhysicalFont$0(Unknown Source) 中发生。在 java.base/java.util.Optional.orElseThrow(Unknown Source) 中使用默认选项。在 java.desktop/sun.font.SunFontManager.getDefaultPhysicalFont(Unknown Source) 中获取默认字体。在 java.desktop/sun.font.CompositeFont.doDeferredInitialisation(Unknown Source) 中执行延迟初始化。在 java.desktop/sun.font.CompositeFont.getSlotFont(Unknown Source) 中获取字体插槽。在 java.desktop/sun.font.CompositeGlyphMapper.initMapper(Unknown Source) 中初始化复合字形映射器。在 java.desktop/sun.font.CompositeGlyphMapper.(Unknown Source) 中创建复合字形映射器。在 java.desktop/sun.font.CompositeFont.getMapper(Unknown Source) 中获取字形映射器。在 java.desktop/sun.font.CompositeFont.canDisplay(Unknown Source) 中检查是否可以显示。在 java.desktop/java.awt.Font.canDisplayUpTo(Unknown Source) 中检查字符是否可显示。在 java.desktop/java.awt.font.TextLayout.singleFont(Unknown Source) 中搜索单个字体。在 java.desktop/java.awt.font.TextLayout.(Unknown Source) 中创建文本布局。在 org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:285) 中获取默认字符宽度。在 org.apache.poi.xssf.streaming.AutoSizeColumnTracker.(AutoSizeColumnTracker.java:117) 中创建自动调整列宽跟踪器。在 org.apache.poi.xssf.streaming.SXSSFSheet.(SXSSFSheet.java:84) 中创建 SXSSF 工作表。在 org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:705) 中创建和注册 SXSSF 工作表。在 org.apache.poi.xssf.streaming.SXSSFWorkbook.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");`