เรนเดอร์ข้อความด้วยฟอนต์ Adobe Type 1 ใน Java

เรนเดอร์ข้อความ แยกโครงร่างของ glyph วัดเมตริกข้อความ และวาดตัวอักษรแบบกำหนดเองได้อย่างราบรื่นโดยใช้ฟอนต์ Adobe Type 1 (PostScript) ในแอปพลิเคชัน Java ด้วย Aspose.Font for Java นักพัฒนาสามารถแปลงข้อความดิบเป็นรูปร่างเวกเตอร์ของ glyph ที่มีความแม่นยำสูง และเรนเดอร์ลงบนบริบทกราฟิกหรือรูปภาพแบบแรสเตอร์ได้โดยตรงโดยไม่ต้องพึ่งพาการทำงานภายนอก

 

ฟอนต์ Adobe Type 1 ใช้เทคโนโลยีโครงร่าง PostScript ซึ่งให้ความคมชัดยอดเยี่ยมและการปรับขนาดเวกเตอร์ที่แม่นยำ การเรนเดอร์ข้อความด้วยฟอนต์ Type 1 แบบโปรแกรมใน Java ช่วยให้รองรับความสามารถที่สำคัญสำหรับองค์กร:

  • การสร้างกราฟิกแบบกำหนดเอง: - เรนเดอร์ข้อความแบบไดนามิกลงบนสภาพแวดล้อมแคนวาส รูปภาพที่สร้างขึ้น หรือการแสดงตัวอย่างเอกสาร
  • การแยกเส้นทางของ glyph: - แยกโครงร่างทางเรขาคณิต (IGlyphAccessor & GeneralPath) สำหรับการแปลงเวกเตอร์แบบกำหนดเองหรือการดำเนินการ CAD
  • ความแม่นยำของเมตริกข้อความ: - คำนวณขอบเขตของสตริง ความกว้างการเลื่อน ความสูงของบรรทัด และระยะห่างระหว่าง glyph ได้อย่างแม่นยำก่อนการเรนเดอร์
  • การเรนเดอร์ข้ามแพลตฟอร์ม: - ทำให้รูปแบบตัวอักษรมีความสม่ำเสมอในระดับพิกเซลบนเซิร์ฟเวอร์ Linux, คอนเทนเนอร์ Docker และไมโครเซอร์วิสบนคลาวด์

ความสามารถหลักด้านการเรนเดอร์

โครงร่างเวกเตอร์ของ glyph - เรียกดูเส้นทางเวกเตอร์ที่แม่นยำ (java.awt.geom.GeneralPath) สำหรับ glyph แต่ละตัวในฟอนต์ Type 1

การวาดในบริบทกราฟิก - วาดสตริงข้อความลงบน Graphics2D หรือรูปภาพบิตแมป (BufferedImage) ได้โดยตรง

การเข้ารหัสและเมตริกแบบกำหนดเอง - วัดเมตริกของอักขระ ตำแหน่งอักขระ และจัดการตารางการเข้ารหัส PostScript

ไม่มีการพึ่งพา GUI ของระบบปฏิบัติการ - ดำเนินการเรนเดอร์ข้อความฝั่งเซิร์ฟเวอร์ในโหมด headless โดยไม่ต้องใช้เซิร์ฟเวอร์ X11 หรือข้อกำหนด GDI แบบเนทีฟ

การเรนเดอร์ข้อความทำงานอย่างไรใน Aspose.Font for Java

การโหลดฟอนต์ Type 1: เริ่มต้นออบเจ็กต์ Type1Font จากเส้นทางไฟล์ (.pfb, .pfm) หรือสตรีมไบต์

การแยกโครงร่างของ glyph: เข้าถึงตัวแทนของ glyph หรือคำนวณเรขาคณิตของเส้นทางโดยใช้การเข้ารหัสของฟอนต์

การวาดลงบนแคนวาส: เรนเดอร์เส้นทางของ glyph หรือข้อความที่จัดรูปแบบแล้วลงบนแคนวาสกราฟิกเป้าหมายโดยตรง

การเรนเดอร์ข้อความทำงานอย่างไรใน Aspose.Font for Java

การโหลดฟอนต์ Type 1: เริ่มต้นออบเจ็กต์ Type1Font จากเส้นทางไฟล์ (.pfb, .pfm) หรือสตรีมไบต์

การแยกโครงร่างของ glyph: เข้าถึงตัวแทนของ glyph หรือคำนวณเรขาคณิตของเส้นทางโดยใช้การเข้ารหัสของฟอนต์

การวาดลงบนแคนวาส: เรนเดอร์เส้นทางของ glyph หรือข้อความที่จัดรูปแบบแล้วลงบนแคนวาสกราฟิกเป้าหมายโดยตรง

