แยกกลีฟ เมตริก และข้อมูลใบอนุญาตจากฟอนต์ 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