kn-file-viewer
Version:
A file preview component for Vue.js
105 lines (101 loc) • 2.72 kB
JavaScript
import { defaultOptions, renderAsync } from "docx-preview";
import renderPptx from "@/vendors/pptx";
import renderSheet from "@/vendors/xlsx";
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) => {
const docxOptions = Object.assign(defaultOptions, {
debug: true,
experimental: true,
});
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);
},
},
// 图片过滤器
{
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, 以及纯文本格式和各种图片格式的在线预览</div>`;
return VueWrapper(target);
},
},
];
// 匹配
export default handlers.reduce((result, { accepts, handler }) => {
accepts.forEach((type) => (result[type] = handler));
return result;
}, {});