在 上一篇文章 中,您已经了解了如何使用 Java 以编程方式加载 CFF、TrueType 和 Type1 字体。今天,我们将讨论 Java 字体操作 API 的另一个有趣特性——使用字体渲染文本。在本文结束时,您将能够在 Java 应用程序中使用 TrueType 和 Type1 字体呈现文本。所以让我们开始吧。
Java 字体操作 API
Aspose.Font for Java 为您提供加载和保存字体的功能,以及获取包括 CFF、TrueType、OpenType 和 Type1 在内的流行字体类型的指标。此外,API 允许您使用提供的 TrueType 或 Type1 字体呈现文本。您可以使用 Maven 配置或 下载 API 的 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 设置为先前的 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() 方法。
使用 Java 使用 TrueType 字体呈现文本
以下代码示例演示如何使用 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();
}
在 Java 中使用 Type1 字体呈现文本
以下代码示例展示了如何使用 Java 将文本呈现为具有 Type1 字体的 JPEG 图像。
// 如需完整的示例和数据文件,请访问 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();
}
结论
在本文中,您了解了如何在 Java 应用程序中使用 TrueType 或 Type1 字体将文本呈现为 JPEG 图像。要了解有关 Java 字体操作 API 的更多信息,您可以访问 文档 并使用 源代码示例 评估 API 的功能。