Nell’articolo precedente, hai visto come caricare i font CFF, TrueType e Type1 a livello di codice usando Java. Oggi discuteremo un’altra caratteristica interessante della nostra API di manipolazione dei caratteri Java: il rendering del testo utilizzando i caratteri. Entro la fine di questo articolo, sarai in grado di eseguire il rendering del testo utilizzando i caratteri TrueType e Type1 dalle tue applicazioni Java. Quindi iniziamo.
- Informazioni sull’API di manipolazione dei caratteri Java
- Implementare il metodo di rendering del testo
- Rendering di testo utilizzando i caratteri TrueType in Java
- Rendering di testo utilizzando i caratteri Type1 in Java
API di manipolazione dei caratteri Java
Aspose.Font for Java ti fornisce le funzionalità per caricare e salvare i font, oltre a ottenere le metriche dei tipi di font più diffusi, inclusi CFF, TrueType, OpenType e Type1. Inoltre, l’API consente di eseguire il rendering del testo utilizzando i caratteri TrueType o Type1 forniti. Puoi installare l’API utilizzando le configurazioni Maven o scaricare il JAR dell’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>
Implementare il metodo di rendering del testo
Per eseguire il rendering del testo, Aspose.Font per Java richiede l’implementazione del metodo drawText() che disegnerà il testo fornito. Quella che segue è la definizione completa del metodo drawText().
// Per esempi completi e file di dati, vai a 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
{
//Ottieni identificatori di glifi per ogni simbolo nella riga di testo
GlyphId[] gids = new GlyphId[text.length()];
for (int i = 0; i < text.length(); i++)
gids[i] = font.getEncoding().decodeToGid(text.charAt(i));
// impostare le impostazioni di disegno comuni
double dpi = 300;
double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
// preparare la bitmap di output
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);
//dichiarare le variabili coordinate e il gid precedente
GlyphId previousGid = null;
double glyphXCoordinate = 0;
double glyphYCoordinate = fontSize * resolutionCorrection;
//loop che dipinge ogni glifo in gid
for (GlyphId gid : gids)
{
// se il font contiene il gid
if (gid != null)
{
Glyph glyph = font.getGlyphAccessor().getGlyphById(gid);
if (glyph == null)
continue;
// percorso che accetta le istruzioni di disegno
GeneralPath path = new GeneralPath();
// Crea l'implementazione di IglyphOutlinePainter
GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);
// Crea il renderer
IGlyphRenderer renderer = new GlyphOutlineRenderer(outlinePainter);
// ottenere le proprietà comuni dei glifi
double kerning = 0;
// ottenere valore di crenatura
if (previousGid != null)
{
kerning = (font.getMetrics().getKerningValue(previousGid, gid) /
glyph.getSourceResolution()) * fontSize * resolutionCorrection;
kerning += fontWidthToImageWdith(font.getMetrics().getGlyphWidth(previousGid),
glyph.getSourceResolution(), fontSize, 300);
}
// posizionamento del glifo - aumenta la coordinata X del glifo in base alla distanza di crenatura
glyphXCoordinate += kerning;
// Matrice di posizionamento dei glifi
TransformationMatrix glyphMatrix =
new TransformationMatrix(
new double[]
{
fontSize*resolutionCorrection,
0,
0,
// negativo a causa del sistema di coordinate bitmap inizia dall'alto
- fontSize*resolutionCorrection,
glyphXCoordinate,
glyphYCoordinate
});
// renderizza il glifo corrente
renderer.renderGlyph(font, gid, glyphMatrix);
// riempire il percorso
path.setWindingRule(GeneralPath.WIND_NON_ZERO);
outGraphics.setPaint(textBrush);
outGraphics.fill(path);
}
//imposta gid corrente come precedente per ottenere la crenatura corretta per il prossimo glifo
previousGid = gid;
}
//Salva i risultati
ImageIO.write(outBitmap, "jpg", new File(outFile));
}
Di seguito è riportato un metodo di utilità utilizzato per calcolare la larghezza del glifo per il sistema di coordinate bitmap.
// Per esempi completi e file di dati, vai a 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;
}
Passaggi per il rendering di testo con font in Java
Di seguito sono riportati i passaggi su come eseguire il rendering di un testo specificato come file immagine utilizzando il metodo darwText() sopra menzionato.
- Carica il carattere usando la classe FontDefinition.
- Accedi al carattere utilizzando la classe come Type1Font o TtfFont.
- Chiama il metodo drawText() fornendo i dettagli sotto forma dei suoi parametri.
Rendering di testo con font TrueType utilizzando Java
Nell’esempio di codice seguente viene illustrato come utilizzare il metodo drawText() per eseguire il rendering del testo utilizzando un carattere TrueType. I risultati del rendering verranno generati come immagine JPEG.
// Per esempi completi e file di dati, vai a 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();
}
Rendering di testo utilizzando i caratteri Type1 in Java
L’esempio di codice seguente mostra come eseguire il rendering del testo in un’immagine JPEG con un carattere Type1 utilizzando Java.
// Per esempi completi e file di dati, vai a 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();
}
Conclusione
In questo articolo, hai visto come eseguire il rendering del testo come immagini JPEG utilizzando il font TrueType o Type1 dall’interno delle applicazioni Java. Per saperne di più sull’API di manipolazione dei caratteri Java, puoi visitare la documentazione e valutare le funzionalità dell’API utilizzando campioni di codice sorgente.