在 Java 中使用字體渲染文本

上一篇文章 中,您了解瞭如何使用 Java 以編程方式加載 CFFTrueTypeType1 字體。今天,我們將討論 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 類加載字體。
  • 使用 Type1FontTtfFont 等類訪問字體。
  • 通過以參數形式提供詳細信息來調用 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 的功能。