; (function(g, fn) { var version = "1.3.9", pdfjsVersion = "2.3.200"; console.log("pdfh5.js v" + version + " & https://www.gjtool.cn") if (typeof require !== 'undefined') { if (g.$ === undefined) { g.$ = require('./jquery-1.11.3.min.js'); } g.pdfjsWorker = require('./pdf.worker.js'); g.pdfjsLib = require('./pdf.js'); } var pdfjsLib = g.pdfjsLib, $ = g.$, pdfjsWorker = g.pdfjsWorker; if (typeof define === 'function' && define.amd) { define(function() { return fn(g, pdfjsWorker, pdfjsLib, $, version) }) } else if (typeof module !== 'undefined' && module.exports) { module.exports = fn(g, pdfjsWorker, pdfjsLib, $, version) } else { g.Pdfh5 = fn(g, pdfjsWorker, pdfjsLib, $, version) } })(typeof window !== 'undefined' ? window : this, function(g, pdfjsWorker, pdfjsLib, $, version) { 'use strict'; var definePinchZoom = function($) { var PinchZoom = function(el, options, viewerContainer) { this.el = $(el); this.viewerContainer = viewerContainer; this.zoomFactor = 1; this.lastScale = 1; this.offset = { x: 0, y: 0 }; this.options = $.extend({}, this.defaults, options); this.options.zoomOutFactor = isNaN(options.zoomOutFactor) ? 1.2 : options.zoomOutFactor; this.options.animationDuration = isNaN(options.animationDuration) ? 300 : options.animationDuration; this.options.maxZoom = isNaN(options.maxZoom) ? 3 : options.maxZoom; this.options.minZoom = isNaN(options.minZoom) ? 0.8 : options.minZoom; this.setupMarkup(); this.bindEvents(); this.update(); this.enable(); this.height = 0; this.load = false; this.direction = null; this.clientY = null; this.lastclientY = null; }, sum = function(a, b) { return a + b; }, isCloseTo = function(value, expected) { return value > expected - 0.01 && value < expected + 0.01; }; PinchZoom.prototype = { defaults: { tapZoomFactor: 3, zoomOutFactor: 1.2, animationDuration: 300, maxZoom: 3, minZoom: 0.8, lockDragAxis: false, use2d: true, zoomStartEventName: 'pz_zoomstart', zoomEndEventName: 'pz_zoomend', dragStartEventName: 'pz_dragstart', dragEndEventName: 'pz_dragend', doubleTapEventName: 'pz_doubletap' }, handleDragStart: function(event) { this.el.trigger(this.options.dragStartEventName); this.stopAnimation(); this.lastDragPosition = false; this.hasInteraction = true; this.handleDrag(event); }, handleDrag: function(event) { if (this.zoomFactor > 1.0) { var touch = this.getTouches(event)[0]; this.drag(touch, this.lastDragPosition, event); this.offset = this.sanitizeOffset(this.offset); this.lastDragPosition = touch; } }, handleDragEnd: function() { this.el.trigger(this.options.dragEndEventName); this.end(); }, handleZoomStart: function(event) { this.el.trigger(this.options.zoomStartEventName); this.stopAnimation(); this.lastScale = 1; this.nthZoom = 0; this.lastZoomCenter = false; this.hasInteraction = true; }, handleZoom: function(event, newScale) { var touchCenter = this.getTouchCenter(this.getTouches(event)), scale = newScale / this.lastScale; this.lastScale = newScale; this.nthZoom += 1; if (this.nthZoom > 3) { this.scale(scale, touchCenter); this.drag(touchCenter, this.lastZoomCenter); } this.lastZoomCenter = touchCenter; }, handleZoomEnd: function() { this.el.trigger(this.options.zoomEndEventName); this.end(); }, handleDoubleTap: function(event) { var center = this.getTouches(event)[0], zoomFactor = this.zoomFactor > 1 ? 1 : this.options.tapZoomFactor, startZoomFactor = this.zoomFactor, updateProgress = (function(progress) { this.scaleTo(startZoomFactor + progress * (zoomFactor - startZoomFactor), center); }).bind(this); if (this.hasInteraction) { return; } if (startZoomFactor > zoomFactor) { center = this.getCurrentZoomCenter(); } this.animate(this.options.animationDuration, updateProgress, this.swing); this.el.trigger(this.options.doubleTapEventName); }, sanitizeOffset: function(offset) { var maxX = (this.zoomFactor - 1) * this.getContainerX(), maxY = (this.zoomFactor - 1) * this.getContainerY(), maxOffsetX = Math.max(maxX, 0), maxOffsetY = Math.max(maxY, 0), minOffsetX = Math.min(maxX, 0), minOffsetY = Math.min(maxY, 0); var x = Math.min(Math.max(offset.x, minOffsetX), maxOffsetX), y = Math.min(Math.max(offset.y, minOffsetY), maxOffsetY); return { x: x, y: y }; }, scaleTo: function(zoomFactor, center) { this.scale(zoomFactor / this.zoomFactor, center); }, scale: function(scale, center) { scale = this.scaleZoomFactor(scale); this.addOffset({ x: (scale - 1) * (center.x + this.offset.x), y: (scale - 1) * (center.y + this.offset.y) }); this.done && this.done.call(this, this.getInitialZoomFactor() * this.zoomFactor) }, scaleZoomFactor: function(scale) { var originalZoomFactor = this.zoomFactor; this.zoomFactor *= scale; this.zoomFactor = Math.min(this.options.maxZoom, Math.max(this.zoomFactor, this.options.minZoom)); return this.zoomFactor / originalZoomFactor; }, drag: function(center, lastCenter, event) { if (lastCenter) { if (this.options.lockDragAxis) { if (Math.abs(center.x - lastCenter.x) > Math.abs(center.y - lastCenter.y)) { this.addOffset({ x: -(center.x - lastCenter.x), y: 0 }); } else { this.addOffset({ y: -(center.y - lastCenter.y), x: 0 }); } } else { if (center.y - lastCenter.y < 0) { this.direction = "down"; } else if (center.y - lastCenter.y > 10) { this.direction = "up"; } this.addOffset({ y: -(center.y - lastCenter.y), x: -(center.x - lastCenter.x) }); } } }, getTouchCenter: function(touches) { return this.getVectorAvg(touches); }, getVectorAvg: function(vectors) { return { x: vectors.map(function(v) { return v.x; }).reduce(sum) / vectors.length, y: vectors.map(function(v) { return v.y; }).reduce(sum) / vectors.length }; }, addOffset: function(offset) { this.offset = { x: this.offset.x + offset.x, y: this.offset.y + offset.y }; }, sanitize: function() { if (this.zoomFactor < this.options.zoomOutFactor) { this.zoomOutAnimation(); } else if (this.isInsaneOffset(this.offset)) { this.sanitizeOffsetAnimation(); } }, isInsaneOffset: function(offset) { var sanitizedOffset = this.sanitizeOffset(offset); return sanitizedOffset.x !== offset.x || sanitizedOffset.y !== offset.y; }, sanitizeOffsetAnimation: function() { var targetOffset = this.sanitizeOffset(this.offset), startOffset = { x: this.offset.x, y: this.offset.y }, updateProgress = (function(progress) { this.offset.x = startOffset.x + progress * (targetOffset.x - startOffset.x); this.offset.y = startOffset.y + progress * (targetOffset.y - startOffset.y); this.update(); }).bind(this); this.animate( this.options.animationDuration, updateProgress, this.swing ); }, zoomOutAnimation: function() { var startZoomFactor = this.zoomFactor, zoomFactor = 1, center = this.getCurrentZoomCenter(), updateProgress = (function(progress) { this.scaleTo(startZoomFactor + progress * (zoomFactor - startZoomFactor), center); }).bind(this); this.animate( this.options.animationDuration, updateProgress, this.swing ); }, updateAspectRatio: function() { this.setContainerY(this.getContainerX() / this.getAspectRatio()); }, getInitialZoomFactor: function() { if (this.container[0] && this.el[0]) { return this.container[0].offsetWidth / this.el[0].offsetWidth; } else { return 0 } }, getAspectRatio: function() { if (this.el[0]) { var offsetHeight = this.el[0].offsetHeight; return this.container[0].offsetWidth / offsetHeight; } else { return 0 } }, getCurrentZoomCenter: function() { var length = this.container[0].offsetWidth * this.zoomFactor, offsetLeft = this.offset.x, offsetRight = length - offsetLeft - this.container[0].offsetWidth, widthOffsetRatio = offsetLeft / offsetRight, centerX = widthOffsetRatio * this.container[0].offsetWidth / (widthOffsetRatio + 1), height = this.container[0].offsetHeight * this.zoomFactor, offsetTop = this.offset.y, offsetBottom = height - offsetTop - this.container[0].offsetHeight, heightOffsetRatio = offsetTop / offsetBottom, centerY = heightOffsetRatio * this.container[0].offsetHeight / (heightOffsetRatio + 1); if (offsetRight === 0) { centerX = this.container[0].offsetWidth; } if (offsetBottom === 0) { centerY = this.container[0].offsetHeight; } return { x: centerX, y: centerY }; }, canDrag: function() { return !isCloseTo(this.zoomFactor, 1); }, getTouches: function(event) { var position = this.container.offset(); return Array.prototype.slice.call(event.touches).map(function(touch) { return { x: touch.pageX - position.left, y: touch.pageY - position.top }; }); }, animate: function(duration, framefn, timefn, callback) { var startTime = new Date().getTime(), renderFrame = (function() { if (!this.inAnimation) { return; } var frameTime = new Date().getTime() - startTime, progress = frameTime / duration; if (frameTime >= duration) { framefn(1); if (callback) { callback(); } this.update(); this.stopAnimation(); } else { if (timefn) { progress = timefn(progress); } framefn(progress); this.update(); requestAnimationFrame(renderFrame); } }).bind(this); this.inAnimation = true; requestAnimationFrame(renderFrame); }, stopAnimation: function() { this.inAnimation = false; }, swing: function(p) { return -Math.cos(p * Math.PI) / 2 + 0.5; }, getContainerX: function() { if (this.el[0]) { return this.el[0].offsetWidth; } else { return 0; } }, getContainerY: function() { return this.el[0].offsetHeight; }, setContainerY: function(y) { y = y.toFixed(2); return this.container.height(y); }, setupMarkup: function() { this.container = $('
'); this.el.before(this.container); this.container.append(this.el); this.container.css({ 'position': 'relative', }); this.el.css({ '-webkit-transform-origin': '0% 0%', '-moz-transform-origin': '0% 0%', '-ms-transform-origin': '0% 0%', '-o-transform-origin': '0% 0%', 'transform-origin': '0% 0%', 'position': 'relative' }); }, end: function() { this.hasInteraction = false; this.sanitize(); this.update(); }, bindEvents: function() { detectGestures(this.container.eq(0), this, this.viewerContainer); $(g).on('resize', this.update.bind(this)); $(this.el).find('img').on('load', this.update.bind(this)); }, update: function() { if (this.updatePlaned) { return; } this.updatePlaned = true; setTimeout((function() { this.updatePlaned = false; this.updateAspectRatio(); var zoomFactor = this.getInitialZoomFactor() * this.zoomFactor, offsetX = (-this.offset.x / zoomFactor).toFixed(3), offsetY = (-this.offset.y / zoomFactor).toFixed(3); this.lastclientY = offsetY; var transform3d = 'scale3d(' + zoomFactor + ', ' + zoomFactor + ',1) ' + 'translate3d(' + offsetX + 'px,' + offsetY + 'px,0px)', transform2d = 'scale(' + zoomFactor + ', ' + zoomFactor + ') ' + 'translate(' + offsetX + 'px,' + offsetY + 'px)', removeClone = (function() { if (this.clone) { this.clone.remove(); delete this.clone; } }).bind(this); if (!this.options.use2d || this.hasInteraction || this.inAnimation) { this.is3d = true; this.el.css({ '-webkit-transform': transform3d, '-o-transform': transform2d, '-ms-transform': transform2d, '-moz-transform': transform2d, 'transform': transform3d }); } else { this.el.css({ '-webkit-transform': transform2d, '-o-transform': transform2d, '-ms-transform': transform2d, '-moz-transform': transform2d, 'transform': transform2d }); this.is3d = false; } }).bind(this), 0); }, enable: function() { this.enabled = true; }, disable: function() { this.enabled = false; }, destroy: function() { var dom = this.el.clone(); var p = this.container.parent(); this.container.remove(); dom.removeAttr('style'); p.append(dom); } }; var detectGestures = function(el, target, viewerContainer) { var interaction = null, fingers = 0, lastTouchStart = null, startTouches = null, lastTouchY = null, clientY = null, lastclientY = 0, lastTop = 0, setInteraction = function(newInteraction, event) { if (interaction !== newInteraction) { if (interaction && !newInteraction) { switch (interaction) { case "zoom": target.handleZoomEnd(event); break; case 'drag': target.handleDragEnd(event); break; } } switch (newInteraction) { case 'zoom': target.handleZoomStart(event); break; case 'drag': target.handleDragStart(event); break; } } interaction = newInteraction; }, updateInteraction = function(event) { if (fingers === 2) { setInteraction('zoom'); } else if (fingers === 1 && target.canDrag()) { setInteraction('drag', event); } else { setInteraction(null, event); } }, targetTouches = function(touches) { return Array.prototype.slice.call(touches).map(function(touch) { return { x: touch.pageX, y: touch.pageY }; }); }, getDistance = function(a, b) { var x, y; x = a.x - b.x; y = a.y - b.y; return Math.sqrt(x * x + y * y); }, calculateScale = function(startTouches, endTouches) { var startDistance = getDistance(startTouches[0], startTouches[1]), endDistance = getDistance(endTouches[0], endTouches[1]); return endDistance / startDistance; }, cancelEvent = function(event) { event.stopPropagation(); event.preventDefault(); }, detectDoubleTap = function(event) { var time = (new Date()).getTime(); var pageY = event.changedTouches[0].pageY; var top = parentNode.scrollTop || 0; if (fingers > 1) { lastTouchStart = null; lastTouchY = null; cancelEvent(event); } if (time - lastTouchStart < 300 && Math.abs(pageY - lastTouchY) < 10 && Math.abs(lastTop - top) < 10) { cancelEvent(event); target.handleDoubleTap(event); switch (interaction) { case "zoom": target.handleZoomEnd(event); break; case 'drag': target.handleDragEnd(event); break; } } if (fingers === 1) { lastTouchStart = time; lastTouchY = pageY; lastTop = top; } }, firstMove = true; if (viewerContainer) { var parentNode = viewerContainer[0]; } if (parentNode) { parentNode.addEventListener('touchstart', function(event) { if (target.enabled) { firstMove = true; fingers = event.touches.length; detectDoubleTap(event); clientY = event.changedTouches[0].clientY; if (fingers > 1) { cancelEvent(event); } } }); parentNode.addEventListener('touchmove', function(event) { if (target.enabled) { lastclientY = event.changedTouches[0].clientY; if (firstMove) { updateInteraction(event); startTouches = targetTouches(event.touches); } else { switch (interaction) { case 'zoom': target.handleZoom(event, calculateScale(startTouches, targetTouches(event.touches))); break; case 'drag': target.handleDrag(event); break; } if (interaction) { target.update(lastclientY); } } if (fingers > 1) { cancelEvent(event); } firstMove = false; } }); parentNode.addEventListener('touchend', function(event) { if (target.enabled) { fingers = event.touches.length; if (fingers > 1) { cancelEvent(event); } updateInteraction(event); } }); } }; return PinchZoom; }; var PinchZoom = definePinchZoom($); var Pdfh5 = function(dom, options) { this.version = version; this.container = $(dom); this.options = options; this.init(); }; Pdfh5.prototype = { init: function() { var self = this; this.thePDF = null; this.totalNum = null; this.pages = null; this.initTime = 0; this.scale = 1; this.currentNum = 1; this.loadedCount = 0; this.endTime = 0; this.pinchZoom = null; this.timer = null; this.docWidth = document.documentElement.clientWidth; this.winWidth = $(window).width(); this.cache = {}; this.eventType = {}; this.cacheNum = 1; this.resizeEvent = false; this.cacheData = null; this.pdfjsLibPromise = null; if (this.container[0].pdfLoaded) { this.destroy(); } this.container[0].pdfLoaded = false; this.container.addClass("pdfjs") this.initTime = new Date().getTime(); setTimeout(function() { var arr1 = self.eventType["scroll"]; if (arr1 && arr1 instanceof Array) { for (var i = 0; i < arr1.length; i++) { arr1[i] && arr1[i].call(self, self.initTime) } } }, 0) this.options = this.options ? this.options : {}; this.options.pdfurl = this.options.pdfurl ? this.options.pdfurl : null; this.options.data = this.options.data ? this.options.data : null; this.options.scale = this.scale; this.options.zoomEnable = this.options.zoomEnable === false ? false : true; this.options.scrollEnable = this.options.scrollEnable === false ? false : true; this.options.loadingBar = this.options.loadingBar === false ? false : true; this.options.pageNum = this.options.pageNum === false ? false : true; this.options.backTop = this.options.backTop === false ? false : true; this.options.URIenable = this.options.URIenable === true ? true : false; this.options.fullscreen = this.options.fullscreen === false ? false : true; this.options.lazy = this.options.lazy === true ? true : false; this.options.renderType = this.options.renderType === "svg" ? "svg" : "canvas"; this.options.resize = this.options.resize === false ? false : true; if (this.options.limit) { var n = parseFloat(this.options.limit) this.options.limit = isNaN(n) ? 0 : n < 0 ? 0 : n; } else { this.options.limit = 0 } var html = '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + '
' + ' 1/' + '1' + '
' + '
' + '
' + '
' + '
'; if (!this.container.find('.pageNum')[0]) { this.container.append(html); } var viewer = document.createElement("div"); viewer.className = 'pdfViewer'; var viewerContainer = document.createElement("div"); viewerContainer.className = 'viewerContainer'; viewerContainer.appendChild(viewer); this.container.append(viewerContainer); this.viewer = $(viewer); this.viewerContainer = $(viewerContainer); this.pageNum = this.container.find('.pageNum'); this.pageNow = this.pageNum.find('.pageNow'); this.pageTotal = this.pageNum.find('.pageTotal'); this.loadingBar = this.container.find('.loadingBar'); this.progress = this.loadingBar.find('.progress'); this.progressDom = this.progress[0]; this.backTop = this.container.find('.backTop'); this.loading = this.container.find('.loading'); if (!this.options.loadingBar) { this.loadingBar.hide() } var containerH = this.container.height(), height = containerH * (1 / 3); if (!this.options.scrollEnable) { this.viewerContainer.css({ "overflow": "hidden" }) } else { this.viewerContainer.css({ "overflow": "auto" }) } viewerContainer.addEventListener('scroll', function() { var scrollTop = viewerContainer.scrollTop; if (scrollTop >= 150) { if (self.options.backTop) { self.backTop.show(); } } else { if (self.options.backTop) { self.backTop.fadeOut(200); } } if (self.viewerContainer) { self.pages = self.viewerContainer.find('.pageContainer'); } clearTimeout(self.timer); if (self.options.pageNum && self.pageNum) { self.pageNum.show(); } var h = containerH; if (self.pages) { self.pages.each(function(index, obj) { var top = obj.getBoundingClientRect().top; var bottom = obj.getBoundingClientRect().bottom; if (top <= height && bottom > height) { if (self.options.pageNum) { self.pageNow.text(index + 1) } self.currentNum = index + 1; } if (top <= h && bottom > h) { self.cacheNum = index + 1; } }) } if (scrollTop + self.container.height() >= self.viewer[0].offsetHeight) { self.pageNow.text(self.totalNum) } if (scrollTop === 0) { self.pageNow.text(1) } self.timer = setTimeout(function() { if (self.options.pageNum && self.pageNum) { self.pageNum.fadeOut(200); } }, 1500) if (self.options.lazy) { var num = Math.floor(100 / self.totalNum).toFixed(2); if (self.cache[self.cacheNum + ""] && !self.cache[self.cacheNum + ""].loaded) { var page = self.cache[self.cacheNum + ""].page; var container = self.cache[self.cacheNum + ""].container; var pageNum = self.cacheNum; self.cache[pageNum + ""].loaded = true; var scaledViewport = self.cache[pageNum + ""].scaledViewport; if (self.options.renderType === "svg") { self.renderSvg(page, scaledViewport, pageNum, num, container, self.options) } else { self.renderCanvas(page, scaledViewport, pageNum, num, container, self.options) } } if (self.cache[(self.totalNum - 1) + ""] && self.cache[(self.totalNum - 1) + ""].loaded && !self.cache[self.totalNum + ""].loaded) { var page = self.cache[self.totalNum + ""].page; var container = self.cache[self.totalNum + ""].container; var pageNum = self.totalNum; self.cache[pageNum + ""].loaded = true; var scaledViewport = self.cache[pageNum + ""].scaledViewport; if (self.options.renderType === "svg") { self.renderSvg(page, scaledViewport, pageNum, num, container, self.options) } else { self.renderCanvas(page, scaledViewport, pageNum, num, container, self.options) } } } var arr1 = self.eventType["scroll"]; if (arr1 && arr1 instanceof Array) { for (var i = 0; i < arr1.length; i++) { arr1[i] && arr1[i].call(self, scrollTop) } } }) this.backTop.on('click tap', function() { var mart = self.viewer.css('transform'); var arr = mart.replace(/[a-z\(\)\s]/g, '').split(','); var s1 = arr[0]; var s2 = arr[3]; var x = arr[4] / 2; var left = self.viewer[0].getBoundingClientRect().left; if (left <= -self.docWidth * 2) { x = -self.docWidth / 2 } self.viewer.css({ transform: 'scale(' + s1 + ', ' + s2 + ') translate(' + x + 'px, 0px)' }) if (self.pinchZoom) { self.pinchZoom.offset.y = 0; self.pinchZoom.lastclientY = 0; } self.viewerContainer.animate({ scrollTop: 0 }, 300) var arr1 = self.eventType["backTop"]; if (arr1 && arr1 instanceof Array) { for (var i = 0; i < arr1.length; i++) { arr1[i] && arr1[i].call(self) } } }) function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = g.location.search.substr(1).match(reg); if (r != null) return decodeURIComponent(r[2]); return ""; } var pdfurl = GetQueryString("file"), url = ""; if (pdfurl && self.options.URIenable) { url = pdfurl } else if (self.options.pdfurl) { url = self.options.pdfurl } if (self.options.loadingBar) { self.loadingBar.show(); self.progress.css({ width: "3%" }) } if (url) { $.ajax({ type: "get", mimeType: 'text/plain; charset=x-user-defined', url: url, success: function(data) { var rawLength = data.length; // var array = new Uint8Array(new ArrayBuffer(rawLength)); // for (i = 0; i < rawLength; i++) { // array[i] = data.charCodeAt(i) & 0xff; // } var array = []; for (i = 0; i < rawLength; i++) { array.push(data.charCodeAt(i) & 0xff); } self.cacheData = array self.renderPdf(self.options, { data: array }) }, error: function(err) { self.loading.hide() var time = new Date().getTime(); self.endTime = time - self.initTime; var arr1 = self.eventType["complete"]; if (arr1 && arr1 instanceof Array) { for (var i = 0; i < arr1.length; i++) { arr1[i] && arr1[i].call(self, "error", err.statusText, self.endTime) } } var arr2 = self.eventType["error"]; if (arr2 && arr2 instanceof Array) { for (var i = 0; i < arr2.length; i++) { arr2[i] && arr2[i].call(self, err.statusText, self.endTime) } } throw Error(err.statusText) } }); } else if (self.options.data) { var data = self.options.data; var rawLength = data.length; if (typeof data === "string" && data != "") { var array = []; for (i = 0; i < rawLength; i++) { array.push(data.charCodeAt(i) & 0xff); } self.cacheData = array self.renderPdf(self.options, { data: array }) } else if (typeof data === "object") { if (data.length == 0) { var time = new Date().getTime(); self.endTime = time - self.initTime; var arr1 = self.eventType["complete"]; if (arr1 && arr1 instanceof Array) { for (var i = 0; i < arr1.length; i++) { arr1[i] && arr1[i].call(self, "error", "options.data is empty Array", self.endTime) } } var arr2 = self.eventType["error"]; if (arr2 && arr2 instanceof Array) { for (var i = 0; i < arr2.length; i++) { arr2[i] && arr2[i].call(self, "options.data is empty Array", self.endTime) } } throw Error("options.data is empty Array") } else { self.cacheData = data self.renderPdf(self.options, { data: data }) } } } else { var time = new Date().getTime(); self.endTime = time - self.initTime; var arr1 = self.eventType["complete"]; if (arr1 && arr1 instanceof Array) { for (var i = 0; i < arr1.length; i++) { arr1[i] && arr1[i].call(self, "error", "Expect options.pdfurl or options.data!", self.endTime) } } var arr2 = self.eventType["error"]; if (arr2 && arr2 instanceof Array) { for (var i = 0; i < arr2.length; i++) { arr2[i] && arr2[i].call(self, "Expect options.pdfurl or options.data!", self.endTime) } } throw Error("Expect options.pdfurl or options.data!") } }, renderPdf: function(options, obj) { this.container[0].pdfLoaded = true; var self = this; if (options.cMapUrl) { obj.cMapUrl = options.cMapUrl; } else { obj.cMapUrl = 'https://unpkg.com/pdfjs-dist@2.0.943/cmaps/'; } obj.cMapPacked = true; this.pdfjsLibPromise = pdfjsLib.getDocument(obj).then(function(pdf) { self.loading.hide() self.thePDF = pdf; self.totalNum = pdf.numPages; if (options.limit > 0) { self.totalNum = options.limit } self.pageTotal.text(self.totalNum) if (!self.pinchZoom) { var arr1 = self.eventType["ready"]; if (arr1 && arr1 instanceof Array) { for (var i = 0; i < arr1.length; i++) { arr1[i] && arr1[i].call(self) } } self.pinchZoom = new PinchZoom(self.viewer, { tapZoomFactor: options.tapZoomFactor, zoomOutFactor: options.zoomOutFactor, animationDuration: options.animationDuration, maxZoom: options.maxZoom, minZoom: options.minZoom }, self.viewerContainer); var timeout, firstZoom = true; self.pinchZoom.done = function(scale) { clearTimeout(timeout) timeout = setTimeout(function() { if (self.options.renderType === "svg") { return } if (scale <= 1 || self.options.scale == 3) { return } console.log(scale, self.options.scale) if (self.thePDF) { self.thePDF.destroy(); self.thePDF = null; } self.options.scale = scale; self.renderPdf(self.options, { data: self.cacheData }) }, 310) if (scale == 1) { if (self.viewerContainer) { self.viewerContainer.css({ '-webkit-overflow-scrolling': 'touch' }) } } else { if (self.viewerContainer) { self.viewerContainer.css({ '-webkit-overflow-scrolling': 'auto' }) } } var arr1 = self.eventType["zoom"]; if (arr1 && arr1 instanceof Array) { for (var i = 0; i < arr1.length; i++) { arr1[i] && arr1[i].call(self, scale) } } } if (options.zoomEnable) { self.pinchZoom.enable() } else { self.pinchZoom.disable() } } var promise = Promise.resolve(); var num = Math.floor(100 / self.totalNum).toFixed(2); for (var i = 1; i <= self.totalNum; i++) { self.cache[i + ""] = { page: null, loaded: false, container: null, scaledViewport: null }; promise = promise.then(function(pageNum) { return self.thePDF.getPage(pageNum).then(function(page) { self.cache[pageNum + ""].page = page; var viewport = page.getViewport(options.scale); var scale = (self.docWidth / viewport.width).toFixed(2) var scaledViewport = page.getViewport(parseFloat(scale)) var div = document.getElementById('pageContainer' + pageNum) var container; if (!div) { container = document.createElement('div'); container.id = 'pageContainer' + pageNum; container.className = 'pageContainer'; container.setAttribute('name', 'page=' + pageNum); container.setAttribute('title', 'Page ' + pageNum); var loadEffect = document.createElement('div'); loadEffect.className = 'loadEffect'; container.appendChild(loadEffect); self.viewer[0].appendChild(container); if (window.ActiveXObject || "ActiveXObject" in window) { $(container).css({ 'width': viewport.width + 'px', "height": viewport.height + 'px' }).attr("data-scale", viewport.width / viewport.height) } else { var h = $(container).width() / (viewport.viewBox[2] / viewport.viewBox[3]); if (h > viewport.height) { h = viewport.height } $(container).css({ 'max-width': viewport.width, "max-height": viewport.height, "min-height": h + 'px' }).attr("data-scale", viewport.width / viewport.height) } } else { container = div } self.cache[pageNum + ""].container = container; self.cache[pageNum + ""].scaledViewport = scaledViewport; var sum = 0, containerH = self.container.height(); self.pages = self.viewerContainer.find('.pageContainer'); if (options.resize) { self.resize() } if (self.pages && options.lazy) { self.pages.each(function(index, obj) { var top = obj.offsetTop; if (top <= containerH) { sum = index + 1; self.cache[sum + ""].loaded = true; } }) } if (pageNum > sum && options.lazy) { return } if (options.renderType === "svg") { return self.renderSvg(page, scaledViewport, pageNum, num, container, options, viewport) } return self.renderCanvas(page, scaledViewport, pageNum, num, container, options) }); }.bind(null, i)); } }).catch(function(err) { self.loading.hide(); var time = new Date().getTime(); self.endTime = time - self.initTime; var arr1 = self.eventType["complete"]; if (arr1 && arr1 instanceof Array) { for (var i = 0; i < arr1.length; i++) { arr1[i] && arr1[i].call(self, "error", err.message, self.endTime) } } var arr2 = self.eventType["error"]; if (arr2 && arr2 instanceof Array) { for (var i = 0; i < arr2.length; i++) { arr2[i] && arr2[i].call(self, err.message, self.endTime) } } }) }, renderSvg: function(page, scaledViewport, pageNum, num, container, options, viewport) { var self = this; return page.getOperatorList().then(function(opList) { var svgGfx = new pdfjsLib.SVGGraphics(page.commonObjs, page.objs); return svgGfx.getSVG(opList, scaledViewport).then(function(svg) { self.loadedCount++; container.children[0].style.display = "none"; container.appendChild(svg); svg.style.width = "100%"; svg.style.height = "100%"; if (self.options.loadingBar) { self.progress.css({ width: num * self.loadedCount + "%" }) } var time = new Date().getTime(); var arr1 = self.eventType["render"]; if (arr1 && arr1 instanceof Array) { for (var i = 0; i < arr1.length; i++) { arr1[i] && arr1[i].call(self, pageNum, time - self.initTime, container) } } if (self.loadedCount === self.totalNum) { self.finalRender(options) } }); }); }, renderCanvas: function(page, viewport, pageNum, num, container, options) { var self = this; var viewport = page.getViewport(options.scale); var scale = (self.docWidth / viewport.width).toFixed(2) var canvas = document.createElement("canvas"); var obj2 = { 'Cheight': viewport.height * scale, 'width': viewport.width, 'height': viewport.height, 'canvas': canvas, 'index': self.loadedCount } var context = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; if (self.options.loadingBar) { self.progress.css({ width: num * self.loadedCount + "%" }) } obj2.src = obj2.canvas.toDataURL("image/jpeg"); return page.render({ canvasContext: context, viewport: viewport }).then(function() { self.loadedCount++; var img = new Image(); var time = new Date().getTime(); var time2 = 0; if (self.renderTime == 0) { time2 = time - self.startTime } else { time2 = time - self.renderTime } obj2.src = obj2.canvas.toDataURL("image/jpeg"); img.src = obj2.src; img.className = "canvasImg" + pageNum; var img0 = $("#pageContainer" + pageNum).find(".canvasImg" + pageNum)[0]; if (container && !img0) { container.appendChild(img); img.onload = function() { // $(container).css({ // "min-height": img.height + 'px' // }) } } else if (img0) { img0.src = obj2.src } var time = new Date().getTime(); var arr1 = self.eventType["render"]; if (arr1 && arr1 instanceof Array) { for (var i = 0; i < arr1.length; i++) { arr1[i] && arr1[i].call(self, pageNum, time - self.initTime, container) } } if (self.loadedCount === self.totalNum) { self.finalRender(options) } }) }, finalRender: function(options) { var time = new Date().getTime(); var self = this; if (self.options.loadingBar) { self.progress.css({ width: "100%" }); } setTimeout(function() { self.loadingBar.hide(); }, 300) self.endTime = time - self.initTime; if (options.renderType === "svg") { if (self.totalNum !== 1) { self.cache[(self.totalNum - 1) + ""].loaded = true; } else { self.cache["1"].loaded = true; } } if (options.zoomEnable) { if (self.pinchZoom) { self.pinchZoom.enable() } } else { if (self.pinchZoom) { self.pinchZoom.disable() } } var arr1 = self.eventType["complete"]; if (arr1 && arr1 instanceof Array) { for (var i = 0; i < arr1.length; i++) { arr1[i] && arr1[i].call(self, "success", "pdf加载完成", self.endTime) } } var arr2 = self.eventType["success"]; if (arr2 && arr2 instanceof Array) { for (var i = 0; i < arr2.length; i++) { arr2[i] && arr2[i].call(self, self.endTime) } } }, resize: function() { var self = this; if (self.resizeEvent) { return } self.resizeEvent = true; var timer; if (self.pages) { self.getH() $(window).on("resize", function() { clearTimeout(timer) timer = setTimeout(function() { var winWidth = $(window).width(); if (self.winWidth !== winWidth) { self.pages.each(function(i, item) { var w = $(item).width(), s = $(item).attr("data-scale"); $(item).css({ "min-height": w / s + 'px' }) }) } self.getH() }, 300) }) } }, getH: function() { var self = this; var num = 0; self.pages.each(function(i, item) { var w = $(item).height(); num + w }) $(".pinch-zoom-container").height(num) }, show: function(callback) { this.container.show(); callback && callback.call(this) var arr = this.eventType["show"]; if (arr && arr instanceof Array) { for (var i = 0; i < arr.length; i++) { arr[i] && arr[i].call(this) } } }, hide: function(callback) { this.container.hide() callback && callback.call(this) var arr = this.eventType["hide"]; if (arr && arr instanceof Array) { for (var i = 0; i < arr.length; i++) { arr[i] && arr[i].call(this) } } }, on: function(type, callback) { if (this.eventType[type] && this.eventType[type] instanceof Array) { this.eventType[type].push(callback) } this.eventType[type] = [callback] }, off: function(type) { if (type !== undefined) { this.eventType[type] = [null] } else { for (var i in this.eventType) { this.eventType[i] = [null] } } }, scrollEnable: function(flag) { if (flag === false) { this.viewerContainer.css({ "overflow": "hidden" }) } else { this.viewerContainer.css({ "overflow": "auto" }) } var arr = this.eventType["scrollEnable"]; if (arr && arr instanceof Array) { for (var i = 0; i < arr.length; i++) { arr[i] && arr[i].call(this, flag) } } }, zoomEnable: function(flag) { if (!this.pinchZoom) { return } if (flag === false) { this.pinchZoom.disable() } else { this.pinchZoom.enable() } var arr = this.eventType["zoomEnable"]; if (arr && arr instanceof Array) { for (var i = 0; i < arr.length; i++) { arr[i] && arr[i].call(this, flag) } } }, reset: function(callback) { if (this.pinchZoom) { this.pinchZoom.offset.y = 0; this.pinchZoom.offset.x = 0; this.pinchZoom.lastclientY = 0; this.pinchZoom.zoomFactor = 1; this.pinchZoom.update(); } if (this.viewerContainer) { this.viewerContainer.scrollTop(0); } callback && callback.call(this) var arr = this.eventType["reset"]; if (arr && arr instanceof Array) { for (var i = 0; i < arr.length; i++) { arr[i] && arr[i].call(this) } } }, destroy: function(callback) { this.reset(); this.off(); if (this.thePDF) { this.thePDF.destroy(); this.thePDF = null; } if (this.viewerContainer) { this.viewerContainer.remove(); this.viewerContainer = null; } if (this.container) { this.container.html(''); } this.totalNum = null; this.pages = null; this.initTime = 0; this.endTime = 0; this.viewer = null; this.pageNum = null; this.pageNow = null; this.pageTotal = null; this.loadingBar = null; this.progress = null; this.loadedCount = 0; this.timer = null; this.show = null; this.hide = null; callback && callback.call(this) var arr = this.eventType["destroy"]; if (arr && arr instanceof Array) { for (var i = 0; i < arr.length; i++) { arr[i] && arr[i].call(this) } } } } return Pdfh5; });