feat(转换能力): 完善转换渲染,优化字体加载
build.yaml / build (push) Successful in 40s

This commit is contained in:
xiaoqidun committed 2026-09-27 08:03:10 +08:00
1 parent 983a856736
commit 98d9effc8c
18 files changed
+672 -137

No files matched your search

+32 -4
View File
@@ -398,10 +398,10 @@ func convertPDFDocument(args []js.Value) (any, error) {
}
// convertFile 使用库转换独立文件,不读取或修改当前阅读和编辑会话
// 入参: args 随机读取、文件大小、转换选项、写出、进度、文件边界、取消检查及字体
// 入参: args 随机读取、文件大小、转换选项、写出、进度、文件边界、取消检查、字体及按需字体读取
// 返回: any 转换报告, error 转换错误
func convertFile(args []js.Value) (any, error) {
if len(args) != 8 {
if len(args) != 9 {
return nil, fmt.Errorf("missing conversion arguments")
}
settings := args[2]
@@ -422,9 +422,13 @@ func convertFile(args []js.Value) (any, error) {
return awaitExport(args[4], progress.Stage, progress.Completed, progress.Total)
},
}
if len(fonts) > 0 {
options.RendererOptions = append(options.RendererOptions, ofdgo.WithFontFS(ofdgo.NewFontFS(fonts)))
fontSources := []fs.FS{ofdgo.NewFontFS(fonts)}
if names := settings.Get("fontNames"); !names.IsUndefined() && names.Length() > 0 {
fontSources = append(fontSources, ofdgo.NewLazyFontFS(stringsFromJS(names), func(name string) ([]byte, error) {
return loadConversionFont(args[8], name)
}))
}
options.RendererOptions = append(options.RendererOptions, ofdgo.WithFontFS(fontSources...))
if value := settings.Get("credentials"); !value.IsNull() && !value.IsUndefined() {
credentials, err := credentialsFromJS(value)
if err != nil {
@@ -476,6 +480,30 @@ func convertFile(args []js.Value) (any, error) {
return report, nil
}
// loadConversionFont 按需读取浏览器已授权字体,不预读系统字体目录
// 入参: load 浏览器读取函数, name 字体文件名
// 返回: []byte 字体内容, error 读取错误或取消原因
func loadConversionFont(load js.Value, name string) ([]byte, error) {
done := make(chan error, 1)
var data []byte
callback := js.FuncOf(func(this js.Value, args []js.Value) any {
var err error
if args[2].Bool() {
err = context.Canceled
} else if message := args[1].String(); message != "" {
err = fmt.Errorf("%s", message)
} else {
data, err = bytesFromJS(args[0])
}
done <- err
return nil
})
defer callback.Release()
load.Invoke(name, callback)
err := <-done
return data, err
}
// packFiles 将已经成功转换的文件逐个打包,不重复转换或读取整个文件
// 入参: args 文件列表、分块读取、分块写出、进度及取消检查
// 返回: any 输出格式, error 打包错误