PageSourceSearch

https://www.sama.cn/wp-content/themes/sama2023/js/pdfh5.js

js sama.cn collected 2026-10-04 07:59:37 UTC 46,087 bytes, 1,369 lines download raw bytes

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.