字体与扩展服务

字体与扩展服务的接口、使用示例与行为说明。

本页内容

本页按主题整理项目公开说明,供完成快速接入后查阅。代码片段中的业务回调、服务地址和存储实现需要由宿主提供。

字体加载与文字塑形

排版线程、页面渲染场景、交互映射、画布绘制和输入桥共享文字塑形结果。注册的字体数据、字体族、样式、字重和版本参与 HarfBuzz 塑形;页面画布使用已定位的字形、行和交互几何,不在绘制阶段重新测量文字。字体未就绪时返回临时结果,不会将备用字体的几何结果标记为已稳定。

ts
import {
  officeWordFontRegistry,
  shapeOfficeWordText,
  getOfficeWordTextShapingDebugState,
} from '@norio-office/office-word'

await officeWordFontRegistry.loadFamilyList('Arial, sans-serif', 'WWW iii AV To fi')
const shaped = shapeOfficeWordText('WWW iii AV To fi', {
  fontFamily: 'Arial, sans-serif',
  fontSize: 16,
})

if (shaped.settled) {
  console.log(shaped.width, shaped.clusterBoundaries, shaped.charX)
}
console.log(getOfficeWordTextShapingDebugState())

可通过 officeWordFontRegistry.register() 注册网络字体的地址、版本和备用字体;需要接入 HarfBuzz WASM 等引擎时,可用 configureOfficeWordTextShaping() 注入符合塑形接口的实现。

宿主扩展服务

拼写检查服务

spellingProvider.check(request) 是必需方法,返回 Promise<OfficeWordSpellingCheckResult>。

请求包含 text、可选 language、contextBefore、contextAfter 和 signal: AbortSignal。结果包含 misspelled: boolean、suggestions: readonly string[],以及可选 language、languages: readonly { id: string; label: string }[]。

其余方法可选,均接收同一检查请求并返回 Promise<void>:

方法 用途
ignore(request) 忽略本次词语。
ignoreAll(request) 忽略该词的全部匹配。
addToDictionary(request) 加入宿主词典。
setLanguage(request) 设置检查语言;该请求中的 language 为必填字符串。

组件使用宿主服务返回的判断和建议,词典、请求地址和存储由宿主实现。

在线图片服务

onlineImageProvider.pickImage(request) 是必需方法,返回 Promise<OfficeWordImagePayload | null>;null 表示没有选择图片。

请求包含 currentSrc: string、currentAlt?: string、signal: AbortSignal。返回图片至少提供 src,其余尺寸、名称、替代文本和排版字段按 OfficeWordImagePayload 填写。

常用返回字段为 src: string、alt?: string、title?: string、width?: string、height?: string、align?: 'left' | 'center' | 'right'。例如尺寸传 '220px'、'120px';宽、高在这个图片接口中是字符串,与页面设置中的数字参数不同。

协同与监测

普通接入可省略协同和监测参数。协同提供者由 createSvgNativeCollaborationProvider() 创建,其传输层类型为 SvgNativeCollaborationTransport;组件使用提供者执行连接和文档同步。业务服务负责身份、房间权限和持久化。

提供者工厂的必填参数为 transport、roomId: string、clientId: string、actorId: string 和 document: OfficeWordDocument;可选参数为 displayName: string、color: string、now: () => string 和 createTelemetryTrace: (operationId: string) => OfficeWordTelemetryTrace。

包入口还提供 createSvgNativeCollaborationServer()、createInMemorySvgNativeCollaborationStorage()、createInMemorySvgNativeCollaborationTransport(),用于搭建本地协同环境;内存存储不提供跨进程持久化。

监测对象可通过 createOfficeWordBrowserTelemetryRuntime()、createOfficeWordBufferedTelemetryTraceFactory()、createOfficeWordInputToPaintRuntime() 等工厂构造。它们属于可选扩展,不是基础加载或导出所必需的参数。

其他公开组件

以下组件也可从包入口单独导入,均不提供公开的 ref 方法。

OfficeWordLoadingOverlay

用于宿主页面显示文档加载状态,无事件。

参数 类型 默认值 / 行为
phase 'reading'、'importing'、'preparing' 'preparing',表示当前加载阶段。
progress number 不传时按阶段取 28、68、92;显示值限制在 0~100。
indeterminate boolean false,是否显示不确定进度。
title string '正在加载文档'。
description string '正在解析内容并准备编辑环境,请稍候…'。

OfficeWordColorPickerPanel

用于独立颜色选择,通过 value 输入颜色,通过 change 返回选择结果。

参数 类型 默认值 / 行为
value string 或 null null,当前颜色。
fallbackColor string '#2D7FF9',无有效颜色时的备用颜色。
themePalette ReadonlyArray<ReadonlyArray<string>> 内置主题色板。
standardPalette ReadonlyArray<string> 内置标准色板。
recentColors ReadonlyArray<string> [],宿主提供的最近颜色。
recentKey string 'default',最近颜色记录的分组标识。
recentSlots number 10,最近颜色显示数量。
defaultLabel string '默认'。
standardTitle string '标准色'。
recentTitle string '最近使用'。
moreLabel string '更多颜色'。
labelPrefix string '颜色',用于标签文字。
panelWidth number 251,主面板宽度,单位像素。
customPanelWidth number 286,自定义颜色面板宽度,单位像素。
customPanelSide 'right'、'left'、'bottom' 'right',自定义颜色面板展开方向。

