В предыдущей статье вы видели, как программно загружать шрифты CFF, TrueType и Type1 с помощью Java. Сегодня мы обсудим еще одну интересную возможность нашего API для работы со шрифтами Java — отрисовку текста с помощью шрифтов. К концу этой статьи вы сможете отображать текст с использованием шрифтов TrueType и Type1 из ваших приложений Java. Итак, начнем.
- Об API управления шрифтами Java
- Реализуйте метод рендеринга текста
- Рендеринг текста с использованием шрифтов TrueType в Java
- Рендеринг текста с использованием шрифтов Type1 в Java
API управления шрифтами Java
Aspose.Font for Java предоставляет функции загрузки и сохранения шрифтов, а также получения показателей популярных типов шрифтов, включая CFF, TrueType, OpenType и Type1. Кроме того, API позволяет отображать текст с использованием предоставленных шрифтов TrueType или Type1. Вы можете либо установить API, используя конфигурации Maven, либо скачать JAR API.
<repository>
<id>AsposeJavaAPI</id>
<name>Aspose Java API</name>
<url>https://repository.aspose.com/repo/</url>
</repository>
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-font</artifactId>
<version>20.10</version>
</dependency>
Реализуйте метод рендеринга текста
Чтобы отображать текст, Aspose.Font for Java требует от вас реализации метода drawText(), который будет рисовать предоставленный текст. Ниже приведено полное определение метода drawText().
// Полные примеры и файлы данных см. на странице https://github.com/aspose-font/Aspose.Font-for-Java.
static void drawText(String text, IFont font, double fontSize,
Paint backgroundBrush, Paint textBrush, String outFile) throws Exception
{
//Получить идентификаторы глифов для каждого символа в текстовой строке
GlyphId[] gids = new GlyphId[text.length()];
for (int i = 0; i < text.length(); i++)
gids[i] = font.getEncoding().decodeToGid(text.charAt(i));
// задать общие параметры рисования
double dpi = 300;
double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
// подготовить выходное растровое изображение
BufferedImage outBitmap = new BufferedImage(960, 720, BufferedImage.TYPE_INT_BGR);
//outBitmap.getRaster().SetResolution((с плавающей запятой)dpi, (с плавающей запятой)dpi);
java.awt.Graphics2D outGraphics = (java.awt.Graphics2D) outBitmap.getGraphics();
outGraphics.setPaint(backgroundBrush);
outGraphics.fillRect(0, 0, outBitmap.getWidth(), outBitmap.getHeight());
outGraphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
//объявить координатные переменные и предыдущий gid
GlyphId previousGid = null;
double glyphXCoordinate = 0;
double glyphYCoordinate = fontSize * resolutionCorrection;
//цикл, который рисует каждый глиф в gids
for (GlyphId gid : gids)
{
// если шрифт содержит gid
if (gid != null)
{
Glyph glyph = font.getGlyphAccessor().getGlyphById(gid);
if (glyph == null)
continue;
// путь, который принимает инструкции по рисованию
GeneralPath path = new GeneralPath();
// Создать реализацию IGlyphOutlinePainter
GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);
// Создайте визуализатор
IGlyphRenderer renderer = new GlyphOutlineRenderer(outlinePainter);
// получить общие свойства глифа
double kerning = 0;
// получить значение кернинга
if (previousGid != null)
{
kerning = (font.getMetrics().getKerningValue(previousGid, gid) /
glyph.getSourceResolution()) * fontSize * resolutionCorrection;
kerning += fontWidthToImageWdith(font.getMetrics().getGlyphWidth(previousGid),
glyph.getSourceResolution(), fontSize, 300);
}
// позиционирование глифа - увеличить координату X глифа в соответствии с расстоянием кернинга
glyphXCoordinate += kerning;
// Матрица размещения глифов
TransformationMatrix glyphMatrix =
new TransformationMatrix(
new double[]
{
fontSize*resolutionCorrection,
0,
0,
// отрицательный из-за растровой системы координат начинается сверху
- fontSize*resolutionCorrection,
glyphXCoordinate,
glyphYCoordinate
});
// визуализировать текущий глиф
renderer.renderGlyph(font, gid, glyphMatrix);
// заполнить путь
path.setWindingRule(GeneralPath.WIND_NON_ZERO);
outGraphics.setPaint(textBrush);
outGraphics.fill(path);
}
//установите текущий gid как предыдущий, чтобы получить правильный кернинг для следующего глифа
previousGid = gid;
}
//Сохранить результаты
ImageIO.write(outBitmap, "jpg", new File(outFile));
}
Ниже приведен вспомогательный метод, который используется для вычисления ширины глифа для растровой системы координат.
// Полные примеры и файлы данных см. на странице https://github.com/aspose-font/Aspose.Font-for-Java.
static double fontWidthToImageWidth(double width, int fontSourceResulution, double fontSize, double dpi)
{
double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
return (width / fontSourceResulution) * fontSize * resolutionCorrection;
}
Шаги для рендеринга текста со шрифтом в Java
Ниже приведены шаги по отображению указанного текста в виде файла изображения с использованием вышеупомянутого метода darwText().
- Загрузите шрифт с помощью класса FontDefinition.
- Получите доступ к шрифту с помощью класса, такого как Type1Font или TtfFont.
- Вызовите метод drawText(), указав подробности в виде его параметров.
Рендеринг текста со шрифтом TrueType с использованием Java
В следующем примере кода показано, как использовать метод drawText() для отображения текста с использованием шрифта TrueType. Результаты рендеринга будут сгенерированы в виде изображения JPEG.
// Полные примеры и файлы данных см. на странице https://github.com/aspose-font/Aspose.Font-for-Java.
String fileName1 = Utils.getDataDir() + "Montserrat-Bold.ttf"; //Font file name with full path
FontDefinition fd1 = new FontDefinition(FontType.TTF, new FontFileDefinition("ttf", new FileSystemStreamSource(fileName1)));
TtfFont font1 = (TtfFont) Font.open(fd1);
String fileName2 = Utils.getDataDir() + "Lora-Bold.ttf"; //Font file name with full path
FontDefinition fd2 = new FontDefinition(FontType.TTF, new FontFileDefinition("ttf", new FileSystemStreamSource(fileName2)));
TtfFont font2 = (TtfFont) Font.open(fd2);
try {
drawText("Hello world", font1, 14, java.awt.Color.WHITE, java.awt.Color.BLACK, Utils.getDataDir() + "hello1_montserrat_out.jpg");
drawText("Hello world", font2, 14, java.awt.Color.YELLOW, java.awt.Color.RED, Utils.getDataDir() + "hello2_lora_out.jpg");
} catch (Exception ex) {
ex.printStackTrace();
}
Рендеринг текста с использованием шрифтов Type1 в Java
В следующем примере кода показано, как преобразовать текст в изображение JPEG с помощью шрифта Type1 с помощью Java.
// Полные примеры и файлы данных см. на странице https://github.com/aspose-font/Aspose.Font-for-Java.
String fileName = Utils.getDataDir() + "courier.pfb"; //Font file name with full path
FontDefinition fd = new FontDefinition(FontType.Type1, new FontFileDefinition("pfb", new FileSystemStreamSource(fileName)));
Type1Font font = (Type1Font) Font.open(fd);
try {
drawText("Hello world", font, 14, java.awt.Color.WHITE, java.awt.Color.BLACK, Utils.getDataDir() + "hello1_type1_out.jpg");
drawText("Hello world", font, 14, java.awt.Color.YELLOW, java.awt.Color.RED, Utils.getDataDir() + "hello2_type1_out.jpg");
} catch (Exception ex) {
ex.printStackTrace();
}
Вывод
В этой статье вы увидели, как отображать текст в виде изображений JPEG с использованием шрифта TrueType или Type1 из приложений Java. Чтобы узнать больше об API управления шрифтами Java, вы можете посетить документацию и оценить возможности API, используя примеры исходного кода.