前端在实现文件预览的过程中,docx、doc 文件格式的文件预览是一大难题。现有的前端预览效果都比较差,下面将从不同的方案进行调研吗,各有优缺点,可以根据自己的需求去选择,希望了帮助到大家。
方案一:纯前端预览
目前前端预览的组件并不多,比较完善的就是 docx-preview mammoth.js
缺点:
-
大文件性能问题、渲染卡顿(致命)
-
大部分非微软 office docx 无法分页(致命)
-
定制化难,没法手动控制分页
-
复杂的文件渲染有问题
实现 demo
docx-preview demo
import * as docx from "docx-preview";
import docTest from "@/assets/ship1.docx?url";
import { useEffect, useRef } from "react";
interface TestProps {}
const Test: React.FC<TestProps> = () => {
const ref = useRef<any>();
async function setData() {
const res = await fetch(docTest, {
method: "GET",
});
docx.renderAsync(res.blob(), ref.current, undefined, {
breakPages: true,
});
}
useEffect(() => {
setData();
}, []);
return (
<div className="w-[100vw] h-[100vh] overflow-auto">
<div ref={ref}></div>
</div>
);
};
mammoth.js demo
import mammoth from "mammoth";
import docTest from "@/assets/ship1.docx?url";
import { useEffect, useState } from "react";
interface TestProps {}
const Test: React.FC<TestProps> = () => {
const [content, setContent] = useState("");
async function setData() {
const res = await fetch(docTest, {
method: "GET",
});
mammoth.convertToHtml({ arrayBuffer: res.blob() }).then((res) => {
console.log(res, "res");
setContent(res.value);
});
}
useEffect(() => {
setData();
}, []);
return (
<div className="w-[100vw] h-[100vh] overflow-auto">
<div dangerouslySetInnerHTML={{ __html: content }}></div>
</div>
);
};
export default Test;
解决性能问题:
如果不在乎文档渲染的样式,可以使用 mammoth.js 将 docx 渲染成文本,放在一个 DOM 节点里,就能解决性能问题。
mammoth.extractRawText({path: "path/to/document.docx"})
.then(function(result){
var text = result.value; // The raw text
var messages = result.messages;
})
.catch(function(error) {
console.error(error);
});
方案二:部署在线服务
部署一个后端预览服务,然后通过 iframe 嵌入到网页中进行预览。
office Online Server
这个方案目前前端预览文件的最优解,支持 pdf、doc、excel、等等。参考桌面版 office,然后通过链接+iframe嵌入页面实现预览。
优点:
- 可以与现有的本地 Office 环境集成,提供无缝的 Office 功能扩展。
- 提供广泛的 Office 功能,包括文档编辑、协作、共享和批注等功能。
- 可在本地服务器上进行部署和管理,提供了更高的数据隐私和安全性。
- 更接近传统桌面版 Office 的使用体验,用户熟悉 Office 功能。
缺点:
-
线上版可能涉及隐私问题,业务侧需要离。
-
离线部署比较复杂,需要两台
Windows Server服务器。 -
部署、维护成本较高。(重点)
onlyoffice
优点:
- 提供全面的在线办公套件,包括文档、电子表格和幻灯片编辑等。
- 具有直观的用户界面和易于使用的协作功能,适合团队协作和远程工作。
- 可以在各种平台上使用,包括桌面、Web 和移动设备。
- 提供丰富的扩展和集成选项,可以与其他应用程序和平台无缝集成。
缺点:
- 不如 OOSS 那么接近传统桌面版 Office 的使用体验。
- 可能需要更多的网络资源和带宽来支持在线编辑和协作。
- 需要依赖 OnlyOffice 提供的云服务或自行部署 OnlyOffice 的服务器。
方案三:docx 转 pdf(待验证)
目前前端预览 pdf 的工具比较完善,解决方案方案也比较全,如果能将 docx 转成 pdf 就好处理了。
问题:
-
前端浏览器docx2pdf 没有比较好的工具。
-
后端处理同样依赖 Windows 服务器,也不好处理。
pdf 预览还不错的库推荐:
- react-pdf (适合分页预览,可自定程度高)
- react-pdf-viewer (适合做无限滚动预览,默认支持虚拟滚动)
- pdf.js:
总结
-
如果只是 docx 小文件预览,且对文件内容的渲染效果要求不高!可以采用第一种方案。这个方案最简单。
-
如果要想达到做好的效果,还能支持多种 office 文件格式预览,无疑
office Online Server方案最佳,不过目前部署成本较高。如果产品定位并不是一定要做文件预览,可以使用其他方案代替。 -
如果不想部署
office Online Server,onlyoffice无疑是不二之选,相比于原生的 office 体验差一些,不过好做功能完善,支持在线协同编辑。 -
第三种方案待考察实际可行性,docx 2 pdf 需要时间,pdf 下载也需要时间,实际预览体验效果还有待验证。