阅行客电子档案
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

114 lines
2.8 KiB

import { defaultOptions, renderAsync } from 'docx-preview'
import renderPptx from '@/vendors/pptx'
import renderSheet from '@/vendors/xlsx'
import renderOfdView from '@/vendors/ofd'
import renderPdf from '@/vendors/pdf'
import renderImage from '@/vendors/image'
import renderText from '@/vendors/text'
import renderMp4 from '@/vendors/mp4'
// 假装构造一个vue的包装,让上层统一处理销毁和替换节点
const VueWrapper = (el) => ({
$el: el,
$destroy() {
// 什么也不需要 nothing to do
}
})
const handlers = [
// 使用docxjs支持,目前效果最好的渲染器
{
accepts: ['docx'],
handler: async(buffer, target) => {
console.log(defaultOptions)
const docxOptions = Object.assign(defaultOptions, {
debug: true,
experimental: true
})
console.log(target)
await renderAsync(buffer, target, null, docxOptions)
return VueWrapper(target)
}
},
// 使用pptx2html,已通过默认值更替
{
accepts: ['pptx'],
handler: async(buffer, target) => {
await renderPptx(buffer, target, null)
window.dispatchEvent(new Event('resize'))
return VueWrapper(target)
}
},
// 使用sheetjs + handsontable,无样式
{
accepts: ['xlsx'],
handler: async(buffer, target) => {
return renderSheet(buffer, target)
}
},
// 使用pdfjs,渲染pdf,效果最好
{
accepts: ['pdf'],
handler: async(buffer, target) => {
return renderPdf(buffer, target)
}
},
// ofd
{
accepts: ['ofd'],
handler: async(buffer, target) => {
return renderOfdView(buffer, target)
}
},
// 图片过滤器
{
accepts: ['gif', 'jpg', 'jpeg', 'bmp', 'tiff', 'tif', 'png', 'svg'],
handler: async(buffer, target) => {
return renderImage(buffer, target)
}
},
// 纯文本预览
{
accepts: [
'txt',
'json',
'js',
'css',
'java',
'py',
'html',
'jsx',
'ts',
'tsx',
'xml',
'md',
'log'
],
handler: async(buffer, target) => {
return renderText(buffer, target)
}
},
// 视频预览,仅支持MP4
{
accepts: ['mp4'],
handler: async(buffer, target) => {
renderMp4(buffer, target)
return VueWrapper(target)
}
},
// 错误处理
{
accepts: ['error'],
handler: async(buffer, target, type) => {
target.innerHTML = `<div style="text-align: center; margin-top: 80px">不支持.${type}格式的在线预览,请下载后预览或转换为支持的格式</div>
<div style="text-align: center">支持docx, xlsx, pptx, pdf, ofd 以及纯文本格式和各种图片格式的在线预览</div>`
return VueWrapper(target)
}
}
]
// 匹配
export default handlers.reduce((result, { accepts, handler }) => {
accepts.forEach((type) => (result[type] = handler))
return result
}, {})