在 Java 中加载和保存 CFF 字体
使用 Aspose.Font for Java 以编程方式处理基于 PostScript 的 Compact Font Format (.cff) 文件。从本地文件路径或内存中的字节数组打开 CFF 字体二进制数据,使用 CffFont 类检查字体结构,并在无需外部依赖项的情况下将修改后的字体数据保存回磁盘或流。
Compact Font Format (CFF) 是一种紧凑的 PostScript Type 1 字体轮廓表示形式,广泛用于 PDF 文档、OpenType CFF (.otf) 字体和数字出版工作流。使用 Aspose.Font for Java,开发人员可以:
- 内存中的字体处理: 直接从数据库 BLOB、PDF 流或云存储中加载 CFF 字体字节,而无需将临时文件写入磁盘。
- 紧凑型存储管理: 操作占用空间较小的 PostScript 轮廓字体结构,以实现优化的文档嵌入。
- 灵活的文件操作: 使用
FileSystemStreamSource或ByteContentStreamSource读取 CFF 字体文件,并通过CffFont.save()导出。
CFF 字体处理工作流
从磁盘加载 CFF - 使用(文件路径 (.cff))和 FontDefinition + FileSystemStreamSource
从内存加载 CFF - 使用二进制字节数组 (byte[]) 和 FontDefinition + ByteContentStreamSource
检查/编辑 CFF 数据 - 使用 CffFont 对象以及 CffFont.getFontName()、CffFont.getNumGlyphs() 等
将 CFF 保存到磁盘 - 使用 CffFont 对象以及 CffFont.getFontName()、CffFont.getNumGlyphs() 等
如何在 Java 中从磁盘上的字体加载 CFF?
通过定义包含 FontType.CFF 和 FileSystemStreamSource 的 FontDefinition 来加载 .cff 字体文件。
import com.aspose.font.*;
public class LoadCffFontFromDisk {
public static void main(String[] args) {
// Step 1: Specify path to the .cff font file
String fileName = "path/to/OpenSans-Regular.cff";
// Step 2: Initialize FontDefinition with CFF format and FileSystemStreamSource
FontDefinition fd = new FontDefinition(
FontType.CFF,
new FontFileDefinition("cff", new FileSystemStreamSource(fileName))
);
// Step 3: Open the CFF font
CffFont font = (CffFont) Font.open(fd);
// Step 4: Verify font properties
System.out.println("Font Name: " + font.getFontName());
System.out.println("Glyph Count: " + font.getNumGlyphs());
System.out.println("CFF Font successfully loaded from disk.");
}
}如何从字节数组 (`byte[]`) 加载 CFF 字体?
将字体加载到内存并执行数据提取或修改后,您可以将字体保存回本地磁盘存储,或将其写入输出字节流。
import com.aspose.font.*;
import java.nio.file.Files;
import java.nio.file.Paths;
public class LoadCffFontFromByteArray {
public static void main(String[] args) throws Exception {
String fileName = "path/to/OpenSans-Regular.cff";
// Step 1: Read font file bytes into memory
byte[] fontMemoryData = Files.readAllBytes(Paths.get(fileName));
// Step 2: Create FontDefinition using ByteContentStreamSource
FontDefinition fd = new FontDefinition(
FontType.CFF,
new FontFileDefinition("cff", new ByteContentStreamSource(fontMemoryData))
);
// Step 3: Open font instance from byte array
CffFont font = (CffFont) Font.open(fd);
System.out.println("Loaded CFF Font Name from memory: " + font.getFontName());
}
}如何修改 CFF 字体并将其保存到磁盘?
加载并处理 CffFont 实例后,使用 save() 方法将字体文件写入新位置。
import com.aspose.font.*;
import java.nio.file.Files;
import java.nio.file.Paths;
public class SaveCffFontToDisk {
public static void main(String[] args) throws Exception {
String inputPath = "path/to/OpenSans-Regular.cff";
String outputPath = "path/to/OpenSans-Regular_out.cff";
// Step 1: Load font from byte array
byte[] fontMemoryData = Files.readAllBytes(Paths.get(inputPath));
FontDefinition fd = new FontDefinition(
FontType.CFF,
new FontFileDefinition("cff", new ByteContentStreamSource(fontMemoryData))
);
CffFont font = (CffFont) Font.open(fd);
System.out.println("Loaded CFF Font: " + font.getFontName());
// Step 2: Work with font data (inspect metrics, glyphs, or update properties)
// Step 3: Save CFF font back to disk
font.save(outputPath);
System.out.println("CFF Font successfully saved to: " + outputPath);
}
}安装和设置
通过 Maven 将 Aspose.Font for Java 添加到您的项目中。
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. OpenType CFF (.otf) 与独立 CFF (.cff) 之间有什么区别?
独立的 .cff 文件包含原始 PostScript 字体程序数据,而没有 OpenType 表包装器。包含 CFF 轮廓的 .otf 文件会将 .cff 流封装在标准 OpenType 表结构 (CFF、cmap、head 等) 中。Aspose.Font for Java 支持处理独立 CFF 和 OpenType CFF 格式。
2. 我可以在 Java 中将 CFF 字体转换为 TTF 或 WOFF 等其他字体格式吗?
可以。加载到 CffFont 实例后,Aspose.Font for Java 提供渲染和编码功能,使您能够将字体数据转换为其他目标格式,例如 TTF、WOFF 或 WOFF2。
3. 我可以将修改后的 CffFont 直接保存到 OutputStream 吗?
可以。除了向 font.save(fileName) 传递文件路径字符串之外,您还可以传递 java.io.OutputStream,将二进制字体数据直接写入网络流或内存流。