V předchozím článku jste viděli, jak načíst fonty CFF, TrueType a Type1 programově pomocí Java. Dnes si probereme další zajímavou funkci našeho API pro manipulaci s fonty Java – vykreslování textu pomocí fontů. Na konci tohoto článku budete schopni vykreslovat text pomocí písem TrueType a Type1 z vašich aplikací Java. Takže začneme.
- O Java Font Manipulation API
- Implementujte metodu vykreslování textu
- Vykreslování textu pomocí písem TrueType v Javě
- Vykreslování textu pomocí písem Type1 v Javě
Java API pro manipulaci s písmy
Aspose.Font for Java vám poskytuje funkce načítání a ukládání písem a také získávání metrik oblíbených typů písem včetně CFF, TrueType, OpenType a Type1. Kromě toho vám API umožňuje vykreslit text pomocí poskytnutých písem TrueType nebo Type1. Můžete buď nainstalovat API pomocí konfigurací Maven nebo stáhnout 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>
Implementujte metodu vykreslování textu
Aby bylo možné vykreslit text, Aspose.Font for Java vyžaduje, abyste implementovali metodu drawText(), která vykreslí poskytnutý text. Následuje úplná definice metody drawText().
// Úplné příklady a datové soubory najdete na 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
{
//Získejte identifikátory glyfů pro každý symbol v textovém řádku
GlyphId[] gids = new GlyphId[text.length()];
for (int i = 0; i < text.length(); i++)
gids[i] = font.getEncoding().decodeToGid(text.charAt(i));
// nastavit běžná nastavení kreslení
double dpi = 300;
double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
// připravit výstupní bitmapu
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);
//deklarovat proměnné souřadnic a předchozí gid
GlyphId previousGid = null;
double glyphXCoordinate = 0;
double glyphYCoordinate = fontSize * resolutionCorrection;
//smyčka, která maluje každý glyf v gids
for (GlyphId gid : gids)
{
// pokud písmo obsahuje gid
if (gid != null)
{
Glyph glyph = font.getGlyphAccessor().getGlyphById(gid);
if (glyph == null)
continue;
// cestu, která přijímá pokyny pro kreslení
GeneralPath path = new GeneralPath();
// Vytvořte implementaci IGlyphOutlinePainter
GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);
// Vytvořte renderer
IGlyphRenderer renderer = new GlyphOutlineRenderer(outlinePainter);
// získat běžné vlastnosti glyfů
double kerning = 0;
// získat hodnotu kerningu
if (previousGid != null)
{
kerning = (font.getMetrics().getKerningValue(previousGid, gid) /
glyph.getSourceResolution()) * fontSize * resolutionCorrection;
kerning += fontWidthToImageWdith(font.getMetrics().getGlyphWidth(previousGid),
glyph.getSourceResolution(), fontSize, 300);
}
// umístění glyfu - zvyšte souřadnici X glyfu podle vzdálenosti vyrovnání párů
glyphXCoordinate += kerning;
// Matice umístění glyfů
TransformationMatrix glyphMatrix =
new TransformationMatrix(
new double[]
{
fontSize*resolutionCorrection,
0,
0,
// negativní, protože bitmapový souřadnicový systém začíná shora
- fontSize*resolutionCorrection,
glyphXCoordinate,
glyphYCoordinate
});
// vykreslit aktuální glyf
renderer.renderGlyph(font, gid, glyphMatrix);
// vyplnit cestu
path.setWindingRule(GeneralPath.WIND_NON_ZERO);
outGraphics.setPaint(textBrush);
outGraphics.fill(path);
}
//nastavte aktuální gid jako předchozí, abyste získali správné vyrovnání párů pro další glyf
previousGid = gid;
}
//Uložit výsledky
ImageIO.write(outBitmap, "jpg", new File(outFile));
}
Následuje obslužná metoda, která se používá k výpočtu šířky glyfu pro bitmapový souřadnicový systém.
// Úplné příklady a datové soubory najdete na 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;
}
Kroky k vykreslení textu s písmem v Javě
Následují kroky, jak vykreslit zadaný text jako soubor obrázku pomocí výše uvedené metody darwText().
- Načtěte písmo pomocí třídy FontDefinition.
- Přistupujte k písmu pomocí třídy, jako je Type1Font nebo TtfFont.
- Zavolejte metodu drawText() poskytnutím podrobností ve formě jejích parametrů.
Vykreslování textu pomocí písma TrueType pomocí Java
Následující ukázka kódu ukazuje, jak použít metodu drawText() k vykreslení textu pomocí písma TrueType. Výsledky vykreslení budou generovány jako obrázek JPEG.
// Úplné příklady a datové soubory najdete na 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();
}
Vykreslování textu pomocí písem Type1 v Javě
Následující ukázka kódu ukazuje, jak vykreslit text do obrázku JPEG s písmem Type1 pomocí jazyka Java.
// Úplné příklady a datové soubory najdete na 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();
}
Závěr
V tomto článku jste viděli, jak vykreslit text jako obrázky JPEG pomocí písma TrueType nebo Type1 z aplikací Java. Chcete-li se dozvědět více o rozhraní API pro manipulaci s písmy Java, můžete navštívit dokumentaci a vyhodnotit funkce rozhraní API pomocí ukázky zdrojového kódu.