国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版在线打开 word文件编辑留痕并显示痕迹列表

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

查看本示例演示效果
本示例关键代码的编写位置
Vue+Springboot

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

强制留痕模式编辑

Word 中的“痕迹”功能可以跟踪文档中所做的更改。痕迹可以包括添加、删除、移动和格式更改等。Word 提供了“痕迹保留”功能,可以保留这些痕迹并在文档中显示出来。痕迹保留对于多人协作编辑同一份文档时非常有用,可以清楚地了解每个人对文档所做的修改。同时,痕迹保留也可以用于审阅和修改文档,帮助用户更轻松地进行修改和校对工作。用户可以通过“审阅”选项卡中的“修订”按钮来开启和关闭痕迹保留功能。

既然 Word 中的痕迹保留功能已经可以满足多人协作编辑同一份文档的需求,那为什么还需要强制留痕功能呢?原因主要有以下两点:

  • 很多普通用户不清楚留痕功能如何使用,不知道点击“审阅”选项卡中的“修订”按钮就可以开启留痕功能;
  • 部分的用户知道留痕功能,但是不愿意使用,故意关闭“审阅”选项卡中的“修订”状态;
  • 用户可以随意修改和处理其他人的痕迹,不受系统控制;

PageOffice 通过封装 Office 的 API,实现了强制留痕模式,PageOfficeCtrl 对象 webOpen 方法的第二个参数使用docRevisionOnly就是强制留痕模式,在这种模式下,用户对文档做的任何修订都会被记录下来,无需用户手动开启留痕功能,并且用户也不能关闭留痕功能。不同用户对文档做的修订会自动使用不同的颜色标记。用户不能接受、拒绝或删除其他用户对此文档所做的任何修订。修订记录能够显示修订者的名字,修订时间及修订内容。痕迹所显示的用户名就是 webOpen 方法第三个参数所传递的用户名,一般使用真实的用户名,比如“张三”,不要用“zhangsan”这样的登录名。

由于强制留痕模式下用户不能接受、拒绝或删除其他用户对此文档所做的任何修订,所以经过多人审阅后的 Word 文档,需要进行核稿处理,清理文档中用户编辑过的所有痕迹。此时,可以使用 PageOffice 提供的核稿模式,PageOfficeCtrl 对象的 webOpen 方法的第二个参数使用 docAdmin,打开文档即可进入核稿模式,此时在痕迹上点右键,右键菜单中的“接受修订”、“拒绝修订”、“接受删除”、“拒绝删除”等项就都是可用状态了,核稿人员就可以根据文档中各用户的意见,对文档做修改并清除文件中的所有痕迹,整理为可发布的正式文件。有些办公系统需要将用户留痕审阅过的文件归档保存,以便后期查阅。因此开发人员可以编写程序,在进入核稿环节时,自动备份留痕文档。

显示痕迹列表效果

在实际应用中,为了方便查找和定位当前页面的某个痕迹,通常采用将当前文档中的所有痕迹遍历,并以列表方式显示到当前页面某个位置。

一般需要显示的痕迹属性包括:痕迹的用户名,痕迹的内容,痕迹的日期时间等。PageOffice 客户端控件提供了 RevisionsAsJson 对象来实现对痕迹的遍历。
RevisionsAsJson

  • author 代表当前痕迹的用户名
  • date 代表当前痕迹的日期
  • type 代表痕迹的类型
  • GetTextFromRevision 代表痕迹的文本内容

后端代码

PageOfficeCtrl poCtrl = new PageOfficeCtrl(request);
//webOpen 的第一个参数支持能够输出下载文件的 Url 相对地址或者文件在服务器上的磁盘路径两种方式
// 查看详细,请在本站搜索“PageOffice 属性或方法中涉及到的 URL 路径或磁盘路径的说明”
poCtrl.webOpen("D:\\documents\\test.docx", OpenModeType.docRevisionOnly, "张三");

前端代码

  1. 在 OnPageOfficeCtrlInit 事件中添加隐藏和显示痕迹的按钮(根据实际业务需求处理即可);
OnPageOfficeCtrlInit() {
  pageofficectrl.AddCustomToolButton("隐藏痕迹", "hideRevision", 18);
  pageofficectrl.AddCustomToolButton("显示痕迹", "showRevision", 9);
},
  1. 实现自定义按钮所调用的 js 函数;
function showRevision() {
    pageofficectrl.ShowRevisions = true;
}
function hideRevision() {
    pageofficectrl.ShowRevisions = false;
}
  1. 获取痕迹列表
