OFDKIT-HARMONY 0.2.0 发布:鸿蒙原生 OFD 阅读库,已上架 OHPM

发布时间:2026/7/6 4:33:53

OFDKIT-HARMONY 0.2.0 发布:鸿蒙原生 OFD 阅读库,已上架 OHPM 双指捏合缩放 / 单指拖动 / 双击复位侧滑切页 多页连续滚动 缩略图条跨页全文搜索 命中高亮 上下跳转长按选中文字 → 复制到剪贴板嵌入字体注册 全局兜底字体 API一行安装ohpm install ofdkit-harmony演示快速接入import { OFDParser, OFDPageView, installDefaultExtensions } from ofdkit-harmony; // 应用启动时调用一次 installDefaultExtensions(); // 解析 const parser new OFDParser({ workDir: /path/to/cache }); const doc await parser.parse(/path/to/file.ofd); // 渲染 Component struct Reader { State doc: OFDDocument doc; State pageIndex: number 0; build() { OFDPageView({ page: this.doc.pages[this.pageIndex] }) } }OFDPageView内部自动处理字体注册、图片解码、Canvas 绘制和手势。架构四层UI 组件 → Renderer → Parser → 扩展点。三类扩展点向上开放ObjectParserExt/ObjectRendererExt/DocumentExtension验签 / 转换 / 表单等能力都能用同一套机制接入不必侵入核心库。几个值得说的实现细节1. DeltaX/DeltaY 定位的几个坑OFD 文字对象用DeltaX数组定位每个字符。规范里有一个g N v重复格式如3.5 g 5 4.2 1.8表示[3.5, 4.2×5, 1.8]实际样本里还经常出现DeltaX数组比字符串短要重复最后一个值兜底、负 DeltaX密码区多行布局等情况。早期把「DeltaX 太小就用字符自然宽度兜底」的逻辑加进去结果把负值也覆盖了密码区直接错乱——后来改成负值跳过兜底。2. 字体处理嵌入 ttf 全局兜底 API嵌入字体直接用font.registerFont注册到 ArkUI 字体表Canvas 直接用字体名。但大多数电子发票只声明FontName宋体不嵌入文件——HarmonyOS Sans 是无衬线跟纸质发票的衬线宋体差别明显。所以加了OFDRenderer.setFallbackFontFamily(OFD-Fallback);调用方自己注册字体到系统表避免授权风险然后告诉 Renderer 用这个 family 兜底视觉立刻接近纸质发票。3. ZOrder 与模板页模板页 ZOrder 有 Background / Foreground 两种。电子发票的「红章框」常常是 Foreground 模板必须最后绘制否则会被发票数据盖住。渲染顺序模板 Background → 主页对象 → 模板 Foreground → 注释 → 签章。4. AbbreviatedData 路径的 A 命令OFD 路径 A 命令参数是 SVG 风格的rx ry rotate largeArc sweep x y但 Canvas 没有 SVG 圆弧 API要换算成ellipse(cx, cy, ...)。endpoint-to-center 推导那一段代码挺繁琐仓库里parsePath.ts有完整实现。5. OFD 套 OFD矢量印章的递归解析最有意思的一个细节——电子发票的红章本身就是一个嵌入的 OFD 文件picture.typeOFD。完整结构主 OFD 文档 └── StampAnnot └── SES_Signature └── picture ├── typepng → 光栅印章PixelMap 直绘 └── typeOFD → 矢量印章递归解析渲染递归渲染时字体命名要做命名空间隔离嵌入文档的字体注册加stamp_${stampId}_前缀否则跟主文档同名字体都叫Font_F1会互相覆盖。实际踩过的小坑LongPressGesture 被 PanGesture 抢占长按选字 500ms 触发不了 → 用priorityGesture独立挂 LongPress比子组件 / 兄弟手势先识别。模板页常常不带 PhysicalBox规范说应有实际样本里大多没有 → 模板页 Area 改为可选缺省继承主页。OFD 包路径大小写不一致XML 写Doc_0/实际文件名是doc_0/→ 加resolveCaseInsensitive兜底。部分电子发票对象不带 ID早期当必需字段直接报错 → 改可选用对象顺序号兜底。API 概览OFDParser— 解析入口OFDPageView— 单页渲染组件OFDDocumentScroll— 多页连续滚动视图OFDThumbnailStrip— 缩略图条SearchControllerOFDSearchBar— 跨页全文搜索OFDRenderer.setFallbackFontFamily— 全局兜底字体

相关新闻