แยกกลีฟ เมตริก และข้อมูลใบอนุญาตจากฟอนต์ TTF และ OTF ใน Java

ตรวจสอบ วัด และวิเคราะห์ฟอนต์ TrueType (.ttf) และ OpenType (.otf) โดยใช้ Aspose.Font for Java แบบโปรแกรม เข้าถึงเมตริกฟอนต์ส่วนกลาง (Ascender, Descender, UnitsPerEm) จับคู่ดัชนีกลีฟโดยใช้ตาราง cmap คำนวณกรอบขอบเขตของอักขระแต่ละตัว ตรวจสอบการรองรับชุดอักขระ และบังคับใช้ข้อจำกัดใบอนุญาตในการฝังฟอนต์โดยไม่ต้องพึ่งพาสภาพแวดล้อมกราฟิกดั้งเดิมของระบบ

 

การตรวจสอบฟอนต์เชิงลึกมีความสำคัญอย่างยิ่งต่อการจัดหน้าข้อความแบบอัตโนมัติ การสร้าง PDF ระบบอัตโนมัติสำหรับการออกแบบกราฟิก และเวิร์กโฟลว์การเผยแพร่ดิจิทัล ด้วย Aspose.Font for Java นักพัฒนาสามารถ:

  • การจัดวางข้อความอย่างแม่นยำ: ดึงข้อมูลขนาดตัวอักษรที่แม่นยำ (Ascender, Descender, UnitsPerEm) เพื่อคำนวณความสูงของบรรทัดและตำแหน่งข้อความได้อย่างถูกต้อง
  • การตรวจสอบชุดอักขระ: ตรวจสอบว่าฟอนต์รองรับสคริปต์เป้าหมายหรือไม่ (เช่น อักขระละติน ซีริลลิก หรือ CJK) ก่อนการเรนเดอร์
  • การวิเคราะห์เรขาคณิตของกลีฟ: แยกกรอบขอบเขตของกลีฟ (XMin, XMax, YMin, YMax) และความกว้างการเลื่อนเพื่อการตรวจจับการชนและการจัดแนวที่แม่นยำ
  • การตรวจสอบด้านการปฏิบัติตามข้อกำหนดและกฎหมาย: ตรวจสอบแฟล็กใบอนุญาตในการฝังฟอนต์ (fsType ในตาราง OS/2) ด้วยโปรแกรม เพื่อให้มั่นใจว่าการฝังเอกสารเป็นไปตามข้อกำหนด

เมตริกหลักและคุณสมบัติของกลีฟ

เมตริกฟอนต์ส่วนกลาง - แยกเมตริก Ascender, Descender, TypoAscender, TypoDescender และ UnitsPerEM

กรอบขอบเขตของกลีฟ (BBox) - ดึงพิกัดกรอบขอบเขตที่แม่นยำ (XMin, XMax, YMin, YMax) และความกว้างการเลื่อนของแต่ละกลีฟ

การจับคู่ Unicode cmap - ค้นหาการจับคู่ระหว่างอักขระและกลีฟในตารางการเข้ารหัส Unicode และตารางการเข้ารหัสเฉพาะแพลตฟอร์ม

การรองรับชุดอักขระ - ตรวจสอบการมีอยู่ของสัญลักษณ์ (เช่น ชุดอักขระละติน) โดยถอดรหัสรหัสอักขระเป็น Glyph ID

การตรวจสอบข้อจำกัดของใบอนุญาต - ตรวจสอบแฟล็กของตาราง OS/2 เพื่อระบุว่าฟอนต์สามารถแก้ไขได้ ติดตั้งได้ ใช้สำหรับการแสดงตัวอย่างและการพิมพ์ หรือถูกจำกัด

วิธีแยกเมตริกฟอนต์ส่วนกลางและรายละเอียดของกลีฟ

เข้าถึงขนาดโดยรวมของฟอนต์พร้อมกับเมตริกเฉพาะอักขระโดยใช้โครงสร้าง Font.getMetrics() และโครงสร้างตาราง Unicode CMap

import com.aspose.font.*;
import java.text.MessageFormat;

