netcasealpdf.js 77 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053
  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. $('.modal-background').show();
  951. };
  952. // 本文档找不到可验证的签名
  953. that.notFoundSignature = function() {
  954. $('.netcainvalidInfo').text('本文档找不到可验证的签名!');
  955. $('.netcainvalidIcon img').attr('src','');
  956. $('#netcasignedDataVerify').css('display', 'block');
  957. $('#netcainvalidBtn').css('display', 'none');
  958. $('#netcaDisplaySignedDataVerify').css('display', 'none');
  959. $('#viewerContainer').css({"margin-top":"47px"});
  960. that.VerifyInfos = null;
  961. isDisplayVerifyTips = null;
  962. };
  963. /**
  964. * 动态生成 签名验证 具体信息
  965. * */
  966. that.createSignedDataVerifyInfo = function(){
  967. var icon = '';
  968. var htmlDOM = '';
  969. //清空节点内容
  970. $("div").remove(".netcasignDetail");
  971. for(var i=0;i<that.VerifyInfos.length;i++){
  972. (function(i){
  973. // verifyResult 确定签名状态
  974. if(that.VerifyInfos[i].verifyResult === 3){
  975. icon = 'icon_invalid';
  976. that.VerifyInfos[i].status1 = "签名无效"
  977. }else if(that.VerifyInfos[i].verifyResult === 2){
  978. icon = 'icon_know';
  979. that.VerifyInfos[i].status1 = "签名不确定"
  980. } else if(that.VerifyInfos[i].verifyResult === 1){
  981. icon = 'icon_valid'; //不确定
  982. that.VerifyInfos[i].status1 = "签名有效"
  983. }
  984. // 验证文档的有效性
  985. if(that.VerifyInfos[i].fileIntegrityVerfiy === 1){
  986. that.VerifyInfos[i].moreInfo = '文档未被更改或损坏';
  987. // 签名证书的路径构建
  988. if(that.VerifyInfos[i].signCertPathBuild === 1){
  989. // console.log('签名证书链完整')
  990. } else if(that.VerifyInfos[i].signCertPathBuild === 0){
  991. that.VerifyInfos[i].signCertPathBuildText = '签名证书链未构建'
  992. } else {//-1
  993. that.VerifyInfos[i].signCertPathBuildText = '签名证书链不完整'
  994. }
  995. // 从配置信息‘验证’,确定是否验证吊销信息
  996. if(isVerifyRevoke){
  997. // 如果签名本身存在吊销信息
  998. if(that.VerifyInfos[i].hasRevoke){
  999. that.VerifyInfos[i].isVerifyRevokeText = '已嵌入吊销信息('+ that.VerifyInfos[i].revokeStatus+')'
  1000. } else{
  1001. // 如果不存在,进一步确定是否开启在线验证吊销信息
  1002. if(isOnlineverifyrevoke){
  1003. that.VerifyInfos[i].isVerifyRevokeText = '在线验证吊销('+ that.VerifyInfos[i].revokeStatus+')'
  1004. } else{
  1005. that.VerifyInfos[i].isVerifyRevokeText = '未执行吊销检查'
  1006. }
  1007. }
  1008. }
  1009. // 是否验证时间戳
  1010. if(that.VerifyInfos[i].hasTsa){
  1011. that.VerifyInfos[i].hasTsaText = that.VerifyInfos[i].isTsaValid?'已嵌入时间戳(有效)':'已嵌入时间戳(无效)';
  1012. if(!that.VerifyInfos[i].isTsaValid){
  1013. if(that.VerifyInfos[i].tsaCertPathBuild === 0){
  1014. that.VerifyInfos[i].tsaCertPathBuildText = '时间戳证书链未构建'
  1015. } else if(that.VerifyInfos[i].tsaCertPathBuild === -1) {
  1016. that.VerifyInfos[i].tsaCertPathBuildText = '时间戳证书链不完整'
  1017. }
  1018. }
  1019. }
  1020. } else if(that.VerifyInfos[i].fileIntegrityVerfiy === 0){
  1021. that.VerifyInfos[i].moreInfo = '文档完整性未验证'
  1022. } else{
  1023. that.VerifyInfos[i].moreInfo = '文件自签名后被更改或损坏'
  1024. }
  1025. htmlDOM +=
  1026. ' <div class="netcasignDetail" name='+that.VerifyInfos[i].fieldName+'>\n' +
  1027. ' <span class="btn_fold"><img class="btn_fold_img" src="ui/images/icon/btn_unfold.png"></span>\n' +
  1028. ' <span class="netcasubjectCN"><span><img src="ui/images/icon/'+icon+'.png" alt=""></span>'+that.VerifyInfos[i].signerName+'</span>\n' +
  1029. ' <div class="netcasignContent">\n' +
  1030. ' <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' +
  1031. ' <div class="netcasignTime">\n' +
  1032. ' <p>'+that.VerifyInfos[i].moreInfo+'</p>\n' +
  1033. ' <p>域名:'+that.VerifyInfos[i].fieldName+'</p>\n' +
  1034. ' <p><span> 签名时间:</span><br><span> '+that.VerifyInfos[i].signDate+'</span></p>\n' +
  1035. ' <p class="signCertPathBuildText">'+that.VerifyInfos[i].signCertPathBuildText+'</p>\n' +
  1036. ' <p class="hasTsa"><span> '+that.VerifyInfos[i].hasTsaText+'</span></br><span>'+that.VerifyInfos[i].tsaDate+'</span></p>\n' +
  1037. ' <p class="hasTsaCertPathBuildText">'+that.VerifyInfos[i].tsaCertPathBuildText+'</p>\n' +
  1038. ' <p class="isVerifyRevokeText">'+that.VerifyInfos[i].isVerifyRevokeText+'</p>\n' +
  1039. ' </div>\n' +
  1040. ' </div>\n' +
  1041. ' </div>';
  1042. })(i);
  1043. }
  1044. $('.netcasignInfo').append(htmlDOM);
  1045. var len = $('.hasTsa').length;
  1046. for(var j=0;j<len;j++){
  1047. if(that.VerifyInfos[j].hasTsa === false){
  1048. $('.hasTsa').eq(j).css({"display":'none'})
  1049. }
  1050. if(!that.VerifyInfos[j].tsaCertPathBuildText){
  1051. $('.hasTsaCertPathBuildText').eq(j).css({"display":'none'})
  1052. }
  1053. if(!that.VerifyInfos[j].signCertPathBuildText){
  1054. $('.signCertPathBuildText').eq(j).css({"display":'none'})
  1055. }
  1056. if(!that.VerifyInfos[j].isVerifyRevokeText){
  1057. $('.isVerifyRevokeText').eq(j).css({"display":'none'})
  1058. }
  1059. }
  1060. that.selectCertField(); // 选中签名状态中的某一个签名信息,显示选中的签名域
  1061. htmlDOM = null;
  1062. len = null;
  1063. };
  1064. that.displayCert = function() {
  1065. var arr = document.getElementsByClassName("netcadetailBtn");
  1066. var arr1 = document.getElementsByClassName('netcahiddenBtn');
  1067. var DeviceOutputId = document.getElementById('DeviceOutputId');
  1068. for (var i = 0; i < arr.length; i++) {
  1069. arr[i].index = i;
  1070. var _arr = arr[i];
  1071. _arr.onclick = function () {
  1072. DeviceOutputId.value = arr1[this.index].value;
  1073. that.uIDisplayCert(DeviceOutputId.value);
  1074. _arr = null;
  1075. }
  1076. }
  1077. };
  1078. that.uIDisplayCert = function(val){
  1079. var certEncode = val;
  1080. var selectType = "Device";
  1081. var selectCondition = "InValidity='True' && CertType='Signature'";
  1082. var params = {
  1083. cert: {
  1084. "encode": certEncode,
  1085. "type": selectType,
  1086. "condition": selectCondition
  1087. }
  1088. };
  1089. NetcaPKI.displayCert(params)
  1090. .Then(function(res){
  1091. })
  1092. .Catch(function (res) {
  1093. alert(res.msg);
  1094. });
  1095. };
  1096. /**
  1097. * 签名状态 切换显示
  1098. * */
  1099. that.displayInfoFeild = function() {
  1100. var btn_fold = document.getElementsByClassName("btn_fold");
  1101. for(var i=0;i<btn_fold.length;i++){
  1102. btn_fold[i].index = i;
  1103. var _btn_fold = btn_fold[i];
  1104. _btn_fold.onclick = function () {
  1105. if($('.netcasignTime').eq(this.index).css('display') === 'none'){
  1106. $('.netcasignTime').eq(this.index).css({"display":"block"});
  1107. $('.btn_fold_img').eq(this.index).attr('src','/public/netcasign/ui/images/icon/btn_fold.png')
  1108. }else{
  1109. $('.netcasignTime').eq(this.index).css({"display":"none"});
  1110. $('.btn_fold_img').eq(this.index).attr('src','/public/netcasign/ui/images/icon/btn_unfold.png')
  1111. }
  1112. _btn_fold = null;
  1113. }
  1114. }
  1115. };
  1116. /***
  1117. * 获取PDF文档的签名域信息
  1118. * */
  1119. that.getSignatureFieldInfo = function(signBytes,streamId){
  1120. if($(".netcafieldInfo").length){
  1121. $(".netcafieldInfo").remove(); //先删除旧的签名域
  1122. }
  1123. var params = {
  1124. srcFile: '',
  1125. srcBytes: signBytes,
  1126. srcStreamId: streamId
  1127. };
  1128. NetcaPKI.getSignatureFieldInfo(params)
  1129. .Then(function (res) {
  1130. that.getSignatureFieldInfoSuccessCallBack(res,streamId);
  1131. })
  1132. .Catch(function (res) {
  1133. that.getSignatureFieldInfoFailedCallBack(res);
  1134. });
  1135. };
  1136. that.getSignatureFieldInfoSuccessCallBack = function(res,streamId){
  1137. signFields = res.signFields; //签名域信息
  1138. that.describeSignatureField(); //描绘签名域
  1139. that.createRevokeEvent(streamId); //撤章事件
  1140. if(!signFields){
  1141. $('#netcasignedDataVerify').css('display', 'none');
  1142. layer.closeAll('loading');
  1143. return;
  1144. }
  1145. // 缩放pdf,只获取签名域,不需要重新验证
  1146. if(zoom){
  1147. zoom = false;
  1148. layer.closeAll('loading');
  1149. return;
  1150. }
  1151. //打开是否马上验证 和签名后 一定验证
  1152. if(!isVerifyOpen){
  1153. isVerifyOpen = true;
  1154. layer.closeAll('loading');
  1155. return;
  1156. }
  1157. if(isVerifyOpen){
  1158. if(streamId){ //大文件验证
  1159. that.signedDataVerify('', '', verifyLevel, isOnlineverifyrevoke, streamId);
  1160. } else { //小文件验证
  1161. that.signedDataVerify('', NetcaPDFSeal.SetPDFBytes, verifyLevel, isOnlineverifyrevoke);
  1162. }
  1163. }
  1164. };
  1165. // 描绘签名域
  1166. that.describeSignatureField = function() {
  1167. if($('.netcafieldInfo').length){
  1168. $('.netcafieldInfo').remove();
  1169. }
  1170. var viewer_width = $('#viewer').width();
  1171. var newscale = that.getScale();//缩放比例
  1172. var scale = 0.75; // 75% 对应72dpi; 如果不是75%缩放比例,需要对应转换为72dpi的坐标大小
  1173. var page_width;
  1174. var _brank;
  1175. if(signFields){
  1176. for(var i=0;i<signFields.length;i++){
  1177. (function(i){
  1178. page_width = $('#viewer .page').eq(signFields[i].pageNum-1).width();
  1179. _brank = (viewer_width - page_width) / 2;
  1180. signFields[i].xPos = signFields[i].xPos * newscale / scale;
  1181. signFields[i].yPos = signFields[i].yPos * newscale / scale;
  1182. if(signFields[i].pageNum > 1){
  1183. var _height = that.addHeight(signFields[i].pageNum);
  1184. signFields[i].yPos = _height + signFields[i].yPos;
  1185. }
  1186. signFields[i].xPos = signFields[i].xPos + parseInt(_brank);
  1187. signFields[i].width = signFields[i].width * newscale / scale;
  1188. signFields[i].height = signFields[i].height * newscale / scale;
  1189. // 签名域
  1190. $('#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>');
  1191. if(signFields[i].width === 0){
  1192. $('.netcafieldInfo').eq(i).css({"display":"none"})
  1193. }
  1194. })(i);
  1195. }
  1196. that.selectSignatureField(); //选中签名域 显示签名状态中的某一个的签名信息
  1197. } else {
  1198. $('#netcasignedDataVerify').css('display','none');
  1199. $('#viewerContainer').css({"margin-top":"0"});
  1200. $('#netcaDisplaySignedDataVerify').css('display','none');
  1201. }
  1202. };
  1203. that.getSignatureFieldInfoFailedCallBack = function(res){
  1204. layer.closeAll('loading');
  1205. // alert('签名域信息失败:'+res.msg);
  1206. };
  1207. that.zoomPDFBySelectOptionScale = function(){
  1208. // 缩放页面 重新描绘签名域
  1209. $('#scaleSelect').change(function(){
  1210. that.getSignatureFieldInfo(NetcaPDFSeal.SetPDFBytes, unfinishedStreamId);
  1211. })
  1212. };
  1213. that.createRevokeEvent = function(streamId) {
  1214. // filedFlag 普通签章完成后的 签名/章 才有撤销按钮;批量签章、骑缝章没有撤销按钮
  1215. if(filedFlag){
  1216. $('.netcafieldInfo').eq($('.netcafieldInfo').length-1).append('' +
  1217. '<img id="btn_discard" src="/public/netcasign/ui/images/icon/btn_discard_nor.png" alt="" ' +
  1218. 'style="position:absolute;top:-15px;right:-15px;z-index:1000;display: none;">' +
  1219. '');
  1220. $('.netcafieldInfo').eq($('.netcafieldInfo').length-1).hover(function(){
  1221. $('#btn_discard').css({'display':'block'});
  1222. },function(){
  1223. $('#btn_discard').css({'display':'none'});
  1224. });
  1225. $('#btn_discard').click(function(){
  1226. // -1表示最后的一个签名/章
  1227. that.isLoading();
  1228. if(streamId){
  1229. that.signatureVerifierUndoPDF('',-1, unfinishedStreamId, true);
  1230. } else {
  1231. that.signatureVerifierUndoPDF(NetcaPDFSeal.SetPDFBytes,-1);
  1232. }
  1233. });
  1234. }
  1235. };
  1236. that.signatureVerifierUndoPDF = function(_signBytes, _index, _streamId, _isReturnStreamId){
  1237. layer.confirm('是否需要撤销选定的签章?',{
  1238. btn: ['是','否'] //按钮
  1239. }, function(index){
  1240. layer.close(index);
  1241. var params = {
  1242. signFile: '',
  1243. signBytes: _signBytes,
  1244. index: _index,
  1245. srcStreamId: _streamId,
  1246. isReturnStreamId: _isReturnStreamId
  1247. };
  1248. NetcaPKI.signatureVerifierUndoPDF(params)
  1249. .Then(function (res) {
  1250. if(res.srcBytes == null ||res.srcBytes.length ==0 ){
  1251. that.signatureVerifierUndoPDFReadStreamCallBack(res);
  1252. return;
  1253. }
  1254. that.revokeSignatureSuccessCall(res.srcBytes); //撤章成功回调
  1255. })
  1256. .Catch(function (res) {
  1257. layer.closeAll('loading');
  1258. alert('撤销签名/章失败:'+res.msg);
  1259. });
  1260. }, function(){
  1261. layer.closeAll('loading');
  1262. });
  1263. };
  1264. that.revokeSignatureSuccessCall = function(srcBytes) {
  1265. // 撤章成功回调
  1266. // 如果窗口大小改变 还得重绘签名域
  1267. NetcaPDFSeal.setPDFBytes(srcBytes);
  1268. that.openPDF(NetcaPDFSeal.SetPDFBytes);
  1269. filedFlag = false;
  1270. if(signFields.length){
  1271. signFields.pop();
  1272. }
  1273. if(that.VerifyInfos.length){
  1274. that.VerifyInfos.pop();
  1275. }
  1276. that.displaySignedDataVerifyTip(that.VerifyInfos);
  1277. $('.netcafieldInfo').last().remove();
  1278. $('.netcasignDetail').last().remove();
  1279. layer.closeAll('loading');
  1280. };
  1281. that.signatureVerifierUndoPDFReadStreamCallBack = function(signSuccessRes){
  1282. completedStreamId = signSuccessRes.srcBytesStream.streamId;
  1283. signSuccessRes.destFileEncode='';
  1284. var params = {
  1285. streamId: signSuccessRes.srcBytesStream.streamId,
  1286. length: writeLength*1024*1024
  1287. };
  1288. NetcaPKI.readStream(params)
  1289. .Then(function (res) {
  1290. that.SignatureVerifierUndoPDFReadStreamUpdateCallBack(res, signSuccessRes);
  1291. })
  1292. .Catch(function (res) {
  1293. alert('撤销签名/章失败:'+res.msg);
  1294. });
  1295. };
  1296. that.SignatureVerifierUndoPDFReadStreamUpdateCallBack = function(res, signSuccessRes)
  1297. {
  1298. completedStreamId = res.streamId;
  1299. signSuccessRes.destFileEncode = signSuccessRes.destFileEncode + res.data;
  1300. if(!res.hasMoreData)
  1301. {
  1302. that.revokeSignatureSuccessCall(signSuccessRes.destFileEncode);
  1303. return;
  1304. }
  1305. var params = {
  1306. streamId: res.streamId,
  1307. length: writeLength*1024*1024
  1308. };
  1309. NetcaPKI.readStream(params)
  1310. .Then(function (res) {
  1311. that.SignatureVerifierUndoPDFReadStreamUpdateCallBack(res, signSuccessRes);
  1312. })
  1313. .Catch(function (res) {
  1314. alert('撤销签名/章失败:'+res.msg);
  1315. });
  1316. };
  1317. /*** 选中签名域信息* */
  1318. that.selectSignatureField = function(){
  1319. var netcafieldInfo = document.getElementsByClassName("netcafieldInfo");
  1320. for(var i=0;i<netcafieldInfo.length;i++){
  1321. netcafieldInfo[i].index = i;
  1322. var _netcafieldInfo = netcafieldInfo[i];
  1323. _netcafieldInfo.onclick = function () {
  1324. // 通过签名域name 与 验证结果的fieldName 对应上
  1325. var name = $('.netcafieldInfo').eq(this.index).attr('name');
  1326. $('.netcafieldInfo').eq(this.index).css({'border':'4px dashed #426bf6'});
  1327. $('.netcafieldInfo').eq(this.index).siblings().css({'border':''});
  1328. $('.netcasignDetail[name='+name+']').css({"background":"#e2eeff"});
  1329. $('.netcasignDetail[name='+name+']').siblings().css({"background":"none"});
  1330. if(this.index === netcafieldInfo.length - 1){
  1331. $('#btn_discard').css({'display':'block'});
  1332. $('.netcafieldInfo').eq(this.index).off('hover');
  1333. }
  1334. _netcafieldInfo = null;
  1335. }
  1336. }
  1337. };
  1338. /**
  1339. * 选中标签信息
  1340. * */
  1341. that.selectCertField = function(){
  1342. var netcasignDetail = document.getElementsByClassName("netcasignDetail");
  1343. for(var i=0;i<netcasignDetail.length;i++){
  1344. netcasignDetail[i].index = i;
  1345. var _netcasignDetail = netcasignDetail[i];
  1346. _netcasignDetail.onclick = function () {
  1347. var name = $('.netcasignDetail').eq(this.index).attr('name');
  1348. $('.netcafieldInfo[name='+name+']').css({'border':'4px dashed #426bf6'});
  1349. $('.netcafieldInfo[name='+name+']').siblings().css({'border':''});
  1350. $('.netcasignDetail').eq(this.index).css({"background":"#e2eeff"});
  1351. $('.netcasignDetail').eq(this.index).siblings().css({"background":"none"});
  1352. var _top = parseFloat($('.netcafieldInfo[name='+name+']').css('top'));
  1353. $('#viewerContainer').scrollTop(_top);
  1354. _netcasignDetail = null;
  1355. }
  1356. }
  1357. };
  1358. /**打印*/
  1359. that.printPDF = function() {
  1360. var params = {
  1361. srcBytes: NetcaPDFSeal.SetPDFBytes
  1362. };
  1363. NetcaPKI.printPDF(params)
  1364. .Then(function(res){
  1365. alert('打印文档成功');
  1366. })
  1367. .Catch(function(res){
  1368. alert('打印文档失败:' + res.msg);
  1369. });
  1370. };
  1371. /**
  1372. * 点击close按钮,关闭签名验证信息
  1373. * */
  1374. that.closeSignedDataVerifyInfo = function(params){
  1375. if(params === 'netcainvalidClose'){
  1376. $('#netcasignedDataVerify').css('display','none');
  1377. $('#viewerContainer').css({"margin-top":"0"});
  1378. $('#netcaDisplaySignedDataVerify').css({"top":'70px','height':'92%'})
  1379. }
  1380. if(params === 'netcaclose2'){
  1381. $('#netcaDisplaySignedDataVerify').css({'display':'none'});
  1382. that.getSignatureFieldInfo(NetcaPDFSeal.SetPDFBytes);
  1383. }
  1384. };
  1385. /**
  1386. * 点击详细信息,显示左侧签名验证详细信息
  1387. * */
  1388. that.displaySignedDataVerifyInfo = function(){
  1389. $('#netcaDisplaySignedDataVerify').css({'display':'block',"top":'117px','height':'84%'});
  1390. };
  1391. // 鼠标移入移除签章菜单背景色变化
  1392. that.transBackground = function(name) {
  1393. $('.'+name).hover(function(){
  1394. $(this).css('background','#DBECFF');
  1395. },function(){
  1396. $(this).css('background','#fff');
  1397. });
  1398. };
  1399. that.setUIVisible = function(obj){
  1400. for (var k in obj) {
  1401. if (!obj[k]) {
  1402. $('#' + k).css({'display': 'none'});
  1403. }else{
  1404. $('#' + k).css({'display': 'inline-block'});
  1405. }
  1406. }
  1407. if(obj.NetcaToolBar === true){
  1408. $('#toolbarViewer').css({'display':'block'});
  1409. }else if(obj.NetcaToolBar === false){
  1410. $('#toolbarViewer').css({'display':'none'});
  1411. }
  1412. };
  1413. that.getWorkTime = function() {
  1414. var date = new Date();
  1415. var time = date.getMinutes() + ":" + date.getSeconds() + ":" + date.getMilliseconds();
  1416. return time;
  1417. };
  1418. that.closeFile = function() {
  1419. $('#viewer').children().css('display', 'none');
  1420. $('#netcasignedDataVerify').css('display', 'none');
  1421. $('#netcaDisplaySignedDataVerify').css('display', 'none');
  1422. $('.netcasignpdf').css('margin-top', '0');
  1423. };
  1424. that.openPDFWithUrl = function(url) {
  1425. var origin = window.location.origin;
  1426. var pathname = window.location.pathname;
  1427. var newUrl = origin + pathname + '?file=' + encodeURIComponent(url);
  1428. window.location = newUrl;
  1429. };
  1430. return that;
  1431. })();
  1432. var NetcaIESignAPI = (function(){
  1433. 'use strict';
  1434. var that = {};
  1435. var readerAx;
  1436. that.openPDF = function(byteBase64){
  1437. if(readerAx == null)
  1438. readerAx = document.getElementById("NetcaReaderAx").object;
  1439. var comObj = null;
  1440. try {
  1441. var NETCA_PKI_BASE64_NO_NL = 1;
  1442. comObj = new ActiveXObject("NetcaPki.Utilities");
  1443. var bytesDecode = comObj.Base64Decode(byteBase64, NETCA_PKI_BASE64_NO_NL);
  1444. readerAx.PDFSavePath=":AutoSave:";
  1445. readerAx.AsyncOpenPDFBytes(bytesDecode);
  1446. } catch (e) {
  1447. alert("异常:" + e);
  1448. }
  1449. };
  1450. that.initPreView = function () {
  1451. var obj = {
  1452. 'NetcaToolBar': false,
  1453. 'navigationBar': false
  1454. };
  1455. that.setUIVisible(obj);
  1456. };
  1457. that.GetPDFBytes = function(){
  1458. if(readerAx == null)
  1459. readerAx = document.getElementById("NetcaReaderAx").object;
  1460. var path = readerAx.GetPDFBytes();
  1461. var comObj = new ActiveXObject("NetcaPki.Utilities");
  1462. var NETCA_PKI_BASE64_NO_NL =1;
  1463. NetcaPDFSeal.setPDFBytes(comObj.Base64Encode(path, NETCA_PKI_BASE64_NO_NL));
  1464. };
  1465. that.setUI = function (value,visiable) {
  1466. if (readerAx == null)
  1467. readerAx = document.getElementById("NetcaReaderAx").object;
  1468. readerAx.SetIndividuationUI(value, visiable, "");
  1469. };
  1470. that.initUI = function(){
  1471. var obj = {
  1472. // 'netcaopen':false,
  1473. 'netcasave':false,
  1474. 'netcasearch':false,
  1475. 'netcaFirstSeparator':false,
  1476. 'netcaSecondSeparator':false,
  1477. 'netcaThirdSeparaor':false,
  1478. // 'netcaVerfity':false,
  1479. 'netcaSetting':false,
  1480. 'netcaAbout':false,
  1481. 'navigationBar': false
  1482. };
  1483. $('#netcasignpdf').css('display','none');
  1484. that.setUIVisible(obj);
  1485. };
  1486. that.setUIVisible = function (obj ) {
  1487. var UI_PDF_TOOLBAR_BUTTON = 0; //工具栏
  1488. var UI_PDF_OPEN_BUTTON = 1; //打开按钮
  1489. var UI_PDF_SAVE_BUTTON = 2; //保存按钮
  1490. var UI_PDF_SERACH_BUTTON = 3; //搜索按钮
  1491. var UI_PDF_ZOOM_IN_BUTTON = 4; //放大按钮
  1492. var UI_PDF_ZOOM_OUT_BUTTON = 5; //缩小按钮
  1493. var UI_PDF_ZOOM_RATION_COMBO = 6; //放大缩小比例列表框
  1494. var UI_PDF_FIRST_SEPARATOR = 7;//第一个分割符控件
  1495. var UI_PDF_FRONT_PAGE_BUTTON = 8;//上一页按钮
  1496. var UI_PDF_NEXT_PAGE_BUTTON = 9; //下一页按钮
  1497. var UI_PDF_PAGE_NUM_EDIT = 10;//页面数字
  1498. var UI_PDF_SECOND_SEPARATOR = 11; //第二个分割符控件
  1499. var UI_PDF_SIGN_BUTTON = 12; //签章按钮
  1500. var UI_PDF_VERIFY_BUTTON = 13; //验证按钮
  1501. var UI_PDF_THIRD_SEPARATOR = 14; //第三个分割符控件
  1502. var UI_PDF_SETTING_BUTTON = 15; //设置按钮
  1503. var UI_PDF_ABOUT_BUTTON = 16; //关于按钮
  1504. var UI_PDF_NAVIGATION_BAR = 17 ;//导航栏
  1505. var UI_PDF_MARK_BUTTON = 18 ;//书签按钮
  1506. var UI_PDF_ANNOT_BUTTON = 19 ;//批注按钮
  1507. var UI_PDF_PRINT_BUTTON = 20;//打印按钮
  1508. var UI_PDF_COMMON_SIGN_MENU = 21; //签章签章
  1509. var UI_PDF_EMPLOYEE_SIGN_MENU = 22; //员工签章
  1510. var UI_PDF_INSTITUTION_SIGN_MENU = 23; //机构签章
  1511. var UI_PDF_ARTIFIFCIAL_SIGN_MENU = 24;//法人签章
  1512. var UI_PDF_CLOSE_BUTTON = 28;//关闭按钮
  1513. if (readerAx == null)
  1514. readerAx = document.getElementById("NetcaReaderAx").object;
  1515. //工具栏
  1516. if(obj.NetcaToolBar === true) {
  1517. readerAx.SetIndividuationUI(UI_PDF_TOOLBAR_BUTTON, true, "");
  1518. } else if (obj.NetcaToolBar === false) {
  1519. readerAx.SetIndividuationUI(UI_PDF_TOOLBAR_BUTTON, false, "");
  1520. }
  1521. //打开按钮
  1522. if(obj.openFile === true) {
  1523. readerAx.SetIndividuationUI(UI_PDF_OPEN_BUTTON, true, "");
  1524. } else if (obj.openFile === false) {
  1525. readerAx.SetIndividuationUI(UI_PDF_OPEN_BUTTON, false, "");
  1526. }
  1527. //关闭按钮
  1528. if(obj.netcasave === true) {
  1529. readerAx.SetIndividuationUI(UI_PDF_SAVE_BUTTON, true, "");
  1530. }else if(obj.netcasave === false){
  1531. readerAx.SetIndividuationUI(UI_PDF_SAVE_BUTTON, false, "");
  1532. }
  1533. //搜索
  1534. if(obj.viewFind === true) {
  1535. readerAx.SetIndividuationUI(UI_PDF_SERACH_BUTTON, true, "");
  1536. }else if(obj.viewFind === false){
  1537. readerAx.SetIndividuationUI(UI_PDF_SERACH_BUTTON, false, "");
  1538. }
  1539. //放大
  1540. if(obj.zoomIn === true) {
  1541. readerAx.SetIndividuationUI(UI_PDF_ZOOM_IN_BUTTON, true, "");
  1542. }else if( obj.zoomIn === false){
  1543. readerAx.SetIndividuationUI(UI_PDF_ZOOM_IN_BUTTON, false, "");
  1544. }
  1545. //缩小
  1546. if(obj.zoomOut === true) {
  1547. readerAx.SetIndividuationUI(UI_PDF_ZOOM_OUT_BUTTON, true, "");
  1548. }else if( obj.zoomOut === false){
  1549. readerAx.SetIndividuationUI(UI_PDF_ZOOM_OUT_BUTTON, false, "");
  1550. }
  1551. //缩放select控件
  1552. if(obj.scaleSelectContainer === true) {
  1553. readerAx.SetIndividuationUI(UI_PDF_ZOOM_RATION_COMBO, true, "");
  1554. }else if( obj.scaleSelectContainer === false){
  1555. readerAx.SetIndividuationUI(UI_PDF_ZOOM_RATION_COMBO, false, "");
  1556. }
  1557. //第一个分割符控件
  1558. if(obj.netcaFirstSeparator === true) {
  1559. readerAx.SetIndividuationUI(UI_PDF_FIRST_SEPARATOR, true, "");
  1560. }else if(obj.netcaFirstSeparator === false){
  1561. readerAx.SetIndividuationUI(UI_PDF_FIRST_SEPARATOR, false, "");
  1562. }
  1563. //上一页
  1564. if(obj.previous === true) {
  1565. readerAx.SetIndividuationUI(UI_PDF_FRONT_PAGE_BUTTON, true, "");
  1566. }else if( obj.previous === false){
  1567. readerAx.SetIndividuationUI(UI_PDF_FRONT_PAGE_BUTTON, false, "");
  1568. }
  1569. //下一页
  1570. if(obj.next === true) {
  1571. readerAx.SetIndividuationUI(UI_PDF_NEXT_PAGE_BUTTON, true, "");
  1572. }else if( obj.next === false){
  1573. readerAx.SetIndividuationUI(UI_PDF_NEXT_PAGE_BUTTON, false, "");
  1574. }
  1575. //页面数字
  1576. if(obj.netcapage === true) {
  1577. readerAx.SetIndividuationUI(UI_PDF_PAGE_NUM_EDIT, true, "");
  1578. }else if( obj.netcapage === false){
  1579. readerAx.SetIndividuationUI(UI_PDF_PAGE_NUM_EDIT, false, "");
  1580. }
  1581. //第二个分割符控件
  1582. if(obj.netcaSecondSeparator === true) {
  1583. readerAx.SetIndividuationUI(UI_PDF_SECOND_SEPARATOR, true, "");
  1584. }else if(obj.netcaSecondSeparator === false){
  1585. readerAx.SetIndividuationUI(UI_PDF_SECOND_SEPARATOR, false, "");
  1586. }
  1587. //关闭
  1588. if(obj.closeFile === true) {
  1589. readerAx.SetIndividuationUI(UI_PDF_CLOSE_BUTTON, true, "");
  1590. }else if(obj.closeFile === false){
  1591. readerAx.SetIndividuationUI(UI_PDF_CLOSE_BUTTON, false, "");
  1592. }
  1593. //验证
  1594. if(obj.verify === true) {
  1595. readerAx.SetIndividuationUI(UI_PDF_VERIFY_BUTTON, true, "");
  1596. }else if(obj.verify === false){
  1597. readerAx.SetIndividuationUI(UI_PDF_VERIFY_BUTTON, false, "");
  1598. }
  1599. //第三个分割符控件
  1600. if(obj.netcaThirdSeparaor === true) {
  1601. readerAx.SetIndividuationUI(UI_PDF_THIRD_SEPARATOR, true, "");
  1602. }else if(obj.netcaThirdSeparaor === false){
  1603. readerAx.SetIndividuationUI(UI_PDF_THIRD_SEPARATOR, false, "");
  1604. }
  1605. //设置
  1606. if(obj.netcaSetting === true) {
  1607. readerAx.SetIndividuationUI(UI_PDF_SETTING_BUTTON, true, "");
  1608. }else if(obj.netcaSetting === false){
  1609. readerAx.SetIndividuationUI(UI_PDF_SETTING_BUTTON, false, "");
  1610. }
  1611. //关于
  1612. if(obj.netcaAbout === true) {
  1613. readerAx.SetIndividuationUI(UI_PDF_ABOUT_BUTTON, true, "");
  1614. }else if(obj.netcaAbout === false){
  1615. readerAx.SetIndividuationUI(UI_PDF_ABOUT_BUTTON, false, "");
  1616. }
  1617. //普通签章
  1618. if(obj.sign === true) {
  1619. readerAx.SetIndividuationUI(UI_PDF_COMMON_SIGN_MENU, true, "");
  1620. }else if(obj.sign === false){
  1621. readerAx.SetIndividuationUI(UI_PDF_COMMON_SIGN_MENU, false, "");
  1622. }
  1623. //员工签章
  1624. if(obj.netcastaff === true) {
  1625. readerAx.SetIndividuationUI(UI_PDF_EMPLOYEE_SIGN_MENU, true, "");
  1626. }else if(obj.netcastaff === false){
  1627. readerAx.SetIndividuationUI(UI_PDF_EMPLOYEE_SIGN_MENU, false, "");
  1628. }
  1629. //机构签章
  1630. if(obj.netcaorganization === true) {
  1631. readerAx.SetIndividuationUI(UI_PDF_INSTITUTION_SIGN_MENU, true, "");
  1632. }else if(obj.netcaorganization === false){
  1633. readerAx.SetIndividuationUI(UI_PDF_INSTITUTION_SIGN_MENU, false, "");
  1634. }
  1635. //法人签章
  1636. if(obj.netcalegalperson === true) {
  1637. readerAx.SetIndividuationUI(UI_PDF_ARTIFIFCIAL_SIGN_MENU, true, "");
  1638. }else if(obj.netcalegalperson === false){
  1639. readerAx.SetIndividuationUI(UI_PDF_ARTIFIFCIAL_SIGN_MENU, false, "");
  1640. }
  1641. //打印
  1642. if(obj.print === true) {
  1643. readerAx.SetIndividuationUI(UI_PDF_PRINT_BUTTON, true, "");
  1644. }else if(obj.print === false){
  1645. readerAx.SetIndividuationUI(UI_PDF_PRINT_BUTTON, false, "");
  1646. }
  1647. //导航栏
  1648. if(obj.navigationBar === true) {
  1649. readerAx.SetIndividuationUI(UI_PDF_NAVIGATION_BAR, true, "");
  1650. }else if(obj.navigationBar === false){
  1651. readerAx.SetIndividuationUI(UI_PDF_NAVIGATION_BAR, false, "");
  1652. }
  1653. };
  1654. /**初始化页面
  1655. * */
  1656. that.init = function(){
  1657. that.initUI();
  1658. };
  1659. that.signCallbackEvent = function(callback){
  1660. if(callback != null)
  1661. {
  1662. if (readerAx == null)
  1663. readerAx = document.getElementById("NetcaReaderAx").object;
  1664. readerAx.SetSignCallback(callback)
  1665. }
  1666. };
  1667. that.verifyCallbackEvent = function(callback){
  1668. if(callback != null)
  1669. {
  1670. if (readerAx == null)
  1671. readerAx = document.getElementById("NetcaReaderAx").object;
  1672. readerAx.SetVerifyCallback(callback)
  1673. }
  1674. };
  1675. that.openPDFWithUrl = function(url) {
  1676. if (readerAx == null)
  1677. readerAx = document.getElementById("NetcaReaderAx").object;
  1678. try {
  1679. readerAx.PDFSavePath = ":AutoSave:";
  1680. readerAx.AsyncOpenPDFUrl(url);
  1681. } catch(e) {
  1682. alert("异常:" + e);
  1683. }
  1684. };
  1685. return that;
  1686. })();
  1687. var NetcaPDFSeal = (function(){
  1688. 'use strict';
  1689. /**set base64*/
  1690. var that = {
  1691. SetPDFBytes:''
  1692. };
  1693. that.setPDFBytes = function(INPDFbase64){
  1694. that.SetPDFBytes = INPDFbase64
  1695. };
  1696. /**get base64*/
  1697. that.getSignPDFBytes = function(){
  1698. if (that._isIE()) {
  1699. NetcaIESignAPI.GetPDFBytes();
  1700. }
  1701. return that.SetPDFBytes
  1702. };
  1703. /**判断当前浏览器是否为IE浏览器
  1704. * */
  1705. that._isIE = function(){
  1706. var comObj = null;
  1707. try{
  1708. comObj = new ActiveXObject("NetcaPki.Utilities");
  1709. return true;
  1710. }catch(e){
  1711. return false;
  1712. }
  1713. };
  1714. /**
  1715. * 需要隐藏的功能按钮
  1716. * */
  1717. that.setUIVisible = function(obj){
  1718. if(NetcaPDFSeal._isIE()){
  1719. NetcaIESignAPI.setUIVisible(obj);
  1720. }else{
  1721. NetcaSignAPI.setUIVisible(obj);
  1722. }
  1723. };
  1724. /**初始化页面
  1725. * */
  1726. that.init = function(){
  1727. that.initUI();
  1728. };
  1729. that.initUI = function(){
  1730. if (that._isIE()) {
  1731. NetcaIESignAPI.initUI();
  1732. } else {
  1733. NetcaSignAPI.initUI();
  1734. }
  1735. };
  1736. /**打开pdf
  1737. * */
  1738. that.openPDFBytes = function(OpenPDFBytes){
  1739. var search = window.location.search;
  1740. var reg = new RegExp(/\?file=/);
  1741. if(that._isIE()){
  1742. NetcaIESignAPI.openPDF(OpenPDFBytes);
  1743. }else{
  1744. if(!reg.test(search)){
  1745. // url有file参数说明是使用url打开的,没有file则是使用base64字节流打开
  1746. return;
  1747. if(!OpenPDFBytes){
  1748. alert('打开文档数据为空');
  1749. return;
  1750. }
  1751. NetcaSignAPI.getSealConfigInfo(OpenPDFBytes);
  1752. NetcaSignAPI.openPDF(OpenPDFBytes);
  1753. NetcaPDFSeal.setPDFBytes(OpenPDFBytes);
  1754. }else {
  1755. var interval = setInterval(function(){
  1756. if (globalPDFViewerApplication.pdfDocument == null) {
  1757. console.info('Loading...');
  1758. } else {
  1759. if($('#viewer .page').length>0){
  1760. clearInterval(interval);
  1761. globalPDFViewerApplication.pdfDocument.getData().then(function(data){
  1762. // var PDFBytes = NetcaUtils.arrayBufferToBase64(data);
  1763. NetcaPDFSeal.setPDFBytes(data);
  1764. // if (can_netcasign) {
  1765. // NetcaSignAPI.getSealConfigInfo(data);
  1766. // }
  1767. })
  1768. }
  1769. }
  1770. }, 1000);
  1771. }
  1772. }
  1773. };
  1774. that.getVerifySignSuccessFlag = function(arr){
  1775. var invalidArr = [];
  1776. var notSureArr = [];
  1777. for(var i=0;i<arr.length;i++){
  1778. if(arr[i].verifyResult === 3){ //签名无效
  1779. invalidArr.push(arr[i].verifyResult)
  1780. }
  1781. if(arr[i].verifyResult === 2){ //签名不确定
  1782. notSureArr.push(arr[i].verifyResult)
  1783. } // 签名有效
  1784. }
  1785. if(invalidArr.length){
  1786. return 0
  1787. }else{
  1788. if(notSureArr.length){
  1789. return -1
  1790. }else{
  1791. return 1
  1792. }
  1793. }
  1794. };
  1795. /**签章完成后对外提示接口*/
  1796. that.setSignCallbackEvent = function(callback){
  1797. if(that._isIE()){
  1798. NetcaIESignAPI.signCallbackEvent(callback)
  1799. }else{
  1800. NetcaSignAPI.signCallbackEvent = callback
  1801. }
  1802. };
  1803. that.setVerifyCallbackEvent = function(callback){
  1804. if(that._isIE()){
  1805. NetcaIESignAPI.verifyCallbackEvent(callback)
  1806. }else{
  1807. NetcaSignAPI.verifyCallbackEvent = callback
  1808. }
  1809. };
  1810. that.openPDFWithUrl = function(url) {
  1811. if(that._isIE()){
  1812. NetcaIESignAPI.openPDFWithUrl(url);
  1813. } else {
  1814. NetcaSignAPI.openPDFWithUrl(url);
  1815. }
  1816. };
  1817. return that;
  1818. })();