change(payload) 返回 OfficeWordColorPickerChangePayload:color: string | null 和 source: 'default' | 'palette' | 'recent' | 'custom'。该组件不提供 v-model 更新事件,宿主在 change 回调中更新自己的颜色值。

OfficeWordContextMenu

独立右键菜单展示组件,宿主传入 OfficeWordContextMenuModel,并处理菜单命令;不是给 OfficeWord 自动增加菜单项的配置参数。

参数 类型 默认值 / 行为
model OfficeWordContextMenuModel 或 null 必填;为 null 时没有可展示的菜单模型。
open boolean true,控制菜单显示。
viewportPadding number 8,距视口边缘的预留像素。
portalTarget string、HTMLElement 或 null null,可指定挂载目标。
事件 回调参数
command { commandId: string; item: OfficeWordContextMenuCommandItem; model: OfficeWordContextMenuModel }。
close 原因字符串:'command'、'escape'、'outside'、'scroll'、'resize'、'blur'。
ready { durationMs: number; family: OfficeWordContextMenuModel['family'] },用于菜单呈现记录。

资源按需加载和字体缓存

普通编辑不加载公式面板、KaTeX、DOCX 序列化或 PDF/SVG/PNG 固定版式导出实现;第一次使用时加载。已有同步底层渲染工具保持原契约,直接使用这些工具的调用方仍需承担对应资源。推荐普通组件宿主使用 ./browser 入口,并保留 ./style.css。

公式面板加载期间显示状态,网络失败可在原文档内重试;导出继续使用原有 Promise API、进度和错误处理,失败后可再次调用。更新版本时应保留仍被打开页面引用的旧哈希资源,避免把部署缺失误当成暂时断网。

字体下载经 SHA-256 验证后供浏览器字体和权威塑形复用,不再为 FontFace 另发 URL 请求。浏览器允许时,将校验后的字节保存到当前来源的 Cache Storage office-word-verified-fonts-v1,后续启动重新校验并复用;缓存损坏则重新下载,存储不可用不影响正常下载。更换字体内容需要对应版本与哈希,不能仅覆盖同名文件。禁用或清理站点存储后,下次仍需完整下载。

正式 publish:prepare 会审计构建 JS 和公开声明的外部依赖,已内嵌的实现不再要求宿主重复安装。公开类型仍使用的 jszip、harfbuzzjs 保留;Vue 是 peer,Vite 仅用于可选的资源插件。源码开发依赖与正式发布依赖分别维护。

包级扩展导出与类型

组件 ref 方法与包级工具函数是两个入口:前者操作当前挂载的编辑器,后者处理调用方传入的文档或数据,不会自动同步到组件。

包级入口 用途与返回结果
createDefaultOfficeWordDocument(title?: string) 创建完整默认文档,返回 OfficeWordDocument;默认标题为 '未命名文档'。
loadOfficeWordDocument(input, fallbackTitle?) 加载、迁移并规范化文档输入,返回 OfficeWordDocument。
migrateOfficeWordDocument(input) 迁移文档数据,返回 OfficeWordCanonicalDocumentInput。
validateOfficeWordDocument(input) 校验文档结构,返回 { valid: boolean; issues: OfficeWordDocumentValidationIssue[] }。
normalizeOfficeWordDocument(document, fallbackTitle?) 规范化文档,返回 OfficeWordDocument;数据迁移可使用前两项入口。
officeWordReleaseCapabilities、getOfficeWordReleaseCapabilitySummary() 查询编辑能力范围和统计。
DEFAULT_DOCX_IMPORT_LIMITS、resolveDocxImportLimits(overrides?) 查询默认导入限制或合并、校验自定义限制。
OfficeWordFeatureAccessError、OfficeWordExportTypeError、DocxImportError 识别功能授权、导出类型和导入错误。
officeWordFontRegistry、shapeOfficeWordText()、getOfficeWordTextShapingDebugState() 字体加载、文字塑形和相关诊断,见上文示例。
协同与监测工厂 构造可传入组件的扩展服务,见“协同与监测”。

包入口还导出了文档命令、排版、渲染、协同协议、插件和测试监测等底层工具。它们的完整签名随包的 TypeScript 声明提供,普通组件接入不需要使用这些底层工具,也不应将它们当作组件 ref 方法。

常用类型可直接从 @norio-office/office-word 导入,包括 OfficeWordMode、OfficeWordFileNameChangePayload、OfficeWordProps、OfficeWordPublicApi、OfficeWordDocumentInput、OfficeWordDocument、OfficeWordImportState、OfficeWordPageSettingsUpdate、OfficeWordBlobExportResult、WordFeatureCode 和各扩展服务类型。主组件完整参数类型也可通过 InstanceType<typeof OfficeWord>['$props'] 取得。

内容依据组件公开文档 · 2026-10-25常见问题
输入关键词开始搜索