国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版实现Office文档在线预览

PageOffice 国产版 :支持信创系统,支持银河麒麟 V10 和统信 UOS,支持 X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、龙芯(LoogArch)芯片架构。

本示例关键代码的编写位置
Vue+Springboot

注意
本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。

在涉及到 Office 文档管理的各种 Web 项目中,时常会遇到用户阅读文档的时候,并不想将网站上的 Office 文档下载到本地,这时候就需要文档在线预览的功能。

目前常用的文档在线预览方案如下:

  • 转换为 HTML 文件。转换后的 HTML 格式可以直接用浏览器查看,但是无法完全保留原 Word 文档的格式和功能。例如,HTML 不支持某些 Word 功能,转换时 Word 可能会自动更改或取消内容,而且另存 HTML 格式还会导致文档的布局、字体样式等发生变化,影响文档的可读性和专业性。

  • 调用第三方提供的在线预览接口。比如调用永中 Office、金山文档、腾讯文档等在线预览服务,集成相对简单,开发工作量小,但是只能在公网环境使用,且对于超过一定大小的文件,预览速度会变得很慢,这意味着大文件的处理能力受限,可能会影响用户体验。在线预览文档需要先上传到第三方官方的服务器进行解析,然后下载到服务器中后实现在线预览,这种模式意味着对第三方服务的依赖,可能会因为第三方服务的问题而影响在线预览的稳定性和速度。但是如果 Web 系统中存储的是涉密文档,包含了技术秘密和经营秘密等商业秘密,甚至包含了国家机密,那么绝对不能使用第三方预览服务。

  • 转换为 PDF 文件(推荐)。通过转换为 PDF 格式,可以确保在大多数浏览器和平台上都能实现良好的兼容性。PDF 是一种广泛支持的文件格式,几乎所有的现代浏览器都内置了对 PDF 的支持,这意味着用户可以在没有额外软件的情况下直接预览文件。PDF 格式的文件具有很好的跨平台性,无论是在 Windows、MacOS 还是 Linux 操作系统上,用户都可以方便地打开和查看 PDF 文件,这一点对于需要在不同操作系统间共享和查看文档的用户来说非常重要。

用 PageOffice 实现的 Office 文档在线预览采用了转换为 PDF 文件的预览方案,可以在公网环境使用,也可以支持物理隔绝的内网环境。

第一步: 使用 PageOffice 在线编辑 Office 文件,可以在每次保存文件的时候同另存一份 PDF 格式的文件,如此一来,PDF 文件和 Office 文件的内容总是完全同步的。实现 PageOffice 在线编辑 Office,保存文件的同时转 pdf 的关键代码如下。

  • 后端代码:
  1. 在后端编写代码调用 webOpen 方法打开文件之前给 SaveFilePage 属性赋值(设置好保存时由哪个地址接口负责接收处理控件上传的文件流);
PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
poCtrl.setSaveFilePage("saveFile"); // 设置保存文件的接口地址
//webOpen 的第一个参数支持能够输出下载文件的 Url 相对地址或者文件在服务器上的磁盘路径两种方式
poCtrl.webOpen("doc/test.docx", OpenModeType.docNormalEdit, "张佚名"); // 打开文件
  1. 在 SaveFilePage 属性指向的地址接口中,创建 FileSaver 对在线打开的 Office 文件和另存的 pdf 文件分别进行保存。
FileSaver fs = new FileSaver(request, response);
if(fs.getFileExtName().equals(".pdf")){
    fs.saveToFile(request.getSession().getServletContext().getRealPath("pdf/") + fs.getFileName());
}else{
    fs.saveToFile(request.getSession().getServletContext().getRealPath("doc/") + fs.getFileName());
}
fs.close();
  • 前端代码
    使用 AddCustomToolButton 添加自定义保存按钮,实现保存文件的同时另存 PDF。
function SaveFile() {
  pageofficectrl.WebSave(); // 保存当前文件
  pageofficectrl.WebSaveAsPDF(); // 另存当前文件为 PDF 格式
}

OnPageOfficeCtrlInit() {
// PageOffice 的初始化事件回调函数
pageofficectrl.AddCustomToolButton("保存", "SaveFile()", 1);
}

第二步: 需要在线预览 Office 文档的环节,只需集成调用 PageOffice 的 PDFCtrl 组件在线打开 PDF 文件即可。如果还想实现只让用户浏览文件内容,不允许用户下载另存文件的功能,可以设置 pdfCtrl 对象的 AllowCopy 属性为 false,禁止文件内容的拷贝操作,这样就能实现用户只能在线查看文件,而获取不到文件的下载地址,也无法另存 PDF 文件到本地,实现文件的安全浏览。

PDFCtrl pdfCtrl = new PDFCtrl(request);
pdfCtrl.setAllowCopy(false);// 禁止拷贝
pdfCtrl.webOpen("D:\\documents\\test.pdf");
// Linux 服务器添加前缀:file://
// pdfCtrl.webOpen("file://"+"/root/documents/test.pdf");

提示
PageOffice 内置了 PDF 阅读器,所以即使客户端电脑未安装 Office 或 WPS 软件也可以在线打开 PDF 文件。

参考链接:Office 文档在线预览方案