國產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, "張三");
前端程式碼
- 在OnPageOfficeCtrlInit事件中新增隱藏和顯示痕跡的按鈕(根據實際業務需求處理即可);
OnPageOfficeCtrlInit() {
pageofficectrl.AddCustomToolButton("隱藏痕跡", "hideRevision", 18);
pageofficectrl.AddCustomToolButton("顯示痕跡", "showRevision", 9);
},
- 實現自定義按鈕所呼叫的js函式;
function showRevision() {
pageofficectrl.ShowRevisions = true;
}
function hideRevision() {
pageofficectrl.ShowRevisions = false;
}
- 獲取痕跡列表
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();
}
參考連結
強制留痕模式編輯
顯示痕跡列表效果