renderuj tekst za pomocą czcionki w Javie

W poprzednim artykule widziałeś, jak programowo ładować czcionki CFF, TrueType i Type1 przy użyciu języka Java. Dzisiaj omówimy kolejną interesującą funkcję naszego interfejsu API manipulacji czcionkami Java — renderowanie tekstu za pomocą czcionek. Pod koniec tego artykułu będziesz w stanie renderować tekst przy użyciu czcionek TrueType i Type1 z poziomu swoich aplikacji Java. A więc zacznijmy.

Interfejs API manipulacji czcionkami Java

Aspose.Font for Java zapewnia funkcje ładowania i zapisywania czcionek, a także uzyskiwania metryk popularnych typów czcionek, w tym CFF, TrueType, OpenType i Type1. Ponadto interfejs API umożliwia renderowanie tekstu przy użyciu dostarczonych czcionek TrueType lub Type1. Możesz zainstalować API przy użyciu konfiguracji Mavena lub pobierz plik 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>

Zaimplementuj metodę renderowania tekstu

Aby wyrenderować tekst, Aspose.Font for Java wymaga zaimplementowania metody drawText(), która narysuje dostarczony tekst. Poniżej znajduje się pełna definicja metody drawText().

// Aby uzyskać pełne przykłady i pliki danych, przejdź do 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
{
    //Uzyskaj identyfikatory glifów dla każdego symbolu w wierszu tekstu
    GlyphId[] gids = new GlyphId[text.length()];
   for (int i = 0; i < text.length(); i++)
        gids[i] = font.getEncoding().decodeToGid(text.charAt(i));
    // ustaw wspólne ustawienia rysunku
    double dpi = 300;
	
    double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
    // przygotować wyjściową bitmapę
    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);
    //zadeklaruj zmienne współrzędnych i poprzedni gid
    GlyphId previousGid = null;
    double glyphXCoordinate = 0;
    double glyphYCoordinate = fontSize * resolutionCorrection;
    //pętla, która maluje każdy glif w gidzie
   for (GlyphId gid : gids)
    {
        // jeśli czcionka zawiera gid
        if (gid != null)
        {
            Glyph glyph = font.getGlyphAccessor().getGlyphById(gid);
            if (glyph == null)
                continue;
	
            // ścieżka, która akceptuje instrukcje rysowania
            GeneralPath path = new GeneralPath();
	
            // Utwórz implementację IGlyphOutlinePainter
            GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);
	
            // Utwórz renderer
            IGlyphRenderer renderer = new GlyphOutlineRenderer(outlinePainter);
	
            // uzyskać wspólne właściwości glifów
            double kerning = 0;
	
            // uzyskać wartość kerningu
            if (previousGid != null)
            {
                kerning = (font.getMetrics().getKerningValue(previousGid, gid) /
                           glyph.getSourceResolution()) * fontSize * resolutionCorrection;
                kerning += fontWidthToImageWdith(font.getMetrics().getGlyphWidth(previousGid),
                        glyph.getSourceResolution(), fontSize, 300);
            }
	
            // pozycjonowanie glifów - zwiększ współrzędną X glifu zgodnie z odległością kerningu
            glyphXCoordinate += kerning;
	
            // Macierz rozmieszczenia glifów
            TransformationMatrix glyphMatrix =
                new TransformationMatrix(
                    new double[]
                            {
                                    fontSize*resolutionCorrection,
                                    0,
                                    0,
                                // ujemne ze względu na bitmapowy układ współrzędnych zaczyna się od góry
                                    - fontSize*resolutionCorrection,
                                    glyphXCoordinate,
                                    glyphYCoordinate
                            });
	
            // renderuj bieżący glif
            renderer.renderGlyph(font, gid, glyphMatrix);
            // wypełnić ścieżkę
            path.setWindingRule(GeneralPath.WIND_NON_ZERO);
            outGraphics.setPaint(textBrush);
            outGraphics.fill(path);
        }
        //ustaw bieżący gid jak poprzedni, aby uzyskać poprawny kerning dla następnego glifu
        previousGid = gid;
    }
    //Zapisz wyniki
    ImageIO.write(outBitmap, "jpg", new File(outFile));
}

Poniżej przedstawiono metodę użytkową używaną do obliczania szerokości glifów dla układu współrzędnych mapy bitowej.

// Aby uzyskać pełne przykłady i pliki danych, przejdź do 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;
}

Kroki renderowania tekstu z czcionką w Javie

Poniżej przedstawiono kroki renderowania określonego tekstu jako pliku obrazu przy użyciu wspomnianej powyżej metody darwText().

  • Załaduj czcionkę, używając klasy FontDefinition.
  • Uzyskaj dostęp do czcionki za pomocą klasy, takiej jak Type1Font lub TtfFont.
  • Wywołaj metodę drawText() podając szczegóły w postaci jej parametrów.

Renderuj tekst czcionką TrueType przy użyciu języka Java

Poniższy przykładowy kod pokazuje, jak używać metody drawText() do renderowania tekstu przy użyciu czcionki TrueType. Wyniki renderowania zostaną wygenerowane jako obraz JPEG.

// Aby uzyskać pełne przykłady i pliki danych, przejdź do 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();
      }

Renderuj tekst przy użyciu czcionek Type1 w Javie

Poniższy przykładowy kod pokazuje, jak renderować tekst do obrazu JPEG z czcionką Type1 przy użyciu języka Java.

// Aby uzyskać pełne przykłady i pliki danych, przejdź do 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();
      }

Wniosek

W tym artykule pokazano, jak renderować tekst jako obrazy JPEG przy użyciu czcionek TrueType lub Type1 z poziomu aplikacji Java. Aby dowiedzieć się więcej o interfejsie API manipulowania czcionkami Java, możesz odwiedzić dokumentację i ocenić funkcje interfejsu API za pomocą przykładów kodu źródłowego.