viewer.html 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. <!DOCTYPE html>
  2. <html dir="ltr" mozdisallowselectionprint moznomarginboxes>
  3. <head>
  4. <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
  5. <meta name="apple-mobile-web-app-capable" content="yes">
  6. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  7. <title>PDF</title>
  8. <link rel="stylesheet" href="../build/reset.css">
  9. <link rel="resource" type="application/l10n" href="locale/locale.properties">
  10. <script src="../build/pdf.js"></script>
  11. <style type="text/css">
  12. html,
  13. body,
  14. .mui-content {
  15. padding: 0;
  16. margin: 0;
  17. height: 100%;
  18. box-sizing: border-box;
  19. padding-bottom: 0 !important;
  20. }
  21. .mui-content {
  22. display: flex;
  23. flex-direction: row;
  24. overflow: hidden;
  25. }
  26. .mui-content .side-menu {
  27. width: 100px;
  28. height: 100%;
  29. overflow-y: auto;
  30. padding: 10px;
  31. border-right: 1px solid #e6e6e6;
  32. }
  33. .mui-content .side-menu .viewer-image {
  34. border: 1px solid #e6e6e6;
  35. background: #fff;
  36. margin-bottom: 10px;
  37. border-radius: 5px;
  38. overflow: hidden;
  39. }
  40. .mui-content img {
  41. width: 100%;
  42. height: 100%;
  43. }
  44. .mui-content .side-menu .viewer-image.active {
  45. border-color: #4681e9;
  46. }
  47. .mui-content .view-box {
  48. flex: 1;
  49. width: 0;
  50. height: 100%;
  51. overflow-y: auto;
  52. background: #e6e6e6;
  53. position: relative;
  54. }
  55. .mui-content .view-box .page {
  56. text-align: center;
  57. display: none;
  58. position: relative;
  59. overflow: hidden;
  60. }
  61. .mui-content .view-box .page.active {
  62. display: block;
  63. }
  64. .mui-content .view-box .page .seal {
  65. position: absolute;
  66. width: 30px;
  67. height: 30px;
  68. top: 0;
  69. left: 0;
  70. z-index: 2;
  71. }
  72. .mui-content .view-box .page .sign {
  73. position: absolute;
  74. width: 30px;
  75. height: 10px;
  76. top: 0;
  77. left: 0;
  78. z-index: 2;
  79. }
  80. .btn-box {
  81. text-align: center;
  82. margin: 20px 0;
  83. }
  84. .btn {
  85. font-size: 12px;
  86. padding: 5px 10px;
  87. border-radius: 5px;
  88. margin: 0 5px;
  89. cursor: pointer;
  90. }
  91. /*字体大小*/
  92. .size-24 {
  93. font-size: 24px;
  94. }
  95. .size-18 {
  96. font-size: 18px;
  97. }
  98. .size-16 {
  99. font-size: 16px;
  100. }
  101. .size-14 {
  102. font-size: 14px;
  103. }
  104. .size-12 {
  105. font-size: 12px;
  106. }
  107. .size-10 {
  108. font-size: 10px;
  109. }
  110. .size-weight {
  111. font-weight: bold;
  112. }
  113. .red-color {
  114. color: #fd5c54;
  115. }
  116. .blue-color {
  117. color: #5c88ef;
  118. }
  119. .gray-color {
  120. color: #666666;
  121. }
  122. .grays-color {
  123. color: #999999;
  124. }
  125. .orange-color {
  126. color: #f8a722;
  127. }
  128. .white-color {
  129. color: #fff;
  130. }
  131. .backgroud-blue {
  132. background: #5c88ef;
  133. }
  134. .backgroud-red {
  135. background: #fd5c54;
  136. }
  137. .backgroud-yellow {
  138. background: #f8a722;
  139. }
  140. .backgroud-qing {
  141. background: #5cc8b4;
  142. }
  143. .backgroud-white {
  144. background: #fff;
  145. }
  146. .displayNone {
  147. display: none;
  148. }
  149. .operation {
  150. position: fixed;
  151. bottom: 40px;
  152. right: 10px;
  153. }
  154. </style>
  155. </head>
  156. <body>
  157. <div class="mui-content">
  158. <div id="viewer-image" class="side-menu"></div>
  159. <div class="view-box">
  160. <div id="viewer"></div>
  161. <div class="operation displayNone">
  162. <div id="select-menu" class="btn-box">
  163. <span onclick="btn(this)" class="btn white-color backgroud-blue">
  164. 申请盖章
  165. </span>
  166. </div>
  167. </div>
  168. </div>
  169. </div>
  170. <script type="text/javascript">
  171. PDFJS.workerSrc = '../build/pdf.worker.js';
  172. var pageIndex = 0,
  173. imgIndex = 0,
  174. nowIndex = 0,
  175. moveType, url, positionList = [];
  176. function getQueryObject(url) {
  177. url = url == null ? window.location.href : url
  178. const search = url.substring(url.lastIndexOf('?') + 1)
  179. const obj = {}
  180. const reg = /([^?&=]+)=([^?&=]*)/g
  181. search.replace(reg, (rs, $1, $2) => {
  182. const name = decodeURIComponent($1)
  183. let val = decodeURIComponent($2)
  184. val = String(val)
  185. obj[name] = val
  186. return rs
  187. })
  188. return obj
  189. }
  190. var query = getQueryObject();
  191. if (query.type == 'look') {
  192. positionList = window.parent['getPositionList']();
  193. } else if (query.type == 'edit') {
  194. document.getElementsByClassName('operation')[0].style.display = 'block';
  195. if (window.parent.getPositionList) {
  196. positionList = window.parent['getPositionList']();
  197. }
  198. }
  199. function renderPage(page) {
  200. var viewport = page.getViewport(1);
  201. var canvas = document.getElementById('the-canvas' + pageIndex);
  202. pageIndex++
  203. var context = canvas.getContext('2d');
  204. var outputScale = window.devicePixelRatio || 1;
  205. canvas.width = Math.floor(viewport.width * outputScale);
  206. canvas.height = Math.floor(viewport.height * outputScale);
  207. canvas.style.width = Math.floor(viewport.width) + "px";
  208. canvas.style.height = Math.floor(viewport.height) + "px";
  209. var transform = outputScale !== 1 ? [outputScale, 0, 0, outputScale, 0, 0] : null;
  210. var renderContext = {
  211. canvasContext: context,
  212. transform: transform,
  213. viewport: viewport
  214. };
  215. page.render(renderContext).then(function() {
  216. var base64 = canvas.toDataURL('image/jpeg', 0.7);
  217. var div = document.createElement('div');
  218. div.className = 'viewer-image';
  219. div.id = imgIndex;
  220. div.onclick = function() {
  221. if (this.className == 'viewer-image active') return;
  222. document.getElementsByClassName('viewer-image active')[0].classList.remove('active');
  223. document.getElementsByClassName('page active')[0].classList.remove('active');
  224. this.classList.add('active');
  225. document.getElementById('page' + this.id).classList.add('active');
  226. nowIndex = this.id;
  227. }
  228. if (imgIndex == 0) div.className = 'viewer-image active'
  229. div.innerHTML = '<img src="' + base64 + '">'
  230. document.getElementById('viewer-image').appendChild(div);
  231. if (positionList.length > 0) {
  232. positionList.filter(function(item) {
  233. return item.nowIndex == imgIndex
  234. }).forEach(function(item) {
  235. var div = document.createElement('div');
  236. div.className = item.moveType;
  237. div.innerHTML = '<img src="' + item.url + '">'
  238. div.style.left = item.left + '%';
  239. div.style.top = item.top + '%';
  240. document.getElementById('page' + item.nowIndex).appendChild(div);
  241. })
  242. }
  243. imgIndex++
  244. });
  245. }
  246. function createDom(i) {
  247. var div = document.createElement('div');
  248. div.className = 'page'
  249. div.id = 'page' + i;
  250. div.innerHTML = '<canvas id="the-canvas' + i + '"></canvas>';
  251. if (i == 0) div.className = 'page active'
  252. document.getElementById('viewer').appendChild(div);
  253. }
  254. PDFJS.getDocument({
  255. url: query.file
  256. }).promise.then(function(pdf) {
  257. for (var i = 0; i < pdf.pdfInfo.numPages; i++) {
  258. createDom(i);
  259. pdf.getPage(i + 1).then(renderPage)
  260. }
  261. })
  262. function btn(_self) {
  263. _self.parentNode.style.display = 'none'
  264. // window.parent['signSeal'](_self.id, 'page' + nowIndex);
  265. createImage('https://fc1tn.baidu.com/it/u=3484410304,3029921230&fm=202&mola=new&crop=v1',1)
  266. }
  267. function createImage(imageUrl, sealId) {
  268. var div = document.createElement('div');
  269. div.className = 'seal move'
  270. div.setAttribute('sealId', sealId);
  271. div.innerHTML = '<img src="' + imageUrl + '">'
  272. document.getElementById('page0').appendChild(div);
  273. move();
  274. }
  275. function move() {
  276. var oBox = document.getElementsByClassName("move")[0];
  277. oBox.onmousedown = function(ev) {
  278. console.log('-----');
  279. var disX = ev.clientX - oBox.offsetLeft;
  280. var disY = ev.clientY - oBox.offsetTop;
  281. document.onmousemove = function(ev) {
  282. var l = ev.clientX - disX;
  283. var t = ev.clientY - disY;
  284. oBox.style.left = l + "px";
  285. oBox.style.top = t + "px";
  286. };
  287. document.onmouseup = function() {
  288. document.onmousemove = null;
  289. };
  290. return false; //阻止默认事件的发生
  291. };
  292. }
  293. function noMove() {
  294. var oBox = document.getElementsByClassName("move")[0];
  295. oBox.onmousedown = function(ev) {
  296. return false
  297. };
  298. }
  299. function sure() {
  300. return {}
  301. }
  302. </script>
  303. </body>
  304. </html>