国产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);

	//遍历痕迹
	for(var key in revisionObj){
		let str = '';
		let revisionAuthor = revisionObj[key].author; //author属性为当前痕迹的用户名
		let revisionDate = revisionObj[key].date; //date属性为当前痕迹的日期

		str = dateFormat(revisionDate, '[yyyy-MM-dd HH:mm]') + revisionAuthor + ':';

		if (revisionObj[key].type === 1) { //type代表当前痕迹的类型为“插入”类型
			let revisionType = '插入';
			let revisionTxt = pageofficectrl.word.GetTextFromRevision(parseInt(revisionObj[key].id));//获取当前痕迹的文本内容
			str = str + revisionType +':' + revisionTxt;
		}
		else if (revisionObj[key].type === 2) { //type代表当前痕迹的类型为“删除”类型
			let revisionType = '删除';
			let revisionTxt = pageofficectrl.word.GetTextFromRevision(parseInt(revisionObj[key].id));
			str = str + revisionType +':' + revisionTxt;
		}
		else {
			let revisionType = '调整格式或样式。';
			str = str + revisionType ;
		}

		revisionList += "<li><a href='#' onclick='goToRevision(" + key + ")'>" + str + "</a></li>";
	}

	return revisionList;
}

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

function dateFormat(date, format) {
	date = new Date((date-25569)*86400*1000);
	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
	};

	if (/(y+)/.test(format))
		format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));

	for (var k in o)
		if (new RegExp('(' + k + ')').test(format))
			format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));

	return 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();
}

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

posted on 2024-07-12 14:05  qianxi  阅读(11)  评论(0编辑  收藏  举报