/** * 2021-03-02 增加无外观签名 * 2021-05-26 增加在线打开URL文件 * */ var NetcaUtils = (function(){ 'use strict'; var that = {}; /**判断当前是否手动盖章界面*/ that.isUserManualSignUI = function () { if ($('.netcasignpdf').length) { return true; } return false; }; /**转换成pdf.js能直接解析的Uint8Array类型*/ that.convertDataURIToBinary = function(dataURI){ var raw = window.atob(dataURI); var rawLength = raw.length; var array = new Uint8Array(new ArrayBuffer(rawLength)); for (var i = 0; i < rawLength; i++) { array[i] = raw.charCodeAt(i) & 0xff; } return array; }; /**Uint8Array转为base64*/ that.arrayBufferToBase64 =function(buffer) { var binary = ''; var bytes = new Uint8Array(buffer); for (var len = bytes.byteLength, i = 0; i < len; i++) { binary += String.fromCharCode(bytes[i]); } return window.btoa(binary); }; return that; })(); var NetcaSignAPI = (function(){ 'use strict'; var that = { VerifyInfos: null //验证信息 }; var isOnlineverifyrevoke = null; var click_x = null; var click_y = null; var sealImage_halfWidth = null; var sealImage_halfheight = null; var sealImageSrc = null; var certEncode = null; var originImage_width = null; var originImage_height = null; var tagObj = { width: '', //签章图片宽度 height: '' //签章图片高度 }; var timeStamp = { tsaUrl: '', //时间戳地址 tsaUsr: '', //时间戳服务对应用户名 tsaPwd: '',//时间戳服务对应用户的密码 tsaHashAlgo: '' }; var revInfoIncludeFlag = null; //是否包含吊销信息 var isVerifyRevoke = null;//是否获取吊销信息 var verifyLevel = null; //验证级别 var signFields = []; //签名域信息 var isDisplayVerifyTips = null; var isVerifyOpen = false; //初次进入页面,是否开启在线自动验证文档有效性 var isVerifyOpenWithOpenBtn = null; //使用打开按钮时,是否开启在线自动验证文档有效性 var filedFlag = false; //判断是否为刚签完的章 var zoom = false; //缩放 var completedStreamId; //已签数据流信息 var unfinishedStreamId; //未完成数据流信息 var bigFileSize = 20; //大文件 var writeLength = 10; //写入文件大小 that.initUI = function(){ if(NetcaUtils.isUserManualSignUI()) { // 签章绑定事件 that.bindSignFn('netcasign'); that.bindSignFn('connect'); that.bindSignFn('batchsign'); that.bindSignFn('pagingsign'); // 显示签章菜单背景色 that.transBackground('netcasign'); that.transBackground('batchsign'); that.transBackground('pagingsign'); // toorbar 签章按钮 $('#sign').click(function(){ if($('.netcasignmenu').css('display') === 'none') { $('.netcasignmenu').css('display','block'); } else if($('.netcasignmenu').css('display') === 'block') { $('.netcasignmenu').css('display','none'); } }); /// 签章菜单 hover for(var k=0; k<$('.netcasignmemuitem').length;k++) { (function(k){ $('.netcasignmemuitem').eq(k).hover(function(){ $(this).children('ul').css('display','block'); $(this).css('background','#DBECFF'); },function(){ $(this).children('ul').css('display','none'); $(this).css('background','#fff'); }); })(k) } /**选中option,缩放pdf*/ that.zoomPDFBySelectOptionScale(); //绑定事件 document.getElementById('verify').addEventListener('click',function(){ that.isLoading(); isDisplayVerifyTips = true; if(that.isBigFile(NetcaPDFSeal.SetPDFBytes)){ that.signedDataVerify('','',verifyLevel,isOnlineverifyrevoke, unfinishedStreamId) } else { that.signedDataVerify('',NetcaPDFSeal.SetPDFBytes,verifyLevel,isOnlineverifyrevoke) } }); document.getElementById('print').addEventListener('click',that.printPDF); document.getElementById('netcainvalidClose').addEventListener('click', function(){that.closeSignedDataVerifyInfo('netcainvalidClose')}); document.getElementById('netcaclose2').addEventListener('click', function(){that.closeSignedDataVerifyInfo('netcaclose2')}); document.getElementById('netcainvalidBtn').addEventListener('click', that.displaySignedDataVerifyInfo); document.getElementById('zoomIn').addEventListener('click', that.zoomPDF); document.getElementById('zoomOut').addEventListener('click', that.zoomPDF); document.getElementById('closeFile').addEventListener('click', that.closeFile); // 控件显示 $('#netcasignpdf').css('display','block'); $('#NetcaReaderAx').css('display','none'); //打开按钮 $('#openFile input[type="file"]').on('change', function(ev){ var file = ev.target.files[0]; that.openFile(file); }); } }; // 缩放PDF that.zoomPDF = function(){ zoom = true; that.getSignatureFieldInfo(NetcaPDFSeal.SetPDFBytes, unfinishedStreamId); }; /**获取证书列表*/ that.getCertList = function(e){ if($('.netcasignmenu').css('display') === 'block'){ $('.netcasignmenu').css('display','none'); } var clickTargetId = e.target.parentNode.parentNode.getAttribute('id'); //员工 机构 法人 var clickTargetClass = e.target.getAttribute('class'); //普通 批量 骑缝章 切换用户 // 签章0 批量签章1 骑缝章2 切换用户3 普通签章0 员工签章1 机构签章2 法人签章3 var signObj = that.signFn(clickTargetId, clickTargetClass); var index = that.isLoading(); if(clickTargetId){ // 粤商通 that.selectSealSigntureInfoWithDispaly(signObj, index); } else { // 标准版 that.isInsertKey(signObj, index); } }; that.signFn = function(targetId, targetClass) { var _type , _key; switch(targetId) { // 员工签章 case 'netcastaff': _type = 1; break; // 机构签章 case 'netcaorganization': _type = 2; break; // 法人签章 case 'netcalegalperson': _type = 3; break; // 普通签章 default: _type = 0; break; } switch(targetClass) { // 签章 case 'netcasign': _key = 0; break; // 批量签章 case 'batchsign': _key = 1; break; // 骑缝章 case 'pagingsign': _key = 2; break; // 切换用户 case 'connect': _key = 3; break; } if(_key === 0 || _key === 3){ // 普通签章 return { signMenu: _type, signType:_key, batchSignParams: null, acrosspageSignParams:null } } else{ // 批量签章 骑缝章 return { signMenu: _type, signType:_key, batchSignParams: { // 批量签章参数 startPageNum: 1,//开始页码 endPageNum: globalPDFViewerApplication.pagesCount//结束页码,-1表示最后一页 }, acrosspageSignParams:{ // 骑缝章参数 startPageNum: 1,//开始页码 endPageNum: globalPDFViewerApplication.pagesCount//结束页码,-1表示最后一页 } } } }; // 绑定签章按钮初始化功能事件 that.bindSignFn = function(name){ var eleName = document.getElementsByClassName(name); for(var i=0;i 0) { that.InsertCallBack(signObj, index); } else { that.UnInsertCallBack(res, index); } }) .Catch(function (res) { that.UnInsertCallBack(res, index); }); }; that.InsertCallBack = function(signObj, index) { that.selectSealSigntureInfoWithDispaly(signObj, index) }; that.UnInsertCallBack = function(res, index) { layer.close(index); if(!res.insertCount){ alert('找不到签名证书,请检查设备是否连接正确') } }; // 点击签章按钮,弹出证书选择框 that.selectSealSigntureInfoWithDispaly = function(signObj, index){ var params = { signMenu: signObj.signMenu, signType: signObj.signType, batchSignParams: signObj.batchSignParams, acrosspageSignParams: signObj.acrosspageSignParams }; NetcaPKI.SelectSealSigntureInfoWithDispaly(params) .Then(function(res) { NetcaSignAPI.selectSealSigntureInfoWithDispalySuccessCallBack(res, signObj,index); }) .Catch(function(res) { NetcaSignAPI.selectSealSigntureInfoWithDispalyFailCallBack(res, index) }); }; that.selectSealSigntureInfoWithDispalySuccessCallBack = function(res, signObj,index) { certEncode = res.cert; //证书编码 tagObj.width = res.width; //印章宽度 tagObj.height = res.height; //印章高度 sealImageSrc = res.picture; //印章编码 if(signObj.acrosspageSignParams || signObj.batchSignParams){ signObj.acrosspageSignParams.startPageNum = res.acrosspageSignParams.startPageNum; signObj.acrosspageSignParams.endPageNum = res.acrosspageSignParams.endPageNum; signObj.batchSignParams.startPageNum = res.batchSignParams.startPageNum; signObj.batchSignParams.endPageNum = res.batchSignParams.endPageNum; } // 无外观签名 if(res.type === 2){ that.seal_SignSealPosition(-1, res.type); return; } that.setSignImageSize(); that.signImageMoveEvent(signObj, res.type); layer.close(index); }; that.selectSealSigntureInfoWithDispalyFailCallBack = function(res, index) { layer.close(index); alert(res.msg); }; /** 设置跟随鼠标移动的图片大小 图像的像素宽度为 originImage_width,水平分辨率为 72 点/英寸 如果调用此方法在分辨率为 96 点/英寸的设备上绘制该图像,则所呈现图像的像素宽度就是: (originImage_width/72)*96 * */ that.setSignImageSize = function(){ var val = that.getScale();//缩放比例 var scale = 0.75;//当前缩放比例 $('#NetcaSignMoveImage').width(tagObj.width); $('#NetcaSignMoveImage').height(tagObj.height); $('#NetcaSignMoveImage').attr('src',"data:image/PNG;base64," + sealImageSrc); originImage_width = $('#NetcaSignMoveImage').width(); var w = (originImage_width * val)/ scale; $('.NetcaSignMoveDiv').width(w); originImage_height = $('#NetcaSignMoveImage').height(); var h = (originImage_height * val)/ scale; $('.NetcaSignMoveDiv').height(h); $('#NetcaSignMoveImage').css({ 'width':'100%', 'height':'100%' }); sealImage_halfWidth = parseInt($('.NetcaSignMoveDiv').width()) / 2; sealImage_halfheight = parseInt($('.NetcaSignMoveDiv').height()) / 2; }; /**鼠标移动签章图片事件 mousemove*/ that.signImageMoveEvent = function(signObj, type){ $(document).mousemove(function(event){ var ev = event || window.event; /**position left和top 设置鼠标位于图片中央*/ $('.NetcaSignMoveDiv').css({ 'display':'block', 'left':ev.clientX - sealImage_halfWidth + 'px', 'top':ev.clientY - sealImage_halfheight +'px' }) }); $(document).mousedown(function(){ that.netcaPDFClickEvent(signObj, type) }); $(document).mouseup(function(){ $(document).unbind('mousedown'); $(document).unbind('mousemove'); }); /**点击右键 取消签章*/ $(document).bind('contextmenu', function(){ that.hideSignImage(); $('#viewer').unbind('click'); return false; }); }; // 打开文件 that.openPDF = function(base64Val) { if(that.isBigFile(base64Val)){ // 重新打开时 删除旧的streamId,保存新的streamId if(unfinishedStreamId){ that.destoryStreamCallBack(unfinishedStreamId) } unfinishedStreamId = completedStreamId; } else { unfinishedStreamId = null; completedStreamId = null; } // 渲染入口 var Bytes = NetcaUtils.convertDataURIToBinary(base64Val); globalPDFViewerApplication.open(Bytes); }; that.isLoading = function() { var loading = layer.load(1, { shade: [0.1,'#000'] //0.1透明度的白色背景 }); return loading }; // 打开按钮 that.openFile = function(file){ isVerifyOpen = isVerifyOpenWithOpenBtn;//打开按钮,文档加载时是否自动验证文档有效性 that.isLoading(); var reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function (){ var result = reader.result.split(',')[1]; NetcaPDFSeal.setPDFBytes(result); that.openPDF(result); if(that.isBigFile(result)){ var params = {srcBytes: result}; that.createStreamCallBack(params); } else { that.getSignatureFieldInfo(NetcaPDFSeal.SetPDFBytes);//小文件 } }; // 验证提示隐藏 $('#netcasignedDataVerify').css('display', 'none'); $('#netcaDisplaySignedDataVerify').css('display', 'none'); $('#viewerContainer').css('margin-top', '0'); }; //高度累加,计算纵坐标 that.addHeight = function(n){ var result = 0; while(n >= 2) { var _height = $('#viewer .page').eq(n-2).height() + 11; result += _height; n--; } return result; }; // viewer点击事件 that.netcaPDFClickEvent = function(signObj, type){ var pdfviewer = document.getElementById('netcasignpdf'); var pdfviewerL = pdfviewer.offsetLeft; var pdfviewerT = pdfviewer.offsetTop; var flag = 2; var pageNum = globalPDFViewerApplication.page;//当前页码 // 前n-1页 高度 var _height = 0; if(pageNum > 1){ _height = that.addHeight(pageNum); } $('#viewer').click(function(e){ flag--; /**鼠标点击的位置,相对于文档的左边缘/上边缘*/ var client_x = e.clientX; var client_y = e.clientY; var viewer_width = $('#viewer').width(); var blank_top = $('#toolbarViewer').height() + 9; var pdfscrollTop = $('#viewerContainer').scrollTop(); //文档滚动高度 //验证提示信息的高度 if($('#netcasignedDataVerify').css('display') === 'block'){ blank_top = blank_top + $('#netcasignedDataVerify').outerHeight(); } var clicky_temp = client_y - blank_top + pdfscrollTop - pdfviewerT; click_y = clicky_temp - _height; var page_width = $('#viewer .page').eq(pageNum-1).width(); var blank_left = (viewer_width - page_width) / 2; var clickx_temp = client_x - pdfviewerL; click_x = clickx_temp - blank_left; //假如显示第1页,签第2页的位置 var currentPageHeight = that.addHeight(pageNum + 1); if(currentPageHeight < clicky_temp){ pageNum = pageNum + 1; that.calculateCurrentHeightAgain(pageNum, clickx_temp, clicky_temp, viewer_width); } // 假如显示第2页,签第1页页尾位置 if(click_y<0){ //计算负数 重算高度 宽度 pageNum = pageNum -1; that.calculateCurrentHeightAgain(pageNum, clickx_temp, clicky_temp, viewer_width); } if(flag>0){ /**每次点击只触发一次签章 超出文档左右界线不能点击签章*/ if(click_x>0 && (viewer_width - click_x - blank_left) >= blank_left){ that.isLoading(); if(signObj.signType === 1 || signObj.signType === 2) { // 批量签章 骑缝章 that.Seal_signatureCreatorBatchOrAcrossPage(signObj, pageNum, type) } else { // 签章函数 that.seal_SignSealPosition(pageNum, type) } } else { that.hideSignImage(); alert('不在签章范围内') } } }) }; that.calculateCurrentHeightAgain = function(pageNum, clickx_temp, clicky_temp, viewer_width){ var _height; if(pageNum > 1){ _height = that.addHeight(pageNum); } else { _height = 0; } click_y = clicky_temp - _height; var page_width = $('#viewer .page').eq(pageNum-1).width(); var blank_left = (viewer_width - page_width) / 2; click_x = clickx_temp - blank_left; }; that.seal_SignSealPositionForBigFileWriteCallBack = function(signParams) { signParams.srcBytes = ''; signParams.srcStreamId = streamId; //streamId 全局变量 NetcaPKI.SignatureCreatorPdfSignSealFieldOrPosition(signParams) .Then(function (res) { that.SignatureCreatorSuccessCallBack(res); }) .Catch(function (res) { that.SignatureCreatorFailedCallBack(res); }); }; that.seal_SignSealPositionForBigFile = function(signParams) { that.seal_SignSealPositionForBigFileWriteCallBack(signParams); }; that.seal_SignSealPosition = function(_pageNum, _type) { var newscale = that.getScale();//缩放比例 var scale = 0.75; // 75% 对应72dpi; 如果不是75%缩放比例,需要对应转换为72dpi的坐标大小 var _xPos = parseInt((scale / newscale)*(click_x - sealImage_halfWidth));//签名域/签章左下角的水平向右方向坐标 var _yPos = parseInt((scale / newscale)*(click_y - sealImage_halfheight));//签名域/签章左下角的垂直向上方向坐标 var params = { srcFile: '', //源pdf文件 srcBytes: NetcaPDFSeal.SetPDFBytes, //源Pdf文件的Base64编码 destFile: '', //目标pdf文件 certEncode: certEncode, //签名证书Base64编码 selMode: 1, //操作模式 signFieldText: '', //签名域显示的文字 sealImageEncode: sealImageSrc, //签章图片Base64编码 revInfoIncludeFlag: revInfoIncludeFlag,//是否包含吊销信息 SignPosition: //签名位置对象 { pageNum: _pageNum, //PDF文档的页码 xPos: _xPos, //签名域/签章左下角的水平向右方向坐标 yPos: _yPos, //签名域/签章左下角的垂直向上方向坐标 width: parseInt(originImage_width), //签名域/签章的宽度 height: parseInt(originImage_height) //签名域/签章的高度 }, Tsa: //时间戳对象 { tsaUrl: timeStamp.tsaUrl, //时间戳地址 tsaUsr: timeStamp.tsaUsr, //时间戳服务对应用户名 tsaPwd: timeStamp.tsaPwd, //时间戳服务对应用户的密码 tsaHashAlgo: timeStamp.tsaHashAlgo //时间戳使用的hash算法,例如”sha-1”,”sha-256”等 }, synVerify: true, //签完名之后同步验证文档 synGetSignFiled: true, //签完名之后同步获取签名域 level: verifyLevel, //验证级别 onlineVerifyRevok: isOnlineverifyrevoke //是否在线验证吊销信息 }; if(_type === 2){ //无外观签名 params.sealImageEncode = null; params.SignPosition = { pageNum:-1, xPos:0, yPos:0, width:0, height:0 }; params.visible=false; } if(that.isBigFile(params.srcBytes)) { params.srcBytes = ''; params.srcStreamId = unfinishedStreamId; params.isReturnStreamId = true; } NetcaPKI.SignatureCreatorPdfSignSealFieldOrPosition(params) .Then(function (res) { filedFlag = true;//开启刚签完的章能撤章 that.SignatureCreatorSuccessCallBack(res); }) .Catch(function (res) { that.SignatureCreatorFailedCallBack(res); }); }; /**批量签章或骑缝章 要求文件没有做过电子签章/签名*/ that.Seal_signatureCreatorBatchOrAcrossPage = function(signObj, _pageNum, _type){ //var page = _pageNum;//当前页码 var newscale = that.getScale();//缩放比例 var scale = 0.75; // 75% 对应72dpi; 如果不是75%缩放比例,需要对应转换为72dpi的坐标大小 var _xPos = parseInt((scale / newscale)*(click_x - sealImage_halfWidth));//签名域/签章左下角的水平向右方向坐标 var _yPos = parseInt((scale / newscale)*(click_y - sealImage_halfheight));//签名域/签章左下角的垂直向上方向坐标 //Tsa对象说明 var Tsa = { tsaUrl: timeStamp.tsaUrl, //时间戳地址 tsaUsr: timeStamp.tsaUsr, //时间戳服务对应用户名 tsaPwd: timeStamp.tsaPwd, //时间戳服务对应用户的密码 tsaHashAlgo: timeStamp.tsaHashAlgo }; //批量签章 if(signObj.signType === 1){ //batchSeal对象说明 var batchSeal = { signaturePage: signObj.batchSignParams.startPageNum, //电子签章所在页码,目前仅支持批量签章开始页或结束页 xPos: _xPos, //签名域/签章左下角的水平向右方向坐标 yPos: _yPos, //签名域/签章左下角的垂直向上方向坐标 width: parseInt(originImage_width), height: parseInt(originImage_height), startPage: signObj.batchSignParams.startPageNum, // 从开始页计算,第n页:例如:1为第一页; endPage: signObj.batchSignParams.endPageNum //从最尾页计算,最后第n页:例如:-1为最后一页 }; var params = { srcBytes : NetcaPDFSeal.SetPDFBytes, //目标pdf文件 certEncode : certEncode, //签名证书Base64编码 sealImageEncode : sealImageSrc, //签章图片Base64编码 revInfoIncludeFlag : revInfoIncludeFlag,//是否包含吊销信息 batchSeal: batchSeal, //batchSeal对象说明 Tsa: Tsa, //Tsa对象说明 synVerify: true, //签完名之后同步验证文档 synGetSignFiled: true, //签完名之后同步获取签名域 level: verifyLevel, //验证级别 onlineVerifyRevok: isOnlineverifyrevoke //是否在线验证吊销信息 }; if(that.isBigFile(params.srcBytes)) { params.srcBytes = ''; params.srcStreamId = unfinishedStreamId; params.isReturnStreamId = true; } NetcaPKI.signatureCreatorBatchSeal(params) .Then(function(res){ NetcaSignAPI.SignatureCreatorSuccessCallBack(res) }) .Catch(function(res){ NetcaSignAPI.SignatureCreatorFailedCallBack(res) }) } //骑缝章 if(signObj.signType === 2){ //acrossPageSeal对象说明 var acrossPageSeal = { signaturePage: signObj.acrosspageSignParams.startPageNum, //电子签章所在页码,目前仅支持批量签章开始页或结束页 xPos: _xPos, //签名域/签章左下角的水平向右方向坐标 yPos: _yPos, //签名域/签章左下角的垂直向上方向坐标 width: parseInt(originImage_width), height: parseInt(originImage_height), startPage: signObj.acrosspageSignParams.startPageNum, // 从开始页计算,第n页:例如:1为第一页; endPage: signObj.acrosspageSignParams.endPageNum //从最尾页计算,最后第n页:例如:-1为最后一页 }; var params = { srcBytes : NetcaPDFSeal.SetPDFBytes, //目标pdf文件 certEncode : certEncode, //签名证书Base64编码 sealImageEncode : sealImageSrc, //签章图片Base64编码 revInfoIncludeFlag : revInfoIncludeFlag,//是否包含吊销信息 acrossPageSeal: acrossPageSeal, //batchSeal对象说明 Tsa: Tsa, //Tsa对象说明 synVerify: true, //签完名之后同步验证文档 synGetSignFiled: true, //签完名之后同步获取签名域 level: verifyLevel, //验证级别 onlineVerifyRevok: isOnlineverifyrevoke //是否在线验证吊销信息 }; if(that.isBigFile(params.srcBytes)) { params.srcBytes = ''; params.srcStreamId = unfinishedStreamId; params.isReturnStreamId = true; } NetcaPKI.signatureCreatorAcrossPageSeal(params) .Then(function(res){ NetcaSignAPI.SignatureCreatorSuccessCallBack(res) }) .Catch(function(res){ NetcaSignAPI.SignatureCreatorFailedCallBack(res) }) } }; that.SignatureCreatorSuccessReadStreamUpdateCallBack = function(res, signSuccessRes,index) { completedStreamId = res.streamId; signSuccessRes.destFileEncode=signSuccessRes.destFileEncode+res.data; if(!res.hasMoreData) { that.SignatureCreatorCallBack(signSuccessRes, res.streamId); return; } var params = { streamId: res.streamId, length: writeLength*1024*1024 }; NetcaPKI.readStream(params) .Then(function (res) { that.SignatureCreatorSuccessReadStreamUpdateCallBack(res, signSuccessRes); }) .Catch(function (res) { that.SignatureCreatorFailedCallBack(res, index); }); }; that.SignatureCreatorSuccessReadStreamCallBack = function(signSuccessRes) { completedStreamId = signSuccessRes.destFileStream.streamId; signSuccessRes.destFileEncode=''; var params = { streamId: signSuccessRes.destFileStream.streamId, length: writeLength*1024*1024 }; NetcaPKI.readStream(params) .Then(function (res) { that.SignatureCreatorSuccessReadStreamUpdateCallBack(res, signSuccessRes); }) .Catch(function (res) { that.SignatureCreatorFailedCallBack(res); }); }; // 签章成功回调 that.SignatureCreatorSuccessCallBack = function(res){ var streamId; if(res.destFileStream){ streamId = res.destFileStream.streamId; } //大文件 if(res.destFileEncode == null ||res.destFileEncode.length ==0 ) { that.SignatureCreatorSuccessReadStreamCallBack(res); return; } that.SignatureCreatorCallBack(res, streamId) }; // 签章成功回调 that.SignatureCreatorCallBack = function(res, streamId){ that.resetOriginalState(res.destFileEncode); that.SignatureCallBack(res, streamId); NetcaPDFSeal.setPDFBytes(res.destFileEncode); alert('签名/章成功'); var interval = setInterval(function(){ if (globalPDFViewerApplication.pdfDocument == null) { console.info('Loading...'); } else { if($('#viewer .page').length>0){ console.info('Load Success...'); clearInterval(interval); that.describeSignatureField(); //描绘签名域 that.createRevokeEvent(streamId); //撤章事件 } } }, 1000); certEncode = null; sealImageSrc = null; if(that.signCallbackEvent != null) { that.signCallbackEvent(JSON.stringify(res)) } }; that.SignatureCallBack = function(res){ signFields = res.signFields; //签名域信息 that.VerifyInfos = res.VerifyInfos; //验证信息 that.displaySignedDataVerifyTip( res.VerifyInfos); // toobar下验证提示信息 that.createSignedDataVerifyInfo(); // 创建左边 签名状态 每个签名信息 that.displayCert(); // 显示证书信息 that.displayInfoFeild(); // 每个签名信息伸展或收缩显示 layer.closeAll('loading'); }; //创建数据流 that.createStreamCallBack = function(signParams){ var params = { length: signParams.srcBytes.length }; NetcaPKI.createStream(params) .Then(function (res) { unfinishedStreamId = res.streamId; that.writeStreamCallBack(res, signParams) }) .Catch(function (res) { layer.closeAll('loading'); alert(res.msg); }); }; // 写入数据流 that.writeStreamCallBack = function(res, signParams) { //写入数据完成 if( res.streamWritePos >= signParams.srcBytes.length ) { that.getSignatureFieldInfo('', res.streamId); return; } var params = { streamId:res.streamId, data:signParams.srcBytes.substr(res.streamWritePos,writeLength*1024*1024) }; NetcaPKI.writeStream(params) .Then(function (res) { that.writeStreamCallBack(res, signParams); }) .Catch(function (res) { layer.closeAll('loading'); alert(res.msg); }); }; //读取数据流 that.readStreamCallBack = function() { //10M var params = { streamId: stream.streamId, length: writeLength*1024*1024 }; NetcaPKI.readStream(params) .Then(function (res) { that.readStreamUpdateCallBack(res) }) .Catch(function (res) { alert(res.msg) }); }; that.readStreamUpdateCallBack = function(res) { NetcaPDFSeal.SetPDFBytes += res.data; }; // 销毁数据流 that.destoryStreamCallBack = function(id){ var params = { streamId: id }; NetcaPKI.destoryStream(params) .Then(function (res) { // console.log('销毁数据成功') }) .Catch(function (res) { alert(res.msg) }); }; // 大文件 与 小文件 处理方式划分 that.isBigFile = function(srcBytes){ if (srcBytes != null && srcBytes.length > bigFileSize*1024 * 1024) { return true; } else { return false; } }; // 签章失败回调 that.SignatureCreatorFailedCallBack = function(res){ that.hideSignImage(); alert("签名/章失败 " + res.msg); if(that.signCallbackEvent != null) { that.signCallbackEvent(JSON.stringify(res)) } layer.closeAll('loading'); }; /** * 隐藏签章图片 * */ that.hideSignImage = function(){ $('.NetcaSignMoveDiv').css({'display':'none'}); }; /** * 重置状态:关闭layer、签章图片隐藏、展示最新pdf * */ that.resetOriginalState = function(res){ that.openPDF(res); $('#NetcaSignMoveImage').attr('src',''); that.hideSignImage(); }; //获取页面缩放比例 that.getScale = function(){ var scale = Number($('#scaleSelect').val());//缩放比例 /* ctrl+鼠标缩放页面时,缩放倍数不是option中预设的,获取到的scale会是0; 通过globalPDFViewerApplication.getCurrentScale()拿到当前的scale * */ var currentScale = globalPDFViewerApplication.getCurrentScale(); scale = scale ?scale:currentScale; return scale; }; /** * 获取签章客户端的配置信息 * */ that.getSealConfigInfo = function(OpenPDFBytes) { that.isLoading(); $(".netcafieldInfo").remove(); //先删除旧的签名域 var params = {}; NetcaPKI.getSealConfigInfo(params) .Then(function(res) { that.getSealConfigInfoSuccessCallBack(res, OpenPDFBytes); }) .Catch(function(res) { that.getSealConfigInfoFailCallBack(res) }); }; that.getSealConfigInfoSuccessCallBack = function(res, OpenPDFBytes){ isVerifyRevoke = res.verify.isVerifyRevoke; //是否验证签名时签名证书的吊销状态 isOnlineverifyrevoke = res.verify.isOnlineVerifyRevoke;//是否在线获取吊销信息 verifyLevel = res.verify.verifySignLevel;//验证签名的级别 3:验证签名和证书,并且验证签名证书的吊销状态;但不验证CA证书是否吊销 revInfoIncludeFlag = res.sign.isRevokeInclude;//签名时是否嵌入吊销状态 //签名时是否嵌入时间戳 var isTsaInclude = res.sign.isTsaInclude; if(isTsaInclude){ for(var i=0;i\n' + ' \n' + ' '+that.VerifyInfos[i].signerName+'\n' + '
\n' + '
'+that.VerifyInfos[i].status1+'
\n' + '
\n' + '

'+that.VerifyInfos[i].moreInfo+'

\n' + '

域名:'+that.VerifyInfos[i].fieldName+'

\n' + '

签名时间:
'+that.VerifyInfos[i].signDate+'

\n' + '

'+that.VerifyInfos[i].signCertPathBuildText+'

\n' + '

'+that.VerifyInfos[i].hasTsaText+'
'+that.VerifyInfos[i].tsaDate+'

\n' + '

'+that.VerifyInfos[i].tsaCertPathBuildText+'

\n' + '

'+that.VerifyInfos[i].isVerifyRevokeText+'

\n' + '
\n' + '
\n' + ' '; })(i); } $('.netcasignInfo').append(htmlDOM); var len = $('.hasTsa').length; for(var j=0;j 1){ var _height = that.addHeight(signFields[i].pageNum); signFields[i].yPos = _height + signFields[i].yPos; } signFields[i].xPos = signFields[i].xPos + parseInt(_brank); signFields[i].width = signFields[i].width * newscale / scale; signFields[i].height = signFields[i].height * newscale / scale; // 签名域 $('#viewerContainer').append('
'); if(signFields[i].width === 0){ $('.netcafieldInfo').eq(i).css({"display":"none"}) } })(i); } that.selectSignatureField(); //选中签名域 显示签名状态中的某一个的签名信息 } else { $('#netcasignedDataVerify').css('display','none'); $('#viewerContainer').css({"margin-top":"0"}); $('#netcaDisplaySignedDataVerify').css('display','none'); } }; that.getSignatureFieldInfoFailedCallBack = function(res){ layer.closeAll('loading'); // alert('签名域信息失败:'+res.msg); }; that.zoomPDFBySelectOptionScale = function(){ // 缩放页面 重新描绘签名域 $('#scaleSelect').change(function(){ that.getSignatureFieldInfo(NetcaPDFSeal.SetPDFBytes, unfinishedStreamId); }) }; that.createRevokeEvent = function(streamId) { // filedFlag 普通签章完成后的 签名/章 才有撤销按钮;批量签章、骑缝章没有撤销按钮 if(filedFlag){ $('.netcafieldInfo').eq($('.netcafieldInfo').length-1).append('' + '' + ''); $('.netcafieldInfo').eq($('.netcafieldInfo').length-1).hover(function(){ $('#btn_discard').css({'display':'block'}); },function(){ $('#btn_discard').css({'display':'none'}); }); $('#btn_discard').click(function(){ // -1表示最后的一个签名/章 that.isLoading(); if(streamId){ that.signatureVerifierUndoPDF('',-1, unfinishedStreamId, true); } else { that.signatureVerifierUndoPDF(NetcaPDFSeal.SetPDFBytes,-1); } }); } }; that.signatureVerifierUndoPDF = function(_signBytes, _index, _streamId, _isReturnStreamId){ layer.confirm('是否需要撤销选定的签章?',{ btn: ['是','否'] //按钮 }, function(index){ layer.close(index); var params = { signFile: '', signBytes: _signBytes, index: _index, srcStreamId: _streamId, isReturnStreamId: _isReturnStreamId }; NetcaPKI.signatureVerifierUndoPDF(params) .Then(function (res) { if(res.srcBytes == null ||res.srcBytes.length ==0 ){ that.signatureVerifierUndoPDFReadStreamCallBack(res); return; } that.revokeSignatureSuccessCall(res.srcBytes); //撤章成功回调 }) .Catch(function (res) { layer.closeAll('loading'); alert('撤销签名/章失败:'+res.msg); }); }, function(){ layer.closeAll('loading'); }); }; that.revokeSignatureSuccessCall = function(srcBytes) { // 撤章成功回调 // 如果窗口大小改变 还得重绘签名域 NetcaPDFSeal.setPDFBytes(srcBytes); that.openPDF(NetcaPDFSeal.SetPDFBytes); filedFlag = false; if(signFields.length){ signFields.pop(); } if(that.VerifyInfos.length){ that.VerifyInfos.pop(); } that.displaySignedDataVerifyTip(that.VerifyInfos); $('.netcafieldInfo').last().remove(); $('.netcasignDetail').last().remove(); layer.closeAll('loading'); }; that.signatureVerifierUndoPDFReadStreamCallBack = function(signSuccessRes){ completedStreamId = signSuccessRes.srcBytesStream.streamId; signSuccessRes.destFileEncode=''; var params = { streamId: signSuccessRes.srcBytesStream.streamId, length: writeLength*1024*1024 }; NetcaPKI.readStream(params) .Then(function (res) { that.SignatureVerifierUndoPDFReadStreamUpdateCallBack(res, signSuccessRes); }) .Catch(function (res) { alert('撤销签名/章失败:'+res.msg); }); }; that.SignatureVerifierUndoPDFReadStreamUpdateCallBack = function(res, signSuccessRes) { completedStreamId = res.streamId; signSuccessRes.destFileEncode = signSuccessRes.destFileEncode + res.data; if(!res.hasMoreData) { that.revokeSignatureSuccessCall(signSuccessRes.destFileEncode); return; } var params = { streamId: res.streamId, length: writeLength*1024*1024 }; NetcaPKI.readStream(params) .Then(function (res) { that.SignatureVerifierUndoPDFReadStreamUpdateCallBack(res, signSuccessRes); }) .Catch(function (res) { alert('撤销签名/章失败:'+res.msg); }); }; /*** 选中签名域信息* */ that.selectSignatureField = function(){ var netcafieldInfo = document.getElementsByClassName("netcafieldInfo"); for(var i=0;i0){ clearInterval(interval); globalPDFViewerApplication.pdfDocument.getData().then(function(data){ // var PDFBytes = NetcaUtils.arrayBufferToBase64(data); NetcaPDFSeal.setPDFBytes(data); // if (can_netcasign) { // NetcaSignAPI.getSealConfigInfo(data); // } }) } } }, 1000); } } }; that.getVerifySignSuccessFlag = function(arr){ var invalidArr = []; var notSureArr = []; for(var i=0;i