עיבוד טקסט באמצעות גופן ב-Java

במאמר הקודם, ראית כיצד לטעון גופנים CFF, TrueType ו-Type1 באופן פרוגרמטי באמצעות Java. היום, נדון בתכונה מעניינת נוספת של ממשק API למניפולציה של גופנים ב-Java - עיבוד טקסט באמצעות גופנים. בסוף מאמר זה, תוכל לעבד טקסט באמצעות גופני TrueType ו-Type1 מתוך יישומי Java שלך. אז הבה נתחיל.

Java Font Manipulation API

Aspose.Font עבור 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 עבור 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);
    //להכריז על משתני קואורדינטות וגיד קודם
    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;
}

שלבים לעיבוד טקסט עם גופן ב-Java

להלן השלבים כיצד לעבד טקסט שצוין כקובץ תמונה באמצעות שיטת darwText() שהוזכרה לעיל.

  • טען את הגופן באמצעות המחלקה FontDefinition.
  • גש לגופן באמצעות המחלקה כגון Type1Font או TtfFont.
  • קרא למתודה drawText() על ידי מתן הפרטים בצורת הפרמטרים שלה.

עיבוד טקסט עם גופן TrueType באמצעות Java

דוגמת הקוד הבאה מראה כיצד להשתמש בשיטת 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 ב-Java

דוגמת הקוד הבאה מראה כיצד לעבד טקסט לתמונת JPEG עם גופן Type1 באמצעות Java.

// לדוגמאות מלאות וקובצי נתונים, נא עבור אל 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 מתוך יישומי Java. על מנת ללמוד עוד על ה-API של מניפולציה של גופנים של Java, אתה יכול לבקר בתיעוד ולהעריך את תכונות ה-API באמצעות [דוגמאות קוד מקור].