1; (function (g, fn) { 2 var version = "1.2.21", pdfjsVersion = "2.1.266"; 3 console.log("The latest version and API of pdfh5 from: https://www.gjtool.cn (pdf.js: " + pdfjsVersion + " , pdfh5.js: " + version + ")") 4 if (typeof require !== 'undefined') { 5 if (g.$ === undefined) { 6 g.$ = require('./jquery-1.11.3.min.js'); 7 } 8 g.pdfjsWorker = require('./pdf.worker.js'); 9 g.pdfjsLib = require('./pdf.js'); 10 } 11 var pdfjsLib = g.pdfjsLib, $ = g.$, pdfjsWorker = g.pdfjsWorker; 12 if (typeof define === 'function' && define.amd) { 13 define(function () { 14 return fn(g, pdfjsWorker, pdfjsLib, $, version) 15 }) 16 } else if (typeof module !== 'undefined' && module.exports) { 17 module.exports = fn(g, pdfjsWorker, pdfjsLib, $, version) 18 } else { 19 g.Pdfh5 = fn(g, pdfjsWorker, pdfjsLib, $, version) 20 } 21})(typeof window !== 'undefined' ? window : this, function (g, pdfjsWorker, pdfjsLib, $, version) { 22 'use strict'; 23 var definePinchZoom = function ($) { 24 var PinchZoom = function (el, options, viewerContainer) { 25 this.el = $(el); 26 this.viewerContainer = viewerContainer; 27 this.zoomFactor = 1; 28 this.lastScale = 1; 29 this.offset = { 30 x: 0, 31 y: 0 32 }; 33 this.options = $.extend({}, this.defaults, options); 34 this.options.tapZoomFactor = isNaN(options.tapZoomFactor) ? 2 : options.tapZoomFactor; 35 this.options.zoomOutFactor = isNaN(options.zoomOutFactor) ? 1.2 : options.zoomOutFactor; 36 this.options.animationDuration = isNaN(options.animationDuration) ? 300 : options.animationDuration; 37 this.options.maxZoom = isNaN(options.maxZoom) ? 4 : options.maxZoom; 38 this.options.minZoom = isNaN(options.minZoom) ? 0.8 : options.minZoom; 39 this.setupMarkup(); 40 this.bindEvents(); 41 this.update(); 42 this.enable(); 43 this.height = 0; 44 this.load = false; 45 this.direction = null; 46 this.clientY = null; 47 this.lastclientY = null; 48 }, 49 sum = function (a, b) { 50 return a + b; 51 }, 52 isCloseTo = function (value, expected) { 53 return value > expected - 0.01 && value < expected + 0.01; 54 }; 55 56 PinchZoom.prototype = { 57 defaults: { 58 tapZoomFactor: 2, 59 zoomOutFactor: 1.2, 60 animationDuration: 300, 61 maxZoom: 4, 62 minZoom: 0.8, 63 lockDragAxis: false, 64 use2d: true, 65 zoomStartEventName: 'pz_zoomstart', 66 zoomEndEventName: 'pz_zoomend', 67 dragStartEventName: 'pz_dragstart', 68 dragEndEventName: 'pz_dragend', 69 doubleTapEventName: 'pz_doubletap' 70 }, 71 handleDragStart: function (event) { 72 this.el.trigger(this.options.dragStartEventName); 73 this.stopAnimation(); 74 this.lastDragPosition = false; 75 this.hasInteraction = true; 76 this.handleDrag(event); 77 }, 78 handleDrag: function (event) { 79 80 if (this.zoomFactor > 1.0) { 81 var touch = this.getTouches(event)[0]; 82 this.drag(touch, this.lastDragPosition, event); 83 this.offset = this.sanitizeOffset(this.offset); 84 this.lastDragPosition = touch; 85 } 86 }, 87 88 handleDragEnd: function () { 89 this.el.trigger(this.options.dragEndEventName); 90 this.end(); 91 }, 92 handleZoomStart: function (event) { 93 this.el.trigger(this.options.zoomStartEventName); 94 this.stopAnimation(); 95 this.lastScale = 1; 96 this.nthZoom = 0; 97 this.lastZoomCenter = false; 98 this.hasInteraction = true; 99 }, 100 handleZoom: function (event, newScale) { 101 var touchCenter = this.getTouchCenter(this.getTouches(event)), 102 scale = newScale / this.lastScale; 103 this.lastScale = newScale; 104 this.nthZoom += 1; 105 if (this.nthZoom > 3) { 106 107 this.scale(scale, touchCenter); 108 this.drag(touchCenter, this.lastZoomCenter); 109 } 110 this.lastZoomCenter = touchCenter; 111 }, 112 113 handleZoomEnd: function () { 114 this.el.trigger(this.options.zoomEndEventName); 115 this.end(); 116 }, 117 handleDoubleTap: function (event) { 118 var center = this.getTouches(event)[0], 119 zoomFactor = this.zoomFactor > 1 ? 1 : this.options.tapZoomFactor, 120 startZoomFactor = this.zoomFactor, 121 updateProgress = (function (progress) { 122 this.scaleTo(startZoomFactor + progress * (zoomFactor - startZoomFactor), center); 123 }).bind(this); 124 125 if (this.hasInteraction) { 126 return; 127 } 128 if (startZoomFactor > zoomFactor) { 129 center = this.getCurrentZoomCenter(); 130 } 131 132 this.animate(this.options.animationDuration, updateProgress, this.swing); 133 this.el.trigger(this.options.doubleTapEventName); 134 }, 135 sanitizeOffset: function (offset) { 136 var maxX = (this.zoomFactor - 1) * this.getContainerX(), 137 maxY = (this.zoomFactor - 1) * this.getContainerY(), 138 maxOffsetX = Math.max(maxX, 0), 139 maxOffsetY = Math.max(maxY, 0), 140 minOffsetX = Math.min(maxX, 0), 141 minOffsetY = Math.min(maxY, 0); 142 143 var x = Math.min(Math.max(offset.x, minOffsetX), maxOffsetX), 144 y = Math.min(Math.max(offset.y, minOffsetY), maxOffsetY); 145 146 147 return { 148 x: x, 149 y: y 150 }; 151 }, 152 scaleTo: function (zoomFactor, center) { 153 this.scale(zoomFactor / this.zoomFactor, center); 154 }, 155 scale: function (scale, center) { 156 scale = this.scaleZoomFactor(scale); 157 this.addOffset({ 158 x: (scale - 1) * (center.x + this.offset.x), 159 y: (scale - 1) * (center.y + this.offset.y) 160 });
161 }, 162 scaleZoomFactor: function (scale) { 163 var originalZoomFactor = this.zoomFactor; 164 this.zoomFactor *= scale; 165 this.zoomFactor = Math.min(this.options.maxZoom, Math.max(this.zoomFactor, this.options.minZoom)); 166 return this.zoomFactor / originalZoomFactor; 167 }, 168 drag: function (center, lastCenter, event) { 169 if (lastCenter) { 170 if (this.options.lockDragAxis) { 171 if (Math.abs(center.x - lastCenter.x) > Math.abs(center.y - lastCenter.y)) { 172 this.addOffset({ 173 x: -(center.x - lastCenter.x), 174 y: 0 175 }); 176 } else { 177 this.addOffset({ 178 y: -(center.y - lastCenter.y), 179 x: 0 180 }); 181 } 182 } else { 183 if (center.y - lastCenter.y < 0) { 184 this.direction = "down"; 185 } else if (center.y - lastCenter.y > 10) { 186 this.direction = "up"; 187 } 188 this.addOffset({ 189 y: -(center.y - lastCenter.y), 190 x: -(center.x - lastCenter.x) 191 }); 192 } 193 } 194 }, 195 getTouchCenter: function (touches) { 196 return this.getVectorAvg(touches); 197 }, 198 getVectorAvg: function (vectors) { 199 return { 200 x: vectors.map(function (v) { 201 return v.x; 202 }).reduce(sum) / vectors.length, 203 y: vectors.map(function (v) { 204 return v.y; 205 }).reduce(sum) / vectors.length 206 }; 207 }, 208 addOffset: function (offset) { 209 this.offset = { 210 x: this.offset.x + offset.x, 211 y: this.offset.y + offset.y 212 }; 213 }, 214 215 sanitize: function () { 216 if (this.zoomFactor < this.options.zoomOutFactor) { 217 this.zoomOutAnimation(); 218 } else if (this.isInsaneOffset(this.offset)) { 219 this.sanitizeOffsetAnimation(); 220 } 221 }, 222 isInsaneOffset: function (offset) { 223 var sanitizedOffset = this.sanitizeOffset(offset); 224 return sanitizedOffset.x !== offset.x || 225 sanitizedOffset.y !== offset.y; 226 }, 227 sanitizeOffsetAnimation: function () { 228 var targetOffset = this.sanitizeOffset(this.offset), 229 startOffset = { 230 x: this.offset.x, 231 y: this.offset.y 232 }, 233 updateProgress = (function (progress) { 234 this.offset.x = startOffset.x + progress * (targetOffset.x - startOffset.x); 235 this.offset.y = startOffset.y + progress * (targetOffset.y - startOffset.y); 236 this.update(); 237 }).bind(this); 238 239 this.animate( 240 this.options.animationDuration, 241 updateProgress, 242 this.swing 243 ); 244 }, 245 zoomOutAnimation: function () { 246 var startZoomFactor = this.zoomFactor, 247 zoomFactor = 1, 248 center = this.getCurrentZoomCenter(), 249 updateProgress = (function (progress) { 250 this.scaleTo(startZoomFactor + progress * (zoomFactor - startZoomFactor), center); 251 }).bind(this); 252 253 this.animate( 254 this.options.animationDuration, 255 updateProgress, 256 this.swing 257 ); 258 }, 259 updateAspectRatio: function () { 260 this.setContainerY(this.getContainerX() / this.getAspectRatio()); 261 }, 262 getInitialZoomFactor: function () { 263 if (this.container[0] && this.el[0]) { 264 return this.container[0].offsetWidth / this.el[0].offsetWidth; 265 } else { 266 return 0 267 } 268 }, 269 getAspectRatio: function () { 270 if (this.el[0]) { 271 var offsetHeight = this.el[0].offsetHeight; 272 return this.container[0].offsetWidth / offsetHeight; 273 } else { 274 return 0 275 } 276 277 }, 278 getCurrentZoomCenter: function () { 279 var length = this.container[0].offsetWidth * this.zoomFactor, 280 offsetLeft = this.offset.x, 281 offsetRight = length - offsetLeft - this.container[0].offsetWidth, 282 widthOffsetRatio = offsetLeft / offsetRight, 283 centerX = widthOffsetRatio * this.container[0].offsetWidth / (widthOffsetRatio + 1), 284 285 height = this.container[0].offsetHeight * this.zoomFactor, 286 offsetTop = this.offset.y, 287 offsetBottom = height - offsetTop - this.container[0].offsetHeight, 288 heightOffsetRatio = offsetTop / offsetBottom, 289 centerY = heightOffsetRatio * this.container[0].offsetHeight / (heightOffsetRatio + 1); 290 291 if (offsetRight === 0) { 292 centerX = this.container[0].offsetWidth; 293 } 294 if (offsetBottom === 0) { 295 centerY = this.container[0].offsetHeight; 296 } 297 298 return { 299 x: centerX, 300 y: centerY 301 }; 302 }, 303 304 canDrag: function () { 305 return !isCloseTo(this.zoomFactor, 1); 306 }, 307 308 getTouches: function (event) { 309 var position = this.container.offset(); 310 return Array.prototype.slice.call(event.touches).map(function (touch) { 311 return { 312 x: touch.pageX - position.left, 313 y: touch.pageY - position.top 314 }; 315 });
316 }, 317 animate: function (duration, framefn, timefn, callback) { 318 var startTime = new Date().getTime(), 319 renderFrame = (function () { 320 if (!this.inAnimation) { 321 return; 322 } 323 var frameTime = new Date().getTime() - startTime, 324 progress = frameTime / duration; 325 if (frameTime >= duration) { 326 framefn(1); 327 if (callback) { 328 callback(); 329 } 330 this.update(); 331 this.stopAnimation(); 332 this.update(); 333 } else { 334 if (timefn) { 335 progress = timefn(progress); 336 } 337 framefn(progress); 338 this.update(); 339 requestAnimationFrame(renderFrame); 340 } 341 }).bind(this); 342 this.inAnimation = true; 343 requestAnimationFrame(renderFrame); 344 }, 345 stopAnimation: function () { 346 this.inAnimation = false; 347 348 }, 349 swing: function (p) { 350 return -Math.cos(p * Math.PI) / 2 + 0.5; 351 }, 352 353 getContainerX: function () { 354 if (this.el[0]) { 355 return this.el[0].offsetWidth; 356 } else { 357 return 0; 358 } 359 }, 360 361 getContainerY: function () { 362 return this.el[0].offsetHeight; 363 }, 364 setContainerY: function (y) { 365 y = y.toFixed(2); 366 return this.container.height(y); 367 }, 368 setupMarkup: function () {
369 this.container = $('<div class="pinch-zoom-container"></div>'); 370 this.el.before(this.container); 371 this.container.append(this.el); 372 373 this.container.css({ 374 'position': 'relative', 375 }); 376 377 this.el.css({ 378 '-webkit-transform-origin': '0% 0%', 379 '-moz-transform-origin': '0% 0%', 380 '-ms-transform-origin': '0% 0%', 381 '-o-transform-origin': '0% 0%', 382 'transform-origin': '0% 0%', 383 'position': 'relative' 384 }); 385 386 }, 387 388 end: function () { 389 this.hasInteraction = false; 390 this.sanitize(); 391 this.update(); 392 393 }, 394 bindEvents: function () { 395 detectGestures(this.container.eq(0), this, this.viewerContainer); 396 $(g).on('resize', this.update.bind(this)); 397 $(this.el).find('img').on('load', this.update.bind(this)); 398 399 }, 400 update: function () { 401 402 if (this.updatePlaned) { 403 return; 404 } 405 this.updatePlaned = true; 406 setTimeout((function () { 407 this.updatePlaned = false; 408 this.updateAspectRatio(); 409 var zoomFactor = this.getInitialZoomFactor() * this.zoomFactor, 410 offsetX = (-this.offset.x / zoomFactor).toFixed(3), 411 offsetY = (-this.offset.y / zoomFactor).toFixed(3); 412 this.lastclientY = offsetY; 413 414 var transform3d = 'scale3d(' + zoomFactor + ', ' + zoomFactor + ',1) ' + 415 'translate3d(' + offsetX + 'px,' + offsetY + 'px,0px)', 416 transform2d = 'scale(' + zoomFactor + ', ' + zoomFactor + ') ' + 417 'translate(' + offsetX + 'px,' + offsetY + 'px)', 418 removeClone = (function () { 419 if (this.clone) { 420 this.clone.remove(); 421 delete this.clone; 422 } 423 }).bind(this); 424 if (!this.options.use2d || this.hasInteraction || this.inAnimation) { 425 this.is3d = true; 426 this.el.css({ 427 '-webkit-transform': transform3d, 428 '-o-transform': transform2d, 429 '-ms-transform': transform2d, 430 '-moz-transform': transform2d, 431 'transform': transform3d 432 }); 433 } else { 434 this.el.css({ 435 '-webkit-transform': transform2d, 436 '-o-transform': transform2d, 437 '-ms-transform': transform2d, 438 '-moz-transform': transform2d, 439 'transform': transform2d 440 }); 441 this.is3d = false; 442 } 443 this.done && this.done.call(this, zoomFactor) 444 }).bind(this), 0); 445 }, 446 enable: function () { 447 this.enabled = true; 448 }, 449 disable: function () { 450 this.enabled = false; 451 }, 452 destroy: function () { 453 var dom = this.el.clone(); 454 var p = this.container.parent(); 455 this.container.remove(); 456 dom.removeAttr('style'); 457 p.append(dom); 458 } 459 }; 460 461 var detectGestures = function (el, target, viewerContainer) { 462 var interaction = null, 463 fingers = 0, 464 lastTouchStart = null, 465 startTouches = null, 466 lastTouchY = null, 467 clientY = null, 468 lastclientY = 0, 469 lastTop = 0, 470 setInteraction = function (newInteraction, event) { 471 if (interaction !== newInteraction) { 472 473 if (interaction && !newInteraction) { 474 switch (interaction) { 475 case "zoom": 476 target.handleZoomEnd(event); 477 break; 478 case 'drag': 479 target.handleDragEnd(event); 480 break; 481 } 482 } 483 484 switch (newInteraction) { 485 case 'zoom': 486 target.handleZoomStart(event); 487 break; 488 case 'drag': 489 target.handleDragStart(event); 490 break; 491 } 492 } 493 interaction = newInteraction; 494 }, 495 496 updateInteraction = function (event) { 497 if (fingers === 2) { 498 setInteraction('zoom'); 499 } else if (fingers === 1 && target.canDrag()) { 500 setInteraction('drag', event); 501 } else { 502 setInteraction(null, event); 503 } 504 }, 505 506 targetTouches = function (touches) { 507 return Array.prototype.slice.call(touches).map(function (touch) { 508 return { 509 x: touch.pageX, 510 y: touch.pageY 511 }; 512 });
513 }, 514 515 getDistance = function (a, b) { 516 var x, y; 517 x = a.x - b.x; 518 y = a.y - b.y; 519 return Math.sqrt(x * x + y * y); 520 }, 521 522 calculateScale = function (startTouches, endTouches) { 523 var startDistance = getDistance(startTouches[0], startTouches[1]), 524 endDistance = getDistance(endTouches[0], endTouches[1]); 525 return endDistance / startDistance; 526 }, 527 528 cancelEvent = function (event) { 529 event.stopPropagation(); 530 event.preventDefault(); 531 }, 532 533 detectDoubleTap = function (event) { 534 var time = (new Date()).getTime(); 535 var pageY = event.changedTouches[0].pageY; 536 var top = parentNode.scrollTop || 0; 537 if (fingers > 1) { 538 lastTouchStart = null; 539 lastTouchY = null; 540 cancelEvent(event); 541 } 542 543 if (time - lastTouchStart < 300 && Math.abs(pageY - lastTouchY) < 10 && Math.abs(lastTop - top) < 10) { 544 cancelEvent(event); 545 target.handleDoubleTap(event); 546 switch (interaction) { 547 case "zoom": 548 target.handleZoomEnd(event); 549 break; 550 case 'drag': 551 target.handleDragEnd(event); 552 break; 553 } 554 } 555 556 if (fingers === 1) { 557 lastTouchStart = time; 558 lastTouchY = pageY; 559 lastTop = top; 560 } 561 }, 562 firstMove = true; 563 if (viewerContainer) { 564 var parentNode = viewerContainer[0]; 565 } 566 if (parentNode) { 567 parentNode.addEventListener('touchstart', function (event) { 568 if (target.enabled) { 569 firstMove = true; 570 fingers = event.touches.length; 571 detectDoubleTap(event); 572 clientY = event.changedTouches[0].clientY; 573 if (fingers > 1) { 574 cancelEvent(event); 575 } 576 } 577 }); 578 579 parentNode.addEventListener('touchmove', function (event) { 580 if (target.enabled) { 581 lastclientY = event.changedTouches[0].clientY; 582 if (firstMove) { 583 updateInteraction(event); 584 startTouches = targetTouches(event.touches); 585 } else { 586 switch (interaction) { 587 case 'zoom': 588 target.handleZoom(event, calculateScale(startTouches, targetTouches(event.touches))); 589 break; 590 case 'drag': 591 target.handleDrag(event); 592 break; 593 } 594 if (interaction) { 595 target.update(lastclientY); 596 } 597 } 598 if (fingers > 1) { 599 cancelEvent(event); 600 } 601 firstMove = false; 602 } 603 }); 604 605 parentNode.addEventListener('touchend', function (event) { 606 if (target.enabled) { 607 fingers = event.touches.length; 608 if (fingers > 1) { 609 cancelEvent(event); 610 } 611 updateInteraction(event); 612 } 613 }); 614 } 615 616 }; 617 return PinchZoom; 618 }; 619 var PinchZoom = definePinchZoom($); 620 var Pdfh5 = function (dom, options) { 621 this.version = version; 622 this.container = $(dom); 623 this.thePDF = null; 624 this.totalNum = null; 625 this.pages = null; 626 this.initTime = 0; 627 this.scale = 1.3; 628 this.currentNum = 1; 629 this.loadedCount = 0; 630 this.endTime = 0; 631 this.pinchZoom = null; 632 this.timer = null; 633 this.docWidth = document.documentElement.clientWidth; 634 this.winWidth = $(window).width(); 635 this.eventType = {}; 636 this.cache = {}; 637 this.cacheNum = 1; 638 this.options = options; 639 this.resizeEvent = false; 640 this.init(options); 641 }; 642 Pdfh5.prototype = { 643 init: function (options) { 644 if (this.container[0].pdfLoaded) { 645 this.destroy(); 646 } 647 this.container[0].pdfLoaded = false; 648 this.container.addClass("pdfjs") 649 var self = this; 650 this.initTime = new Date().getTime(); 651 setTimeout(function () { 652 var arr1 = self.eventType["scroll"]; 653 if (arr1 && arr1 instanceof Array) { 654 for (var i = 0; i < arr1.length; i++) { 655 arr1[i] && arr1[i].call(self, self.initTime) 656 } 657 } 658 }, 0) 659 options = options ? options : {}; 660 options.pdfurl = options.pdfurl ? options.pdfurl : null; 661 options.data = options.data ? options.data : null; 662 options.scale = options.scale ? options.scale : self.scale; 663 options.zoomEnable = options.zoomEnable === false ? false : true; 664 options.scrollEnable = options.scrollEnable === false ? false : true; 665 options.loadingBar = options.loadingBar === false ? false : true; 666 options.pageNum = options.pageNum === false ? false : true; 667 options.backTop = options.backTop === false ? false : true; 668 options.URIenable = options.URIenable === false ? false : true; 669 options.fullscreen = options.fullscreen === false ? false : true; 670 options.lazy = options.lazy === true ? true : false; 671 options.renderType = options.renderType === "canvas" ? "canvas" : "svg"; 672 options.resize = options.resize === false ? false : true; 673 if (options.renderType === "canvas") { 674 options.scale = 2; 675 } 676 options.type = options.type === "ajax" ? "ajax" : "fetch"; 677 var html = '<div class="loadingBar">' + 678 '<div class="progress">' + 679 ' <div class="glimmer">' + 680 '</div>' + 681 ' </div>' + 682 '</div>' + 683 '<div class="pageNum">' + 684 '<div class="pageNum-bg"></div>' + 685 ' <div class="pageNum-num">' + 686 ' <span class="pageNow">1</span>/' + 687 '<span class="pageTotal">1</span>' + 688 '</div>' + 689 ' </div>' + 690 '<div class="backTop">' + 691 '</div>' + 692 '<div class="loadEffect loading"></div>'; 693 if (!this.container.find('.pageNum')[0]) { 694 this.container.append(html); 695 } 696 var viewer = document.createElement("div"); 697 viewer.className = 'pdfViewer'; 698 var viewerContainer = document.createElement("div"); 699 viewerContainer.className = 'viewerContainer'; 700 viewerContainer.appendChild(viewer); 701 this.container.append(viewerContainer); 702 this.viewer = $(viewer); 703 this.viewerContainer = $(viewerContainer); 704 this.pageNum = this.container.find('.pageNum'); 705 this.pageNow = this.pageNum.find('.pageNow'); 706 this.pageTotal = this.pageNum.find('.pageTotal'); 707 this.loadingBar = this.container.find('.loadingBar'); 708 this.progress = this.loadingBar.find('.progress'); 709 this.progressDom = this.progress[0]; 710 this.backTop = this.container.find('.backTop'); 711 this.loading = this.container.find('.loading'); 712 if (!options.loadingBar) { 713 this.loadingBar.hide() 714 } 715 var containerH = this.container.height(), 716 height = containerH * (1 / 3); 717 718 if (!options.scrollEnable) { 719 this.viewerContainer.css({ 720 "overflow": "hidden" 721 }) 722 } else { 723 this.viewerContainer.css({ 724 "overflow": "auto" 725 }) 726 } 727 viewerContainer.addEventListener('scroll', function () { 728 var scrollTop = viewerContainer.scrollTop; 729 if (scrollTop >= 150) { 730 if (options.backTop) { 731 self.backTop.show(); 732 } 733 } else { 734 if (options.backTop) { 735 self.backTop.fadeOut(200); 736 } 737 } 738 if (self.viewerContainer) { 739 self.pages = self.viewerContainer.find('.pageContainer'); 740 } 741 clearTimeout(self.timer); 742 if (options.pageNum && self.pageNum) { 743 self.pageNum.show(); 744 } 745 var h = containerH; 746 if (self.pages) { 747 self.pages.each(function (index, obj) { 748 var top = obj.getBoundingClientRect().top; 749 var bottom = obj.getBoundingClientRect().bottom; 750 if (top <= height && bottom > height) { 751 if (options.pageNum) { 752 self.pageNow.text(index + 1) 753 } 754 self.currentNum = index + 1; 755 } 756 if (top <= h && bottom > h) { 757 self.cacheNum = index + 1; 758 } 759 }) 760 } 761 if (scrollTop + self.container.height() >= self.viewer[0].offsetHeight) { 762 self.pageNow.text(self.totalNum) 763 } 764 if (scrollTop === 0) { 765 self.pageNow.text(1) 766 } 767 self.timer = setTimeout(function () { 768 if (options.pageNum && self.pageNum) { 769 self.pageNum.fadeOut(200); 770 } 771 }, 1500) 772 if (options.lazy) { 773 var num = Math.floor(100 / self.totalNum).toFixed(2);
774 if (self.cache[self.cacheNum + ""] && !self.cache[self.cacheNum + ""].loaded) { 775 var page = self.cache[self.cacheNum + ""].page; 776 var container = self.cache[self.cacheNum + ""].container; 777 var pageNum = self.cacheNum; 778 self.cache[pageNum + ""].loaded = true; 779 var scaledViewport = self.cache[pageNum + ""].scaledViewport; 780 if (options.renderType === "svg") { 781 self.renderSvg(page, scaledViewport, pageNum, num, container, options) 782 } else { 783 self.renderCanvas(page, scaledViewport, pageNum, num, container, options) 784 } 785 } 786 if (self.cache[(self.totalNum - 1) + ""] && self.cache[(self.totalNum - 1) + ""].loaded && !self.cache[self.totalNum + ""].loaded) { 787 var page = self.cache[self.totalNum + ""].page; 788 var container = self.cache[self.totalNum + ""].container; 789 var pageNum = self.totalNum; 790 self.cache[pageNum + ""].loaded = true; 791 var scaledViewport = self.cache[pageNum + ""].scaledViewport; 792 if (options.renderType === "svg") { 793 self.renderSvg(page, scaledViewport, pageNum, num, container, options) 794 } else { 795 self.renderCanvas(page, scaledViewport, pageNum, num, container, options) 796 } 797 } 798 } 799 var arr1 = self.eventType["scroll"]; 800 if (arr1 && arr1 instanceof Array) { 801 for (var i = 0; i < arr1.length; i++) { 802 arr1[i] && arr1[i].call(self, scrollTop) 803 } 804 } 805 }) 806 this.backTop.on('click tap', function () { 807 var mart = self.viewer.css('transform'); 808 var arr = mart.replace(/[a-z\(\)\s]/g, '').split(','); 809 var s1 = arr[0]; 810 var s2 = arr[3]; 811 var x = arr[4] / 2; 812 var left = self.viewer[0].getBoundingClientRect().left; 813 if (left <= -self.docWidth * 2) { 814 x = -self.docWidth / 2 815 } 816 self.viewer.css({ 817 transform: 'scale(' + s1 + ', ' + s2 + ') translate(' + x + 'px, 0px)' 818 }) 819 if (self.pinchZoom) { 820 self.pinchZoom.offset.y = 0; 821 self.pinchZoom.lastclientY = 0; 822 } 823 self.viewerContainer.animate({ 824 scrollTop: 0 825 }, 300) 826 var arr1 = self.eventType["backTop"]; 827 if (arr1 && arr1 instanceof Array) { 828 for (var i = 0; i < arr1.length; i++) { 829 arr1[i] && arr1[i].call(self) 830 } 831 } 832 }) 833 //è·åurl带çåæ°å°å 834 function GetQueryString(name) { 835 var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); 836 var r = g.location.search.substr(1).match(reg); 837 if (r != null) return decodeURIComponent(r[2]); 838 return ""; 839 } 840 var pdfurl = GetQueryString("file"), url = ""; 841 if (pdfurl && options.URIenable) { 842 url = pdfurl 843 } else if (options.pdfurl) { 844 url = options.pdfurl 845 } 846 if (url) { 847 if (options.type === "ajax") { 848 $.ajax({
849 type: "get", 850 mimeType: 'text/plain; charset=x-user-defined', 851 cache: false, 852 url: url, 853 success: function (data) { 854 var rawLength = data.length; 855 // var array = new Uint8Array(new ArrayBuffer(rawLength)); 856 // for (i = 0; i < rawLength; i++) { 857 // array[i] = data.charCodeAt(i) & 0xff; 858 // } 859 var array = []; 860 for (i = 0; i < rawLength; i++) { 861 array.push(data.charCodeAt(i) & 0xff); 862 } 863 self.renderPdf(options, { 864 data: array 865 }) 866 }, 867 error: function (err) { 868 self.loading.hide() 869 var time = new Date().getTime(); 870 self.endTime = time - self.initTime; 871 var arr1 = self.eventType["complete"]; 872 if (arr1 && arr1 instanceof Array) { 873 for (var i = 0; i < arr1.length; i++) { 874 arr1[i] && arr1[i].call(self, "error", err.statusText, self.endTime) 875 } 876 } 877 var arr2 = self.eventType["error"]; 878 if (arr2 && arr2 instanceof Array) { 879 for (var i = 0; i < arr2.length; i++) { 880 arr2[i] && arr2[i].call(self, err.statusText, self.endTime) 881 } 882 } 883 throw Error(err.statusText) 884 } 885 }); 886 } else {
887 self.renderPdf(options, { 888 url: url 889 }) 890 } 891 } else if (options.data) { 892 var data = options.data; 893 var rawLength = data.length; 894 if (typeof data === "string" && data != "") { 895 var array = []; 896 for (i = 0; i < rawLength; i++) { 897 array.push(data.charCodeAt(i) & 0xff); 898 } 899 self.renderPdf(options, { 900 data: array 901 }) 902 } else if (typeof data === "object") { 903 if (data[0] === 0) { 904 var time = new Date().getTime(); 905 self.endTime = time - self.initTime; 906 var arr1 = self.eventType["complete"]; 907 if (arr1 && arr1 instanceof Array) { 908 for (var i = 0; i < arr1.length; i++) { 909 arr1[i] && arr1[i].call(self, "error", "options.data is empty Array", self.endTime) 910 } 911 } 912 var arr2 = self.eventType["error"]; 913 if (arr2 && arr2 instanceof Array) { 914 for (var i = 0; i < arr2.length; i++) { 915 arr2[i] && arr2[i].call(self, "options.data is empty Array", self.endTime) 916 } 917 } 918 throw Error("options.data is empty Array") 919 } else {
920 self.renderPdf(options, { 921 data: data 922 }) 923 } 924 } 925 926 } else { 927 var time = new Date().getTime(); 928 self.endTime = time - self.initTime; 929 var arr1 = self.eventType["complete"]; 930 if (arr1 && arr1 instanceof Array) { 931 for (var i = 0; i < arr1.length; i++) { 932 arr1[i] && arr1[i].call(self, "error", "Expect options.pdfurl or options.data!", self.endTime) 933 } 934 } 935 var arr2 = self.eventType["error"]; 936 if (arr2 && arr2 instanceof Array) { 937 for (var i = 0; i < arr2.length; i++) { 938 arr2[i] && arr2[i].call(self, "Expect options.pdfurl or options.data!", self.endTime) 939 } 940 } 941 throw Error("Expect options.pdfurl or options.data!") 942 } 943 }, 944 renderPdf: function (options, obj) { 945 this.container[0].pdfLoaded = true; 946 var self = this; 947 if (options.cMapUrl) { 948 obj.cMapUrl = options.cMapUrl; 949 } else { 950 obj.cMapUrl = './js/cmaps/'; 951 } 952 obj.cMapPacked = true; 953 self.loadingBar.show(); 954 self.progress.css({ 955 width: "3%" 956 }) 957 pdfjsLib.getDocument(obj).then(function (pdf) { 958 self.loading.hide() 959 self.thePDF = pdf; 960 self.totalNum = pdf.numPages; 961 self.pageTotal.text(self.totalNum) 962 var arr1 = self.eventType["ready"]; 963 if (arr1 && arr1 instanceof Array) { 964 for (var i = 0; i < arr1.length; i++) { 965 arr1[i] && arr1[i].call(self) 966 } 967 } 968 self.pinchZoom = new PinchZoom(self.viewer, { 969 tapZoomFactor: options.tapZoomFactor, 970 zoomOutFactor: options.zoomOutFactor, 971 animationDuration: options.animationDuration, 972 maxZoom: options.maxZoom, 973 minZoom: options.minZoom 974 }, self.viewerContainer); 975 self.pinchZoom.done = function (scale) { 976 if (scale == 1) { 977 if (self.viewerContainer) { 978 self.viewerContainer.css({ 979 '-webkit-overflow-scrolling': 'touch' 980 }) 981 } 982 983 } else { 984 if (self.viewerContainer) { 985 self.viewerContainer.css({ 986 '-webkit-overflow-scrolling': 'auto' 987 }) 988 } 989 } 990 var arr1 = self.eventType["zoom"]; 991 if (arr1 && arr1 instanceof Array) { 992 for (var i = 0; i < arr1.length; i++) { 993 arr1[i] && arr1[i].call(self, scale) 994 } 995 } 996 } 997 if (options.zoomEnable) { 998 self.pinchZoom.enable() 999 } else { 1000 self.pinchZoom.disable() 1001 } 1002 var promise = Promise.resolve(); 1003 var num = Math.floor(100 / self.totalNum).toFixed(2); 1004 for (var i = 1; i <= self.totalNum; i++) { 1005 self.cache[i + ""] = { 1006 page: null, 1007 loaded: false, 1008 container: null, 1009 scaledViewport: null 1010 }; 1011 promise = promise.then(function (pageNum) { 1012 return self.thePDF.getPage(pageNum).then(function (page) { 1013 self.cache[pageNum + ""].page = page; 1014 var viewport = page.getViewport(options.scale); 1015 var scale = (self.docWidth / viewport.width).toFixed(2) 1016 var scaledViewport = page.getViewport(parseFloat(scale)) 1017 var container = document.createElement('div'); 1018 container.id = 'pageContainer' + pageNum; 1019 container.className = 'pageContainer'; 1020 container.setAttribute('name', 'page=' + pageNum); 1021 container.setAttribute('title', 'Page ' + pageNum); 1022 var loadEffect = document.createElement('div'); 1023 loadEffect.className = 'loadEffect'; 1024 container.appendChild(loadEffect); 1025 self.viewer[0].appendChild(container); 1026 if (window.ActiveXObject || "ActiveXObject" in window) { 1027 $(container).css({ 1028 'width': viewport.width + 'px', 1029 "height": viewport.height + 'px' 1030 }).attr("data-scale", viewport.width / viewport.height) 1031 } else { 1032 $(container).css({ 1033 'max-width': viewport.width, 1034 "max-height": viewport.height, 1035 "min-height": $(container).width() / (viewport.viewBox[2]/ viewport.viewBox[3]) + 'px' 1036 }).attr("data-scale", viewport.width / viewport.height) 1037 } 1038 self.cache[pageNum + ""].container = container; 1039 self.cache[pageNum + ""].scaledViewport = scaledViewport; 1040 var sum = 0, containerH = self.container.height(); 1041 self.pages = self.viewerContainer.find('.pageContainer'); 1042 if (options.resize) { 1043 self.resize() 1044 } 1045 if (self.pages && options.lazy) { 1046 self.pages.each(function (index, obj) { 1047 var top = obj.offsetTop; 1048 if (top <= containerH) { 1049 sum = index + 1; 1050 self.cache[sum + ""].loaded = true; 1051 } 1052 }) 1053 } 1054 1055 if (pageNum > sum && options.lazy) { 1056 return 1057 } 1058 if (options.renderType === "svg") { 1059 return self.renderSvg(page, scaledViewport, pageNum, num, container, options, viewport) 1060 } 1061 return self.renderCanvas(page, scaledViewport, pageNum, num, container, options) 1062 });
1063 }.bind(null, i)); 1064 } 1065 1066 }).catch(function (err) { 1067 self.loading.hide(); 1068 var time = new Date().getTime(); 1069 self.endTime = time - self.initTime; 1070 var arr1 = self.eventType["complete"]; 1071 if (arr1 && arr1 instanceof Array) { 1072 for (var i = 0; i < arr1.length; i++) { 1073 arr1[i] && arr1[i].call(self, "error", err.message, self.endTime) 1074 } 1075 } 1076 var arr2 = self.eventType["error"]; 1077 if (arr2 && arr2 instanceof Array) { 1078 for (var i = 0; i < arr2.length; i++) { 1079 arr2[i] && arr2[i].call(self, err.message, self.endTime) 1080 } 1081 } 1082 }) 1083 }, 1084 renderSvg: function (page, scaledViewport, pageNum, num, container, options, viewport) { 1085 var self = this; 1086 1087 return page.getOperatorList().then(function (opList) { 1088 var svgGfx = new pdfjsLib.SVGGraphics(page.commonObjs, page.objs); 1089 return svgGfx.getSVG(opList, scaledViewport).then(function (svg) { 1090 self.loadedCount++; 1091 container.children[0].style.display = "none"; 1092 container.appendChild(svg); 1093 svg.style.width = "100%"; 1094 svg.style.height = "100%"; 1095 self.progress.css({ 1096 width: num * self.loadedCount + "%" 1097 }) 1098 if (window.ActiveXObject || "ActiveXObject" in window) { 1099 1100 } else { 1101 $(container).css({ 1102 // "min-height": svg.getBBox().height + 'px' 1103 }) 1104 } 1105 var time = new Date().getTime(); 1106 var arr1 = self.eventType["render"]; 1107 if (arr1 && arr1 instanceof Array) { 1108 for (var i = 0; i < arr1.length; i++) { 1109 arr1[i] && arr1[i].call(self, pageNum, time - self.initTime, container) 1110 } 1111 } 1112 if (self.loadedCount === self.totalNum) { 1113 self.finalRender(options) 1114 } 1115 }); 1116 }); 1117 }, 1118 renderCanvas: function (page, viewport, pageNum, num, container, options) { 1119 var self = this; 1120 var viewport = page.getViewport(options.scale); 1121 var scale = (self.docWidth / viewport.width).toFixed(2) 1122 var canvas = document.createElement("canvas"); 1123 var obj2 = { 1124 'Cheight': viewport.height * scale, 1125 'width': viewport.width, 1126 'height': viewport.height, 1127 'canvas': canvas, 1128 'index': self.loadedCount 1129 } 1130 var context = canvas.getContext('2d'); 1131 canvas.height = viewport.height; 1132 canvas.width = viewport.width; 1133 1134 self.progress.css({ 1135 width: num * self.loadedCount + "%" 1136 }) 1137 obj2.src = obj2.canvas.toDataURL("image/jpeg"); 1138 //å¨canvasä¸ç»å¶ 1139 return page.render({ 1140 canvasContext: context, 1141 viewport: viewport 1142 }).then(function () { 1143 self.loadedCount++; 1144 var img = new Image(); 1145 var time = new Date().getTime(); 1146 var time2 = 0; 1147 if (self.renderTime == 0) { 1148 time2 = time - self.startTime 1149 } else { 1150 time2 = time - self.renderTime 1151 } 1152 obj2.src = obj2.canvas.toDataURL("image/jpeg"); 1153 img.src = obj2.src; 1154 container.appendChild(img); 1155 img.onload = function () { 1156 $(container).css({ 1157 "min-height": img.height + 'px' 1158 }) 1159 } 1160 1161 var time = new Date().getTime(); 1162 var arr1 = self.eventType["render"]; 1163 if (arr1 && arr1 instanceof Array) { 1164 for (var i = 0; i < arr1.length; i++) { 1165 arr1[i] && arr1[i].call(self, pageNum, time - self.initTime, container) 1166 } 1167 } 1168 if (self.loadedCount === self.totalNum) { 1169 self.finalRender(options) 1170 } 1171 }) 1172 }, 1173 finalRender: function (options) { 1174 var time = new Date().getTime(); 1175 var self = this; 1176 self.progress.css({ 1177 width: "100%" 1178 }); 1179 setTimeout(function () { 1180 self.loadingBar.hide(); 1181 }, 300) 1182 self.endTime = time - self.initTime; 1183 if (options.renderType === "svg") { 1184 if (self.totalNum !== 1) { 1185 self.cache[(self.totalNum - 1) + ""].loaded = true; 1186 } else { 1187 self.cache["1"].loaded = true; 1188 } 1189 } 1190 if (options.zoomEnable) { 1191 if (self.pinchZoom) { 1192 self.pinchZoom.enable() 1193 } 1194 } else { 1195 if (self.pinchZoom) { 1196 self.pinchZoom.disable() 1197 } 1198 } 1199 var arr1 = self.eventType["complete"]; 1200 if (arr1 && arr1 instanceof Array) { 1201 for (var i = 0; i < arr1.length; i++) { 1202 arr1[i] && arr1[i].call(self, "success", "pdfå è½½å®æ", self.endTime) 1203 } 1204 } 1205 var arr2 = self.eventType["success"]; 1206 if (arr2 && arr2 instanceof Array) { 1207 for (var i = 0; i < arr2.length; i++) { 1208 arr2[i] && arr2[i].call(self, self.endTime) 1209 } 1210 } 1211 }, 1212 resize: function () { 1213 var self = this; 1214 if (self.resizeEvent) { 1215 return 1216 } 1217 self.resizeEvent = true; 1218 var timer; 1219 if (self.pages) { 1220 self.getH() 1221 $(window).on("resize", function () { 1222 clearTimeout(timer) 1223 timer = setTimeout(function () { 1224 var winWidth = $(window).width(); 1225 if (self.winWidth !== winWidth){ 1226 self.pages.each(function (i, item) { 1227 var w = $(item).width(), s = $(item).attr("data-scale"); 1228 $(item).css({ 1229 "min-height": w/s + 'px' 1230 }) 1231 }) 1232 } 1233 self.getH() 1234 },300) 1235 }) 1236 } 1237 }, 1238 getH:function(){ 1239 var self = this; 1240 var num =0; 1241 self.pages.each(function (i, item) { 1242 var w = $(item).height(); 1243 num + w 1244 }) 1245 $(".pinch-zoom-container") 1246 }, 1247 show: function (callback) { 1248 this.container.show(); 1249 callback && callback.call(this) 1250 var arr = this.eventType["show"]; 1251 if (arr && arr instanceof Array) { 1252 for (var i = 0; i < arr.length; i++) { 1253 arr[i] && arr[i].call(this) 1254 } 1255 } 1256 }, 1257 hide: function (callback) { 1258 this.container.hide() 1259 callback && callback.call(this) 1260 var arr = this.eventType["hide"]; 1261 if (arr && arr instanceof Array) { 1262 for (var i = 0; i < arr.length; i++) { 1263 arr[i] && arr[i].call(this) 1264 } 1265 } 1266 }, 1267 on: function (type, callback) { 1268 if (this.eventType[type] && this.eventType[type] instanceof Array) { 1269 this.eventType[type].push(callback) 1270 } 1271 this.eventType[type] = [callback] 1272 }, 1273 off: function (type) { 1274 if (type !== undefined) { 1275 this.eventType[type] = [null] 1276 } else { 1277 for (var i in this.eventType) { 1278 this.eventType[i] = [null] 1279 } 1280 } 1281 }, 1282 scrollEnable: function (flag) { 1283 if (flag === false) { 1284 this.viewerContainer.css({ 1285 "overflow": "hidden" 1286 }) 1287 } else { 1288 this.viewerContainer.css({ 1289 "overflow": "auto" 1290 }) 1291 } 1292 var arr = this.eventType["scrollEnable"]; 1293 if (arr && arr instanceof Array) { 1294 for (var i = 0; i < arr.length; i++) { 1295 arr[i] && arr[i].call(this, flag) 1296 } 1297 } 1298 }, 1299 zoomEnable: function (flag) { 1300 if (flag === false) { 1301 this.pinchZoom.disable() 1302 } else { 1303 this.pinchZoom.enable() 1304 } 1305 var arr = this.eventType["zoomEnable"]; 1306 if (arr && arr instanceof Array) { 1307 for (var i = 0; i < arr.length; i++) { 1308 arr[i] && arr[i].call(this, flag) 1309 } 1310 } 1311 }, 1312 reset: function (callback) { 1313 if (this.pinchZoom) { 1314 this.pinchZoom.offset.y = 0; 1315 this.pinchZoom.offset.x = 0; 1316 this.pinchZoom.lastclientY = 0; 1317 this.pinchZoom.zoomFactor = 1;
1318 this.pinchZoom.update(); 1319 } 1320 if (this.viewerContainer) { 1321 this.viewerContainer.scrollTop(0); 1322 } 1323 callback && callback.call(this) 1324 var arr = this.eventType["reset"]; 1325 if (arr && arr instanceof Array) { 1326 for (var i = 0; i < arr.length; i++) { 1327 arr[i] && arr[i].call(this) 1328 } 1329 } 1330 }, 1331 destroy: function (callback) { 1332 this.reset(); 1333 this.off(); 1334 if (this.thePDF) { 1335 this.thePDF.destroy(); 1336 this.thePDF = null; 1337 } 1338 if (this.viewerContainer) { 1339 this.viewerContainer.remove(); 1340 this.viewerContainer = null; 1341 } 1342 if (this.container) { 1343 this.container.html(''); 1344 } 1345 this.totalNum = null; 1346 this.pages = null; 1347 this.initTime = 0; 1348 this.endTime = 0; 1349 this.viewer = null; 1350 this.pageNum = null; 1351 this.pageNow = null; 1352 this.pageTotal = null; 1353 this.loadingBar = null; 1354 this.progress = null; 1355 this.loadedCount = 0; 1356 this.timer = null; 1357 this.show = null; 1358 this.hide = null; 1359 callback && callback.call(this) 1360 var arr = this.eventType["destroy"]; 1361 if (arr && arr instanceof Array) { 1362 for (var i = 0; i < arr.length; i++) { 1363 arr[i] && arr[i].call(this) 1364 } 1365 } 1366 } 1367 } 1368 return Pdfh5; 1369});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.