Javaでフォントを使用してテキストをレンダリングする

前の記事では、Javaを使用してプログラムでCFFTrueType、およびType1フォントをロードする方法を見てきました。今日は、Javaフォント操作APIのもう1つの興味深い機能、フォントを使用したテキストのレンダリングについて説明します。この記事の終わりまでに、Javaアプリケーション内からTrueTypeおよびType1フォントを使用してテキストをレンダリングできるようになります。それでは始めましょう。

Javaフォント操作API

Aspose.Font for Javaは、フォントのロードと保存、およびCFF、TrueType、OpenType、Type1などの一般的なフォントタイプのメトリックを取得する機能を提供します。さらに、APIを使用すると、提供されているTrueTypeまたはType1フォントを使用してテキストをレンダリングできます。 Maven構成を使用してAPIをインストールするか、APIのJARをダウンロードすることができます。

<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;
    //すべてのグリフをギッドでペイントするループ
    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を前のように設定します
        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の機能を評価できます。