Guides
字体管理
ComPDF SDK 支持读取设备中已安装的字体字族及其样式,并可将其应用于注释、表单、水印、页眉页脚、贝茨码等多种功能。 通过字体管理能力,您可以更灵活地设计 PDF 的视觉效果,或使用符合特定规范要求的字体对 PDF 文档进行调整与完善。
获取字体
在设置字体之前,通常需要完成以下步骤:
- 获取系统中可用的所有字体字族(Font Family)。
- 从字族列表中选择目标字族,获取对应的
CPDFFontName对象。 - 从
CPDFFontName中获取该字族支持的样式列表(Font Style)。 - 根据字族名称与样式名称,生成对应的字体
PsName。 - 使用生成的
PsName为注释、表单等功能设置字体。
示例代码:
java
// 获取系统中所有字体字族
List<CPDFFontName> fontList = CPDFFont.getFontName();
// 选择指定字族
CPDFFontName fontName = fontList.get(index);
// 获取该字族支持的样式列表
List<String> fontStyles = fontName.getStyleName();
// 根据字族名称和样式名称生成 PsName
String psName = CPDFTextAttribute.FontNameHelper.obtainFontName(
fontName.getFamilyName(),
fontStyles.get(0)
);
// 示例 1:设置 FreeText 注释字体
CPDFFreetextAnnotation freetextAnnotation = freetextAnnot.onGetAnnotation();
freetextAnnotation.setFreetextDa(
new CPDFTextAttribute(psName, fontSize, fontColor)
);
// 示例 2:设置表单 ListBox 字体
CPDFListboxWidget listBoxWidget = (CPDFListboxWidget) baseAnnotImpl;
listBoxWidget.setFontName(psName);kotlin
// 获取系统中所有字体字族
val fontList: List<CPDFFontName> = CPDFFont.getFontName()
// 选择指定字族
val fontName: CPDFFontName = fontList[index]
// 获取该字族支持的样式列表
val fontStyles: List<String> = fontName.styleName
// 根据字族名称和样式名称生成 PsName
val psName: String = CPDFTextAttribute.FontNameHelper.obtainFontName(
fontName.familyName,
fontStyles[0]
)
// 示例 1:设置 FreeText 注释字体
val freetextAnnotation = freetextAnnot.onGetAnnotation()
freetextAnnotation.setFreetextDa(
CPDFTextAttribute(psName, fontSize, fontColor)
)
// 示例 2:设置表单 ListBox 字体
val listBoxWidget = baseAnnotImpl as CPDFListboxWidget
listBoxWidget.setFontName(psName)字族说明
Font Family(字族)
字族是字体的系列名称,用于表示一组具有统一设计风格的字体集合。
例如,Helvetica 是一个字体字族,该字族下包含多种样式,如:
- Helvetica Regular
- Helvetica Bold
- Helvetica Italic
这些字体在视觉风格上保持一致,但在字重或倾斜程度上有所区别。
Font Style(样式)
字体样式用于区分同一字族中的具体变体,例如常规体、粗体、斜体等。
以 Helvetica 字族为例,Regular、Bold、Italic 均属于该字族下的不同样式。
导入字体
默认情况下,SDK 使用设备系统中已安装的字体。由于不同地区、不同设备的系统字体集可能存在差异,您可以通过字体导入接口扩展可用字体。
操作步骤:
- 将所需的字体文件(如
.ttf、.otf)复制到指定目录。 - 使用
CPDFSdk.setImportFontDir()设置字体目录。 - 在 SDK 初始化之前完成字体目录配置。
java
// 将 assets 中的字体复制到应用存储目录
String fontDir = new File(getFilesDir(), "extraFonts/").getAbsolutePath();
CFileUtils.copyAssetsDirToPhone(
this,
"extraFonts",
getFilesDir().getAbsolutePath()
);
// 是否同时加载系统字体
boolean addSysFont = true;
// 设置字体导入目录
CPDFSdk.setImportFontDir(fontDir, addSysFont);
// 初始化 SDK
CPDFSdk.init(this, "your license key", true);kotlin
// 将 assets 中的字体复制到应用存储目录
val fontDir = File(filesDir, "extraFonts/").absolutePath
CFileUtils.copyAssetsDirToPhone(
this,
"extraFonts",
filesDir.absolutePath
)
// 是否同时加载系统字体
val addSysFont = true
// 设置字体导入目录
CPDFSdk.setImportFontDir(fontDir, addSysFont)
// 初始化 SDK
CPDFSdk.init(this, "your license key", true)注意 字体导入目录必须在 SDK 初始化之前设置。 请移除
AndroidManifest.xml中的 SDK 自动初始化配置,并改为通过代码方式初始化 SDK。
更新导入的字体
在 SDK 初始化完成后,您仍可通过 CPDFDocument.setImportFontDir() 动态更新当前使用的字体目录。
java
String fontDir = new File(getFilesDir(), "extraFonts2/").getAbsolutePath();
CFileUtils.copyAssetsDirToPhone(
this,
"extraFonts2",
getFilesDir().getAbsolutePath()
);
boolean addSysFont = true;
// 更新字体目录
CPDFDocument.setImportFontDir(fontDir, addSysFont);kotlin
val fontDir = File(filesDir, "extraFonts2/").absolutePath
CFileUtils.copyAssetsDirToPhone(
this,
"extraFonts2",
filesDir.absolutePath
)
val addSysFont = true
// 更新字体目录
CPDFDocument.setImportFontDir(fontDir, addSysFont)注意 重新指定字体目录后,之前已设置的字体目录将被清除,仅保留当前指定目录中的字体。
更新完成后,可通过 CPDFFont.getFontName() 获取最新可用的字体列表。