У попередній статті ви бачили, як програмно завантажувати шрифти CFF, TrueType і Type1 за допомогою Java. Сьогодні ми обговоримо ще одну цікаву функцію нашого API обробки шрифтів Java — відтворення тексту за допомогою шрифтів. До кінця цієї статті ви зможете відтворювати текст за допомогою шрифтів TrueType і Type1 у своїх програмах Java. Тож почнемо.
- Про Java Font Manipulation API
- Реалізація методу відтворення тексту
- Візуалізуйте текст за допомогою шрифтів TrueType у Java
- Візуалізуйте текст за допомогою шрифтів Type1 у Java
Java Font Manipulation API
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((float)dpi, (float)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
У наведеному нижче прикладі коду показано, як за допомогою Java відобразити текст у зображенні JPEG із шрифтом Type1.
// Щоб отримати повні приклади та файли даних, перейдіть на сторінку 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 за допомогою зразків вихідного коду.