hiển thị văn bản bằng phông chữ trong Java

Trong bài viết trước, bạn đã thấy cách tải các phông chữ CFF, TrueTypeType1 theo chương trình bằng cách sử dụng Java. Hôm nay, chúng ta sẽ thảo luận về một tính năng thú vị khác của API thao tác phông chữ Java - hiển thị văn bản bằng cách sử dụng phông chữ. Đến cuối bài viết này, bạn sẽ có thể hiển thị văn bản bằng cách sử dụng phông chữ TrueType và Type1 từ bên trong các ứng dụng Java của mình. Vì vậy, hãy bắt đầu.

API thao tác phông chữ Java

Aspose.Font for Java cung cấp cho bạn các tính năng tải và lưu phông chữ cũng như nhận số liệu về các loại phông chữ phổ biến bao gồm CFF, TrueType, OpenType và Type1. Ngoài ra, API cho phép bạn hiển thị văn bản bằng phông chữ TrueType hoặc Type1 được cung cấp. Bạn có thể cài đặt API bằng cấu hình Maven hoặc tải xuống JAR của 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>

Thực hiện phương pháp kết xuất văn bản

Để hiển thị văn bản, Aspose.Font cho Java yêu cầu bạn triển khai phương thức drawText() sẽ vẽ văn bản được cung cấp. Sau đây là định nghĩa đầy đủ của phương thức drawText().

// Để biết các ví dụ và tệp dữ liệu đầy đủ, vui lòng truy cập 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
{
    //Nhận số nhận dạng glyph cho mọi ký hiệu trong dòng văn bản
    GlyphId[] gids = new GlyphId[text.length()];
   for (int i = 0; i < text.length(); i++)
        gids[i] = font.getEncoding().decodeToGid(text.charAt(i));
    // đặt cài đặt bản vẽ chung
    double dpi = 300;
	
    double resolutionCorrection = dpi / 72; // 72 is font's internal dpi
    // chuẩn bị bitmap đầu ra
    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);
    //khai báo các biến tọa độ và gid trước đó
    GlyphId previousGid = null;
    double glyphXCoordinate = 0;
    double glyphYCoordinate = fontSize * resolutionCorrection;
    //vòng lặp vẽ mọi glyph trong gids
   for (GlyphId gid : gids)
    {
        // nếu phông chữ chứa gid
        if (gid != null)
        {
            Glyph glyph = font.getGlyphAccessor().getGlyphById(gid);
            if (glyph == null)
                continue;
	
            // đường dẫn chấp nhận hướng dẫn vẽ
            GeneralPath path = new GeneralPath();
	
            // Tạo triển khai IGlyphOutlinePainter
            GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);
	
            // Tạo trình kết xuất
            IGlyphRenderer renderer = new GlyphOutlineRenderer(outlinePainter);
	
            // nhận các thuộc tính glyph phổ biến
            double kerning = 0;
	
            // lấy giá trị kerning
            if (previousGid != null)
            {
                kerning = (font.getMetrics().getKerningValue(previousGid, gid) /
                           glyph.getSourceResolution()) * fontSize * resolutionCorrection;
                kerning += fontWidthToImageWdith(font.getMetrics().getGlyphWidth(previousGid),
                        glyph.getSourceResolution(), fontSize, 300);
            }
	
            // định vị glyph - tăng tọa độ glyph X theo khoảng cách kerning
            glyphXCoordinate += kerning;
	
            // Ma trận vị trí Glyph
            TransformationMatrix glyphMatrix =
                new TransformationMatrix(
                    new double[]
                            {
                                    fontSize*resolutionCorrection,
                                    0,
                                    0,
                                // âm vì hệ tọa độ bitmap bắt đầu từ đầu
                                    - fontSize*resolutionCorrection,
                                    glyphXCoordinate,
                                    glyphYCoordinate
                            });
	
            // hiển thị glyph hiện tại
            renderer.renderGlyph(font, gid, glyphMatrix);
            // điền vào đường dẫn
            path.setWindingRule(GeneralPath.WIND_NON_ZERO);
            outGraphics.setPaint(textBrush);
            outGraphics.fill(path);
        }
        //đặt gid hiện tại như trước đó để có được kerning chính xác cho glyph tiếp theo
        previousGid = gid;
    }
    //Lưu kết quả
    ImageIO.write(outBitmap, "jpg", new File(outFile));
}

Sau đây là một phương pháp tiện ích được sử dụng để tính chiều rộng nét vẽ cho hệ tọa độ bitmap.

// Để biết các ví dụ và tệp dữ liệu đầy đủ, vui lòng truy cập 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;
}

Các bước để kết xuất văn bản với phông chữ trong Java

Sau đây là các bước về cách hiển thị văn bản đã chỉ định dưới dạng tệp hình ảnh bằng phương thức darwText() đã đề cập ở trên.

  • Tải phông chữ bằng lớp FontDefinition.
  • Truy cập phông chữ bằng cách sử dụng lớp như Type1Font hoặc TtfFont.
  • Gọi phương thức drawText() bằng cách cung cấp thông tin chi tiết dưới dạng tham số của nó.

Kết xuất văn bản với Phông chữ TrueType bằng Java

Mẫu mã sau đây cho biết cách sử dụng phương thức drawText() để hiển thị văn bản bằng phông chữ TrueType. Kết quả hiển thị sẽ được tạo dưới dạng ảnh JPEG.

// Để biết các ví dụ và tệp dữ liệu đầy đủ, vui lòng truy cập 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();
      }

Kết xuất văn bản bằng Phông chữ Type1 trong Java

Mẫu mã sau đây cho biết cách hiển thị văn bản thành hình ảnh JPEG bằng phông chữ Type1 bằng Java.

// Để biết các ví dụ và tệp dữ liệu đầy đủ, vui lòng truy cập 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();
      }

Sự kết luận

Trong bài viết này, bạn đã biết cách hiển thị văn bản dưới dạng hình ảnh JPEG bằng cách sử dụng phông chữ TrueType hoặc Type1 từ bên trong các ứng dụng Java. Để tìm hiểu thêm về API thao tác phông chữ Java, bạn có thể truy cập tài liệu và đánh giá các tính năng của API bằng cách sử dụng mẫu mã nguồn.