Skip to content
ComPDF
Guides

字体管理

ComPDF SDK 支持读取设备中已安装的字体字族及其样式,并可将其应用于注释、表单、水印、页眉页脚、贝茨码等多种功能。 通过字体管理能力,您可以更灵活地设计 PDF 的视觉效果,或使用符合特定规范要求的字体对 PDF 文档进行调整与完善。

获取字体

在设置字体之前,通常需要完成以下步骤:

  1. 获取系统中可用的所有字体字族(Font Family)。
  2. 从字族列表中选择目标字族,获取对应的 CPDFFontName 对象。
  3. CPDFFontName 中获取该字族支持的样式列表(Font Style)。
  4. 根据字族名称与样式名称,生成对应的字体 PsName
  5. 使用生成的 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 字族为例,RegularBoldItalic 均属于该字族下的不同样式。


导入字体

默认情况下,SDK 使用设备系统中已安装的字体。由于不同地区、不同设备的系统字体集可能存在差异,您可以通过字体导入接口扩展可用字体。

操作步骤:

  1. 将所需的字体文件(如 .ttf.otf)复制到指定目录。
  2. 使用 CPDFSdk.setImportFontDir() 设置字体目录。
  3. 在 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() 获取最新可用的字体列表。