# vue-ofd-viewer **Repository Path**: usin_cc/vue-ofd-viewer ## Basic Information - **Project Name**: vue-ofd-viewer - **Description**: vue-ofd-viewer是一个功能完整、高度可定制的 OFD(Open Fixed-layout Document)文档查看器组件,专为 Vue.js 应用程序设计。该组件提供了企业级的文档查看解决方案,支持 Vue 2.6+ 和 Vue 3.x 双版本,具备完整的 TypeScript 类型支持。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-11 - **Last Updated**: 2026-03-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vue-ofd-viewer

🚀 企业级 OFD 文档查看器 - 支持 Vue 2 & Vue 3

概述特性安装快速开始APIFAQ

--- ## 📋 项目概述 **vue-ofd-viewer** 是一个功能完整、高度可定制的 OFD(Open Fixed-layout Document)文档查看器组件,专为 Vue.js 应用程序设计。该组件提供了企业级的文档查看解决方案,支持 Vue 2.6+ 和 Vue 3.x 双版本,具备完整的 TypeScript 类型支持。 ### 🏗️ 技术架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ vue-ofd-viewer │ ├─────────────────────────────────────────────────────────────┤ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ OfdView │ │ Thumbnail │ │ Toolbar │ │ │ │ (主组件) │ │ Panel │ │ (工具栏组件) │ │ │ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │ │ │ │ │ │ │ ┌──────┴────────────────┴────────────────────┴──────────┐ │ │ │ Core Engine │ │ │ │ ┌────────────┐ ┌────────────┐ ┌────────────────┐ │ │ │ │ │ OFD Parser │ │ Renderer │ │ Signature │ │ │ │ │ │ (解析器) │ │ (渲染器) │ │ Verifier │ │ │ │ │ └────────────┘ └────────────┘ └────────────────┘ │ │ │ └───────────────────────────────────────────────────────┘ │ │ ┌───────────────────────────────────────────────────────┐ │ │ │ Composables │ │ │ │ ┌────────────┐ ┌────────────┐ ┌────────────────┐ │ │ │ │ │ useConfig │ │ vue-demi │ │ Mosaic │ │ │ │ │ │ (配置管理) │ │ (兼容层) │ │ (马赛克工具) │ │ │ │ │ └────────────┘ └────────────┘ └────────────────┘ │ │ │ └───────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` ### 🔧 技术栈 | 类别 | 技术 | |------|------| | **框架** | Vue 2.6+ / Vue 3.x (via vue-demi) | | **语言** | TypeScript 5.5+ | | **构建** | Vite 5.x | | **OFD解析** | ofd-xml-parser | | **加密算法** | sm-crypto (国密算法) | | **签名验证** | jsrsasign | --- ## ✨ 特性 ### 核心功能 - 📄 **OFD 文档渲染** - 高保真渲染 OFD 文档,支持复杂排版 - 🔍 **缩放控制** - 多级缩放,支持自适应、实际大小、百分比等多种模式 - 📐 **缩略图面板** - 快速导航,支持打印页面选择 - 🖨️ **打印支持** - 支持全部打印、选择页面打印 - 📥 **下载功能** - 一键下载 OFD 文档 - 🔐 **签章验证** - 查看数字签章信息,验证文档完整性 - 🔲 **马赛克工具** - 敏感信息遮罩处理 ### 开发体验 - 🎨 **高度可定制** - 工具栏按钮、样式、布局全面可配置 - 📦 **开箱即用** - 零配置即可使用,所有功能默认启用 - 🔒 **类型安全** - 完整的 TypeScript 类型定义 - 🌐 **双版本支持** - 同时支持 Vue 2 和 Vue 3 - 📱 **响应式设计** - 适配各种屏幕尺寸 --- ## 📦 安装 ### 环境要求 | 依赖 | 版本要求 | |------|---------| | Node.js | >= 16.0.0 | | Vue | ^2.6.14 或 ^3.0.0 | ### 安装命令 ```bash # npm npm install vue-ofd-viewer # yarn yarn add vue-ofd-viewer # pnpm pnpm add vue-ofd-viewer ``` ### Vue 2 额外依赖 如果您使用 Vue 2,需要额外安装 Composition API 插件: ```bash npm install @vue/composition-api ``` --- ## 🚀 快速开始 ### Vue 3 项目 #### 1. 全局注册 ```typescript // main.ts import { createApp } from "vue"; import App from "./App.vue"; import VueOfdViewer from "vue-ofd-viewer"; import "vue-ofd-viewer/style.css"; const app = createApp(App); app.use(VueOfdViewer); app.mount("#app"); ``` #### 2. 组件使用 ```vue ``` ### Vue 2 项目 #### 1. 全局注册 ```javascript // main.js import Vue from "vue"; import VueCompositionAPI from "@vue/composition-api"; import VueOfdViewer from "vue-ofd-viewer"; import "vue-ofd-viewer/style.css"; Vue.use(VueCompositionAPI); Vue.use(VueOfdViewer); new Vue({ render: (h) => h(App), }).$mount("#app"); ``` #### 2. 组件使用 ```vue ``` --- ## 📖 API 文档 ### 组件 Props #### OfdView Props | 属性名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `ofdLink` | `string` | - | OFD 文档 URL 地址 | | `showOpenFileButton` | `boolean` | `true` | 是否显示打开文件按钮 | | `config` | `OfdViewerConfig` | - | 查看器配置对象 | | `sealClick` | `(sealInfo: IOfdSignatureInfo) => void` | - | 签章点击回调 | ### 配置类型定义 #### OfdViewerConfig ```typescript interface OfdViewerConfig { toolbar?: ToolbarConfig | false; // 工具栏配置,false 表示隐藏 thumbnailPanel?: ThumbnailPanelConfig | false; // 缩略图面板配置 showOpenFileButton?: boolean; // 是否显示打开文件按钮 showLoading?: boolean; // 是否显示加载动画 loadingText?: string; // 加载提示文字 } ``` #### ToolbarConfig ```typescript interface ToolbarConfig { visible?: boolean; // 是否显示工具栏 buttons?: Partial>; scaleList?: ScaleOption[]; // 自定义缩放选项 defaultScale?: number; // 默认缩放值 } interface ToolbarButtonConfig { key: ToolbarButtonKey; // 按钮唯一标识 visible?: boolean; // 是否显示 title?: string; // 提示文字 order?: number; // 排序权重 } interface ScaleOption { value: number; // 缩放值 label: string; // 显示标签 } ``` #### ThumbnailPanelConfig ```typescript interface ThumbnailPanelConfig { visible?: boolean; // 是否显示 width?: number; // 面板宽度 (px) position?: "left" | "right"; // 显示位置 showPageNumber?: boolean; // 是否显示页码 showPrintSelect?: boolean; // 是否显示打印选择图标 } ``` ### 工具栏按钮键值 | Key | 功能 | 说明 | |-----|------|------| | `openFile` | 打开文件 | 打开本地 OFD 文件 | | `firstPage` | 首页 | 跳转到第一页 | | `prePage` | 上一页 | 向前翻页 | | `pageInput` | 页码输入 | 显示当前页码,支持跳转 | | `nextPage` | 下一页 | 向后翻页 | | `lastPage` | 末页 | 跳转到最后一页 | | `zoomOut` | 缩小 | 缩小文档 | | `zoomSelect` | 缩放选择 | 下拉选择缩放比例 | | `zoomIn` | 放大 | 放大文档 | | `thumbnail` | 缩略图 | 切换缩略图面板 | | `fullScreen` | 全屏 | 切换全屏模式 | | `print` | 打印 | 打印文档 | | `download` | 下载 | 下载 OFD 文件 | | `sealInfo` | 签章信息 | 查看签章详情 | | `mosaic` | 马赛克 | 马赛克绘制工具 | ### 暴露方法 通过 `ref` 可以访问以下方法: ```typescript interface OfdViewerExpose { // 页面导航 firstPage(): void; prePage(): void; nextPage(): void; lastPage(): void; gotoPage(page: number): void; // 缩放控制 zoomIn(): Promise; zoomOut(): Promise; setScale(scale: number): Promise; // 文件操作 openFile(file: File | string): Promise; print(): void; download(): void; // UI 控制 toggleThumbnail(): void; toggleFullScreen(): void; enableMosaic(): void; // 数据获取 readonly pageIndex: number; readonly pageCount: number; readonly loading: boolean; getSeals(): ISeal[]; getPrintList(): Set; clearPrintList(): void; } ``` #### 方法使用示例 ```vue ``` ### 事件 | 事件名 | 参数 | 说明 | |--------|------|------| | `ready` | `OfdViewerExpose` | 文档加载完成 | | `pageChange` | `number` | 页码变化 | | `scaleChange` | `number` | 缩放比例变化 | --- ## 🎨 高级配置 ### 自定义工具栏 ```typescript const config = createOfdViewerConfig({ toolbar: { // 隐藏特定按钮 buttons: { print: false, // 隐藏打印按钮 download: false, // 隐藏下载按钮 mosaic: { // 自定义按钮配置 key: "mosaic", visible: true, title: "敏感信息遮罩", }, }, // 自定义缩放选项 scaleList: [ { value: 0, label: "自适应" }, { value: 5, label: "100%" }, { value: 7.5, label: "150%" }, { value: 10, label: "200%" }, ], // 默认缩放比例 defaultScale: 5, }, }); ``` ### 自定义缩略图面板 ```typescript const config = createOfdViewerConfig({ thumbnailPanel: { visible: true, width: 250, position: "right", showPageNumber: true, showPrintSelect: true, }, }); ``` ### 隐藏工具栏 ```typescript const config = createOfdViewerConfig({ toolbar: false, // 完全隐藏工具栏 }); ``` --- ## 📁 项目结构 ``` vue-ofd-viewer/ ├── src/ │ ├── components/ # Vue 组件 │ │ ├── OfdView.vue # 主组件 │ │ ├── common/ # 通用组件 │ │ │ ├── Dialog.vue │ │ │ ├── ThumbnailPanel.vue │ │ │ └── FullScreenLoading.vue │ │ └── toolbar/ # 工具栏组件 │ │ ├── ToolbarButton.vue │ │ ├── ToolbarPage.vue │ │ └── ToolbarZoom.vue │ ├── composables/ # 组合式函数 │ │ └── useConfig.ts # 配置管理 │ ├── compat/ # Vue 兼容层 │ │ └── index.ts # vue-demi 封装 │ ├── core/ # 核心引擎 │ │ ├── ofd/ # OFD 解析与渲染 │ │ └── jbig2/ # 图像解码 │ ├── types/ # TypeScript 类型 │ │ ├── config.ts # 配置类型 │ │ └── ofd.ts # OFD 类型 │ ├── utils/ # 工具函数 │ │ ├── helpers.ts # 辅助函数 │ │ └── mosaic.ts # 马赛克工具 │ └── index.ts # 入口文件 ├── dist/ # 构建产物 │ ├── vue-ofd-viewer.es.js # ES Module │ ├── vue-ofd-viewer.umd.js # UMD 格式 │ ├── style.css # 样式文件 │ └── index.d.ts # 类型声明 └── package.json ``` --- ## 🔧 开发指南 ### 本地开发 ```bash # 克隆项目 git clone https://gitee.com/usin_cc/vue-ofd-viewer.git # 安装依赖 npm install # 启动开发服务器 npm run dev # 类型检查 npm run type-check # 构建库 npm run build:lib ``` ### 发布流程 ```bash # 1. 更新版本号 npm version patch/minor/major # 2. 构建 npm run build:lib # 3. 发布 npm publish ``` --- ## ❓ 常见问题 ### Q1: Vue 2 项目中组件无法正常工作? **A:** 确保已安装 `@vue/composition-api` 插件并在入口文件中注册: ```javascript import VueCompositionAPI from "@vue/composition-api"; Vue.use(VueCompositionAPI); ``` ### Q2: 如何处理跨域问题? **A:** OFD 文件需要通过 HTTP 服务提供,确保服务器配置了正确的 CORS 头: ``` Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET ``` ### Q3: 打印时页面显示不完整? **A:** 这通常是因为文档未完全加载。请确保在 `ready` 事件触发后再调用打印功能。 ### Q4: 如何自定义按钮样式? **A:** 可以通过 CSS 变量覆盖默认样式: ```css :root { --ofd-toolbar-bg: #f5f5f5; --ofd-toolbar-icon-color: #333; --ofd-toolbar-icon-hover-color: #409eff; } ``` ### Q5: 支持 SSR 吗? **A:** 当前版本不支持服务端渲染 (SSR),请在客户端渲染环境中使用。 --- ## 🤝 贡献指南 我们欢迎所有形式的贡献! ### 贡献流程 1. Fork 本仓库 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 提交 Pull Request ### 代码规范 - 使用 TypeScript 编写代码 - 遵循 ESLint 规则 - 编写单元测试 - 更新相关文档 --- ## 📄 许可证 本项目基于 [MIT](LICENSE) 许可证开源。 --- ## 📞 联系方式 - **作者**: Usin - **邮箱**: usin1120@qq.com - **问题反馈**: [Gitee Issues](https://gitee.com/usin_cc/vue-ofd-viewer/issues) --- ## 🙏 致谢 - [ofd.js](https://github.com/DLTech21/ofd.js) - OFD 解析核心 - [vue-demi](https://github.com/vueuse/vue-demi) - Vue 双版本兼容方案 - 所有贡献者和用户 ---

如果这个项目对您有帮助,请给一个 ⭐️ Star 支持一下!