Jdk-релизы не поставляются со шрифтами, Oracle релизы обычно делают, поэтому у меня была идея скачать Oracle релиз и посмотреть, что они делают, но файл fontconfig.properties значительно отличается между Windows и * Выпуски 1063 *, поэтому мне нужен был UNIX выпуск.
Я сначала скачал jdk-11.0.6_ linux -x64_bin.tar.gz , но, вероятно, у него не было файла fontconfig.properties потому что это был просто обобщенный c linux сборник, а не привязанный к какому-либо конкретному. Так как моя основная машинная машина - Windows, я не хотел опробовать сборки .deb или .rpm, потому что мне было нелегко их установить. Поэтому вместо этого я загружаю Solaris jdk-11.0.6_solaris-sparcv9_bin.tar.gz и распаковываю его.
, который содержит файл font.properties.sr c, следующий этой структуре
Version =1
# Component Font Mappings
# Search Sequences
# Font Filenames
# AWT X11 font paths
Насколько я понимаю, Сопоставление шрифтов компонентов сопоставляется с Java компонентным шрифтом с логическим именем шрифта , Последовательность поиска указывает порядок поиска шрифтов на основе компонентных шрифтов Java. Имена файлов шрифтов сопоставляют логическое имя шрифта с фактическим именем файла , где шрифт находится на компьютере. Пути шрифта AWT X11 указывает от имени шрифта компонента на фактическую папку , содержащую фактический шрифт на компьютере.
Итак, я выполнил поиск и заменил в файле, заменив фактическое имя файла на местоположение моего шрифта на сервере и заменив фактическую папку с расположением в папке, содержащей фактический шрифт.
Затем я переименовал этот измененный fontconfig.proprties.sr c в fontconfig.properties и сохранил его в папке jre / lib
Простая тестовая программа, которая ранее не работала, теперь работает
import java.awt.*;
public class Fonts
{
public static void main(String[] args) throws Exception
{
Font defaultFont = Font.decode(null);
System.out.println(defaultFont);
}
}
Однако я указал только один шрифт (ipag.ttf), который будет использоваться для разных скриптов и для различные стили (обычный, полужирный и т. д. c).
Когда я запускаю программу, шрифты требуются для использования с jakarta.poi (для создания файла таблицы Excel), и теперь это дает следующее исключение:
java.lang.ClassCastException: class sun.font.CompositeFont cannot be cast to class sun.font.PhysicalFont (sun.font.CompositeFont and sun.font.PhysicalFont are in module java.desktop of loader 'bootstrap')
at java.desktop/sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1086)
at java.desktop/sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:965)
at java.desktop/sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:903)
at java.desktop/sun.font.SunFontManager.findDeferredFont(SunFontManager.java:919)
at java.desktop/sun.font.SunFontManager.findFont2D(SunFontManager.java:2120)
at java.desktop/java.awt.Font.getFont2D(Font.java:506)
at java.desktop/java.awt.Font.canDisplayUpTo(Font.java:2246)
at java.desktop/java.awt.font.TextLayout.singleFont(TextLayout.java:469)
at java.desktop/java.awt.font.TextLayout.<init>(TextLayout.java:530)
at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:275)
Я думаю, что проблема здесь в том, что Физический шрифт ожидался, но поскольку я не указал жирный шрифт, itali c fonts ectera Java пытается создать шрифт на основе модификации к физический шрифт, создающий составной шрифт . Но Java всегда ожидает, что физические шрифты будут предоставлены для некоторых базовых c стилей.
Поэтому я скопировал шрифты Lucida в каталог шрифтов и изменил fontconfig. Файл свойств, чтобы использовать эти варианты шрифтов следующим образом
filename.-monotype-arial-medium-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaSansRegular.ttf
filename.-monotype-arial-medium-i-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaSansRegular.ttf
filename.-monotype-arial-bold-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaSansDemiBold.ttf
filename.-monotype-arial-bold-i-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaSansDemiBold.ttf
filename.-monotype-courier_new-medium-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaTypewriterRegular.ttf
filename.-monotype-courier_new-medium-i-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaTypewriterRegular.ttf
filename.-monotype-courier_new-bold-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaTypewriterBold.ttf
filename.-monotype-courier_new-bold-i-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaTypewriterBold.ttf
filename.-monotype-times_new_roman-medium-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaBrightRegular.ttf
filename.-monotype-times_new_roman-medium-i-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaBrightItalic.ttf
filename.-monotype-times_new_roman-bold-r-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaBrightDemiBold.ttf
filename.-monotype-times_new_roman-bold-i-normal--*-%d-*-*-p-*-iso10646-1=/mnt/app/opt/jre/lib/fonts/LucidaBrightDemiItalic.ttf
Просто сохранил ipag.ttf для скриптов Юго-Восточной Азии и перезапустил приложение, и это сработало. Будет ли это работать при любых обстоятельствах, я не уверен.