
W poprzednim artykule widziałeś, jak programowo ładować czcionki CFF, TrueType i Type1 przy użyciu języka Java. Dzisiaj omówimy kolejną interesującą funkcję naszego interfejsu API manipulacji czcionkami Java — renderowanie tekstu za pomocą czcionek. Pod koniec tego artykułu będziesz w stanie renderować tekst przy użyciu czcionek TrueType i Type1 z poziomu swoich aplikacji Java. A więc zacznijmy.
- Informacje o interfejsie API manipulowania czcionkami Java
- Zaimplementuj metodę renderowania tekstu
- Renderuj tekst przy użyciu czcionek TrueType w Javie
- Renderuj tekst przy użyciu czcionek Type1 w Javie
Interfejs API manipulacji czcionkami Java
Aspose.Font for Java zapewnia funkcje ładowania i zapisywania czcionek, a także uzyskiwania metryk popularnych typów czcionek, w tym CFF, TrueType, OpenType i Type1. Ponadto interfejs API umożliwia renderowanie tekstu przy użyciu dostarczonych czcionek TrueType lub Type1. Możesz zainstalować API przy użyciu konfiguracji Mavena lub pobierz plik 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>
Zaimplementuj metodę renderowania tekstu
Aby wyrenderować tekst, Aspose.Font for Java wymaga zaimplementowania metody drawText(), która narysuje dostarczony tekst. Poniżej znajduje się pełna definicja metody drawText().
// Aby uzyskać pełne przykłady i pliki danych, przejdź do 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
{
//Uzyskaj identyfikatory glifów dla każdego symbolu w wierszu tekstu
GlyphId[] gids = new GlyphId[text.length()];
for (int i = 0; i < text.length(); i++)
gids[i] = font.getEncoding().decodeToGid(text.charAt(i));
// ustaw wspólne ustawienia rysunku
double dpi = 300;
double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
// przygotować wyjściową bitmapę
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);
//zadeklaruj zmienne współrzędnych i poprzedni gid
GlyphId previousGid = null;
double glyphXCoordinate = 0;
double glyphYCoordinate = fontSize * resolutionCorrection;
//pętla, która maluje każdy glif w gidzie
for (GlyphId gid : gids)
{
// jeśli czcionka zawiera gid
if (gid != null)
{
Glyph glyph = font.getGlyphAccessor().getGlyphById(gid);
if (glyph == null)
continue;
// ścieżka, która akceptuje instrukcje rysowania
GeneralPath path = new GeneralPath();
// Utwórz implementację IGlyphOutlinePainter
GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);
// Utwórz renderer
IGlyphRenderer renderer = new GlyphOutlineRenderer(outlinePainter);
// uzyskać wspólne właściwości glifów
double kerning = 0;
// uzyskać wartość kerningu
if (previousGid != null)
{
kerning = (font.getMetrics().getKerningValue(previousGid, gid) /
glyph.getSourceResolution()) * fontSize * resolutionCorrection;
kerning += fontWidthToImageWdith(font.getMetrics().getGlyphWidth(previousGid),
glyph.getSourceResolution(), fontSize, 300);
}
// pozycjonowanie glifów - zwiększ współrzędną X glifu zgodnie z odległością kerningu
glyphXCoordinate += kerning;
// Macierz rozmieszczenia glifów
TransformationMatrix glyphMatrix =
new TransformationMatrix(
new double[]
{
fontSize*resolutionCorrection,
0,
0,
// ujemne ze względu na bitmapowy układ współrzędnych zaczyna się od góry
- fontSize*resolutionCorrection,
glyphXCoordinate,
glyphYCoordinate
});
// renderuj bieżący glif
renderer.renderGlyph(font, gid, glyphMatrix);
// wypełnić ścieżkę
path.setWindingRule(GeneralPath.WIND_NON_ZERO);
outGraphics.setPaint(textBrush);
outGraphics.fill(path);
}
//ustaw bieżący gid jak poprzedni, aby uzyskać poprawny kerning dla następnego glifu
previousGid = gid;
}
//Zapisz wyniki
ImageIO.write(outBitmap, "jpg", new File(outFile));
}
Poniżej przedstawiono metodę użytkową używaną do obliczania szerokości glifów dla układu współrzędnych mapy bitowej.
// Aby uzyskać pełne przykłady i pliki danych, przejdź do 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;
}
Kroki renderowania tekstu z czcionką w Javie
Poniżej przedstawiono kroki renderowania określonego tekstu jako pliku obrazu przy użyciu wspomnianej powyżej metody darwText().
- Załaduj czcionkę, używając klasy FontDefinition.
- Uzyskaj dostęp do czcionki za pomocą klasy, takiej jak Type1Font lub TtfFont.
- Wywołaj metodę drawText() podając szczegóły w postaci jej parametrów.
Renderuj tekst czcionką TrueType przy użyciu języka Java
Poniższy przykładowy kod pokazuje, jak używać metody drawText() do renderowania tekstu przy użyciu czcionki TrueType. Wyniki renderowania zostaną wygenerowane jako obraz JPEG.
// Aby uzyskać pełne przykłady i pliki danych, przejdź do 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();
}
Renderuj tekst przy użyciu czcionek Type1 w Javie
Poniższy przykładowy kod pokazuje, jak renderować tekst do obrazu JPEG z czcionką Type1 przy użyciu języka Java.
// Aby uzyskać pełne przykłady i pliki danych, przejdź do 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();
}
Wniosek
W tym artykule pokazano, jak renderować tekst jako obrazy JPEG przy użyciu czcionek TrueType lub Type1 z poziomu aplikacji Java. Aby dowiedzieć się więcej o interfejsie API manipulowania czcionkami Java, możesz odwiedzić dokumentację i ocenić funkcje interfejsu API za pomocą przykładów kodu źródłowego.