ตัวอย่างโค้ด Java สำหรับเรนเดอร์ข้อความด้วยฟอนต์ Type 1

ด้านล่างคือตัวอย่างการใช้งาน Java แบบสมบูรณ์ที่แสดงวิธีโหลดฟอนต์ Type 1 คำนวณโครงร่างของ glyph และเรนเดอร์ข้อความแบบกำหนดเองลงบนแคนวาสรูปภาพ

import com.aspose.font.ByteContentStreamSource;
import com.aspose.font.FontDefinition;
import com.aspose.font.FontType;
import com.aspose.font.Type1Font;
import com.aspose.font.GlyphId;

import java.awt.*;
import java.awt.geom.GeneralPath;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.imageio.ImageIO;

public class RenderType1Text {
    public static void main(String[] args) throws IOException {
        // Load Type 1 font bytes
        String pfbPath = "path/to/font.pfb";
        byte[] fontBytes = Files.readAllBytes(Paths.get(pfbPath));

        // Initialize FontDefinition & open Type1Font
        FontDefinition fontDef = new FontDefinition(FontType.Type1, new ByteContentStreamSource(fontBytes));
        Type1Font font = (Type1Font) com.aspose.font.Font.open(fontDef);

        // Create canvas image and Graphics2D context
        int width = 800;
        int height = 200;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = image.createGraphics();

        // Configure rendering hints for clean vector text
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, width, height);
        g2d.setColor(Color.BLUE);

        // Render text character by character using glyph paths
        String textToRender = "Type 1 Text Rendering";
        double xPosition = 50;
        double yPosition = 120;
        double fontSize = 36;

        for (char c : textToRender.toCharArray()) {
            // Get Glyph ID for the character
            GlyphId glyphId = font.getEncoding().decodeToGlyphId(c);
            
            // Extract vector outline path
            GeneralPath path = font.getGlyphClass().getGlyphPath(glyphId);

            if (path != null) {
                // Save state and position glyph on canvas
                Graphics2D g2dCopy = (Graphics2D) g2d.create();
                g2dCopy.translate(xPosition, yPosition);
                g2dCopy.scale(fontSize / 1000.0, -fontSize / 1000.0); // Adjust PostScript coordinate scaling

                g2dCopy.fill(path);
                g2dCopy.dispose();
            }

            // Advance cursor position for next character
            xPosition += font.getGlyphClass().getGlyphWidth(glyphId) * (fontSize / 1000.0);
        }

        g2d.dispose();

        // Save rendered image to file
        ImageIO.write(image, "png", new File("rendered_type1_text.png"));
        System.out.println("Text rendered successfully with Type 1 font.");
    }
}

การติดตั้งและการตั้งค่า

เพิ่ม Aspose.Font for Java ลงในโปรเจกต์ของคุณผ่าน Maven

Package Manager Console Command

<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>Latest</version>
</dependency>

FAQ

1. สามารถแยกเส้นทางเวกเตอร์ดิบจากฟอนต์ Type 1 โดยไม่ต้องเรนเดอร์ทันทีได้หรือไม่?

ได้ คุณสามารถเรียกดูเรขาคณิตเวกเตอร์ที่แม่นยำ (java.awt.geom.GeneralPath) สำหรับอักขระหรือ Glyph ID ใด ๆ ในฟอนต์ Type 1 และแปลง ปรับขนาด หรือตรวจสอบเส้นทางเหล่านั้นได้อย่างอิสระ

2. Aspose.Font จัดการกับระบบพิกัด PostScript ระหว่างการเรนเดอร์ข้อความอย่างไร?

ฟอนต์ PostScript Type 1 ใช้แกน Y ที่กลับด้านเมื่อเทียบกับพื้นที่พิกัดหน้าจอมาตรฐาน Aspose.Font มีเรขาคณิตของ Glyph ซึ่งสามารถแปลงหรือกลับด้านได้อย่างง่ายดายผ่านการแปลงมาตราส่วนมาตรฐาน

3. การเรนเดอร์ฝั่งเซิร์ฟเวอร์จำเป็นต้องใช้เอนจินแสดงผลหรือไลบรารีแบบเนทีฟหรือไม่?

ไม่ Aspose.Font for Java ทำงานในโหมด headless อย่างสมบูรณ์ คุณสามารถคำนวณโครงสร้าง Glyph และเรนเดอร์ข้อความเป็นรูปภาพบนเซิร์ฟเวอร์คลาวด์, Linux daemon หรือสภาพแวดล้อมแบบคอนเทนเนอร์ได้โดยไม่ต้องติดตั้ง X11 หรือไดรเวอร์แสดงผลกราฟิกแบบเนทีฟ