رندر متن با استفاده از فونت در جاوا

در مقاله قبلی، نحوه بارگیری فونت‌های CFF، TrueType و Type1 را با استفاده از جاوا مشاهده کرده‌اید. امروز، یکی دیگر از ویژگی‌های جالب API دستکاری فونت جاوا را مورد بحث قرار خواهیم داد - رندر کردن متن با استفاده از فونت‌ها. تا پایان این مقاله، می توانید متن را با استفاده از فونت های TrueType و Type1 از داخل برنامه های جاوا خود رندر کنید. پس بیایید شروع کنیم.

Java Font Manipulation API

Aspose.Font for Java ویژگی های بارگیری و ذخیره فونت ها و همچنین دریافت معیارهای انواع فونت های محبوب از جمله CFF، TrueType، OpenType، و Type1 را در اختیار شما قرار می دهد. علاوه بر این، API به شما امکان می دهد متن را با استفاده از فونت های TrueType یا Type1 ارائه شده ارائه دهید. می‌توانید API را با استفاده از تنظیمات Maven نصب کنید یا 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 برای جاوا از شما می خواهد که متد 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 فعلی را به عنوان قبلی تنظیم کنید تا به درستی برای علامت بعدی استفاده کنید
        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;
}

مراحل رندر متن با فونت در جاوا

در زیر مراحل نحوه ارائه یک متن مشخص شده به عنوان یک فایل تصویری با استفاده از متد ()darwText فوق ذکر شده است.

  • فونت را با استفاده از کلاس FontDefinition بارگیری کنید.
  • با استفاده از کلاسی مانند Type1Font یا TtfFont به فونت دسترسی پیدا کنید.
  • متد drawText() را با ارائه جزئیات در قالب پارامترهای آن فراخوانی کنید.

رندر متن با فونت 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();
      }

رندر متن با استفاده از فونت Type1 در جاوا

نمونه کد زیر نحوه رندر کردن متن به یک تصویر JPEG با فونت Type1 با استفاده از جاوا را نشان می دهد.

// برای نمونه های کامل و فایل های داده، لطفاً به 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();
      }

نتیجه

در این مقاله، نحوه رندر متن را به صورت JPEG با استفاده از فونت TrueType یا Type1 از داخل برنامه های جاوا مشاهده کرده اید. به منظور کسب اطلاعات بیشتر در مورد API دستکاری فونت جاوا، می‌توانید از مستندات دیدن کنید و ویژگی‌های API را با استفاده از نمونه‌های کد منبع ارزیابی کنید.