mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-30 01:27:26 +08:00
This commit is contained in:
1 parent
87af84e4cd
commit
73472c5d4b
36 files changed
+2052
-609
No files matched your search
+55
-8
@@ -102,6 +102,7 @@ func RunWASM() {
|
||||
registerCallback("ofdgoConfigure", configureDocument)
|
||||
registerCallback("ofdgoDocumentInfo", documentInfo)
|
||||
registerCallback("ofdgoRenderPage", renderPage)
|
||||
registerCallback("ofdgoRenderBackends", renderBackends)
|
||||
registerCallback("ofdgoSVGFontData", svgFontData)
|
||||
registerCallback("ofdgoSearchPage", searchPage)
|
||||
registerCallback("ofdgoPageTextString", pageTextString)
|
||||
@@ -181,6 +182,13 @@ func registerCallback(name string, fn func([]js.Value) (any, error)) {
|
||||
js.Global().Set(name, cb)
|
||||
}
|
||||
|
||||
// renderBackends 返回库提供的内置后端能力
|
||||
// 入参: args 浏览器参数
|
||||
// 返回: any 后端能力, error 错误信息
|
||||
func renderBackends(args []js.Value) (any, error) {
|
||||
return ofdgo.RenderBackendInfos(), nil
|
||||
}
|
||||
|
||||
// registerAsyncCallback 注册异步回调,为浏览器处理数据和取消请求让出事件循环
|
||||
// 入参: name 回调名称, fn 回调函数
|
||||
func registerAsyncCallback(name string, fn func([]js.Value) (any, error)) {
|
||||
@@ -345,7 +353,7 @@ func svgFontData(args []js.Value) (any, error) {
|
||||
}
|
||||
|
||||
// renderPage 渲染OFD页面
|
||||
// 入参: args 浏览器参数
|
||||
// 入参: args 页面索引、后端组合、DPI和光栅显示开关
|
||||
// 返回: any 页面SVG结果, error 错误信息
|
||||
func renderPage(args []js.Value) (any, error) {
|
||||
if currentSession == nil {
|
||||
@@ -354,10 +362,21 @@ func renderPage(args []js.Value) (any, error) {
|
||||
if len(args) == 0 {
|
||||
return nil, fmt.Errorf("missing page index")
|
||||
}
|
||||
page, err := currentSession.RenderPageSVG(args[0].Int())
|
||||
backend, dpi := "canvas", 150.0
|
||||
if len(args) > 1 {
|
||||
backend = args[1].String()
|
||||
}
|
||||
if len(args) > 2 {
|
||||
dpi = args[2].Float()
|
||||
}
|
||||
raster := len(args) > 3 && args[3].Bool()
|
||||
page, err := currentSession.RenderPage(args[0].Int(), backend, dpi, raster)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if currentEditor != nil {
|
||||
currentEditor.SetPageCompiler(currentSession.Renderer.Backends().Compiler)
|
||||
}
|
||||
text, err := currentSession.PageText(args[0].Int())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -472,8 +491,12 @@ func exportPage(args []js.Value) (any, error) {
|
||||
if len(args) < 4 {
|
||||
return nil, fmt.Errorf("missing export page arguments")
|
||||
}
|
||||
writer := bufio.NewWriterSize(exportWriter{write: args[3]}, 1<<20)
|
||||
format, err := currentSession.ExportPage(args[0].Int(), args[1].String(), args[2].Float(), writer)
|
||||
session, writerIndex, err := exportSession(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
writer := bufio.NewWriterSize(exportWriter{write: args[writerIndex]}, 1<<20)
|
||||
format, err := session.ExportPage(args[0].Int(), args[1].String(), args[2].Float(), writer)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -493,9 +516,13 @@ func exportDocument(args []js.Value) (any, error) {
|
||||
if currentSession == nil {
|
||||
return nil, fmt.Errorf("ofd document is not opened")
|
||||
}
|
||||
renderer := currentSession.Renderer
|
||||
session, writerIndex, err := exportSession(args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
renderer := session.Renderer
|
||||
renderer.OnExportProgress = func(completed, total int) error {
|
||||
return awaitExport(args[4], completed, total)
|
||||
return awaitExport(args[writerIndex+1], completed, total)
|
||||
}
|
||||
defer func() { renderer.OnExportProgress = nil }()
|
||||
var indices []int
|
||||
@@ -505,8 +532,8 @@ func exportDocument(args []js.Value) (any, error) {
|
||||
indices[i] = args[2].Index(i).Int()
|
||||
}
|
||||
}
|
||||
writer := bufio.NewWriterSize(exportWriter{write: args[3]}, 1<<20)
|
||||
format, err := currentSession.ExportDocument(args[0].String(), args[1].Float(), writer, indices...)
|
||||
writer := bufio.NewWriterSize(exportWriter{write: args[writerIndex]}, 1<<20)
|
||||
format, err := session.ExportDocument(args[0].String(), args[1].Float(), writer, indices...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -519,6 +546,23 @@ func exportDocument(args []js.Value) (any, error) {
|
||||
}), nil
|
||||
}
|
||||
|
||||
// exportSession 创建独立导出配置,写入回调前可指定光栅后端
|
||||
// 入参: args 浏览器参数
|
||||
// 返回: *Session 导出会话, int 写入回调位置, error 错误信息
|
||||
func exportSession(args []js.Value) (*Session, int, error) {
|
||||
session := *currentSession
|
||||
renderer := *session.Renderer
|
||||
session.Renderer = &renderer
|
||||
writerIndex := 3
|
||||
if args[3].Type() == js.TypeString {
|
||||
if err := session.SetRenderBackend(args[3].String()); err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
writerIndex++
|
||||
}
|
||||
return &session, writerIndex, nil
|
||||
}
|
||||
|
||||
// successResult 创建成功接口结果
|
||||
// 入参: data 返回数据
|
||||
// 返回: js.Value 接口结果
|
||||
@@ -2737,6 +2781,7 @@ func editDocument(args []js.Value) (any, error) {
|
||||
if currentSession.fontFS != nil {
|
||||
editor.SetFontFS(currentSession.fontFS)
|
||||
}
|
||||
editor.SetPageCompiler(currentSession.Renderer.Backends().Compiler)
|
||||
currentEditor = editor
|
||||
currentSession.editing = true
|
||||
copiedObjects = nil
|
||||
@@ -2758,6 +2803,7 @@ func previewEditor(editor *ofdgo.Editor, annotations bool) (editorInfo, error) {
|
||||
}
|
||||
editor.SetFontFS()
|
||||
if currentSession != nil {
|
||||
ofdgo.WithRenderBackends(currentSession.Renderer.Backends())(session.Renderer)
|
||||
if currentSession.fontFS != nil {
|
||||
session.fontFS = currentSession.fontFS
|
||||
session.Renderer.SetFontFS(session.fontFS)
|
||||
@@ -2765,6 +2811,7 @@ func previewEditor(editor *ofdgo.Editor, annotations bool) (editorInfo, error) {
|
||||
}
|
||||
_ = currentSession.Close()
|
||||
}
|
||||
editor.SetPageCompiler(session.Renderer.Backends().Compiler)
|
||||
currentSession = session
|
||||
session.editing = true
|
||||
if currentEditor != editor {
|
||||
|
||||
+30
-4
@@ -479,6 +479,18 @@ func (s *Session) Info() DocumentInfo {
|
||||
// 入参: index 页面索引
|
||||
// 返回: PageSVG 页面SVG结果, error 错误信息
|
||||
func (s *Session) RenderPageSVG(index int) (PageSVG, error) {
|
||||
return s.RenderPage(index, "", 0, false)
|
||||
}
|
||||
|
||||
// RenderPage 按显示后端生成页面,光栅结果复用SVG容器和独立交互信息
|
||||
// 入参: index 页面索引, backend 后端组合,空值沿用会话配置, dpi 光栅分辨率, raster 是否光栅显示
|
||||
// 返回: PageSVG 页面结果, error 错误信息
|
||||
func (s *Session) RenderPage(index int, backend string, dpi float64, raster bool) (PageSVG, error) {
|
||||
if backend != "" {
|
||||
if err := s.SetRenderBackend(backend); err != nil {
|
||||
return PageSVG{}, err
|
||||
}
|
||||
}
|
||||
page, err := s.pageContent(index)
|
||||
if err != nil {
|
||||
return PageSVG{}, err
|
||||
@@ -494,11 +506,10 @@ func (s *Session) RenderPageSVG(index int) (PageSVG, error) {
|
||||
s.textCache[index] = text
|
||||
}
|
||||
}
|
||||
renderSVG := renderer.RenderToSVGWithResources
|
||||
if s.editing {
|
||||
renderSVG = renderer.RenderToSVGWithObjects
|
||||
if raster {
|
||||
renderer.DPI = dpi
|
||||
}
|
||||
resources, err := renderSVG(page, &buf)
|
||||
resources, err := renderer.RenderPreview(page, &buf, ofdgo.PreviewOptions{Raster: raster, Objects: !raster && s.editing})
|
||||
if err != nil {
|
||||
return PageSVG{}, err
|
||||
}
|
||||
@@ -517,6 +528,21 @@ func (s *Session) RenderPageSVG(index int) (PageSVG, error) {
|
||||
return PageSVG{Index: index, Number: index + 1, ID: page.ID, Width: box.W, Height: box.H, SVG: buf.String(), Links: links, Fonts: resources.Fonts, Images: resources.Images, Annotations: annotations}, nil
|
||||
}
|
||||
|
||||
// SetRenderBackend 设置库提供的后端组合,不改变文档数据
|
||||
// 入参: name 后端名称
|
||||
// 返回: error 错误信息
|
||||
func (s *Session) SetRenderBackend(name string) error {
|
||||
backends, err := ofdgo.NewRenderBackends(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if s.Renderer.Backends().Info().Compiler != backends.Info().Compiler {
|
||||
clear(s.textCache)
|
||||
}
|
||||
ofdgo.WithRenderBackends(backends)(s.Renderer)
|
||||
return nil
|
||||
}
|
||||
|
||||
// SVGFontData 获取已渲染页面引用的字体数据
|
||||
// 入参: name 字体资源标识
|
||||
// 返回: []byte 字体数据, error 错误信息
|
||||
|
||||
Reference in new issue
Block a user