
Trong bài viết trước, bạn đã thấy cách tải các phông chữ CFF, TrueType và Type1 theo chương trình bằng cách sử dụng Java. Hôm nay, chúng ta sẽ thảo luận về một tính năng thú vị khác của API thao tác phông chữ Java - hiển thị văn bản bằng cách sử dụng phông chữ. Đến cuối bài viết này, bạn sẽ có thể hiển thị văn bản bằng cách sử dụng phông chữ TrueType và Type1 từ bên trong các ứng dụng Java của mình. Vì vậy, hãy bắt đầu.
- Giới thiệu về API thao tác phông chữ Java
- Thực hiện phương pháp kết xuất văn bản
- Kết xuất văn bản bằng Phông chữ TrueType trong Java
- Kết xuất văn bản bằng Phông chữ Type1 trong Java
API thao tác phông chữ Java
Aspose.Font for Java cung cấp cho bạn các tính năng tải và lưu phông chữ cũng như nhận số liệu về các loại phông chữ phổ biến bao gồm CFF, TrueType, OpenType và Type1. Ngoài ra, API cho phép bạn hiển thị văn bản bằng phông chữ TrueType hoặc Type1 được cung cấp. Bạn có thể cài đặt API bằng cấu hình Maven hoặc tải xuống JAR của 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>
Thực hiện phương pháp kết xuất văn bản
Để hiển thị văn bản, Aspose.Font cho Java yêu cầu bạn triển khai phương thức drawText() sẽ vẽ văn bản được cung cấp. Sau đây là định nghĩa đầy đủ của phương thức drawText().
// Để biết các ví dụ và tệp dữ liệu đầy đủ, vui lòng truy cập 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
{
//Nhận số nhận dạng glyph cho mọi ký hiệu trong dòng văn bản
GlyphId[] gids = new GlyphId[text.length()];
for (int i = 0; i < text.length(); i++)
gids[i] = font.getEncoding().decodeToGid(text.charAt(i));
// đặt cài đặt bản vẽ chung
double dpi = 300;
double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
// chuẩn bị bitmap đầu ra
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);
//khai báo các biến tọa độ và gid trước đó
GlyphId previousGid = null;
double glyphXCoordinate = 0;
double glyphYCoordinate = fontSize * resolutionCorrection;
//vòng lặp vẽ mọi glyph trong gids
for (GlyphId gid : gids)
{
// nếu phông chữ chứa gid
if (gid != null)
{
Glyph glyph = font.getGlyphAccessor().getGlyphById(gid);
if (glyph == null)
continue;
// đường dẫn chấp nhận hướng dẫn vẽ
GeneralPath path = new GeneralPath();
// Tạo triển khai IGlyphOutlinePainter
GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);
// Tạo trình kết xuất
IGlyphRenderer renderer = new GlyphOutlineRenderer(outlinePainter);
// nhận các thuộc tính glyph phổ biến
double kerning = 0;
// lấy giá trị kerning
if (previousGid != null)
{
kerning = (font.getMetrics().getKerningValue(previousGid, gid) /
glyph.getSourceResolution()) * fontSize * resolutionCorrection;
kerning += fontWidthToImageWdith(font.getMetrics().getGlyphWidth(previousGid),
glyph.getSourceResolution(), fontSize, 300);
}
// định vị glyph - tăng tọa độ glyph X theo khoảng cách kerning
glyphXCoordinate += kerning;
// Ma trận vị trí Glyph
TransformationMatrix glyphMatrix =
new TransformationMatrix(
new double[]
{
fontSize*resolutionCorrection,
0,
0,
// âm vì hệ tọa độ bitmap bắt đầu từ đầu
- fontSize*resolutionCorrection,
glyphXCoordinate,
glyphYCoordinate
});
// hiển thị glyph hiện tại
renderer.renderGlyph(font, gid, glyphMatrix);
// điền vào đường dẫn
path.setWindingRule(GeneralPath.WIND_NON_ZERO);
outGraphics.setPaint(textBrush);
outGraphics.fill(path);
}
//đặt gid hiện tại như trước đó để có được kerning chính xác cho glyph tiếp theo
previousGid = gid;
}
//Lưu kết quả
ImageIO.write(outBitmap, "jpg", new File(outFile));
}
Sau đây là một phương pháp tiện ích được sử dụng để tính chiều rộng nét vẽ cho hệ tọa độ bitmap.
// Để biết các ví dụ và tệp dữ liệu đầy đủ, vui lòng truy cập 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;
}
Các bước để kết xuất văn bản với phông chữ trong Java
Sau đây là các bước về cách hiển thị văn bản đã chỉ định dưới dạng tệp hình ảnh bằng phương thức darwText() đã đề cập ở trên.
- Tải phông chữ bằng lớp FontDefinition.
- Truy cập phông chữ bằng cách sử dụng lớp như Type1Font hoặc TtfFont.
- Gọi phương thức drawText() bằng cách cung cấp thông tin chi tiết dưới dạng tham số của nó.
Kết xuất văn bản với Phông chữ TrueType bằng Java
Mẫu mã sau đây cho biết cách sử dụng phương thức drawText() để hiển thị văn bản bằng phông chữ TrueType. Kết quả hiển thị sẽ được tạo dưới dạng ảnh JPEG.
// Để biết các ví dụ và tệp dữ liệu đầy đủ, vui lòng truy cập 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();
}
Kết xuất văn bản bằng Phông chữ Type1 trong Java
Mẫu mã sau đây cho biết cách hiển thị văn bản thành hình ảnh JPEG bằng phông chữ Type1 bằng Java.
// Để biết các ví dụ và tệp dữ liệu đầy đủ, vui lòng truy cập 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();
}
Sự kết luận
Trong bài viết này, bạn đã biết cách hiển thị văn bản dưới dạng hình ảnh JPEG bằng cách sử dụng phông chữ TrueType hoặc Type1 từ bên trong các ứng dụng Java. Để tìm hiểu thêm về API thao tác phông chữ Java, bạn có thể truy cập tài liệu và đánh giá các tính năng của API bằng cách sử dụng mẫu mã nguồn.