一、 OFD是什么
OFD(Open Fixed-layout Document,意为开放式版式文档),是中国电子技术标准化研究院制定的版式文档国家标准。是中国的自主格式,也是国家正在推行的电子办公文档标准,对标美制版式PDF。OFD具有格式独立、版面固定、固化呈现等特质,同时相对于PDF版式文件,OFD具有更安全可靠,因为文件读取需要通过版式转换。 目前OFD主要是国家机关或者国企央企在使用,特别是航班电子发票。OFD文件不能直接打开,需要专门的OFD阅读器。
二、OFD文件的预览
-
考虑原生的、标签,看标签介绍原本以为可以支持,只是兼容性差,实测发现不支持。
-
ofd.js实现ofd文件的预览
按照文档安装
- 使用cafe-ofd插件预览
- 使用iframe, 把文件放在外部URL上
-
使用ofd-viewer.js预览
按照文档安装插件会报错(npm库没有这个插件),可以查找压缩包(压缩包20多M,挺大的),解压放到CDN上 使用
zip包下载地址:gitcode.com/open-source…
-
使用lm-ofdpreview插件预览
这是一个ts插件,如果项目是vue2的,需要修改一下配置
使用时如下
npm install ofd.js
import {parseOfdDocument, renderOfd} from "ofd.js";
用法查看文档,实际使用时从import那步开始会报错,用ai搜或者掘金等搜解决方案,都是互相抄袭,对于解决问题没有用处(也可能是我哪里使用的不对)。
npm install cafe-ofd --save
import cafeOfd from 'cafe-ofd';
import 'cafe-ofd/package/index.css';
Vue.use(cafeOfd)
<cafe-ofd ref="ofd" :filePath="filePath" @on-success="handleOfdSuccess" @on-error="handleOfdError" />
在开发环境使用预览正常,兼容性强;在测试环境容易出现读取文件时卡进度条的情况,问题尚未排查,后期有空时补上。 ps:新增火车票电子发票ofd格式读不出来
<iframe :src="`https://ofd.xdocin.com/view?src=${encodeURIComponent(filePath)}`" width="100%"
height="500px" frameborder="0" style="border: 1px solid #eee; border-radius: 10px;"></iframe>
这个方案预览正常,兼容性也很强,但是因为是放在第三方的URL上,安全性未知。
<iframe :src="`${CDNUrl}?file=${filePath}`" width="100%"
height="500px" frameborder="0" style="border: 1px solid #eee; border-radius: 10px;"></iframe>
预览正常,兼容性也还可以。
npm install lm-ofdpreview --save
<div id="container"></div>
import { parseOfdDocument, renderOfd, setPageScale } from 'lm-ofdpreview'
parseOfdDocument({
ofd: this.filePath,
success(res) {
const ofdDoc = Array.isArray(res) ? res[0] : res
const width = document.getElementById('container')?.clientWidth
const pages = renderOfd(width, ofdDoc)
const root = document.getElementById('container')
root.innerHTML = ''
pages.forEach(p => root.appendChild(p))
console.log(res);
},
fail(err) { console.error(err) },
})
文档中提供了两种使用方式,另一种通过import jsPreviewOfd from 'lm-ofdpreview' 的方式使用时会报插件内部的错误。
这种方式能预览,兼容性尚可,会偶发性出现的ofd文件除公章外的内容是黑白的情况。 ps:新增火车票电子发票ofd格式读不出来
以上几种预览方案是使用的vue2项目测试的,都验证过。