public class GetFontMetricsAndGlyphs {
    public static void main(String[] args) {
        // Load the TrueType / OpenType font
        String fileName = "path/to/Montserrat-Regular.ttf";
        FontDefinition fd = new FontDefinition(FontType.TTF, new FontFileDefinition("ttf", new FileSystemStreamSource(fileName)));
        TtfFont font = (TtfFont) Font.open(fd);

        // Print global font metrics
        System.out.println("Font Name: " + font.getFontName());
        System.out.println("Glyph Count: " + font.getNumGlyphs());
        
        IFontMetrics metrics = font.getMetrics();
        System.out.println(MessageFormat.format(
            "Metrics: Ascender={0}, Descender={1}, TypoAscender={2}, TypoDescender={3}, UnitsPerEm={4}",
            metrics.getAscender(), metrics.getDescender(), 
            metrics.getTypoAscender(), metrics.getTypoDescender(), metrics.getUnitsPerEM()
        ));

        // Access cmap unicode table to locate character 'A'
        TtfCMapFormatBaseTable cmapTable = null;
        if (font.getTtfTables().getCMapTable() != null) {
            cmapTable = font.getTtfTables().getCMapTable().findUnicodeTable();
        }

        if (cmapTable != null && font.getTtfTables().getGlyfTable() != null) {
            char unicodeA = 'A';
            long glyphIndex = cmapTable.getGlyphIndex(unicodeA);

            if (glyphIndex != 0) {
                Glyph glyph = font.getGlyphById(glyphIndex);
                if (glyph != null) {
                    // Step 4: Extract bounding box and advance width
                    FontBBox bbox = glyph.getGlyphBBox();
                    System.out.println(MessageFormat.format(
                        "Glyph BBox for 'A': Xmin={0}, Xmax={1}, Ymin={2}, Ymax={3}",
                        bbox.getXMin(), bbox.getXMax(), bbox.getYMin(), bbox.getYMax()
                    ));
                    System.out.println("Glyph Width: " + metrics.getGlyphWidth(new GlyphUInt32Id(glyphIndex)));
                }
            }
        }
    }
}

ตรวจหาการรองรับชุดอักขระใน Java

ตรวจสอบว่าฟอนต์ที่โหลดมีการจับคู่กลีฟที่ถูกต้องสำหรับช่วงรหัสอักขระที่ระบุหรือไม่

import com.aspose.font.*;
import java.text.MessageFormat;

public class CheckFontLicense {
    public static void main(String[] args) {
        String fileName = "path/to/font.ttf";
        FontDefinition fd = new FontDefinition(FontType.TTF, new FontFileDefinition("ttf", new FileSystemStreamSource(fileName)));
        TtfFont font = (TtfFont) Font.open(fd);

        LicenseFlags licenseFlags = null;
        if (font.getTtfTables().getOs2Table() != null) {
            licenseFlags = font.getTtfTables().getOs2Table().getLicenseFlags();
        }

        if (licenseFlags == null || licenseFlags.isFSTypeAbsent()) {
            System.out.println(MessageFormat.format("Font {0} has no embedded license restrictions.", font.getFontName()));
        } else if (licenseFlags.isEditableEmbedding()) {
            System.out.println("License Mode: Editable Embedding allowed.");
        } else if (licenseFlags.isInstallableEmbedding()) {
            System.out.println("License Mode: Installable Embedding allowed.");
        } else if (licenseFlags.isPreviewAndPrintEmbedding()) {
            System.out.println("License Mode: Preview and Print Embedding only.");
        } else if (licenseFlags.isRestrictedLicenseEmbedding()) {
            System.out.println("License Mode: Restricted Embedding - explicit permission required.");
        }
    }
}

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

เพิ่ม 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. Aspose.Font for Java ใช้หน่วยใดในการวัดเมตริกของฟอนต์?

เมตริกต่าง ๆ เช่น Ascender, Descender และ GlyphBBox จะแสดงเป็นหน่วยฟอนต์ที่กำหนดโดยคุณสมบัติ UnitsPerEM (โดยทั่วไปคือ 1000 หรือ 2048 หน่วยต่อกล่อง EM สำหรับฟอนต์ TTF/OTF)

2. จะรับการแสดงผลของ Glyph ที่หายไปได้อย่างไรเมื่ออักขระไม่รองรับ?

เมื่ออักขระไม่ได้ถูกกำหนดไว้ในตารางการเข้ารหัสของฟอนต์ decodeToGid() จะส่งคืน GlyphUInt32Id.getNotDef() ซึ่งสอดคล้องกับดัชนี 0 (สัญลักษณ์มาตรฐาน .notdef หรือ Glyph ที่หายไป)

3. สามารถตรวจสอบตารางในฟอนต์ OpenType (.otf) รวมถึง TrueType (.ttf) ได้หรือไม่?

ได้ Aspose.Font for Java แยกวิเคราะห์ตารางฟอนต์ทั้ง .ttf และ .otf (OpenType ที่ใช้ CFF หรือ TrueType) และให้เข้าถึงตาราง OS/2, cmap, glyf, head และ hhea