Fonts
Fonts
本指南展示了如何检查文档中引用的字体、提取嵌入的字体数据,以及使用 Aspose.Words FOSS for .NET 在保存时控制 TrueType 字体嵌入。Aspose.Words FOSS for .NET 通过 FontInfoCollection 跟踪已加载文档引用的每一种字体,并通过 FontInfo 提供每种字体的元数据、嵌入字体提取以及保存时的嵌入控制。Document.FontSettings 和 LoadOptions.FontSettings 提供了本版(特意保持简约)的 FontSettings 入口。
检查文档中使用的字体
DocumentBase.FontInfos(由 Document 继承)返回一个 FontInfoCollection,描述文档中出现的每一种字体。可通过名称(例如 fontInfos["Arial"])索引它,使用 Contains(name) 检查是否存在,使用 Count 计数,或通过 GetEnumerator() 枚举整个集合。
字体属性与分类
每个 FontInfo 描述一种字体:Name 和 AltName 用于标识它,Family 通过 FontFamily 枚举(Auto、Roman、Swiss、Modern、Script、Decorative)对其进行分类,Pitch 报告其 FontPitch(Default、Fixed、Variable),IsTrueType、Charset 和 Panose 暴露更底层的字体匹配数据。
嵌入字体提取
如果文档中嵌入了字体,FontInfo.GetEmbeddedFont(format, style) 返回给定 EmbeddedFontFormat(EmbeddedOpenType 或 OpenType)以及 EmbeddedFontStyle(Regular、Bold、Italic、BoldItalic)的原始嵌入字体字节。GetEmbeddedFontAsOpenType(style) 直接返回转换为 OpenType 格式的字体,无论最初是如何嵌入的。
字体嵌入许可权利
在提取或重新嵌入字体之前,检查 FontInfo.EmbeddingLicensingRights,它是一个 FontEmbeddingLicensingRights 对象。EmbeddingUsagePermissions 通过 FontEmbeddingUsagePermissions 枚举(Installable、RestrictedLicense、PrintAndPreview、Editable)报告许可级别,而 NoSubsetting 和 BitmapEmbeddingOnly 则标记字体供应商设置的进一步限制。
保存时控制字体嵌入
FontInfoCollection 还携带文档级别的嵌入开关:将 EmbedTrueTypeFonts 设置为 true,以在保存文档时嵌入文档中使用的每个 TrueType 字体;将 EmbedSystemFonts 设置为包含通常假定在任何系统上存在的字体;将 SaveSubsetFonts 设置为仅嵌入实际使用的字形,而不是完整字体。
FontSettings 在本版本中的范围
Document.FontSettings 和 LoadOptions.FontSettings 都返回一个 FontSettings 对象,FontSettings.DefaultInstance 提供一个共享的默认实例。在此 FOSS 版本中,FontSettings 的 API 界面仅限于该默认实例属性——基于文件夹和系统字体源的解析,在 Aspose.Words 的其他地方用于替换或解析页面布局和渲染的字体,在本版本中不存在,因为页面布局和渲染超出了本版本的范围。此处的字体处理指的是元数据检查和嵌入,而不是用于渲染的字体替换。
提示与最佳实践
- 在提取或重新分发嵌入的字体之前,请始终检查
FontInfo.EmbeddingLicensingRights.EmbeddingUsagePermissions——某些字体仅授权为RestrictedLicense或PrintAndPreview。 - 当您需要一致的输出格式,而不管源文档如何嵌入字体(
EmbeddedOpenType与OpenType)时,请使用GetEmbeddedFontAsOpenType()。 - 将
FontInfoCollection.SaveSubsetFonts设置为true,以在嵌入仅使用少量字形的字体时减小输出文件大小。 - 当您仅需检测字体是否存在时,
FontInfoCollection.Contains(name)的成本低于索引并处理查找失败(例如fontInfos[name])。
常见问题
| 问题 | 原因 | 修复 |
|---|---|---|
GetEmbeddedFont() 返回无可用数据 | 引用的字体实际上并未嵌入到文档中 | 在假设存在字体数据之前,请检查文档的嵌入设置 |
按名称索引 FontInfoCollection 未找到任何内容 | 字体名称不完全匹配,包括大小写 | 使用 FontInfoCollection 与 GetEnumerator() 进行枚举,以确认精确的 Name 字符串 |
| 缺少预期的字体替换/解析 API | 此 FOSS 版本未实现基于文件夹和系统的字体来源解析 | 仅使用 FontInfo/FontInfoCollection 进行元数据和嵌入;渲染时的字体替换不在本版本的范围内 |
FAQ
我如何列出文档引用的所有字体?
通过 GetEnumerator() 枚举 Document.FontInfos(一个 FontInfoCollection),或通过名称索引以查找特定的(例如 fontInfos["Arial"])。
我可以从文档中提取嵌入字体的原始字节吗?
是的,如果字体已嵌入 — 调用 FontInfo.GetEmbeddedFont(format, style) 获取原始嵌入格式,或调用 GetEmbeddedFontAsOpenType(style) 将结果标准化为 OpenType。
我如何确保在保存文档时嵌入字体?
在保存之前将 FontInfoCollection.EmbedTrueTypeFonts 设置为 true;如果还需要假设任何系统上都有的字体,请添加 EmbedSystemFonts,并使用 SaveSubsetFonts 仅嵌入正在使用的字形。
此版本是否支持从自定义文件夹解析字体用于渲染?
不 — 基于文件夹和系统的字体来源解析(FontSettings 源配置)在此未实现,因为它用于页面布局和渲染,而这些超出此 FOSS 版本的范围。
FontEmbeddingLicensingRights.NoSubsetting 是什么意思?
这是字体供应商嵌入权限报告的许可标志:当 true 时,字体不能仅子集化为正在使用的字形。
API Reference 摘要
| 类 / 方法 | 描述 |
|---|---|
FontInfoCollection | 文档中引用的字体;按名称索引 (fontInfos[name]), Contains(), Count, GetEnumerator(),以及 EmbedTrueTypeFonts/EmbedSystemFonts/SaveSubsetFonts |
FontInfo | 一种字体的元数据:Name,AltName,Family,Pitch,IsTrueType,Charset,Panose,EmbeddingLicensingRights |
FontInfo.GetEmbeddedFont() / GetEmbeddedFontAsOpenType() | 提取嵌入的字体字节 |
EmbeddedFontFormat / EmbeddedFontStyle | 枚举用于标识嵌入字体的格式和样式变体 |
FontEmbeddingLicensingRights / FontEmbeddingUsagePermissions | 每种字体报告的嵌入许可限制 |
FontSettings | 最小字体设置入口点(Document.FontSettings, LoadOptions.FontSettings);此版本中不进行字体源解析 |