netcasealpdf.js 77 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048
  1. /**
  2. * 2021-03-02 增加无外观签名
  3. * 2021-05-26 增加在线打开URL文件
  4. * */
  5. var NetcaUtils = (function(){
  6. 'use strict';
  7. var that = {};
  8. /**判断当前是否手动盖章界面*/
  9. that.isUserManualSignUI = function () {
  10. if ($('.netcasignpdf').length) {
  11. return true;
  12. }
  13. return false;
  14. };
  15. /**转换成pdf.js能直接解析的Uint8Array类型*/
  16. that.convertDataURIToBinary = function(dataURI){
  17. var raw = window.atob(dataURI);
  18. var rawLength = raw.length;
  19. var array = new Uint8Array(new ArrayBuffer(rawLength));
  20. for (var i = 0; i < rawLength; i++) {
  21. array[i] = raw.charCodeAt(i) & 0xff;
  22. }
  23. return array;
  24. };
  25. /**Uint8Array转为base64*/
  26. that.arrayBufferToBase64 =function(buffer) {
  27. var binary = '';
  28. var bytes = new Uint8Array(buffer);
  29. for (var len = bytes.byteLength, i = 0; i < len; i++) {
  30. binary += String.fromCharCode(bytes[i]);
  31. }
  32. return window.btoa(binary);
  33. };
  34. return that;
  35. })();
  36. var NetcaSignAPI = (function(){
  37. 'use strict';
  38. var that = {
  39. VerifyInfos: null //验证信息
  40. };
  41. var isOnlineverifyrevoke = null;
  42. var click_x = null;
  43. var click_y = null;
  44. var sealImage_halfWidth = null;
  45. var sealImage_halfheight = null;
  46. var sealImageSrc = null;
  47. var certEncode = null;
  48. var originImage_width = null;
  49. var originImage_height = null;
  50. var tagObj = {
  51. width: '', //签章图片宽度
  52. height: '' //签章图片高度
  53. };
  54. var timeStamp = {
  55. tsaUrl: '', //时间戳地址
  56. tsaUsr: '', //时间戳服务对应用户名
  57. tsaPwd: '',//时间戳服务对应用户的密码
  58. tsaHashAlgo: ''
  59. };
  60. var revInfoIncludeFlag = null; //是否包含吊销信息
  61. var isVerifyRevoke = null;//是否获取吊销信息
  62. var verifyLevel = null; //验证级别
  63. var signFields = []; //签名域信息
  64. var isDisplayVerifyTips = null;
  65. var isVerifyOpen = false; //初次进入页面,是否开启在线自动验证文档有效性
  66. var isVerifyOpenWithOpenBtn = null; //使用打开按钮时,是否开启在线自动验证文档有效性
  67. var filedFlag = false; //判断是否为刚签完的章
  68. var zoom = false; //缩放
  69. var completedStreamId; //已签数据流信息
  70. var unfinishedStreamId; //未完成数据流信息
  71. var bigFileSize = 20; //大文件
  72. var writeLength = 10; //写入文件大小
  73. that.initUI = function(){
  74. if(NetcaUtils.isUserManualSignUI()) {
  75. // 签章绑定事件
  76. that.bindSignFn('netcasign');
  77. that.bindSignFn('connect');
  78. that.bindSignFn('batchsign');
  79. that.bindSignFn('pagingsign');
  80. // 显示签章菜单背景色
  81. that.transBackground('netcasign');
  82. that.transBackground('batchsign');
  83. that.transBackground('pagingsign');
  84. // toorbar 签章按钮
  85. $('#sign').click(function(){
  86. if($('.netcasignmenu').css('display') === 'none') {
  87. $('.netcasignmenu').css('display','block');
  88. } else if($('.netcasignmenu').css('display') === 'block') {
  89. $('.netcasignmenu').css('display','none');
  90. }
  91. });
  92. /// 签章菜单 hover
  93. for(var k=0; k<$('.netcasignmemuitem').length;k++) {
  94. (function(k){
  95. $('.netcasignmemuitem').eq(k).hover(function(){
  96. $(this).children('ul').css('display','block');
  97. $(this).css('background','#DBECFF');
  98. },function(){
  99. $(this).children('ul').css('display','none');
  100. $(this).css('background','#fff');
  101. });
  102. })(k)
  103. }
  104. /**选中option,缩放pdf*/
  105. that.zoomPDFBySelectOptionScale();
  106. //绑定事件
  107. document.getElementById('verify').addEventListener('click',function(){
  108. that.isLoading();
  109. isDisplayVerifyTips = true;
  110. if(that.isBigFile(NetcaPDFSeal.SetPDFBytes)){
  111. that.signedDataVerify('','',verifyLevel,isOnlineverifyrevoke, unfinishedStreamId)
  112. } else {
  113. that.signedDataVerify('',NetcaPDFSeal.SetPDFBytes,verifyLevel,isOnlineverifyrevoke)
  114. }
  115. });
  116. document.getElementById('print').addEventListener('click',that.printPDF);
  117. document.getElementById('netcainvalidClose').addEventListener('click', function(){that.closeSignedDataVerifyInfo('netcainvalidClose')});
  118. document.getElementById('netcaclose2').addEventListener('click', function(){that.closeSignedDataVerifyInfo('netcaclose2')});
  119. document.getElementById('netcainvalidBtn').addEventListener('click', that.displaySignedDataVerifyInfo);
  120. document.getElementById('zoomIn').addEventListener('click', that.zoomPDF);
  121. document.getElementById('zoomOut').addEventListener('click', that.zoomPDF);
  122. document.getElementById('closeFile').addEventListener('click', that.closeFile);
  123. // 控件显示
  124. $('#netcasignpdf').css('display','block');
  125. $('#NetcaReaderAx').css('display','none');
  126. //打开按钮
  127. $('#openFile input[type="file"]').on('change', function(ev){
  128. var file = ev.target.files[0];
  129. that.openFile(file);
  130. });
  131. }
  132. };
  133. // 缩放PDF
  134. that.zoomPDF = function(){
  135. zoom = true;
  136. that.getSignatureFieldInfo(NetcaPDFSeal.SetPDFBytes, unfinishedStreamId);
  137. };
  138. /**获取证书列表*/
  139. that.getCertList = function(e){
  140. if($('.netcasignmenu').css('display') === 'block'){
  141. $('.netcasignmenu').css('display','none');
  142. }
  143. var clickTargetId = e.target.parentNode.parentNode.getAttribute('id'); //员工 机构 法人
  144. var clickTargetClass = e.target.getAttribute('class'); //普通 批量 骑缝章 切换用户
  145. // 签章0 批量签章1 骑缝章2 切换用户3 普通签章0 员工签章1 机构签章2 法人签章3
  146. var signObj = that.signFn(clickTargetId, clickTargetClass);
  147. var index = that.isLoading();
  148. if(clickTargetId){
  149. // 粤商通
  150. that.selectSealSigntureInfoWithDispaly(signObj, index);
  151. } else {
  152. // 标准版
  153. that.isInsertKey(signObj, index);
  154. }
  155. };
  156. that.signFn = function(targetId, targetClass) {
  157. var _type , _key;
  158. switch(targetId) {
  159. // 员工签章
  160. case 'netcastaff':
  161. _type = 1;
  162. break;
  163. // 机构签章
  164. case 'netcaorganization':
  165. _type = 2;
  166. break;
  167. // 法人签章
  168. case 'netcalegalperson':
  169. _type = 3;
  170. break;
  171. // 普通签章
  172. default:
  173. _type = 0;
  174. break;
  175. }
  176. switch(targetClass) {
  177. // 签章
  178. case 'netcasign':
  179. _key = 0;
  180. break;
  181. // 批量签章
  182. case 'batchsign':
  183. _key = 1;
  184. break;
  185. // 骑缝章
  186. case 'pagingsign':
  187. _key = 2;
  188. break;
  189. // 切换用户
  190. case 'connect':
  191. _key = 3;
  192. break;
  193. }
  194. if(_key === 0 || _key === 3){
  195. // 普通签章
  196. return {
  197. signMenu: _type,
  198. signType:_key,
  199. batchSignParams: null,
  200. acrosspageSignParams:null
  201. }
  202. } else{
  203. // 批量签章 骑缝章
  204. return {
  205. signMenu: _type,
  206. signType:_key,
  207. batchSignParams: { // 批量签章参数
  208. startPageNum: 1,//开始页码
  209. endPageNum: globalPDFViewerApplication.pagesCount//结束页码,-1表示最后一页
  210. },
  211. acrosspageSignParams:{ // 骑缝章参数
  212. startPageNum: 1,//开始页码
  213. endPageNum: globalPDFViewerApplication.pagesCount//结束页码,-1表示最后一页
  214. }
  215. }
  216. }
  217. };
  218. // 绑定签章按钮初始化功能事件
  219. that.bindSignFn = function(name){
  220. var eleName = document.getElementsByClassName(name);
  221. for(var i=0;i<eleName.length;i++){
  222. (function(i){
  223. document.getElementsByClassName(name)[i].addEventListener('click', that.getCertList);
  224. }(i))
  225. }
  226. };
  227. // 点击 签章 按钮,普通签章,先判断是否插入key
  228. that.isInsertKey = function(signObj, index) {
  229. var params = {};
  230. NetcaPKI.isInsertKey(params)
  231. .Then(function (res) {
  232. if (res.insertCount > 0) {
  233. that.InsertCallBack(signObj, index);
  234. }
  235. else {
  236. that.UnInsertCallBack(res, index);
  237. }
  238. })
  239. .Catch(function (res) {
  240. that.UnInsertCallBack(res, index);
  241. });
  242. };
  243. that.InsertCallBack = function(signObj, index) {
  244. that.selectSealSigntureInfoWithDispaly(signObj, index)
  245. };
  246. that.UnInsertCallBack = function(res, index) {
  247. layer.close(index);
  248. if(!res.insertCount){
  249. alert('找不到签名证书,请检查设备是否连接正确')
  250. }
  251. };
  252. // 点击签章按钮,弹出证书选择框
  253. that.selectSealSigntureInfoWithDispaly = function(signObj, index){
  254. var params = {
  255. signMenu: signObj.signMenu,
  256. signType: signObj.signType,
  257. batchSignParams: signObj.batchSignParams,
  258. acrosspageSignParams: signObj.acrosspageSignParams
  259. };
  260. NetcaPKI.SelectSealSigntureInfoWithDispaly(params)
  261. .Then(function(res) {
  262. NetcaSignAPI.selectSealSigntureInfoWithDispalySuccessCallBack(res, signObj,index);
  263. })
  264. .Catch(function(res) {
  265. NetcaSignAPI.selectSealSigntureInfoWithDispalyFailCallBack(res, index)
  266. });
  267. };
  268. that.selectSealSigntureInfoWithDispalySuccessCallBack = function(res, signObj,index) {
  269. certEncode = res.cert; //证书编码
  270. tagObj.width = res.width; //印章宽度
  271. tagObj.height = res.height; //印章高度
  272. sealImageSrc = res.picture; //印章编码
  273. if(signObj.acrosspageSignParams || signObj.batchSignParams){
  274. signObj.acrosspageSignParams.startPageNum = res.acrosspageSignParams.startPageNum;
  275. signObj.acrosspageSignParams.endPageNum = res.acrosspageSignParams.endPageNum;
  276. signObj.batchSignParams.startPageNum = res.batchSignParams.startPageNum;
  277. signObj.batchSignParams.endPageNum = res.batchSignParams.endPageNum;
  278. }
  279. // 无外观签名
  280. if(res.type === 2){
  281. that.seal_SignSealPosition(-1, res.type);
  282. return;
  283. }
  284. that.setSignImageSize();
  285. that.signImageMoveEvent(signObj, res.type);
  286. layer.close(index);
  287. };
  288. that.selectSealSigntureInfoWithDispalyFailCallBack = function(res, index) {
  289. layer.close(index);
  290. alert(res.msg);
  291. };
  292. /**
  293. 设置跟随鼠标移动的图片大小
  294. 图像的像素宽度为 originImage_width,水平分辨率为 72 点/英寸
  295. 如果调用此方法在分辨率为 96 点/英寸的设备上绘制该图像,则所呈现图像的像素宽度就是: (originImage_width/72)*96
  296. * */
  297. that.setSignImageSize = function(){
  298. var val = that.getScale();//缩放比例
  299. var scale = 0.75;//当前缩放比例
  300. $('#NetcaSignMoveImage').width(tagObj.width);
  301. $('#NetcaSignMoveImage').height(tagObj.height);
  302. $('#NetcaSignMoveImage').attr('src',"data:image/PNG;base64," + sealImageSrc);
  303. originImage_width = $('#NetcaSignMoveImage').width();
  304. var w = (originImage_width * val)/ scale;
  305. $('.NetcaSignMoveDiv').width(w);
  306. originImage_height = $('#NetcaSignMoveImage').height();
  307. var h = (originImage_height * val)/ scale;
  308. $('.NetcaSignMoveDiv').height(h);
  309. $('#NetcaSignMoveImage').css({
  310. 'width':'100%',
  311. 'height':'100%'
  312. });
  313. sealImage_halfWidth = parseInt($('.NetcaSignMoveDiv').width()) / 2;
  314. sealImage_halfheight = parseInt($('.NetcaSignMoveDiv').height()) / 2;
  315. };
  316. /**鼠标移动签章图片事件 mousemove*/
  317. that.signImageMoveEvent = function(signObj, type){
  318. $(document).mousemove(function(event){
  319. var ev = event || window.event;
  320. /**position left和top 设置鼠标位于图片中央*/
  321. $('.NetcaSignMoveDiv').css({
  322. 'display':'block',
  323. 'left':ev.clientX - sealImage_halfWidth + 'px',
  324. 'top':ev.clientY - sealImage_halfheight +'px'
  325. })
  326. });
  327. $(document).mousedown(function(){
  328. that.netcaPDFClickEvent(signObj, type)
  329. });
  330. $(document).mouseup(function(){
  331. $(document).unbind('mousedown');
  332. $(document).unbind('mousemove');
  333. });
  334. /**点击右键 取消签章*/
  335. $(document).bind('contextmenu', function(){
  336. that.hideSignImage();
  337. $('#viewer').unbind('click');
  338. return false;
  339. });
  340. };
  341. // 打开文件
  342. that.openPDF = function(base64Val) {
  343. if(that.isBigFile(base64Val)){
  344. // 重新打开时 删除旧的streamId,保存新的streamId
  345. if(unfinishedStreamId){
  346. that.destoryStreamCallBack(unfinishedStreamId)
  347. }
  348. unfinishedStreamId = completedStreamId;
  349. } else {
  350. unfinishedStreamId = null;
  351. completedStreamId = null;
  352. }
  353. // 渲染入口
  354. var Bytes = NetcaUtils.convertDataURIToBinary(base64Val);
  355. globalPDFViewerApplication.open(Bytes);
  356. };
  357. that.isLoading = function() {
  358. var loading = layer.load(1, {
  359. shade: [0.1,'#000'] //0.1透明度的白色背景
  360. });
  361. return loading
  362. };
  363. // 打开按钮
  364. that.openFile = function(file){
  365. isVerifyOpen = isVerifyOpenWithOpenBtn;//打开按钮,文档加载时是否自动验证文档有效性
  366. that.isLoading();
  367. var reader = new FileReader();
  368. reader.readAsDataURL(file);
  369. reader.onload = function (){
  370. var result = reader.result.split(',')[1];
  371. NetcaPDFSeal.setPDFBytes(result);
  372. that.openPDF(result);
  373. if(that.isBigFile(result)){
  374. var params = {srcBytes: result};
  375. that.createStreamCallBack(params);
  376. } else {
  377. that.getSignatureFieldInfo(NetcaPDFSeal.SetPDFBytes);//小文件
  378. }
  379. };
  380. // 验证提示隐藏
  381. $('#netcasignedDataVerify').css('display', 'none');
  382. $('#netcaDisplaySignedDataVerify').css('display', 'none');
  383. $('#viewerContainer').css('margin-top', '0');
  384. };
  385. //高度累加,计算纵坐标
  386. that.addHeight = function(n){
  387. var result = 0;
  388. while(n >= 2) {
  389. var _height = $('#viewer .page').eq(n-2).height() + 11;
  390. result += _height;
  391. n--;
  392. }
  393. return result;
  394. };
  395. // viewer点击事件
  396. that.netcaPDFClickEvent = function(signObj, type){
  397. var pdfviewer = document.getElementById('netcasignpdf');
  398. var pdfviewerL = pdfviewer.offsetLeft;
  399. var pdfviewerT = pdfviewer.offsetTop;
  400. var flag = 2;
  401. var pageNum = globalPDFViewerApplication.page;//当前页码
  402. // 前n-1页 高度
  403. var _height = 0;
  404. if(pageNum > 1){
  405. _height = that.addHeight(pageNum);
  406. }
  407. $('#viewer').click(function(e){
  408. flag--;
  409. /**鼠标点击的位置,相对于文档的左边缘/上边缘*/
  410. var client_x = e.clientX;
  411. var client_y = e.clientY;
  412. var viewer_width = $('#viewer').width();
  413. var blank_top = $('#toolbarViewer').height() + 9;
  414. var pdfscrollTop = $('#viewerContainer').scrollTop(); //文档滚动高度
  415. //验证提示信息的高度
  416. if($('#netcasignedDataVerify').css('display') === 'block'){
  417. blank_top = blank_top + $('#netcasignedDataVerify').outerHeight();
  418. }
  419. var clicky_temp = client_y - blank_top + pdfscrollTop - pdfviewerT;
  420. click_y = clicky_temp - _height;
  421. var page_width = $('#viewer .page').eq(pageNum-1).width();
  422. var blank_left = (viewer_width - page_width) / 2;
  423. var clickx_temp = client_x - pdfviewerL;
  424. click_x = clickx_temp - blank_left;
  425. //假如显示第1页,签第2页的位置
  426. var currentPageHeight = that.addHeight(pageNum + 1);
  427. if(currentPageHeight < clicky_temp){
  428. pageNum = pageNum + 1;
  429. that.calculateCurrentHeightAgain(pageNum, clickx_temp, clicky_temp, viewer_width);
  430. }
  431. // 假如显示第2页,签第1页页尾位置
  432. if(click_y<0){
  433. //计算负数 重算高度 宽度
  434. pageNum = pageNum -1;
  435. that.calculateCurrentHeightAgain(pageNum, clickx_temp, clicky_temp, viewer_width);
  436. }
  437. if(flag>0){
  438. /**每次点击只触发一次签章 超出文档左右界线不能点击签章*/
  439. if(click_x>0 && (viewer_width - click_x - blank_left) >= blank_left){
  440. that.isLoading();
  441. if(signObj.signType === 1 || signObj.signType === 2) {
  442. // 批量签章 骑缝章
  443. that.Seal_signatureCreatorBatchOrAcrossPage(signObj, pageNum, type)
  444. } else {
  445. // 签章函数
  446. that.seal_SignSealPosition(pageNum, type)
  447. }
  448. } else {
  449. that.hideSignImage();
  450. alert('不在签章范围内')
  451. }
  452. }
  453. })
  454. };
  455. that.calculateCurrentHeightAgain = function(pageNum, clickx_temp, clicky_temp, viewer_width){
  456. var _height;
  457. if(pageNum > 1){
  458. _height = that.addHeight(pageNum);
  459. } else {
  460. _height = 0;
  461. }
  462. click_y = clicky_temp - _height;
  463. var page_width = $('#viewer .page').eq(pageNum-1).width();
  464. var blank_left = (viewer_width - page_width) / 2;
  465. click_x = clickx_temp - blank_left;
  466. };
  467. that.seal_SignSealPositionForBigFileWriteCallBack = function(signParams)
  468. {
  469. signParams.srcBytes = '';
  470. signParams.srcStreamId = streamId; //streamId 全局变量
  471. NetcaPKI.SignatureCreatorPdfSignSealFieldOrPosition(signParams)
  472. .Then(function (res) {
  473. that.SignatureCreatorSuccessCallBack(res);
  474. })
  475. .Catch(function (res) {
  476. that.SignatureCreatorFailedCallBack(res);
  477. });
  478. };
  479. that.seal_SignSealPositionForBigFile = function(signParams) {
  480. that.seal_SignSealPositionForBigFileWriteCallBack(signParams);
  481. };
  482. that.seal_SignSealPosition = function(_pageNum, _type) {
  483. var newscale = that.getScale();//缩放比例
  484. var scale = 0.75; // 75% 对应72dpi; 如果不是75%缩放比例,需要对应转换为72dpi的坐标大小
  485. var _xPos = parseInt((scale / newscale)*(click_x - sealImage_halfWidth));//签名域/签章左下角的水平向右方向坐标
  486. var _yPos = parseInt((scale / newscale)*(click_y - sealImage_halfheight));//签名域/签章左下角的垂直向上方向坐标
  487. var params = {
  488. srcFile: '', //源pdf文件
  489. srcBytes: NetcaPDFSeal.SetPDFBytes, //源Pdf文件的Base64编码
  490. destFile: '', //目标pdf文件
  491. certEncode: certEncode, //签名证书Base64编码
  492. selMode: 1, //操作模式
  493. signFieldText: '', //签名域显示的文字
  494. sealImageEncode: sealImageSrc, //签章图片Base64编码
  495. revInfoIncludeFlag: revInfoIncludeFlag,//是否包含吊销信息
  496. SignPosition: //签名位置对象
  497. {
  498. pageNum: _pageNum, //PDF文档的页码
  499. xPos: _xPos, //签名域/签章左下角的水平向右方向坐标
  500. yPos: _yPos, //签名域/签章左下角的垂直向上方向坐标
  501. width: parseInt(originImage_width), //签名域/签章的宽度
  502. height: parseInt(originImage_height) //签名域/签章的高度
  503. },
  504. Tsa: //时间戳对象
  505. {
  506. tsaUrl: timeStamp.tsaUrl, //时间戳地址
  507. tsaUsr: timeStamp.tsaUsr, //时间戳服务对应用户名
  508. tsaPwd: timeStamp.tsaPwd, //时间戳服务对应用户的密码
  509. tsaHashAlgo: timeStamp.tsaHashAlgo //时间戳使用的hash算法,例如”sha-1”,”sha-256”等
  510. },
  511. synVerify: true, //签完名之后同步验证文档
  512. synGetSignFiled: true, //签完名之后同步获取签名域
  513. level: verifyLevel, //验证级别
  514. onlineVerifyRevok: isOnlineverifyrevoke //是否在线验证吊销信息
  515. };
  516. if(_type === 2){
  517. //无外观签名
  518. params.sealImageEncode = null;
  519. params.SignPosition =
  520. {
  521. pageNum:-1,
  522. xPos:0,
  523. yPos:0,
  524. width:0,
  525. height:0
  526. };
  527. params.visible=false;
  528. }
  529. if(that.isBigFile(params.srcBytes))
  530. {
  531. params.srcBytes = '';
  532. params.srcStreamId = unfinishedStreamId;
  533. params.isReturnStreamId = true;
  534. }
  535. NetcaPKI.SignatureCreatorPdfSignSealFieldOrPosition(params)
  536. .Then(function (res) {
  537. filedFlag = true;//开启刚签完的章能撤章
  538. that.SignatureCreatorSuccessCallBack(res);
  539. })
  540. .Catch(function (res) {
  541. that.SignatureCreatorFailedCallBack(res);
  542. });
  543. };
  544. /**批量签章或骑缝章 要求文件没有做过电子签章/签名*/
  545. that.Seal_signatureCreatorBatchOrAcrossPage = function(signObj, _pageNum, _type){
  546. //var page = _pageNum;//当前页码
  547. var newscale = that.getScale();//缩放比例
  548. var scale = 0.75; // 75% 对应72dpi; 如果不是75%缩放比例,需要对应转换为72dpi的坐标大小
  549. var _xPos = parseInt((scale / newscale)*(click_x - sealImage_halfWidth));//签名域/签章左下角的水平向右方向坐标
  550. var _yPos = parseInt((scale / newscale)*(click_y - sealImage_halfheight));//签名域/签章左下角的垂直向上方向坐标
  551. //Tsa对象说明
  552. var Tsa = {
  553. tsaUrl: timeStamp.tsaUrl, //时间戳地址
  554. tsaUsr: timeStamp.tsaUsr, //时间戳服务对应用户名
  555. tsaPwd: timeStamp.tsaPwd, //时间戳服务对应用户的密码
  556. tsaHashAlgo: timeStamp.tsaHashAlgo
  557. };
  558. //批量签章
  559. if(signObj.signType === 1){
  560. //batchSeal对象说明
  561. var batchSeal = {
  562. signaturePage: signObj.batchSignParams.startPageNum, //电子签章所在页码,目前仅支持批量签章开始页或结束页
  563. xPos: _xPos, //签名域/签章左下角的水平向右方向坐标
  564. yPos: _yPos, //签名域/签章左下角的垂直向上方向坐标
  565. width: parseInt(originImage_width),
  566. height: parseInt(originImage_height),
  567. startPage: signObj.batchSignParams.startPageNum, // 从开始页计算,第n页:例如:1为第一页;
  568. endPage: signObj.batchSignParams.endPageNum //从最尾页计算,最后第n页:例如:-1为最后一页
  569. };
  570. var params = {
  571. srcBytes : NetcaPDFSeal.SetPDFBytes, //目标pdf文件
  572. certEncode : certEncode, //签名证书Base64编码
  573. sealImageEncode : sealImageSrc, //签章图片Base64编码
  574. revInfoIncludeFlag : revInfoIncludeFlag,//是否包含吊销信息
  575. batchSeal: batchSeal, //batchSeal对象说明
  576. Tsa: Tsa, //Tsa对象说明
  577. synVerify: true, //签完名之后同步验证文档
  578. synGetSignFiled: true, //签完名之后同步获取签名域
  579. level: verifyLevel, //验证级别
  580. onlineVerifyRevok: isOnlineverifyrevoke //是否在线验证吊销信息
  581. };
  582. if(that.isBigFile(params.srcBytes)) {
  583. params.srcBytes = '';
  584. params.srcStreamId = unfinishedStreamId;
  585. params.isReturnStreamId = true;
  586. }
  587. NetcaPKI.signatureCreatorBatchSeal(params)
  588. .Then(function(res){
  589. NetcaSignAPI.SignatureCreatorSuccessCallBack(res)
  590. })
  591. .Catch(function(res){
  592. NetcaSignAPI.SignatureCreatorFailedCallBack(res)
  593. })
  594. }
  595. //骑缝章
  596. if(signObj.signType === 2){
  597. //acrossPageSeal对象说明
  598. var acrossPageSeal = {
  599. signaturePage: signObj.acrosspageSignParams.startPageNum, //电子签章所在页码,目前仅支持批量签章开始页或结束页
  600. xPos: _xPos, //签名域/签章左下角的水平向右方向坐标
  601. yPos: _yPos, //签名域/签章左下角的垂直向上方向坐标
  602. width: parseInt(originImage_width),
  603. height: parseInt(originImage_height),
  604. startPage: signObj.acrosspageSignParams.startPageNum, // 从开始页计算,第n页:例如:1为第一页;
  605. endPage: signObj.acrosspageSignParams.endPageNum //从最尾页计算,最后第n页:例如:-1为最后一页
  606. };
  607. var params = {
  608. srcBytes : NetcaPDFSeal.SetPDFBytes, //目标pdf文件
  609. certEncode : certEncode, //签名证书Base64编码
  610. sealImageEncode : sealImageSrc, //签章图片Base64编码
  611. revInfoIncludeFlag : revInfoIncludeFlag,//是否包含吊销信息
  612. acrossPageSeal: acrossPageSeal, //batchSeal对象说明
  613. Tsa: Tsa, //Tsa对象说明
  614. synVerify: true, //签完名之后同步验证文档
  615. synGetSignFiled: true, //签完名之后同步获取签名域
  616. level: verifyLevel, //验证级别
  617. onlineVerifyRevok: isOnlineverifyrevoke //是否在线验证吊销信息
  618. };
  619. if(that.isBigFile(params.srcBytes)) {
  620. params.srcBytes = '';
  621. params.srcStreamId = unfinishedStreamId;
  622. params.isReturnStreamId = true;
  623. }
  624. NetcaPKI.signatureCreatorAcrossPageSeal(params)
  625. .Then(function(res){
  626. NetcaSignAPI.SignatureCreatorSuccessCallBack(res)
  627. })
  628. .Catch(function(res){
  629. NetcaSignAPI.SignatureCreatorFailedCallBack(res)
  630. })
  631. }
  632. };
  633. that.SignatureCreatorSuccessReadStreamUpdateCallBack = function(res, signSuccessRes,index)
  634. {
  635. completedStreamId = res.streamId;
  636. signSuccessRes.destFileEncode=signSuccessRes.destFileEncode+res.data;
  637. if(!res.hasMoreData)
  638. {
  639. that.SignatureCreatorCallBack(signSuccessRes, res.streamId);
  640. return;
  641. }
  642. var params = {
  643. streamId: res.streamId,
  644. length: writeLength*1024*1024
  645. };
  646. NetcaPKI.readStream(params)
  647. .Then(function (res) {
  648. that.SignatureCreatorSuccessReadStreamUpdateCallBack(res, signSuccessRes);
  649. })
  650. .Catch(function (res) {
  651. that.SignatureCreatorFailedCallBack(res, index);
  652. });
  653. };
  654. that.SignatureCreatorSuccessReadStreamCallBack = function(signSuccessRes)
  655. {
  656. completedStreamId = signSuccessRes.destFileStream.streamId;
  657. signSuccessRes.destFileEncode='';
  658. var params = {
  659. streamId: signSuccessRes.destFileStream.streamId,
  660. length: writeLength*1024*1024
  661. };
  662. NetcaPKI.readStream(params)
  663. .Then(function (res) {
  664. that.SignatureCreatorSuccessReadStreamUpdateCallBack(res, signSuccessRes);
  665. })
  666. .Catch(function (res) {
  667. that.SignatureCreatorFailedCallBack(res);
  668. });
  669. };
  670. // 签章成功回调
  671. that.SignatureCreatorSuccessCallBack = function(res){
  672. var streamId;
  673. if(res.destFileStream){
  674. streamId = res.destFileStream.streamId;
  675. }
  676. //大文件
  677. if(res.destFileEncode == null ||res.destFileEncode.length ==0 )
  678. {
  679. that.SignatureCreatorSuccessReadStreamCallBack(res);
  680. return;
  681. }
  682. that.SignatureCreatorCallBack(res, streamId)
  683. };
  684. // 签章成功回调
  685. that.SignatureCreatorCallBack = function(res, streamId){
  686. that.resetOriginalState(res.destFileEncode);
  687. that.SignatureCallBack(res, streamId);
  688. NetcaPDFSeal.setPDFBytes(res.destFileEncode);
  689. alert('签名/章成功');
  690. var interval = setInterval(function(){
  691. if (globalPDFViewerApplication.pdfDocument == null) {
  692. console.info('Loading...');
  693. } else {
  694. if($('#viewer .page').length>0){
  695. console.info('Load Success...');
  696. clearInterval(interval);
  697. that.describeSignatureField(); //描绘签名域
  698. that.createRevokeEvent(streamId); //撤章事件
  699. }
  700. }
  701. }, 1000);
  702. certEncode = null;
  703. sealImageSrc = null;
  704. if(that.signCallbackEvent != null)
  705. {
  706. that.signCallbackEvent(JSON.stringify(res))
  707. }
  708. };
  709. that.SignatureCallBack = function(res){
  710. signFields = res.signFields; //签名域信息
  711. that.VerifyInfos = res.VerifyInfos; //验证信息
  712. that.displaySignedDataVerifyTip( res.VerifyInfos); // toobar下验证提示信息
  713. that.createSignedDataVerifyInfo(); // 创建左边 签名状态 每个签名信息
  714. that.displayCert(); // 显示证书信息
  715. that.displayInfoFeild(); // 每个签名信息伸展或收缩显示
  716. layer.closeAll('loading');
  717. };
  718. //创建数据流
  719. that.createStreamCallBack = function(signParams){
  720. var params = {
  721. length: signParams.srcBytes.length
  722. };
  723. NetcaPKI.createStream(params)
  724. .Then(function (res) {
  725. unfinishedStreamId = res.streamId;
  726. that.writeStreamCallBack(res, signParams)
  727. })
  728. .Catch(function (res) {
  729. layer.closeAll('loading');
  730. alert(res.msg);
  731. });
  732. };
  733. // 写入数据流
  734. that.writeStreamCallBack = function(res, signParams) {
  735. //写入数据完成
  736. if( res.streamWritePos >= signParams.srcBytes.length ) {
  737. that.getSignatureFieldInfo('', res.streamId);
  738. return;
  739. }
  740. var params = {
  741. streamId:res.streamId,
  742. data:signParams.srcBytes.substr(res.streamWritePos,writeLength*1024*1024)
  743. };
  744. NetcaPKI.writeStream(params)
  745. .Then(function (res) {
  746. that.writeStreamCallBack(res, signParams);
  747. })
  748. .Catch(function (res) {
  749. layer.closeAll('loading');
  750. alert(res.msg);
  751. });
  752. };
  753. //读取数据流
  754. that.readStreamCallBack = function() {
  755. //10M
  756. var params = {
  757. streamId: stream.streamId,
  758. length: writeLength*1024*1024
  759. };
  760. NetcaPKI.readStream(params)
  761. .Then(function (res) {
  762. that.readStreamUpdateCallBack(res)
  763. })
  764. .Catch(function (res) {
  765. alert(res.msg)
  766. });
  767. };
  768. that.readStreamUpdateCallBack = function(res) {
  769. NetcaPDFSeal.SetPDFBytes += res.data;
  770. };
  771. // 销毁数据流
  772. that.destoryStreamCallBack = function(id){
  773. var params = {
  774. streamId: id
  775. };
  776. NetcaPKI.destoryStream(params)
  777. .Then(function (res) {
  778. // console.log('销毁数据成功')
  779. })
  780. .Catch(function (res) {
  781. alert(res.msg)
  782. });
  783. };
  784. // 大文件 与 小文件 处理方式划分
  785. that.isBigFile = function(srcBytes){
  786. if (srcBytes != null && srcBytes.length > bigFileSize*1024 * 1024)
  787. {
  788. return true;
  789. } else {
  790. return false;
  791. }
  792. };
  793. // 签章失败回调
  794. that.SignatureCreatorFailedCallBack = function(res){
  795. that.hideSignImage();
  796. alert("签名/章失败 " + res.msg);
  797. if(that.signCallbackEvent != null)
  798. {
  799. that.signCallbackEvent(JSON.stringify(res))
  800. }
  801. layer.closeAll('loading');
  802. };
  803. /**
  804. * 隐藏签章图片
  805. * */
  806. that.hideSignImage = function(){
  807. $('.NetcaSignMoveDiv').css({'display':'none'});
  808. };
  809. /**
  810. * 重置状态:关闭layer、签章图片隐藏、展示最新pdf
  811. * */
  812. that.resetOriginalState = function(res){
  813. that.openPDF(res);
  814. $('#NetcaSignMoveImage').attr('src','');
  815. that.hideSignImage();
  816. };
  817. //获取页面缩放比例
  818. that.getScale = function(){
  819. var scale = Number($('#scaleSelect').val());//缩放比例
  820. /*
  821. ctrl+鼠标缩放页面时,缩放倍数不是option中预设的,获取到的scale会是0;
  822. 通过globalPDFViewerApplication.getCurrentScale()拿到当前的scale
  823. * */
  824. var currentScale = globalPDFViewerApplication.getCurrentScale();
  825. scale = scale ?scale:currentScale;
  826. return scale;
  827. };
  828. /**
  829. * 获取签章客户端的配置信息
  830. * */
  831. that.getSealConfigInfo = function(OpenPDFBytes) {
  832. that.isLoading();
  833. $(".netcafieldInfo").remove(); //先删除旧的签名域
  834. var params = {};
  835. NetcaPKI.getSealConfigInfo(params)
  836. .Then(function(res) {
  837. that.getSealConfigInfoSuccessCallBack(res, OpenPDFBytes);
  838. })
  839. .Catch(function(res) {
  840. that.getSealConfigInfoFailCallBack(res)
  841. });
  842. };
  843. that.getSealConfigInfoSuccessCallBack = function(res, OpenPDFBytes){
  844. isVerifyRevoke = res.verify.isVerifyRevoke; //是否验证签名时签名证书的吊销状态
  845. isOnlineverifyrevoke = res.verify.isOnlineVerifyRevoke;//是否在线获取吊销信息
  846. verifyLevel = res.verify.verifySignLevel;//验证签名的级别 3:验证签名和证书,并且验证签名证书的吊销状态;但不验证CA证书是否吊销
  847. revInfoIncludeFlag = res.sign.isRevokeInclude;//签名时是否嵌入吊销状态
  848. //签名时是否嵌入时间戳
  849. var isTsaInclude = res.sign.isTsaInclude;
  850. if(isTsaInclude){
  851. for(var i=0;i<res.timeStamp.length;i++){
  852. (function(i){
  853. if(res.timeStamp[i].checked){
  854. timeStamp.tsaUrl = res.timeStamp[i].url;
  855. }
  856. })(i);
  857. }
  858. }
  859. // 打开文档时是否自动验证签名
  860. isVerifyOpen = res.verify.isVerifyOpen;
  861. isVerifyOpenWithOpenBtn = res.verify.isVerifyOpen;
  862. // 第一次创建数据流 大文件 创建流后再去验证文档
  863. if(that.isBigFile(OpenPDFBytes)){
  864. var params = { srcBytes: OpenPDFBytes};
  865. that.createStreamCallBack(params);
  866. } else {
  867. // 获取签名域,再验证
  868. NetcaSignAPI.getSignatureFieldInfo(OpenPDFBytes);
  869. }
  870. };
  871. /**
  872. * signatureVerifierVerifyPDF PDF签名文档进行验证
  873. * */
  874. that.signedDataVerify = function(_srcFile, _srcBytes, _level, _onlineVerifyRevoke,streamId){
  875. var params = {
  876. srcFile: _srcFile,
  877. srcBytes: _srcBytes,
  878. srcStreamId: streamId,
  879. level: _level,
  880. onlineVerifyRevoke: _onlineVerifyRevoke
  881. };
  882. NetcaPKI.signatureVerifierVerifyPDF(params)
  883. .Then(function (res) {
  884. that.SuccessSignedDataVerifyCallBack(res);
  885. })
  886. .Catch(function (res) {
  887. that.FailedSignedDataVerifyCallBack(res);
  888. });
  889. };
  890. that.SuccessSignedDataVerifyCallBack = function(res){
  891. that.VerifyInfos = res.VerifyInfos; // 验证结果
  892. that.displaySignedDataVerifyTip( res.VerifyInfos); // toobar下验证提示信息
  893. that.createSignedDataVerifyInfo(); // 创建左边 签名状态 每个签名信息
  894. that.displayCert(); // 显示证书信息
  895. that.displayInfoFeild(); // 每个签名信息伸展或收缩显示
  896. if(that.verifyCallbackEvent !=null){
  897. that.verifyCallbackEvent(JSON.stringify(res)) //返回验证的对外信息
  898. }
  899. layer.closeAll('loading'); //关闭loading
  900. };
  901. that.displaySignedDataVerifyTip = function(info){
  902. if(info.length){
  903. if($('#netcasignedDataVerify').css('display') === 'none'){
  904. $('#netcasignedDataVerify').css({
  905. "display":'inline-block'
  906. })
  907. }
  908. var status = NetcaPDFSeal.getVerifySignSuccessFlag(info); //根据verifyResult 1成功 2不确定 3失败
  909. if(status === 0){ //失败
  910. $('.netcainvalidInfo').text('至少一个签名验证失败,请点击右方 "详细信息" 查询签名的详细验证信息。');
  911. $('.netcainvalidIcon img').attr('src','ui/images/icon/certicon_invalid.png');
  912. }else if(status === 1){ //成功
  913. $('.netcainvalidInfo').text('签名验证成功,请点击右方 "详细信息" 查询签名的详细验证信息。');
  914. $('.netcainvalidIcon img').attr('src','ui/images/icon/certicon_valid.png');
  915. }else{ //-1 不确定
  916. $('.netcainvalidInfo').text('文档内容自签名以来未被篡改,但至少有一个签名的证书验证不通过。请点击右方 "详细信息" 查询签名的详细验证信息。');
  917. $('.netcainvalidIcon img').attr('src','ui/images/icon/certicon_known.png');
  918. }
  919. if($('#netcainvalidBtn').css('display') === 'none'){
  920. $('#netcainvalidBtn').css({
  921. "display":'inline-block'
  922. })
  923. }
  924. if($('#netcaDisplaySignedDataVerify').css('display') === 'block'){
  925. $('#netcaDisplaySignedDataVerify').css({"top":"117px",'height':'84%'})
  926. }
  927. $('#viewerContainer').css({"margin-top":"47px"});
  928. } else {
  929. that.notFoundSignature();
  930. }
  931. };
  932. that.FailedSignedDataVerifyCallBack = function(res){
  933. if(res.status === -2006){
  934. if(isDisplayVerifyTips){
  935. that.notFoundSignature();
  936. } else {
  937. $('#netcasignedDataVerify').css('display', 'none');
  938. }
  939. } else{
  940. alert('验证签名失败:'+res.msg);
  941. }
  942. if(that.verifyCallbackEvent !=null){
  943. that.verifyCallbackEvent(JSON.stringify(res))
  944. }
  945. layer.closeAll('loading');
  946. };
  947. that.getSealConfigInfoFailCallBack = function(res){
  948. layer.closeAll('loading');
  949. alert('获取电子签章客户端配置信息失败:' + res.msg);
  950. };
  951. // 本文档找不到可验证的签名
  952. that.notFoundSignature = function() {
  953. $('.netcainvalidInfo').text('本文档找不到可验证的签名!');
  954. $('.netcainvalidIcon img').attr('src','');
  955. $('#netcasignedDataVerify').css('display', 'block');
  956. $('#netcainvalidBtn').css('display', 'none');
  957. $('#netcaDisplaySignedDataVerify').css('display', 'none');
  958. $('#viewerContainer').css({"margin-top":"47px"});
  959. that.VerifyInfos = null;
  960. isDisplayVerifyTips = null;
  961. };
  962. /**
  963. * 动态生成 签名验证 具体信息
  964. * */
  965. that.createSignedDataVerifyInfo = function(){
  966. var icon = '';
  967. var htmlDOM = '';
  968. //清空节点内容
  969. $("div").remove(".netcasignDetail");
  970. for(var i=0;i<that.VerifyInfos.length;i++){
  971. (function(i){
  972. // verifyResult 确定签名状态
  973. if(that.VerifyInfos[i].verifyResult === 3){
  974. icon = 'icon_invalid';
  975. that.VerifyInfos[i].status1 = "签名无效"
  976. }else if(that.VerifyInfos[i].verifyResult === 2){
  977. icon = 'icon_know';
  978. that.VerifyInfos[i].status1 = "签名不确定"
  979. } else if(that.VerifyInfos[i].verifyResult === 1){
  980. icon = 'icon_valid'; //不确定
  981. that.VerifyInfos[i].status1 = "签名有效"
  982. }
  983. // 验证文档的有效性
  984. if(that.VerifyInfos[i].fileIntegrityVerfiy === 1){
  985. that.VerifyInfos[i].moreInfo = '文档未被更改或损坏';
  986. // 签名证书的路径构建
  987. if(that.VerifyInfos[i].signCertPathBuild === 1){
  988. // console.log('签名证书链完整')
  989. } else if(that.VerifyInfos[i].signCertPathBuild === 0){
  990. that.VerifyInfos[i].signCertPathBuildText = '签名证书链未构建'
  991. } else {//-1
  992. that.VerifyInfos[i].signCertPathBuildText = '签名证书链不完整'
  993. }
  994. // 从配置信息‘验证’,确定是否验证吊销信息
  995. if(isVerifyRevoke){
  996. // 如果签名本身存在吊销信息
  997. if(that.VerifyInfos[i].hasRevoke){
  998. that.VerifyInfos[i].isVerifyRevokeText = '已嵌入吊销信息('+ that.VerifyInfos[i].revokeStatus+')'
  999. } else{
  1000. // 如果不存在,进一步确定是否开启在线验证吊销信息
  1001. if(isOnlineverifyrevoke){
  1002. that.VerifyInfos[i].isVerifyRevokeText = '在线验证吊销('+ that.VerifyInfos[i].revokeStatus+')'
  1003. } else{
  1004. that.VerifyInfos[i].isVerifyRevokeText = '未执行吊销检查'
  1005. }
  1006. }
  1007. }
  1008. // 是否验证时间戳
  1009. if(that.VerifyInfos[i].hasTsa){
  1010. that.VerifyInfos[i].hasTsaText = that.VerifyInfos[i].isTsaValid?'已嵌入时间戳(有效)':'已嵌入时间戳(无效)';
  1011. if(!that.VerifyInfos[i].isTsaValid){
  1012. if(that.VerifyInfos[i].tsaCertPathBuild === 0){
  1013. that.VerifyInfos[i].tsaCertPathBuildText = '时间戳证书链未构建'
  1014. } else if(that.VerifyInfos[i].tsaCertPathBuild === -1) {
  1015. that.VerifyInfos[i].tsaCertPathBuildText = '时间戳证书链不完整'
  1016. }
  1017. }
  1018. }
  1019. } else if(that.VerifyInfos[i].fileIntegrityVerfiy === 0){
  1020. that.VerifyInfos[i].moreInfo = '文档完整性未验证'
  1021. } else{
  1022. that.VerifyInfos[i].moreInfo = '文件自签名后被更改或损坏'
  1023. }
  1024. htmlDOM +=
  1025. ' <div class="netcasignDetail" name='+that.VerifyInfos[i].fieldName+'>\n' +
  1026. ' <span class="btn_fold"><img class="btn_fold_img" src="ui/images/icon/btn_unfold.png"></span>\n' +
  1027. ' <span class="netcasubjectCN"><span><img src="ui/images/icon/'+icon+'.png" alt=""></span>'+that.VerifyInfos[i].signerName+'</span>\n' +
  1028. ' <div class="netcasignContent">\n' +
  1029. ' <div class="netcasignTip"><span>'+that.VerifyInfos[i].status1+'</span> <input type="button" value="详细" class="netcadetailBtn"><input type="hidden" value="'+that.VerifyInfos[i].certEncode+'" class="netcahiddenBtn"></div>\n' +
  1030. ' <div class="netcasignTime">\n' +
  1031. ' <p>'+that.VerifyInfos[i].moreInfo+'</p>\n' +
  1032. ' <p>域名:'+that.VerifyInfos[i].fieldName+'</p>\n' +
  1033. ' <p><span> 签名时间:</span><br><span> '+that.VerifyInfos[i].signDate+'</span></p>\n' +
  1034. ' <p class="signCertPathBuildText">'+that.VerifyInfos[i].signCertPathBuildText+'</p>\n' +
  1035. ' <p class="hasTsa"><span> '+that.VerifyInfos[i].hasTsaText+'</span></br><span>'+that.VerifyInfos[i].tsaDate+'</span></p>\n' +
  1036. ' <p class="hasTsaCertPathBuildText">'+that.VerifyInfos[i].tsaCertPathBuildText+'</p>\n' +
  1037. ' <p class="isVerifyRevokeText">'+that.VerifyInfos[i].isVerifyRevokeText+'</p>\n' +
  1038. ' </div>\n' +
  1039. ' </div>\n' +
  1040. ' </div>';
  1041. })(i);
  1042. }
  1043. $('.netcasignInfo').append(htmlDOM);
  1044. var len = $('.hasTsa').length;
  1045. for(var j=0;j<len;j++){
  1046. if(that.VerifyInfos[j].hasTsa === false){
  1047. $('.hasTsa').eq(j).css({"display":'none'})
  1048. }
  1049. if(!that.VerifyInfos[j].tsaCertPathBuildText){
  1050. $('.hasTsaCertPathBuildText').eq(j).css({"display":'none'})
  1051. }
  1052. if(!that.VerifyInfos[j].signCertPathBuildText){
  1053. $('.signCertPathBuildText').eq(j).css({"display":'none'})
  1054. }
  1055. if(!that.VerifyInfos[j].isVerifyRevokeText){
  1056. $('.isVerifyRevokeText').eq(j).css({"display":'none'})
  1057. }
  1058. }
  1059. that.selectCertField(); // 选中签名状态中的某一个签名信息,显示选中的签名域
  1060. htmlDOM = null;
  1061. len = null;
  1062. };
  1063. that.displayCert = function() {
  1064. var arr = document.getElementsByClassName("netcadetailBtn");
  1065. var arr1 = document.getElementsByClassName('netcahiddenBtn');
  1066. var DeviceOutputId = document.getElementById('DeviceOutputId');
  1067. for (var i = 0; i < arr.length; i++) {
  1068. arr[i].index = i;
  1069. var _arr = arr[i];
  1070. _arr.onclick = function () {
  1071. DeviceOutputId.value = arr1[this.index].value;
  1072. that.uIDisplayCert(DeviceOutputId.value);
  1073. _arr = null;
  1074. }
  1075. }
  1076. };
  1077. that.uIDisplayCert = function(val){
  1078. var certEncode = val;
  1079. var selectType = "Device";
  1080. var selectCondition = "InValidity='True' && CertType='Signature'";
  1081. var params = {
  1082. cert: {
  1083. "encode": certEncode,
  1084. "type": selectType,
  1085. "condition": selectCondition
  1086. }
  1087. };
  1088. NetcaPKI.displayCert(params)
  1089. .Then(function(res){
  1090. })
  1091. .Catch(function (res) {
  1092. alert(res.msg);
  1093. });
  1094. };
  1095. /**
  1096. * 签名状态 切换显示
  1097. * */
  1098. that.displayInfoFeild = function() {
  1099. var btn_fold = document.getElementsByClassName("btn_fold");
  1100. for(var i=0;i<btn_fold.length;i++){
  1101. btn_fold[i].index = i;
  1102. var _btn_fold = btn_fold[i];
  1103. _btn_fold.onclick = function () {
  1104. if($('.netcasignTime').eq(this.index).css('display') === 'none'){
  1105. $('.netcasignTime').eq(this.index).css({"display":"block"});
  1106. $('.btn_fold_img').eq(this.index).attr('src','/public/netcasign/ui/images/icon/btn_fold.png')
  1107. }else{
  1108. $('.netcasignTime').eq(this.index).css({"display":"none"});
  1109. $('.btn_fold_img').eq(this.index).attr('src','/public/netcasign/ui/images/icon/btn_unfold.png')
  1110. }
  1111. _btn_fold = null;
  1112. }
  1113. }
  1114. };
  1115. /***
  1116. * 获取PDF文档的签名域信息
  1117. * */
  1118. that.getSignatureFieldInfo = function(signBytes,streamId){
  1119. if($(".netcafieldInfo").length){
  1120. $(".netcafieldInfo").remove(); //先删除旧的签名域
  1121. }
  1122. var params = {
  1123. srcFile: '',
  1124. srcBytes: signBytes,
  1125. srcStreamId: streamId
  1126. };
  1127. NetcaPKI.getSignatureFieldInfo(params)
  1128. .Then(function (res) {
  1129. that.getSignatureFieldInfoSuccessCallBack(res,streamId);
  1130. })
  1131. .Catch(function (res) {
  1132. that.getSignatureFieldInfoFailedCallBack(res);
  1133. });
  1134. };
  1135. that.getSignatureFieldInfoSuccessCallBack = function(res,streamId){
  1136. signFields = res.signFields; //签名域信息
  1137. that.describeSignatureField(); //描绘签名域
  1138. that.createRevokeEvent(streamId); //撤章事件
  1139. if(!signFields){
  1140. $('#netcasignedDataVerify').css('display', 'none');
  1141. layer.closeAll('loading');
  1142. return;
  1143. }
  1144. // 缩放pdf,只获取签名域,不需要重新验证
  1145. if(zoom){
  1146. zoom = false;
  1147. layer.closeAll('loading');
  1148. return;
  1149. }
  1150. //打开是否马上验证 和签名后 一定验证
  1151. if(!isVerifyOpen){
  1152. isVerifyOpen = true;
  1153. layer.closeAll('loading');
  1154. return;
  1155. }
  1156. if(isVerifyOpen){
  1157. if(streamId){ //大文件验证
  1158. that.signedDataVerify('', '', verifyLevel, isOnlineverifyrevoke, streamId);
  1159. } else { //小文件验证
  1160. that.signedDataVerify('', NetcaPDFSeal.SetPDFBytes, verifyLevel, isOnlineverifyrevoke);
  1161. }
  1162. }
  1163. };
  1164. // 描绘签名域
  1165. that.describeSignatureField = function() {
  1166. if($('.netcafieldInfo').length){
  1167. $('.netcafieldInfo').remove();
  1168. }
  1169. var viewer_width = $('#viewer').width();
  1170. var newscale = that.getScale();//缩放比例
  1171. var scale = 0.75; // 75% 对应72dpi; 如果不是75%缩放比例,需要对应转换为72dpi的坐标大小
  1172. var page_width;
  1173. var _brank;
  1174. if(signFields){
  1175. for(var i=0;i<signFields.length;i++){
  1176. (function(i){
  1177. page_width = $('#viewer .page').eq(signFields[i].pageNum-1).width();
  1178. _brank = (viewer_width - page_width) / 2;
  1179. signFields[i].xPos = signFields[i].xPos * newscale / scale;
  1180. signFields[i].yPos = signFields[i].yPos * newscale / scale;
  1181. if(signFields[i].pageNum > 1){
  1182. var _height = that.addHeight(signFields[i].pageNum);
  1183. signFields[i].yPos = _height + signFields[i].yPos;
  1184. }
  1185. signFields[i].xPos = signFields[i].xPos + parseInt(_brank);
  1186. signFields[i].width = signFields[i].width * newscale / scale;
  1187. signFields[i].height = signFields[i].height * newscale / scale;
  1188. // 签名域
  1189. $('#viewerContainer').append(' <div class="netcafieldInfo" name='+ signFields[i].name +' style="position:absolute;z-index:99;width:'+signFields[i].width+'px;height:'+signFields[i].height+'px;left:'+signFields[i].xPos+'px;top:'+signFields[i].yPos+'px;"></div>');
  1190. if(signFields[i].width === 0){
  1191. $('.netcafieldInfo').eq(i).css({"display":"none"})
  1192. }
  1193. })(i);
  1194. }
  1195. that.selectSignatureField(); //选中签名域 显示签名状态中的某一个的签名信息
  1196. } else {
  1197. $('#netcasignedDataVerify').css('display','none');
  1198. $('#viewerContainer').css({"margin-top":"0"});
  1199. $('#netcaDisplaySignedDataVerify').css('display','none');
  1200. }
  1201. };
  1202. that.getSignatureFieldInfoFailedCallBack = function(res){
  1203. layer.closeAll('loading');
  1204. alert('签名域信息失败:'+res.msg);
  1205. };
  1206. that.zoomPDFBySelectOptionScale = function(){
  1207. // 缩放页面 重新描绘签名域
  1208. $('#scaleSelect').change(function(){
  1209. that.getSignatureFieldInfo(NetcaPDFSeal.SetPDFBytes, unfinishedStreamId);
  1210. })
  1211. };
  1212. that.createRevokeEvent = function(streamId) {
  1213. // filedFlag 普通签章完成后的 签名/章 才有撤销按钮;批量签章、骑缝章没有撤销按钮
  1214. if(filedFlag){
  1215. $('.netcafieldInfo').eq($('.netcafieldInfo').length-1).append('' +
  1216. '<img id="btn_discard" src="/public/netcasign/ui/images/icon/btn_discard_nor.png" alt="" ' +
  1217. 'style="position:absolute;top:-15px;right:-15px;z-index:1000;display: none;">' +
  1218. '');
  1219. $('.netcafieldInfo').eq($('.netcafieldInfo').length-1).hover(function(){
  1220. $('#btn_discard').css({'display':'block'});
  1221. },function(){
  1222. $('#btn_discard').css({'display':'none'});
  1223. });
  1224. $('#btn_discard').click(function(){
  1225. // -1表示最后的一个签名/章
  1226. that.isLoading();
  1227. if(streamId){
  1228. that.signatureVerifierUndoPDF('',-1, unfinishedStreamId, true);
  1229. } else {
  1230. that.signatureVerifierUndoPDF(NetcaPDFSeal.SetPDFBytes,-1);
  1231. }
  1232. });
  1233. }
  1234. };
  1235. that.signatureVerifierUndoPDF = function(_signBytes, _index, _streamId, _isReturnStreamId){
  1236. layer.confirm('是否需要撤销选定的签章?',{
  1237. btn: ['是','否'] //按钮
  1238. }, function(index){
  1239. layer.close(index);
  1240. var params = {
  1241. signFile: '',
  1242. signBytes: _signBytes,
  1243. index: _index,
  1244. srcStreamId: _streamId,
  1245. isReturnStreamId: _isReturnStreamId
  1246. };
  1247. NetcaPKI.signatureVerifierUndoPDF(params)
  1248. .Then(function (res) {
  1249. if(res.srcBytes == null ||res.srcBytes.length ==0 ){
  1250. that.signatureVerifierUndoPDFReadStreamCallBack(res);
  1251. return;
  1252. }
  1253. that.revokeSignatureSuccessCall(res.srcBytes); //撤章成功回调
  1254. })
  1255. .Catch(function (res) {
  1256. layer.closeAll('loading');
  1257. alert('撤销签名/章失败:'+res.msg);
  1258. });
  1259. }, function(){
  1260. layer.closeAll('loading');
  1261. });
  1262. };
  1263. that.revokeSignatureSuccessCall = function(srcBytes) {
  1264. // 撤章成功回调
  1265. // 如果窗口大小改变 还得重绘签名域
  1266. NetcaPDFSeal.setPDFBytes(srcBytes);
  1267. that.openPDF(NetcaPDFSeal.SetPDFBytes);
  1268. filedFlag = false;
  1269. if(signFields.length){
  1270. signFields.pop();
  1271. }
  1272. if(that.VerifyInfos.length){
  1273. that.VerifyInfos.pop();
  1274. }
  1275. that.displaySignedDataVerifyTip(that.VerifyInfos);
  1276. $('.netcafieldInfo').last().remove();
  1277. $('.netcasignDetail').last().remove();
  1278. layer.closeAll('loading');
  1279. };
  1280. that.signatureVerifierUndoPDFReadStreamCallBack = function(signSuccessRes){
  1281. completedStreamId = signSuccessRes.srcBytesStream.streamId;
  1282. signSuccessRes.destFileEncode='';
  1283. var params = {
  1284. streamId: signSuccessRes.srcBytesStream.streamId,
  1285. length: writeLength*1024*1024
  1286. };
  1287. NetcaPKI.readStream(params)
  1288. .Then(function (res) {
  1289. that.SignatureVerifierUndoPDFReadStreamUpdateCallBack(res, signSuccessRes);
  1290. })
  1291. .Catch(function (res) {
  1292. alert('撤销签名/章失败:'+res.msg);
  1293. });
  1294. };
  1295. that.SignatureVerifierUndoPDFReadStreamUpdateCallBack = function(res, signSuccessRes)
  1296. {
  1297. completedStreamId = res.streamId;
  1298. signSuccessRes.destFileEncode = signSuccessRes.destFileEncode + res.data;
  1299. if(!res.hasMoreData)
  1300. {
  1301. that.revokeSignatureSuccessCall(signSuccessRes.destFileEncode);
  1302. return;
  1303. }
  1304. var params = {
  1305. streamId: res.streamId,
  1306. length: writeLength*1024*1024
  1307. };
  1308. NetcaPKI.readStream(params)
  1309. .Then(function (res) {
  1310. that.SignatureVerifierUndoPDFReadStreamUpdateCallBack(res, signSuccessRes);
  1311. })
  1312. .Catch(function (res) {
  1313. alert('撤销签名/章失败:'+res.msg);
  1314. });
  1315. };
  1316. /*** 选中签名域信息* */
  1317. that.selectSignatureField = function(){
  1318. var netcafieldInfo = document.getElementsByClassName("netcafieldInfo");
  1319. for(var i=0;i<netcafieldInfo.length;i++){
  1320. netcafieldInfo[i].index = i;
  1321. var _netcafieldInfo = netcafieldInfo[i];
  1322. _netcafieldInfo.onclick = function () {
  1323. // 通过签名域name 与 验证结果的fieldName 对应上
  1324. var name = $('.netcafieldInfo').eq(this.index).attr('name');
  1325. $('.netcafieldInfo').eq(this.index).css({'border':'4px dashed #426bf6'});
  1326. $('.netcafieldInfo').eq(this.index).siblings().css({'border':''});
  1327. $('.netcasignDetail[name='+name+']').css({"background":"#e2eeff"});
  1328. $('.netcasignDetail[name='+name+']').siblings().css({"background":"none"});
  1329. if(this.index === netcafieldInfo.length - 1){
  1330. $('#btn_discard').css({'display':'block'});
  1331. $('.netcafieldInfo').eq(this.index).off('hover');
  1332. }
  1333. _netcafieldInfo = null;
  1334. }
  1335. }
  1336. };
  1337. /**
  1338. * 选中标签信息
  1339. * */
  1340. that.selectCertField = function(){
  1341. var netcasignDetail = document.getElementsByClassName("netcasignDetail");
  1342. for(var i=0;i<netcasignDetail.length;i++){
  1343. netcasignDetail[i].index = i;
  1344. var _netcasignDetail = netcasignDetail[i];
  1345. _netcasignDetail.onclick = function () {
  1346. var name = $('.netcasignDetail').eq(this.index).attr('name');
  1347. $('.netcafieldInfo[name='+name+']').css({'border':'4px dashed #426bf6'});
  1348. $('.netcafieldInfo[name='+name+']').siblings().css({'border':''});
  1349. $('.netcasignDetail').eq(this.index).css({"background":"#e2eeff"});
  1350. $('.netcasignDetail').eq(this.index).siblings().css({"background":"none"});
  1351. var _top = parseFloat($('.netcafieldInfo[name='+name+']').css('top'));
  1352. $('#viewerContainer').scrollTop(_top);
  1353. _netcasignDetail = null;
  1354. }
  1355. }
  1356. };
  1357. /**打印*/
  1358. that.printPDF = function() {
  1359. var params = {
  1360. srcBytes: NetcaPDFSeal.SetPDFBytes
  1361. };
  1362. NetcaPKI.printPDF(params)
  1363. .Then(function(res){
  1364. alert('打印文档成功');
  1365. })
  1366. .Catch(function(res){
  1367. alert('打印文档失败:' + res.msg);
  1368. });
  1369. };
  1370. /**
  1371. * 点击close按钮,关闭签名验证信息
  1372. * */
  1373. that.closeSignedDataVerifyInfo = function(params){
  1374. if(params === 'netcainvalidClose'){
  1375. $('#netcasignedDataVerify').css('display','none');
  1376. $('#viewerContainer').css({"margin-top":"0"});
  1377. $('#netcaDisplaySignedDataVerify').css({"top":'70px','height':'92%'})
  1378. }
  1379. if(params === 'netcaclose2'){
  1380. $('#netcaDisplaySignedDataVerify').css({'display':'none'});
  1381. that.getSignatureFieldInfo(NetcaPDFSeal.SetPDFBytes);
  1382. }
  1383. };
  1384. /**
  1385. * 点击详细信息,显示左侧签名验证详细信息
  1386. * */
  1387. that.displaySignedDataVerifyInfo = function(){
  1388. $('#netcaDisplaySignedDataVerify').css({'display':'block',"top":'117px','height':'84%'});
  1389. };
  1390. // 鼠标移入移除签章菜单背景色变化
  1391. that.transBackground = function(name) {
  1392. $('.'+name).hover(function(){
  1393. $(this).css('background','#DBECFF');
  1394. },function(){
  1395. $(this).css('background','#fff');
  1396. });
  1397. };
  1398. that.setUIVisible = function(obj){
  1399. for (var k in obj) {
  1400. if (!obj[k]) {
  1401. $('#' + k).css({'display': 'none'});
  1402. }else{
  1403. $('#' + k).css({'display': 'inline-block'});
  1404. }
  1405. }
  1406. if(obj.NetcaToolBar === true){
  1407. $('#toolbarViewer').css({'display':'block'});
  1408. }else if(obj.NetcaToolBar === false){
  1409. $('#toolbarViewer').css({'display':'none'});
  1410. }
  1411. };
  1412. that.getWorkTime = function() {
  1413. var date = new Date();
  1414. var time = date.getMinutes() + ":" + date.getSeconds() + ":" + date.getMilliseconds();
  1415. return time;
  1416. };
  1417. that.closeFile = function() {
  1418. $('#viewer').children().css('display', 'none');
  1419. $('#netcasignedDataVerify').css('display', 'none');
  1420. $('#netcaDisplaySignedDataVerify').css('display', 'none');
  1421. $('.netcasignpdf').css('margin-top', '0');
  1422. };
  1423. that.openPDFWithUrl = function(url) {
  1424. var origin = window.location.origin;
  1425. var pathname = window.location.pathname;
  1426. var newUrl = origin + pathname + '?file=' + encodeURIComponent(url);
  1427. window.location = newUrl;
  1428. };
  1429. return that;
  1430. })();
  1431. var NetcaIESignAPI = (function(){
  1432. 'use strict';
  1433. var that = {};
  1434. var readerAx;
  1435. that.openPDF = function(byteBase64){
  1436. if(readerAx == null)
  1437. readerAx = document.getElementById("NetcaReaderAx").object;
  1438. var comObj = null;
  1439. try {
  1440. var NETCA_PKI_BASE64_NO_NL = 1;
  1441. comObj = new ActiveXObject("NetcaPki.Utilities");
  1442. var bytesDecode = comObj.Base64Decode(byteBase64, NETCA_PKI_BASE64_NO_NL);
  1443. readerAx.PDFSavePath=":AutoSave:";
  1444. readerAx.AsyncOpenPDFBytes(bytesDecode);
  1445. } catch (e) {
  1446. alert("异常:" + e);
  1447. }
  1448. };
  1449. that.initPreView = function () {
  1450. var obj = {
  1451. 'NetcaToolBar': false,
  1452. 'navigationBar': false
  1453. };
  1454. that.setUIVisible(obj);
  1455. };
  1456. that.GetPDFBytes = function(){
  1457. if(readerAx == null)
  1458. readerAx = document.getElementById("NetcaReaderAx").object;
  1459. var path = readerAx.GetPDFBytes();
  1460. var comObj = new ActiveXObject("NetcaPki.Utilities");
  1461. var NETCA_PKI_BASE64_NO_NL =1;
  1462. NetcaPDFSeal.setPDFBytes(comObj.Base64Encode(path, NETCA_PKI_BASE64_NO_NL));
  1463. };
  1464. that.setUI = function (value,visiable) {
  1465. if (readerAx == null)
  1466. readerAx = document.getElementById("NetcaReaderAx").object;
  1467. readerAx.SetIndividuationUI(value, visiable, "");
  1468. };
  1469. that.initUI = function(){
  1470. var obj = {
  1471. // 'netcaopen':false,
  1472. 'netcasave':false,
  1473. 'netcasearch':false,
  1474. 'netcaFirstSeparator':false,
  1475. 'netcaSecondSeparator':false,
  1476. 'netcaThirdSeparaor':false,
  1477. // 'netcaVerfity':false,
  1478. 'netcaSetting':false,
  1479. 'netcaAbout':false,
  1480. 'navigationBar': false
  1481. };
  1482. $('#netcasignpdf').css('display','none');
  1483. that.setUIVisible(obj);
  1484. };
  1485. that.setUIVisible = function (obj ) {
  1486. var UI_PDF_TOOLBAR_BUTTON = 0; //工具栏
  1487. var UI_PDF_OPEN_BUTTON = 1; //打开按钮
  1488. var UI_PDF_SAVE_BUTTON = 2; //保存按钮
  1489. var UI_PDF_SERACH_BUTTON = 3; //搜索按钮
  1490. var UI_PDF_ZOOM_IN_BUTTON = 4; //放大按钮
  1491. var UI_PDF_ZOOM_OUT_BUTTON = 5; //缩小按钮
  1492. var UI_PDF_ZOOM_RATION_COMBO = 6; //放大缩小比例列表框
  1493. var UI_PDF_FIRST_SEPARATOR = 7;//第一个分割符控件
  1494. var UI_PDF_FRONT_PAGE_BUTTON = 8;//上一页按钮
  1495. var UI_PDF_NEXT_PAGE_BUTTON = 9; //下一页按钮
  1496. var UI_PDF_PAGE_NUM_EDIT = 10;//页面数字
  1497. var UI_PDF_SECOND_SEPARATOR = 11; //第二个分割符控件
  1498. var UI_PDF_SIGN_BUTTON = 12; //签章按钮
  1499. var UI_PDF_VERIFY_BUTTON = 13; //验证按钮
  1500. var UI_PDF_THIRD_SEPARATOR = 14; //第三个分割符控件
  1501. var UI_PDF_SETTING_BUTTON = 15; //设置按钮
  1502. var UI_PDF_ABOUT_BUTTON = 16; //关于按钮
  1503. var UI_PDF_NAVIGATION_BAR = 17 ;//导航栏
  1504. var UI_PDF_MARK_BUTTON = 18 ;//书签按钮
  1505. var UI_PDF_ANNOT_BUTTON = 19 ;//批注按钮
  1506. var UI_PDF_PRINT_BUTTON = 20;//打印按钮
  1507. var UI_PDF_COMMON_SIGN_MENU = 21; //签章签章
  1508. var UI_PDF_EMPLOYEE_SIGN_MENU = 22; //员工签章
  1509. var UI_PDF_INSTITUTION_SIGN_MENU = 23; //机构签章
  1510. var UI_PDF_ARTIFIFCIAL_SIGN_MENU = 24;//法人签章
  1511. var UI_PDF_CLOSE_BUTTON = 28;//关闭按钮
  1512. if (readerAx == null)
  1513. readerAx = document.getElementById("NetcaReaderAx").object;
  1514. //工具栏
  1515. if(obj.NetcaToolBar === true) {
  1516. readerAx.SetIndividuationUI(UI_PDF_TOOLBAR_BUTTON, true, "");
  1517. } else if (obj.NetcaToolBar === false) {
  1518. readerAx.SetIndividuationUI(UI_PDF_TOOLBAR_BUTTON, false, "");
  1519. }
  1520. //打开按钮
  1521. if(obj.openFile === true) {
  1522. readerAx.SetIndividuationUI(UI_PDF_OPEN_BUTTON, true, "");
  1523. } else if (obj.openFile === false) {
  1524. readerAx.SetIndividuationUI(UI_PDF_OPEN_BUTTON, false, "");
  1525. }
  1526. //关闭按钮
  1527. if(obj.netcasave === true) {
  1528. readerAx.SetIndividuationUI(UI_PDF_SAVE_BUTTON, true, "");
  1529. }else if(obj.netcasave === false){
  1530. readerAx.SetIndividuationUI(UI_PDF_SAVE_BUTTON, false, "");
  1531. }
  1532. //搜索
  1533. if(obj.viewFind === true) {
  1534. readerAx.SetIndividuationUI(UI_PDF_SERACH_BUTTON, true, "");
  1535. }else if(obj.viewFind === false){
  1536. readerAx.SetIndividuationUI(UI_PDF_SERACH_BUTTON, false, "");
  1537. }
  1538. //放大
  1539. if(obj.zoomIn === true) {
  1540. readerAx.SetIndividuationUI(UI_PDF_ZOOM_IN_BUTTON, true, "");
  1541. }else if( obj.zoomIn === false){
  1542. readerAx.SetIndividuationUI(UI_PDF_ZOOM_IN_BUTTON, false, "");
  1543. }
  1544. //缩小
  1545. if(obj.zoomOut === true) {
  1546. readerAx.SetIndividuationUI(UI_PDF_ZOOM_OUT_BUTTON, true, "");
  1547. }else if( obj.zoomOut === false){
  1548. readerAx.SetIndividuationUI(UI_PDF_ZOOM_OUT_BUTTON, false, "");
  1549. }
  1550. //缩放select控件
  1551. if(obj.scaleSelectContainer === true) {
  1552. readerAx.SetIndividuationUI(UI_PDF_ZOOM_RATION_COMBO, true, "");
  1553. }else if( obj.scaleSelectContainer === false){
  1554. readerAx.SetIndividuationUI(UI_PDF_ZOOM_RATION_COMBO, false, "");
  1555. }
  1556. //第一个分割符控件
  1557. if(obj.netcaFirstSeparator === true) {
  1558. readerAx.SetIndividuationUI(UI_PDF_FIRST_SEPARATOR, true, "");
  1559. }else if(obj.netcaFirstSeparator === false){
  1560. readerAx.SetIndividuationUI(UI_PDF_FIRST_SEPARATOR, false, "");
  1561. }
  1562. //上一页
  1563. if(obj.previous === true) {
  1564. readerAx.SetIndividuationUI(UI_PDF_FRONT_PAGE_BUTTON, true, "");
  1565. }else if( obj.previous === false){
  1566. readerAx.SetIndividuationUI(UI_PDF_FRONT_PAGE_BUTTON, false, "");
  1567. }
  1568. //下一页
  1569. if(obj.next === true) {
  1570. readerAx.SetIndividuationUI(UI_PDF_NEXT_PAGE_BUTTON, true, "");
  1571. }else if( obj.next === false){
  1572. readerAx.SetIndividuationUI(UI_PDF_NEXT_PAGE_BUTTON, false, "");
  1573. }
  1574. //页面数字
  1575. if(obj.netcapage === true) {
  1576. readerAx.SetIndividuationUI(UI_PDF_PAGE_NUM_EDIT, true, "");
  1577. }else if( obj.netcapage === false){
  1578. readerAx.SetIndividuationUI(UI_PDF_PAGE_NUM_EDIT, false, "");
  1579. }
  1580. //第二个分割符控件
  1581. if(obj.netcaSecondSeparator === true) {
  1582. readerAx.SetIndividuationUI(UI_PDF_SECOND_SEPARATOR, true, "");
  1583. }else if(obj.netcaSecondSeparator === false){
  1584. readerAx.SetIndividuationUI(UI_PDF_SECOND_SEPARATOR, false, "");
  1585. }
  1586. //关闭
  1587. if(obj.closeFile === true) {
  1588. readerAx.SetIndividuationUI(UI_PDF_CLOSE_BUTTON, true, "");
  1589. }else if(obj.closeFile === false){
  1590. readerAx.SetIndividuationUI(UI_PDF_CLOSE_BUTTON, false, "");
  1591. }
  1592. //验证
  1593. if(obj.verify === true) {
  1594. readerAx.SetIndividuationUI(UI_PDF_VERIFY_BUTTON, true, "");
  1595. }else if(obj.verify === false){
  1596. readerAx.SetIndividuationUI(UI_PDF_VERIFY_BUTTON, false, "");
  1597. }
  1598. //第三个分割符控件
  1599. if(obj.netcaThirdSeparaor === true) {
  1600. readerAx.SetIndividuationUI(UI_PDF_THIRD_SEPARATOR, true, "");
  1601. }else if(obj.netcaThirdSeparaor === false){
  1602. readerAx.SetIndividuationUI(UI_PDF_THIRD_SEPARATOR, false, "");
  1603. }
  1604. //设置
  1605. if(obj.netcaSetting === true) {
  1606. readerAx.SetIndividuationUI(UI_PDF_SETTING_BUTTON, true, "");
  1607. }else if(obj.netcaSetting === false){
  1608. readerAx.SetIndividuationUI(UI_PDF_SETTING_BUTTON, false, "");
  1609. }
  1610. //关于
  1611. if(obj.netcaAbout === true) {
  1612. readerAx.SetIndividuationUI(UI_PDF_ABOUT_BUTTON, true, "");
  1613. }else if(obj.netcaAbout === false){
  1614. readerAx.SetIndividuationUI(UI_PDF_ABOUT_BUTTON, false, "");
  1615. }
  1616. //普通签章
  1617. if(obj.sign === true) {
  1618. readerAx.SetIndividuationUI(UI_PDF_COMMON_SIGN_MENU, true, "");
  1619. }else if(obj.sign === false){
  1620. readerAx.SetIndividuationUI(UI_PDF_COMMON_SIGN_MENU, false, "");
  1621. }
  1622. //员工签章
  1623. if(obj.netcastaff === true) {
  1624. readerAx.SetIndividuationUI(UI_PDF_EMPLOYEE_SIGN_MENU, true, "");
  1625. }else if(obj.netcastaff === false){
  1626. readerAx.SetIndividuationUI(UI_PDF_EMPLOYEE_SIGN_MENU, false, "");
  1627. }
  1628. //机构签章
  1629. if(obj.netcaorganization === true) {
  1630. readerAx.SetIndividuationUI(UI_PDF_INSTITUTION_SIGN_MENU, true, "");
  1631. }else if(obj.netcaorganization === false){
  1632. readerAx.SetIndividuationUI(UI_PDF_INSTITUTION_SIGN_MENU, false, "");
  1633. }
  1634. //法人签章
  1635. if(obj.netcalegalperson === true) {
  1636. readerAx.SetIndividuationUI(UI_PDF_ARTIFIFCIAL_SIGN_MENU, true, "");
  1637. }else if(obj.netcalegalperson === false){
  1638. readerAx.SetIndividuationUI(UI_PDF_ARTIFIFCIAL_SIGN_MENU, false, "");
  1639. }
  1640. //打印
  1641. if(obj.print === true) {
  1642. readerAx.SetIndividuationUI(UI_PDF_PRINT_BUTTON, true, "");
  1643. }else if(obj.print === false){
  1644. readerAx.SetIndividuationUI(UI_PDF_PRINT_BUTTON, false, "");
  1645. }
  1646. //导航栏
  1647. if(obj.navigationBar === true) {
  1648. readerAx.SetIndividuationUI(UI_PDF_NAVIGATION_BAR, true, "");
  1649. }else if(obj.navigationBar === false){
  1650. readerAx.SetIndividuationUI(UI_PDF_NAVIGATION_BAR, false, "");
  1651. }
  1652. };
  1653. /**初始化页面
  1654. * */
  1655. that.init = function(){
  1656. that.initUI();
  1657. };
  1658. that.signCallbackEvent = function(callback){
  1659. if(callback != null)
  1660. {
  1661. if (readerAx == null)
  1662. readerAx = document.getElementById("NetcaReaderAx").object;
  1663. readerAx.SetSignCallback(callback)
  1664. }
  1665. };
  1666. that.verifyCallbackEvent = function(callback){
  1667. if(callback != null)
  1668. {
  1669. if (readerAx == null)
  1670. readerAx = document.getElementById("NetcaReaderAx").object;
  1671. readerAx.SetVerifyCallback(callback)
  1672. }
  1673. };
  1674. that.openPDFWithUrl = function(url) {
  1675. if (readerAx == null)
  1676. readerAx = document.getElementById("NetcaReaderAx").object;
  1677. try {
  1678. readerAx.PDFSavePath = ":AutoSave:";
  1679. readerAx.AsyncOpenPDFUrl(url);
  1680. } catch(e) {
  1681. alert("异常:" + e);
  1682. }
  1683. };
  1684. return that;
  1685. })();
  1686. var NetcaPDFSeal = (function(){
  1687. 'use strict';
  1688. /**set base64*/
  1689. var that = {
  1690. SetPDFBytes:''
  1691. };
  1692. that.setPDFBytes = function(INPDFbase64){
  1693. that.SetPDFBytes = INPDFbase64
  1694. };
  1695. /**get base64*/
  1696. that.getSignPDFBytes = function(){
  1697. if (that._isIE()) {
  1698. NetcaIESignAPI.GetPDFBytes();
  1699. }
  1700. return that.SetPDFBytes
  1701. };
  1702. /**判断当前浏览器是否为IE浏览器
  1703. * */
  1704. that._isIE = function(){
  1705. var comObj = null;
  1706. try{
  1707. comObj = new ActiveXObject("NetcaPki.Utilities");
  1708. return true;
  1709. }catch(e){
  1710. return false;
  1711. }
  1712. };
  1713. /**
  1714. * 需要隐藏的功能按钮
  1715. * */
  1716. that.setUIVisible = function(obj){
  1717. if(NetcaPDFSeal._isIE()){
  1718. NetcaIESignAPI.setUIVisible(obj);
  1719. }else{
  1720. NetcaSignAPI.setUIVisible(obj);
  1721. }
  1722. };
  1723. /**初始化页面
  1724. * */
  1725. that.init = function(){
  1726. that.initUI();
  1727. };
  1728. that.initUI = function(){
  1729. if (that._isIE()) {
  1730. NetcaIESignAPI.initUI();
  1731. } else {
  1732. NetcaSignAPI.initUI();
  1733. }
  1734. };
  1735. /**打开pdf
  1736. * */
  1737. that.openPDFBytes = function(OpenPDFBytes){
  1738. var search = window.location.search;
  1739. var reg = new RegExp(/\?file=/);
  1740. if(that._isIE()){
  1741. NetcaIESignAPI.openPDF(OpenPDFBytes);
  1742. }else{
  1743. if(!reg.test(search)){
  1744. // url有file参数说明是使用url打开的,没有file则是使用base64字节流打开
  1745. return;
  1746. if(!OpenPDFBytes){
  1747. alert('打开文档数据为空');
  1748. return;
  1749. }
  1750. NetcaSignAPI.getSealConfigInfo(OpenPDFBytes);
  1751. NetcaSignAPI.openPDF(OpenPDFBytes);
  1752. NetcaPDFSeal.setPDFBytes(OpenPDFBytes);
  1753. }else {
  1754. var interval = setInterval(function(){
  1755. if (globalPDFViewerApplication.pdfDocument == null) {
  1756. console.info('Loading...');
  1757. } else {
  1758. if($('#viewer .page').length>0){
  1759. clearInterval(interval);
  1760. globalPDFViewerApplication.pdfDocument.getData().then(function(data){
  1761. // var PDFBytes = NetcaUtils.arrayBufferToBase64(data);
  1762. NetcaPDFSeal.setPDFBytes(data);
  1763. // NetcaSignAPI.getSealConfigInfo(data);
  1764. })
  1765. }
  1766. }
  1767. }, 1000);
  1768. }
  1769. }
  1770. };
  1771. that.getVerifySignSuccessFlag = function(arr){
  1772. var invalidArr = [];
  1773. var notSureArr = [];
  1774. for(var i=0;i<arr.length;i++){
  1775. if(arr[i].verifyResult === 3){ //签名无效
  1776. invalidArr.push(arr[i].verifyResult)
  1777. }
  1778. if(arr[i].verifyResult === 2){ //签名不确定
  1779. notSureArr.push(arr[i].verifyResult)
  1780. } // 签名有效
  1781. }
  1782. if(invalidArr.length){
  1783. return 0
  1784. }else{
  1785. if(notSureArr.length){
  1786. return -1
  1787. }else{
  1788. return 1
  1789. }
  1790. }
  1791. };
  1792. /**签章完成后对外提示接口*/
  1793. that.setSignCallbackEvent = function(callback){
  1794. if(that._isIE()){
  1795. NetcaIESignAPI.signCallbackEvent(callback)
  1796. }else{
  1797. NetcaSignAPI.signCallbackEvent = callback
  1798. }
  1799. };
  1800. that.setVerifyCallbackEvent = function(callback){
  1801. if(that._isIE()){
  1802. NetcaIESignAPI.verifyCallbackEvent(callback)
  1803. }else{
  1804. NetcaSignAPI.verifyCallbackEvent = callback
  1805. }
  1806. };
  1807. that.openPDFWithUrl = function(url) {
  1808. if(that._isIE()){
  1809. NetcaIESignAPI.openPDFWithUrl(url);
  1810. } else {
  1811. NetcaSignAPI.openPDFWithUrl(url);
  1812. }
  1813. };
  1814. return that;
  1815. })();