function  getRevisionList(){
	var revisionList = "";
	var revisionsJson=pageofficectrl.word.RevisionsAsJson;
	var revisionObj = JSON.parse(revisionsJson);
<span class="hljs-comment">//遍历痕迹</span>
<span class="hljs-keyword">for</span>(<span class="hljs-keyword">var</span> key <span class="hljs-keyword">in</span> revisionObj){
	<span class="hljs-keyword">let</span> str = <span class="hljs-string">''</span>;
	<span class="hljs-keyword">let</span> revisionAuthor = revisionObj[key].<span class="hljs-property">author</span>; <span class="hljs-comment">//author属性为当前痕迹的用户名</span>
	<span class="hljs-keyword">let</span> revisionDate = revisionObj[key].<span class="hljs-property">date</span>; <span class="hljs-comment">//date属性为当前痕迹的日期</span>

	str = <span class="hljs-title function_">dateFormat</span>(revisionDate, <span class="hljs-string">'[yyyy-MM-dd HH:mm]'</span>) + revisionAuthor + <span class="hljs-string">':'</span>;

	<span class="hljs-keyword">if</span> (revisionObj[key].<span class="hljs-property">type</span> === <span class="hljs-number">1</span>) { <span class="hljs-comment">//type代表当前痕迹的类型为“插入”类型</span>
		<span class="hljs-keyword">let</span> revisionType = <span class="hljs-string">'插入'</span>;
		<span class="hljs-keyword">let</span> revisionTxt = pageofficectrl.<span class="hljs-property">word</span>.<span class="hljs-title class_">GetTextFromRevision</span>(<span class="hljs-built_in">parseInt</span>(revisionObj[key].<span class="hljs-property">id</span>));<span class="hljs-comment">//获取当前痕迹的文本内容</span>
		str = str + revisionType +<span class="hljs-string">':'</span> + revisionTxt;
	}
	<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (revisionObj[key].<span class="hljs-property">type</span> === <span class="hljs-number">2</span>) { <span class="hljs-comment">//type代表当前痕迹的类型为“删除”类型</span>
		<span class="hljs-keyword">let</span> revisionType = <span class="hljs-string">'删除'</span>;
		<span class="hljs-keyword">let</span> revisionTxt = pageofficectrl.<span class="hljs-property">word</span>.<span class="hljs-title class_">GetTextFromRevision</span>(<span class="hljs-built_in">parseInt</span>(revisionObj[key].<span class="hljs-property">id</span>));
		str = str + revisionType +<span class="hljs-string">':'</span> + revisionTxt;
	}
	<span class="hljs-keyword">else</span> {
		<span class="hljs-keyword">let</span> revisionType = <span class="hljs-string">'调整格式或样式。'</span>;
		str = str + revisionType ;
	}

	revisionList += <span class="hljs-string">"&lt;li&gt;&lt;a href='#' onclick='goToRevision("</span> + key + <span class="hljs-string">")'&gt;"</span> + str + <span class="hljs-string">"&lt;/a&gt;&lt;/li&gt;"</span>;
}

<span class="hljs-keyword">return</span> revisionList;

}

// 定位到一个痕迹
function goToRevision(key) {
pageofficectrl.word.SelectRevision(key);
}

function dateFormat(date, format) {
date = new Date((date-25569)864001000);
date = roundTimeToSeconds(date);
date.setHours(date.getHours() - 8);
var o = {
'M+': date.getMonth() + 1, //month
'd+': date.getDate(), //day
'H+': date.getHours(), //hour
'm+': date.getMinutes(), //minute
's+': date.getSeconds(), //second
'q+': Math.floor((date.getMonth() + 3) / 3), //quarter
'S': date.getMilliseconds() //millisecond
};

<span class="hljs-keyword">if</span> (<span class="hljs-regexp">/(y+)/</span>.<span class="hljs-title function_">test</span>(format))
	format = format.<span class="hljs-title function_">replace</span>(<span class="hljs-title class_">RegExp</span>.<span class="hljs-property">$1</span>, (date.<span class="hljs-title function_">getFullYear</span>() + <span class="hljs-string">''</span>).<span class="hljs-title function_">substr</span>(<span class="hljs-number">4</span> - <span class="hljs-title class_">RegExp</span>.<span class="hljs-property">$1</span>.<span class="hljs-property">length</span>));

<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> k <span class="hljs-keyword">in</span> o)
	<span class="hljs-keyword">if</span> (<span class="hljs-keyword">new</span> <span class="hljs-title class_">RegExp</span>(<span class="hljs-string">'('</span> + k + <span class="hljs-string">')'</span>).<span class="hljs-title function_">test</span>(format))
		format = format.<span class="hljs-title function_">replace</span>(<span class="hljs-title class_">RegExp</span>.<span class="hljs-property">$1</span>, <span class="hljs-title class_">RegExp</span>.<span class="hljs-property">$1</span>.<span class="hljs-property">length</span> == <span class="hljs-number">1</span> ? o[k] : (<span class="hljs-string">'00'</span> + o[k]).<span class="hljs-title function_">substr</span>((<span class="hljs-string">''</span> + o[k]).<span class="hljs-property">length</span>));

<span class="hljs-keyword">return</span> format;

}

function roundTimeToSeconds(date) {
var seconds = date.getSeconds();
if (seconds < 30) {
date.setSeconds(0);
} else {
date.setSeconds(0);
date.setMinutes(date.getMinutes() + 1);
}
return date;
}

// 把所有痕迹的 <li> 标签放到一个 <ul> 中
function refreshList() {
document.getElementById("ul_Comments").innerHTML = getRevisionList();
}

参考链接
强制留痕模式编辑
显示痕迹列表效果