國產linux系統(銀河麒麟,統信uos)使用 PageOffice 國產版線上開啟 word檔案編輯留痕並顯示痕跡列表

qianxi發表於2024-07-12

國產linux系統(銀河麒麟,統信uos)使用 PageOffice 國產版線上開啟 pdf 檔案
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();
}

參考連結
強制留痕模式編輯
顯示痕跡列表效果

相關文章