// Copyright 2025-2026 肖其顿 (XIAO QI DUN) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package ofdgo 首个原生、全平台、纯 Go 语言高性能 OFD 引擎 package ofdgo import ( "archive/zip" "image" "io" "io/fs" ) // Open 打开OFD文件 // 返回的阅读器持有文件,使用完毕后需调用Close // 入参: path 文件路径, options 阅读选项 // 返回: *Reader 阅读器实例, error 错误信息 func Open(path string, options ...ReaderOption) (*Reader, error) { r, err := zip.OpenReader(path) if err != nil { return nil, err } reader := &Reader{ Path: path, Zip: &r.Reader, Closer: r, } if err := reader.open(options); err != nil { reader.Close() return nil, err } return reader, nil } // NewReader 从IO读取器创建OFD阅读器 // 读取器的生命周期由调用方管理,Reader.Close不会关闭它 // 入参: r IO读取器, size 数据大小, options 阅读选项 // 返回: *Reader 阅读器实例, error 错误信息 func NewReader(r io.ReaderAt, size int64, options ...ReaderOption) (*Reader, error) { zr, err := zip.NewReader(r, size) if err != nil { return nil, err } reader := &Reader{ Zip: zr, } if err := reader.open(options); err != nil { return nil, err } return reader, nil } // NewRenderer 创建渲染器 // 入参: reader 阅读器, opts 渲染选项 // 返回: *Renderer 渲染器实例 func NewRenderer(reader *Reader, opts ...RendererOption) *Renderer { r := &Renderer{ Reader: reader, DPI: 300.0, RenderAnnotations: true, DrawParams: reader.drawParamCache, CompositeGraphicUnits: reader.compositeGraphicUnitCache, templatePageCache: make(map[string]*PageContent), imageCache: &renderCache[string, image.Image]{limit: imageCacheLimit}, backends: defaultRenderBackends(), backendStates: make(map[any]any), } r.resetFontCache() for _, opt := range opts { opt(r) } return r } // WithDPI 设置渲染DPI // 入参: dpi DPI值 // 返回: RendererOption 渲染选项 func WithDPI(dpi float64) RendererOption { return func(r *Renderer) { r.DPI = dpi } } // WithAnnotations 设置是否渲染注释外观 // 入参: enable 是否渲染 // 返回: RendererOption 渲染选项 func WithAnnotations(enable bool) RendererOption { return func(r *Renderer) { r.RenderAnnotations = enable } } // WithFontDirs 设置外部字体查找目录 // 入参: dirs 字体目录列表 // 返回: RendererOption 渲染选项 func WithFontDirs(dirs ...string) RendererOption { return func(r *Renderer) { r.fontDirs = append(r.fontDirs, dirs...) } } // WithFontFS 设置外部字体文件系统 // 入参: fs 字体文件系统 // 返回: RendererOption 渲染选项 func WithFontFS(fs ...fs.FS) RendererOption { return func(r *Renderer) { r.fontFS = append(r.fontFS, fs...) } }