diff --git a/Makefile b/Makefile index 91a2bb6..09ba354 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,151 @@ +# Name of the library (if not specified, the name of the current folder will be used) +LIBRARY_NAME = pdfjs-viewer +# The files that compose your library (if not specified, all the .js files in the src folder will be used) +FILES = js/pdfjs-viewer.js +# The css files that accompany your library (if not specified, no css files will be used) +CSSFILES = css/pdfjs-viewer.css css/pdftoolbar.css +# Folder in which the build files will be located (if not specified, the folder "dist" will be used) +DIST_FOLDER = +# Dependencies of your library (if not specified, no dependencies will be used) +DEPENDS = +# Folder in which the dependencies are located +DEPENDS_FOLDER = ./depends +# Files to include before the source files (it is a js file that will be included before the source files) +# * In most cases, this is not needed, but it is useful for libraries that need to be initialized +PRE = +# Files to include after the source files +# * In most cases, this is not needed, but it is useful for libraries that need an epilogue +POST = +# The variable to use to export the library (if empty, the makefile will not add any enclosure; it is assumed that the library is already enclosed) +ENCLOSURE = +# The minified license to include in the minified version (if the content of the variable is an existing file, otherwise will use the variable as the license) +LICENSE_MIN = notice.min + +##################################################################################### +# Handle with care from here +##################################################################################### + +# Get the current folder name current_dir = $(notdir $(shell pwd)) -build: -ifneq ("","$(wildcard js/*.js)") - uglifyjs js/*.js $(UGLIFY_FLAGS) -b | cat notice - > $(current_dir).js - uglifyjs js/*.js $(UGLIFY_FLAGS_MIN) | cat notice.min - > $(current_dir).min.js -endif -ifneq ("","$(wildcard css/*.css)") - cleancss css/*.css --format beautify | cat notice - > $(current_dir).css - cleancss css/*.css | cat notice.min - > $(current_dir).min.css -endif +# If LIBRARY_NAME is not specified, use the current folder name +LIBRARY_NAME := $(if $(LIBRARY_NAME),$(LIBRARY_NAME),$(current_dir)) +# Folder in which the build files will be located +DIST_FOLDER := $(if $(DIST_FOLDER),$(DIST_FOLDER),dist) +# The name of the build files +FILEPATH = $(DIST_FOLDER)/$(LIBRARY_NAME) +FILENAME := $(notdir $(FILEPATH)) + +# If the LICENSE_MIN is a single filename and it exists, use the content of the file as the license for the minified version. Otherwise, use the variable as the license +LICENSE_MIN := $(shell test $(words $(LICENSE_MIN)) -eq 1 && test -f $(LICENSE_MIN) && cat $(LICENSE_MIN) || echo $(LICENSE_MIN)) + +# The enclosure parameter +ENCLOSURE := $(if $(ENCLOSURE),-e $(ENCLOSURE),) + +# Files of the dependencies to include in the build +DEP_FILES = $(foreach fd, $(DEPENDS), $(DEPENDS_FOLDER)/$(fd)/dist/$(fd).module.js) + +# The version of this library (this is intended to track the version of this template) +MAKEFILE_VERSION = 1.3.1 + +# The result files +RESULT_FILES_CSS = $(if $(CSSFILES),$(FILEPATH).css $(FILEPATH).min.css) +RESULT_FILES_JS = $(FILEPATH).full.js $(FILEPATH).min.js $(FILEPATH).js $(FILEPATH).compress.js $(FILEPATH).module.js $(FILEPATH).min.js.map $(FILEPATH).compress.js.map +RESULT_FILES = $(RESULT_FILES_JS) $(RESULT_FILES_CSS) + +INTERMEDIATE_FILES_JS = $(FILEPATH).raw.js +INTERMEDIATE_FILES_CSS = $(if $(CSSFILES),$(FILEPATH).raw.css) +INTERMEDIATE_FILES = $(INTERMEDIATE_FILES_JS) $(INTERMEDIATE_FILES_CSS) + +INPUT_FILES = $(DEP_FILES) + +all: $(RESULT_FILES) + +js: $(RESULT_FILES_JS) + +css: $(RESULT_FILES_CSS) + +module: $(FILEPATH).module.js clean: - rm -f $(current_dir).min.js $(current_dir).min.css $(current_dir).js $(current_dir).css + rm -f $(RESULT_FILES) $(INTERMEDIATE_FILES) + if [ $(DIST_FOLDER) != "." ] && [ -d $(DIST_FOLDER) ] && [ -z "$(ls -A $(DIST_FOLDER))" ]; then rm -r $(DIST_FOLDER); fi + +cleanall: clean + for fd in $(DEPENDS); do $(MAKE) -C $(DEPENDS_FOLDER)/$$fd clean; done + +depends: $(DEP_FILES) + +$(FILEPATH).full.js: $(FILEPATH).raw.js + @mkdir -p $(DIST_FOLDER) + cat $(FILEPATH).raw.js | uglifyjs $(ENCLOSURE) | js-beautify -t -s 1 -m 1 -j -n | cat notice - > $(FILEPATH).full.js + +$(FILEPATH).js: $(FILEPATH).raw.js + @mkdir -p $(DIST_FOLDER) + cat $(FILEPATH).raw.js | uglifyjs $(ENCLOSURE) -b | js-beautify -t -s 1 -m 1 -j -n | cat notice - > $(FILEPATH).js + +$(FILEPATH).min.js: $(FILEPATH).js + @mkdir -p $(DIST_FOLDER) + echo "$(LICENSE_MIN)" + cd $(DIST_FOLDER) && uglifyjs $(FILENAME).js --beautify beautify=false,preamble='"$(LICENSE_MIN)"' --toplevel --module -m --source-map "filename='$(FILENAME).min.js.map',includeSources=true" -o $(FILENAME).min.js + +$(FILEPATH).compress.js: $(FILEPATH).js + @mkdir -p $(DIST_FOLDER) + cd $(DIST_FOLDER) && uglifyjs $(FILENAME).js --beautify beautify=false,preamble='"$(LICENSE_MIN)"' --compress passes=3,dead_code=true,toplevel=true --toplevel --module -m --source-map "filename='$(FILENAME).compress.js.map',includeSources=true" -o $(FILENAME).compress.js + +$(FILEPATH).module.js: $(FILEPATH).raw.js + @mkdir -p $(DIST_FOLDER) + ( cat notice; echo 'if (typeof imports === "undefined") { var imports = {}; }' ; cat $(FILEPATH).raw.js | uglifyjs $(ENCLOSURE) | js-beautify -t -s 1 -m 1 -j -n ) > $(FILEPATH).module.js + +$(FILEPATH).css: $(FILEPATH).raw.css + @mkdir -p $(DIST_FOLDER) + cleancss $(FILEPATH).raw.css --format beautify | cat notice - > $(FILEPATH).css + +$(FILEPATH).min.css: $(FILEPATH).css + @mkdir -p $(DIST_FOLDER) + cleancss --source-map $(FILEPATH).css --source-map-inline-sources -o $(FILEPATH).min.css + +%.module.js: + $(MAKE) -C $(dir $(@D)) module + +%.raw.js: $(FILES) $(PRE) $(POST) $(DEP_FILES) + @mkdir -p $(DIST_FOLDER) + cat $(DEP_FILES) $(PRE) $(FILES) $(POST) > $(FILEPATH).raw.js + +%.raw.css: $(CSSFILES) + @mkdir -p $(DIST_FOLDER) + cat $(CSSFILES) > $(FILEPATH).raw.css + +################################################################################ +# CHANGELOG +################################################################################ +# +# 1.4.0 +# * Remove the intermediate files when cleaning +# * Prevent trying to remove folder . if it is the dist folder +# * Add CSS files +# +# ---------------------------------------------------------------- +# +# 1.3.0 +# * Enable to specify the license for the minified version by using a file or a text string +# * Add the ENCLOSURE variable to specify the enclosure of the library. If not specified, the library is assumed to be enclosed. +# The most common value is "exports:window" to export the library to the window object. +# +# ---------------------------------------------------------------- +# +# 1.2.0 +# * Add different variables for FILENAME and FILEPATH to avoid problems with the path +# * Change the creation of the raw file to use the dependencies as a prerequisite and create a true raw file +# * Add the creation of map source files for the minified and compressed versions +# +# ---------------------------------------------------------------- +# +# 1.1.0 +# * Reorder the parameters of the Makefile. +# * Add targets to build the files by their name so that "make" checks if the +# files are up to date, to avoid rebuilding if not needed. +# +# ---------------------------------------------------------------- +# 1.0.0 +# * Initial version +# diff --git a/README.md b/README.md index c4131b5..fe4d6cb 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![](https://data.jsdelivr.com/v1/package/gh/dealfonso/pdfjs-viewer/badge?style=rounded)](https://www.jsdelivr.com/package/gh/dealfonso/pdfjs-viewer) ![](https://img.shields.io/github/v/release/dealfonso/pdfjs-viewer) ![](https://img.shields.io/github/release-date/dealfonso/pdfjs-viewer) ![](https://img.shields.io/github/languages/code-size/dealfonso/pdfjs-viewer) ![](https://img.shields.io/github/license/dealfonso/pdfjs-viewer) + # PDFjs-viewer The distribution of [Mozilla's PDF.js](https://mozilla.github.io/pdf.js/) includes an example of a viewer that can be used in a web page by means of inserting using an `iframe`. But the viewer cannot be easily used or customized for using it as part of a web application. @@ -21,7 +23,6 @@ or even easier
``` - The PDFjsViewer is customizable and has different options and callbacks that enable it to be easily integrated in your application. Some examples included in the distribution: @@ -51,10 +52,9 @@ But if (as in my case) you need more than simply a PDF viewer embedded in an `if ## Using ### Dependencies -PDFjs-viewer depends on Mozilla's [PDF.js library](https://mozilla.github.io/pdf.js) and [jQuery](https://jquery.com). So please be sure to include the dependency in your project: +PDFjs-viewer depends on Mozilla's [PDF.js library](https://mozilla.github.io/pdf.js). So please be sure to include the dependencies in your project: ```html - ``` +PDFjs-viewer also depends on a [jQuery](https://jquery.com/) compatible library, so please include it in your project before including the PDFjs-viewer library: + +```html + +``` + +#### Troubleshooting +Some users have reported problems with jQuery. So I added support for an alternative library called [nojquery](https://github.com/jsutilslib/nojquery). If you want to use this library instead, please include it before the PDFjs-viewer library. + +**nojquery** is a library that provides a subset of jQuery functions that are used in PDFjs-viewer. It is a lightweight library that can be used as a replacement for jQuery in some cases. `PDFjs-viewer` will use `nojquery` with more priority than jQuery if it is included in the project. + +```html + +``` + ### From source There is a single _javascript_ file that contains the whole PDFjsViewer class (in folder `js`). @@ -82,7 +97,7 @@ cleancss css/*.css --format beautify | cat notice - > pdfjs-viewer.css cleancss css/*.css | cat notice.min - > pdfjs-viewer.min.css ``` -Now you can use files `pdfjs-viewer.min.js` and `pdfjs-viewer.min.css` in your project (jQuery is a prerequisite): +Now you can use files `pdfjs-viewer.min.js` and `pdfjs-viewer.min.css` in your project (jQuery or nojquery is a prerequisite): ```html @@ -96,19 +111,19 @@ It is possible to use `pdfjs-viewer` directly from a CDN: ```html - - + + ``` ## API -The creation of a PDF viewer consists of creating a `PDFjsViewer` object, setting the jQuery object in which the PDF viewer should be set, and configuring the options that we may need. +The creation of a PDF viewer consists of creating a `PDFjsViewer` object, setting the object in which the PDF viewer should be set, and configuring the options that we may need. ```javascript var options = { ... }; -var pdfViewer = new PDFjsViewer($('.pdfjs-viewer'), options); +var pdfViewer = new PDFjsViewer(document.querySelector('.pdfjs-viewer'), options); ``` ### Options @@ -129,9 +144,9 @@ zoomValues: [ 0.25, 0.5, 0.75, 1, 1.25, 1.50, 2, 4, 8 ], zoomFillArea: 0.95, // Function called when a document has been loaded and its structure has been created onDocumentReady: () => {}, -// Function called when a new page is created (it is binded to the object, and receives a jQuery object as parameter) +// Function called when a new page is created (it is bound to the object, and receives an html object as parameter, and the page number) onNewPage: (page, i) => {}, -// Function called when a page is rendered +// Function called when a page is rendered (it is bound to the object, and receives an html object as parameter, and the page number) onPageRender: (page, i) => {}, // Function called when the zoom level changes (it receives the zoom level) onZoomChange: (zoomlevel) => {}, @@ -139,10 +154,6 @@ onZoomChange: (zoomlevel) => {}, onActivePageChanged: (page, i) => {}, // Function called to get the content of an empty page emptyContent: () => $('
') -// Function called to obtain a page that shows an error when the document could not be loaded (returns a jQuery object) -errorPage: () => { - $(`
`).addClass(this.settings.pageClass).append($(`

`).text("could not load document")) -}, // The scale to which the pages are rendered (1.5 is the default value for the PDFjs viewer); a higher value will render the pages with a higher resolution // but it will consume more memory and CPU. A lower value will render the pages with a lower resolution, but they will be uglier. renderingScale: 1.5, @@ -270,4 +281,4 @@ Check the example at [PDFjs-viewer example-3](https://codepen.io/dealfonso/pen/d I really appreciate collaborations either by detecting bugs or by suggesting new features for this project. In this case, you can open issues and I'll try to address them in a best-effort basis. -Also I welcome collaborations for enhancing the viewer. So if you can add new features, please fork the project and create pull requests. In this case, please add documentation about the new features both in the documentation as in the pull-request description. +Also I welcome collaborations for enhancing the viewer. So if you can add new features, please fork the project and create pull requests. In this case, please add documentation about the new features both in the documentation as in the pull-request description. \ No newline at end of file diff --git a/dist/pdfjs-viewer.compress.js b/dist/pdfjs-viewer.compress.js new file mode 100644 index 0000000..5dab4db --- /dev/null +++ b/dist/pdfjs-viewer.compress.js @@ -0,0 +1,2 @@ +/* Copyright 2021 Carlos A. (https://github.com/dealfonso); License: http://www.apache.org/licenses/LICENSE-2.0 */ +!function(exports,$){if(void 0===$)console.error("jQuery-like library not available");else{let defaults={visibleThreshold:.5,extraPagesToLoad:3,pageClass:"pdfpage",contentClass:"content-wrapper",onDocumentReady:()=>{},onNewPage:(t,e)=>{},onPageRender:(t,e)=>{},zoomValues:[.25,.5,.75,1,1.25,1.5,2,4,8],onZoomChange:t=>{},onActivePageChanged:(t,e)=>{},zoomFillArea:.95,emptyContent:()=>$('
'),renderingScale:1.5};class Zoomer{constructor(t,e={}){this.current=1,this.viewer=t,this.settings=Object.assign({},{zoomValues:[.25,.5,.75,1,1.25,1.5,2,4,8],fillArea:.9},e),this.settings.zoomValues=this.settings.zoomValues.sort()}get(e=null){if(null===e)return this.current;if(parseFloat(e)!=e){var i=this.viewer.getActivePage();let t=[];switch(e){case"in":e=this.current,0<(t=this.settings.zoomValues.filter(t=>et.2*e.clientHeight*this._zoom.current||Math.abs(e.scrollLeft-s.left)>.2*e.clientWidth*this._zoom.current)&&(s={top:e.scrollTop,left:e.scrollLeft},this._visiblePages()),i=!1)}.bind(this),this.$container.off("scroll"),this.$container.on("scroll",this.__scrollHandler)}_createSkeleton(t,e){var i={$div:null,width:0,height:0,loaded:!1},s=(void 0!==t.getViewport?(s=t.getViewport({rotation:this._rotation,scale:1}),i.width=s.width,i.height=s.height,i.loaded=!0):(i.width=t.width,i.height=t.height),console.assert(0`).attr("data-page",e).data("width",i.width).data("height",i.height).data("zoom",this._zoom.current).addClass(this.settings.pageClass).width(i.width*this._zoom.current).height(i.height*this._zoom.current),$(`
`).width(i.width).height(i.height));return i.$div.append(s),this._cleanPage(i.$div),i}_placeSkeleton(t,e){let i=e-1,s=null;for(;0this.pdf.numPages)return!1;let e=t="string"==typeof t?parseInt(t):t;if("number"==typeof t){if(void 0===this.pages[t])return!1;e=this.pages[t].$div}return this._areaOfPageVisible(e)>e.outerWidth()*e.outerHeight()*this.settings.visibleThreshold}_visiblePages(i=!1){let s=0,a=null;if(0===this.pages.length)this._visibles=[],this._setActivePage(0);else{var n=this.pages.filter(function(t){var e=this._areaOfPageVisible(t.$div);return e>s&&(s=e,a=t.$div.data("page")),0t.$div);this._setActivePage(a);let e=n.map(t=>parseInt($(t).data("page")));if(0");var s=o.get(0),h=s.getContext("2d");return s.height=n.height*a,s.width=n.width*a,s.getContext("2d"),t.render({canvasContext:h,viewport:n,transform:1!==a?[a,0,0,a,0,0]:null}).promise.then(function(){return this._setPageContent(i.$div,o),this._documentReady&&("function"==typeof this.settings.onPageRender&&this.settings.onPageRender.call(this,i.$div.get(0),e),this.$container.get(0).dispatchEvent(new CustomEvent("pagerender",{detail:{pageNumber:e,page:i.$div.get(0)}}))),i}.bind(this))}getActivePage(){return null===this._activePage||null===this.pdf||this._activePage<1||this._activePage>this.pdf.numPages?null:this.pages[this._activePage].$div}getPages(){return this.pages}getPageCount(){return null===this.pdf?0:this.pdf.numPages}next(){this._activePaget.replace(/[A-Z]/g,t=>"-"+t.toLowerCase());let $target=$(target),result={};if(0<$target.length)for(var originalAttributeName in $target=$($target[0]),attributeDefaults){let attributeName=camelcaseToSnakecase(originalAttributeName),attributeValue=$target.attr(attributeName);if(null!=attributeValue){switch(typeof attributeDefaults[originalAttributeName]){case"float":try{attributeValue=parseFloat(attributeValue)}catch(_){}break;case"number":try{attributeValue=parseInt(attributeValue)}catch(_){}break;case"function":let functionString=attributeValue;attributeValue=function(){eval(functionString)}.bind(target[0])}result[originalAttributeName]=attributeValue}}return result}function init(e){let i=recoverAttributes(e,Object.assign({pdfDocument:"",initialZoom:""},defaults));if(null!=i.pdfDocument){let t=new PDFjsViewer($(e),i);t.loadDocument(i.pdfDocument).then(function(){null!=i.initialZoom&&t.setZoom(i.initialZoom)}),e.get(0).pdfViewer=t}}$(function(){$(".pdfjs-viewer").each(function(){init($(this))})}),exports.PDFjsViewer=PDFjsViewer}}(window,window._$??window.jQuery??void 0); \ No newline at end of file diff --git a/dist/pdfjs-viewer.compress.js.map b/dist/pdfjs-viewer.compress.js.map new file mode 100644 index 0000000..f998fe7 --- /dev/null +++ b/dist/pdfjs-viewer.compress.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pdfjs-viewer.compress.js.map","sources":["pdfjs-viewer.js"],"sourcesContent":["/**\n Copyright 2021 Carlos A. (https://github.com/dealfonso)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\n(function (exports, $) {\n\t\"use strict\";\n\tif ($ === undefined) {\n\t\tconsole.error(\"jQuery-like library not available\");\n\t\treturn;\n\t}\n\tlet defaults = {\n\t\tvisibleThreshold: .5,\n\t\textraPagesToLoad: 3,\n\t\tpageClass: \"pdfpage\",\n\t\tcontentClass: \"content-wrapper\",\n\t\tonDocumentReady: () => {},\n\t\tonNewPage: (page, i) => {},\n\t\tonPageRender: (page, i) => {},\n\t\tzoomValues: [.25, .5, .75, 1, 1.25, 1.5, 2, 4, 8],\n\t\tonZoomChange: zoomlevel => {},\n\t\tonActivePageChanged: (page, i) => {},\n\t\tzoomFillArea: .95,\n\t\temptyContent: () => $('
'),\n\t\trenderingScale: 1.5\n\t};\n\tclass Zoomer {\n\t\tconstructor(viewer, options = {}) {\n\t\t\tlet defaults = {\n\t\t\t\tzoomValues: [.25, .5, .75, 1, 1.25, 1.5, 2, 4, 8],\n\t\t\t\tfillArea: .9\n\t\t\t};\n\t\t\tthis.current = 1;\n\t\t\tthis.viewer = viewer;\n\t\t\tthis.settings = Object.assign({}, defaults, options);\n\t\t\tthis.settings.zoomValues = this.settings.zoomValues.sort();\n\t\t}\n\t\tget(zoom = null) {\n\t\t\tif (zoom === null) {\n\t\t\t\treturn this.current;\n\t\t\t}\n\t\t\tif (parseFloat(zoom) == zoom) {\n\t\t\t\treturn zoom;\n\t\t\t}\n\t\t\tlet $activepage = this.viewer.getActivePage();\n\t\t\tlet zoomValues = [];\n\t\t\tswitch (zoom) {\n\t\t\tcase \"in\":\n\t\t\t\tzoom = this.current;\n\t\t\t\tzoomValues = this.settings.zoomValues.filter(x => x > zoom);\n\t\t\t\tif (zoomValues.length > 0) {\n\t\t\t\t\tzoom = Math.min(...zoomValues);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"out\":\n\t\t\t\tzoom = this.current;\n\t\t\t\tzoomValues = this.settings.zoomValues.filter(x => x < zoom);\n\t\t\t\tif (zoomValues.length > 0) {\n\t\t\t\t\tzoom = Math.max(...zoomValues);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"fit\":\n\t\t\t\tzoom = Math.min(this.get(\"width\"), this.get(\"height\"));\n\t\t\t\tbreak;\n\t\t\tcase \"width\":\n\t\t\t\tzoom = this.settings.fillArea * this.viewer.$container.width() / $activepage.data(\"width\");\n\t\t\t\tbreak;\n\t\t\tcase \"height\":\n\t\t\t\tzoom = this.settings.fillArea * this.viewer.$container.height() / $activepage.data(\"height\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tzoom = this.current;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn zoom;\n\t\t}\n\t\tzoomPages(zoom) {\n\t\t\tzoom = this.get(zoom);\n\t\t\tthis.viewer.getPages().forEach(function (page) {\n\t\t\t\tlet $page = page.$div;\n\t\t\t\tlet c_width = $page.data(\"width\");\n\t\t\t\tlet c_height = $page.data(\"height\");\n\t\t\t\t$page.width(c_width * zoom).height(c_height * zoom);\n\t\t\t\t$page.data(\"zoom\", zoom);\n\t\t\t\t$page.find(`.${this.viewer.settings.contentClass}`).width(c_width * zoom).height(c_height * zoom);\n\t\t\t}.bind(this));\n\t\t\tthis.current = zoom;\n\t\t}\n\t}\n\tclass PDFjsViewer {\n\t\tversion = \"2.0.0\";\n\t\tconstructor($container, options = {}) {\n\t\t\tthis.settings = Object.assign({}, defaults, options);\n\t\t\tthis._zoom = new Zoomer(this, {\n\t\t\t\tzoomValues: this.settings.zoomValues,\n\t\t\t\tfillArea: this.settings.zoomFillArea\n\t\t\t});\n\t\t\t$container = $($container);\n\t\t\tthis.$container = $container;\n\t\t\t$container.get(0)._pdfjsViewer = this;\n\t\t\tthis._setScrollListener();\n\t\t\tthis.pages = [];\n\t\t\tthis.pdf = null;\n\t\t\tthis._documentReady = false;\n\t\t}\n\t\tsetZoom(zoom) {\n\t\t\tlet container = this.$container.get(0);\n\t\t\tlet prevzoom = this._zoom.current;\n\t\t\tlet prevScroll = {\n\t\t\t\ttop: container.scrollTop,\n\t\t\t\tleft: container.scrollLeft\n\t\t\t};\n\t\t\tthis._zoom.zoomPages(zoom);\n\t\t\tcontainer.scrollLeft = prevScroll.left * this._zoom.current / prevzoom;\n\t\t\tcontainer.scrollTop = prevScroll.top * this._zoom.current / prevzoom;\n\t\t\tthis._visiblePages(true);\n\t\t\tif (this._documentReady) {\n\t\t\t\tif (typeof this.settings.onZoomChange === \"function\") this.settings.onZoomChange.call(this, this._zoom.current);\n\t\t\t\tthis.$container.get(0).dispatchEvent(new CustomEvent(\"zoomchange\", {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tzoom: this._zoom.current\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t}\n\t\t\treturn this._zoom.current;\n\t\t}\n\t\tgetZoom() {\n\t\t\treturn this._zoom.current;\n\t\t}\n\t\t_cleanPage($page) {\n\t\t\tlet $emptyContent = this.settings.emptyContent();\n\t\t\t$page.find(`.${this.settings.contentClass}`).html(\"\").append($emptyContent);\n\t\t}\n\t\t_setPageContent($page, $content) {\n\t\t\t$page.find(`.${this.settings.contentClass}`).html(\"\").append($content);\n\t\t}\n\t\trefreshAll() {\n\t\t\tthis._visiblePages(true);\n\t\t}\n\t\t_setScrollListener() {\n\t\t\tlet scrollLock = false;\n\t\t\tlet scrollPos = {\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t};\n\t\t\tthis.__scrollHandler = function (e) {\n\t\t\t\tif (scrollLock === true) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tscrollLock = true;\n\t\t\t\tlet container = this.$container.get(0);\n\t\t\t\tif (Math.abs(container.scrollTop - scrollPos.top) > container.clientHeight * .2 * this._zoom.current || Math.abs(container.scrollLeft - scrollPos.left) > container.clientWidth * .2 * this._zoom.current) {\n\t\t\t\t\tscrollPos = {\n\t\t\t\t\t\ttop: container.scrollTop,\n\t\t\t\t\t\tleft: container.scrollLeft\n\t\t\t\t\t};\n\t\t\t\t\tthis._visiblePages();\n\t\t\t\t}\n\t\t\t\tscrollLock = false;\n\t\t\t}.bind(this);\n\t\t\tthis.$container.off(\"scroll\");\n\t\t\tthis.$container.on(\"scroll\", this.__scrollHandler);\n\t\t}\n\t\t_createSkeleton(page, i) {\n\t\t\tlet pageinfo = {\n\t\t\t\t$div: null,\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0,\n\t\t\t\tloaded: false\n\t\t\t};\n\t\t\tif (page.getViewport !== undefined) {\n\t\t\t\tlet viewport = page.getViewport({\n\t\t\t\t\trotation: this._rotation,\n\t\t\t\t\tscale: 1\n\t\t\t\t});\n\t\t\t\tpageinfo.width = viewport.width;\n\t\t\t\tpageinfo.height = viewport.height;\n\t\t\t\tpageinfo.loaded = true;\n\t\t\t} else {\n\t\t\t\tpageinfo.width = page.width;\n\t\t\t\tpageinfo.height = page.height;\n\t\t\t}\n\t\t\tconsole.assert(pageinfo.width > 0 && pageinfo.height > 0, \"Page width and height must be greater than 0\");\n\t\t\tpageinfo.$div = $(`
`).attr(\"data-page\", i).data(\"width\", pageinfo.width).data(\"height\", pageinfo.height).data(\"zoom\", this._zoom.current).addClass(this.settings.pageClass).width(pageinfo.width * this._zoom.current).height(pageinfo.height * this._zoom.current);\n\t\t\tlet $content = $(`
`).width(pageinfo.width).height(pageinfo.height);\n\t\t\tpageinfo.$div.append($content);\n\t\t\tthis._cleanPage(pageinfo.$div);\n\t\t\treturn pageinfo;\n\t\t}\n\t\t_placeSkeleton(pageinfo, i) {\n\t\t\tlet prevpage = i - 1;\n\t\t\tlet $prevpage = null;\n\t\t\twhile (prevpage > 0 && ($prevpage = this.$container.find(`.${this.settings.pageClass}[data-page=\"${prevpage}\"]`)).length === 0) {\n\t\t\t\tprevpage--;\n\t\t\t}\n\t\t\tif (prevpage === 0) {\n\t\t\t\tthis.$container.append(pageinfo.$div);\n\t\t\t} else {\n\t\t\t\t$prevpage.after(pageinfo.$div);\n\t\t\t}\n\t\t}\n\t\t_createSkeletons(pageinfo) {\n\t\t\tfor (let i = 1; i <= this.pageCount; i++) {\n\t\t\t\tif (this.pages[i] === undefined) {\n\t\t\t\t\tpageinfo = this._createSkeleton(pageinfo, i);\n\t\t\t\t\tthis.pages[i] = pageinfo;\n\t\t\t\t\tthis._placeSkeleton(pageinfo, i);\n\t\t\t\t\tif (typeof this.settings.onNewPage === \"function\") {\n\t\t\t\t\t\tthis.settings.onNewPage.call(this, pageinfo.$div.get(0), i);\n\t\t\t\t\t}\n\t\t\t\t\tthis.$container.get(0).dispatchEvent(new CustomEvent(\"newpage\", {\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\tpageNumber: i,\n\t\t\t\t\t\t\tpage: pageinfo.$div.get(0)\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_setActivePage(i) {\n\t\t\tif (this._activePage !== i) {\n\t\t\t\tthis._activePage = i;\n\t\t\t\tlet activePage = this.getActivePage();\n\t\t\t\tif (this._documentReady) {\n\t\t\t\t\tactivePage = activePage == null ? null : activePage.get(0);\n\t\t\t\t\tif (typeof this.settings.onActivePageChanged === \"function\") {\n\t\t\t\t\t\tthis.settings.onActivePageChanged.call(this, activePage, i);\n\t\t\t\t\t}\n\t\t\t\t\tthis.$container.get(0).dispatchEvent(new CustomEvent(\"activepagechanged\", {\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\tactivePageNumber: i,\n\t\t\t\t\t\t\tactivePage: activePage\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_areaOfPageVisible($page) {\n\t\t\tif ($page === undefined) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tlet c_offset = this.$container.offset();\n\t\t\tlet c_width = this.$container.width();\n\t\t\tlet c_height = this.$container.height();\n\t\t\tlet position = $page.offset();\n\t\t\tposition.top -= c_offset.top;\n\t\t\tposition.left -= c_offset.left;\n\t\t\tposition.bottom = position.top + $page.outerHeight();\n\t\t\tposition.right = position.left + $page.outerWidth();\n\t\t\tlet page_y0 = Math.min(Math.max(position.top, 0), c_height);\n\t\t\tlet page_y1 = Math.min(Math.max($page.outerHeight() + position.top, 0), c_height);\n\t\t\tlet page_x0 = Math.min(Math.max(position.left, 0), c_width);\n\t\t\tlet page_x1 = Math.min(Math.max($page.outerWidth() + position.left, 0), c_width);\n\t\t\tlet vis_x = page_x1 - page_x0;\n\t\t\tlet vis_y = page_y1 - page_y0;\n\t\t\treturn vis_x * vis_y;\n\t\t}\n\t\tisPageVisible(i) {\n\t\t\tif (this.pdf === null || i === undefined || i === null || i < 1 || i > this.pdf.numPages) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (typeof i === \"string\") {\n\t\t\t\ti = parseInt(i);\n\t\t\t}\n\t\t\tlet $page = i;\n\t\t\tif (typeof i === \"number\") {\n\t\t\t\tif (this.pages[i] === undefined) return false;\n\t\t\t\t$page = this.pages[i].$div;\n\t\t\t}\n\t\t\treturn this._areaOfPageVisible($page) > $page.outerWidth() * $page.outerHeight() * this.settings.visibleThreshold;\n\t\t}\n\t\t_visiblePages(forceRedraw = false) {\n\t\t\tlet max_area = 0;\n\t\t\tlet i_page = null;\n\t\t\tif (this.pages.length === 0) {\n\t\t\t\tthis._visibles = [];\n\t\t\t\tthis._setActivePage(0);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet $visibles = this.pages.filter(function (pageinfo) {\n\t\t\t\tlet areaVisible = this._areaOfPageVisible(pageinfo.$div);\n\t\t\t\tif (areaVisible > max_area) {\n\t\t\t\t\tmax_area = areaVisible;\n\t\t\t\t\ti_page = pageinfo.$div.data(\"page\");\n\t\t\t\t}\n\t\t\t\treturn areaVisible > 0;\n\t\t\t}.bind(this)).map(x => x.$div);\n\t\t\tthis._setActivePage(i_page);\n\t\t\tlet visibles = $visibles.map(x => {\n\t\t\t\treturn parseInt($(x).data(\"page\"));\n\t\t\t});\n\t\t\tif (visibles.length > 0) {\n\t\t\t\tlet minVisible = Math.min(...visibles);\n\t\t\t\tlet maxVisible = Math.max(...visibles);\n\t\t\t\tfor (let i = Math.max(1, minVisible - this.settings.extraPagesToLoad); i < minVisible; i++) {\n\t\t\t\t\tif (!visibles.includes(i)) visibles.push(i);\n\t\t\t\t}\n\t\t\t\tfor (let i = maxVisible + 1; i <= Math.min(maxVisible + this.settings.extraPagesToLoad, this.pdf.numPages); i++) {\n\t\t\t\t\tif (!visibles.includes(i)) visibles.push(i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet nowVisibles = visibles;\n\t\t\tif (!forceRedraw) {\n\t\t\t\tnowVisibles = visibles.filter(function (x) {\n\t\t\t\t\treturn !this._visibles.includes(x);\n\t\t\t\t}.bind(this));\n\t\t\t}\n\t\t\tthis._visibles.filter(function (x) {\n\t\t\t\treturn !visibles.includes(x);\n\t\t\t}).forEach(function (i) {\n\t\t\t\tthis._cleanPage(this.pages[i].$div);\n\t\t\t}.bind(this));\n\t\t\tthis._visibles = visibles;\n\t\t\tthis.loadPages(...nowVisibles);\n\t\t}\n\t\tloadPages(...pages) {\n\t\t\tthis._pagesLoading.push(...pages);\n\t\t\tif (this._loading) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._loadingTask();\n\t\t}\n\t\t_loadingTask() {\n\t\t\tthis._loading = true;\n\t\t\tif (this._pagesLoading.length > 0) {\n\t\t\t\tlet pagei = this._pagesLoading.shift();\n\t\t\t\tthis.pdf.getPage(pagei).then(function (page) {\n\t\t\t\t\tthis._renderPage(page, pagei);\n\t\t\t\t}.bind(this)).then(function (pageinfo) {\n\t\t\t\t\tif (this._pagesLoading.length > 0) {\n\t\t\t\t\t\tthis._loadingTask();\n\t\t\t\t\t}\n\t\t\t\t}.bind(this));\n\t\t\t}\n\t\t\tthis._loading = false;\n\t\t}\n\t\tscrollToPage(i) {\n\t\t\tif (this.pages.length === 0 || this.pages[i] === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet $page = this.pages[i].$div;\n\t\t\tif ($page.length === 0) {\n\t\t\t\tconsole.warn(`Page ${i} not found`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet position = $page.position();\n\t\t\tlet containerPosition = this.$container.position();\n\t\t\tif (position !== undefined) {\n\t\t\t\tthis.$container.get(0).scrollTop = this.$container.get(0).scrollTop + position.top - containerPosition.top;\n\t\t\t\tthis.$container.get(0).scrollLeft = this.$container.get(0).scrollLeft + position.left - containerPosition.left;\n\t\t\t}\n\t\t\tthis._setActivePage(i);\n\t\t}\n\t\t_renderPage(page, i) {\n\t\t\tlet pageinfo = this.pages[i];\n\t\t\tlet scale = this.settings.renderingScale;\n\t\t\tlet pixel_ratio = window.devicePixelRatio || 1;\n\t\t\tlet viewport = page.getViewport({\n\t\t\t\trotation: this._rotation,\n\t\t\t\tscale: this._zoom.current * scale\n\t\t\t});\n\t\t\tpageinfo.width = viewport.width / this._zoom.current / scale;\n\t\t\tpageinfo.height = viewport.height / this._zoom.current / scale;\n\t\t\tpageinfo.$div.data(\"width\", pageinfo.width);\n\t\t\tpageinfo.$div.data(\"height\", pageinfo.height);\n\t\t\tpageinfo.$div.width(pageinfo.width * this._zoom.current);\n\t\t\tpageinfo.$div.height(pageinfo.height * this._zoom.current);\n\t\t\tpageinfo.loaded = true;\n\t\t\tlet $canvas = $(\"\");\n\t\t\tlet canvas = $canvas.get(0);\n\t\t\tlet context = canvas.getContext(\"2d\");\n\t\t\tcanvas.height = viewport.height * pixel_ratio;\n\t\t\tcanvas.width = viewport.width * pixel_ratio;\n\t\t\tcanvas.getContext(\"2d\");\n\t\t\tvar transform = pixel_ratio !== 1 ? [pixel_ratio, 0, 0, pixel_ratio, 0, 0] : null;\n\t\t\tvar renderContext = {\n\t\t\t\tcanvasContext: context,\n\t\t\t\tviewport: viewport,\n\t\t\t\ttransform: transform\n\t\t\t};\n\t\t\treturn page.render(renderContext).promise.then(function () {\n\t\t\t\tthis._setPageContent(pageinfo.$div, $canvas);\n\t\t\t\tif (this._documentReady) {\n\t\t\t\t\tif (typeof this.settings.onPageRender === \"function\") {\n\t\t\t\t\t\tthis.settings.onPageRender.call(this, pageinfo.$div.get(0), i);\n\t\t\t\t\t}\n\t\t\t\t\tthis.$container.get(0).dispatchEvent(new CustomEvent(\"pagerender\", {\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\tpageNumber: i,\n\t\t\t\t\t\t\tpage: pageinfo.$div.get(0)\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\treturn pageinfo;\n\t\t\t}.bind(this));\n\t\t}\n\t\tgetActivePage() {\n\t\t\tif (this._activePage === null || this.pdf === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (this._activePage < 1 || this._activePage > this.pdf.numPages) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn this.pages[this._activePage].$div;\n\t\t}\n\t\tgetPages() {\n\t\t\treturn this.pages;\n\t\t}\n\t\tgetPageCount() {\n\t\t\tif (this.pdf === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn this.pdf.numPages;\n\t\t}\n\t\tnext() {\n\t\t\tif (this._activePage < this.pdf.numPages) {\n\t\t\t\tthis.scrollToPage(this._activePage + 1);\n\t\t\t}\n\t\t}\n\t\tprev() {\n\t\t\tif (this._activePage > 1) {\n\t\t\t\tthis.scrollToPage(this._activePage - 1);\n\t\t\t}\n\t\t}\n\t\tfirst() {\n\t\t\tif (this._activePage !== 1) {\n\t\t\t\tthis.scrollToPage(1);\n\t\t\t}\n\t\t}\n\t\tlast() {\n\t\t\tif (this.pdf === null) return;\n\t\t\tif (this._activePage !== this.pdf.numPages) {\n\t\t\t\tthis.scrollToPage(this.pdf.numPages);\n\t\t\t}\n\t\t}\n\t\trotate(deg, accumulate = false) {\n\t\t\tif (accumulate) {\n\t\t\t\tdeg = deg + this._rotation;\n\t\t\t}\n\t\t\tthis._rotation = deg;\n\t\t\tlet container = this.$container.get(0);\n\t\t\tlet prevScroll = {\n\t\t\t\ttop: container.scrollTop,\n\t\t\t\tleft: container.scrollLeft,\n\t\t\t\theight: container.scrollHeight,\n\t\t\t\twidth: container.scrollWidth\n\t\t\t};\n\t\t\treturn this.forceViewerInitialization().then(function () {\n\t\t\t\tlet newScroll = {\n\t\t\t\t\ttop: container.scrollTop,\n\t\t\t\t\tleft: container.scrollLeft,\n\t\t\t\t\theight: container.scrollHeight,\n\t\t\t\t\twidth: container.scrollWidth\n\t\t\t\t};\n\t\t\t\tcontainer.scrollTop = prevScroll.top * (newScroll.height / prevScroll.height);\n\t\t\t\tcontainer.scrollLeft = prevScroll.left * (newScroll.width / prevScroll.width);\n\t\t\t}.bind(this));\n\t\t}\n\t\tforceViewerInitialization() {\n\t\t\tthis.pages = [];\n\t\t\tthis.$container.find(`.${this.settings.pageClass}`).remove();\n\t\t\tthis._pagesLoading = [];\n\t\t\tthis._loading = false;\n\t\t\tthis._visibles = [];\n\t\t\tthis._activePage = null;\n\t\t\treturn this.pdf.getPage(1).then(function (page) {\n\t\t\t\tthis._createSkeletons(page);\n\t\t\t\tthis._visiblePages();\n\t\t\t\tthis._setActivePage(1);\n\t\t\t}.bind(this));\n\t\t}\n\t\tasync loadDocument(document) {\n\t\t\tthis._documentReady = false;\n\t\t\tthis.pages = [];\n\t\t\tthis.$container.find(`.${this.settings.pageClass}`).remove();\n\t\t\tthis.pdf = null;\n\t\t\tlet loadingTask = pdfjsLib.getDocument(document);\n\t\t\treturn loadingTask.promise.then(function (pdf) {\n\t\t\t\tthis.pdf = pdf;\n\t\t\t\tthis.pageCount = pdf.numPages;\n\t\t\t\tthis._rotation = 0;\n\t\t\t\treturn this.forceViewerInitialization();\n\t\t\t}.bind(this)).then(function () {\n\t\t\t\tif (typeof this.settings.onDocumentReady === \"function\") {\n\t\t\t\t\tthis.settings.onDocumentReady.call(this);\n\t\t\t\t}\n\t\t\t\tthis.$container.get(0).dispatchEvent(new CustomEvent(\"documentready\", {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tdocument: this.pdf\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t\tthis._setActivePage(0);\n\t\t\t\tthis._documentReady = true;\n\t\t\t\tthis._setActivePage(1);\n\t\t\t}.bind(this));\n\t\t}\n\t}\n\n\tfunction recoverAttributes(target, attributeDefaults) {\n\t\tconst camelcaseToSnakecase = str => str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\n\t\tlet $target = $(target);\n\t\tlet result = {};\n\t\tif ($target.length > 0) {\n\t\t\t$target = $($target[0]);\n\t\t\tfor (let originalAttributeName in attributeDefaults) {\n\t\t\t\tlet attributeName = camelcaseToSnakecase(originalAttributeName);\n\t\t\t\tlet attributeValue = $target.attr(attributeName);\n\t\t\t\tif (attributeValue != null) {\n\t\t\t\t\tswitch (typeof attributeDefaults[originalAttributeName]) {\n\t\t\t\t\tcase \"float\":\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tattributeValue = parseFloat(attributeValue);\n\t\t\t\t\t\t} catch (_) {}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tattributeValue = parseInt(attributeValue);\n\t\t\t\t\t\t} catch (_) {}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"function\":\n\t\t\t\t\t\tlet functionString = attributeValue;\n\t\t\t\t\t\tattributeValue = function () {\n\t\t\t\t\t\t\teval(functionString);\n\t\t\t\t\t\t}.bind(target[0]);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tresult[originalAttributeName] = attributeValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction init(element) {\n\t\tlet options = recoverAttributes(element, Object.assign({\n\t\t\tpdfDocument: \"\",\n\t\t\tinitialZoom: \"\"\n\t\t}, defaults));\n\t\tif (options[\"pdfDocument\"] != null) {\n\t\t\tlet pdfViewer = new PDFjsViewer($(element), options);\n\t\t\tpdfViewer.loadDocument(options[\"pdfDocument\"]).then(function () {\n\t\t\t\tif (options[\"initialZoom\"] != null) {\n\t\t\t\t\tpdfViewer.setZoom(options[\"initialZoom\"]);\n\t\t\t\t}\n\t\t\t});\n\t\t\telement.get(0).pdfViewer = pdfViewer;\n\t\t}\n\t}\n\t$(function () {\n\t\t$(\".pdfjs-viewer\").each(function () {\n\t\t\tlet $viewer = $(this);\n\t\t\tinit($viewer);\n\t\t});\n\t});\n\texports.PDFjsViewer = PDFjsViewer;\n})(window, window._$ ?? window.jQuery ?? undefined);\n"],"names":["exports","$","undefined","console","error","let","defaults","visibleThreshold","extraPagesToLoad","pageClass","contentClass","onDocumentReady","onNewPage","page","i","onPageRender","zoomValues","onZoomChange","zoomlevel","onActivePageChanged","zoomFillArea","emptyContent","renderingScale","Zoomer","constructor","viewer","options","this","current","settings","Object","assign","fillArea","sort","get","zoom","parseFloat","$activepage","getActivePage","filter","x","length","Math","min","max","$container","width","data","height","zoomPages","getPages","forEach","$page","$div","c_width","c_height","find","bind","PDFjsViewer","version","_zoom","_pdfjsViewer","_setScrollListener","pages","pdf","_documentReady","setZoom","container","prevzoom","prevScroll","scrollTop","scrollLeft","_visiblePages","call","dispatchEvent","CustomEvent","detail","getZoom","_cleanPage","$emptyContent","html","append","_setPageContent","$content","refreshAll","scrollLock","scrollPos","top","left","__scrollHandler","e","abs","clientHeight","clientWidth","off","on","_createSkeleton","pageinfo","loaded","getViewport","viewport","rotation","_rotation","scale","assert","attr","addClass","_placeSkeleton","prevpage","$prevpage","after","_createSkeletons","pageCount","pageNumber","_setActivePage","_activePage","activePage","activePageNumber","_areaOfPageVisible","position","page_y0","page_y1","page_x0","c_offset","offset","bottom","outerHeight","right","outerWidth","isPageVisible","numPages","parseInt","forceRedraw","max_area","i_page","_visibles","$visibles","areaVisible","map","visibles","minVisible","maxVisible","includes","push","nowVisibles","loadPages","_pagesLoading","_loading","_loadingTask","pagei","shift","getPage","then","_renderPage","scrollToPage","containerPosition","warn","pixel_ratio","window","devicePixelRatio","$canvas","canvas","context","getContext","render","canvasContext","transform","promise","getPageCount","next","prev","first","last","rotate","deg","accumulate","scrollHeight","scrollWidth","forceViewerInitialization","newScroll","remove","loadDocument","document","pdfjsLib","getDocument","recoverAttributes","target","attributeDefaults","camelcaseToSnakecase","str","replace","letter","toLowerCase","$target","result","originalAttributeName","attributeName","attributeValue","_","functionString","eval","init","element","pdfDocument","initialZoom","pdfViewer","each","_$","jQuery"],"mappings":"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"} \ No newline at end of file diff --git a/pdfjs-viewer.css b/dist/pdfjs-viewer.css similarity index 100% rename from pdfjs-viewer.css rename to dist/pdfjs-viewer.css diff --git a/dist/pdfjs-viewer.js b/dist/pdfjs-viewer.js new file mode 100644 index 0000000..c911c17 --- /dev/null +++ b/dist/pdfjs-viewer.js @@ -0,0 +1,569 @@ +/** + Copyright 2021 Carlos A. (https://github.com/dealfonso) + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +(function (exports, $) { + "use strict"; + if ($ === undefined) { + console.error("jQuery-like library not available"); + return; + } + let defaults = { + visibleThreshold: .5, + extraPagesToLoad: 3, + pageClass: "pdfpage", + contentClass: "content-wrapper", + onDocumentReady: () => {}, + onNewPage: (page, i) => {}, + onPageRender: (page, i) => {}, + zoomValues: [.25, .5, .75, 1, 1.25, 1.5, 2, 4, 8], + onZoomChange: zoomlevel => {}, + onActivePageChanged: (page, i) => {}, + zoomFillArea: .95, + emptyContent: () => $('
'), + renderingScale: 1.5 + }; + class Zoomer { + constructor(viewer, options = {}) { + let defaults = { + zoomValues: [.25, .5, .75, 1, 1.25, 1.5, 2, 4, 8], + fillArea: .9 + }; + this.current = 1; + this.viewer = viewer; + this.settings = Object.assign({}, defaults, options); + this.settings.zoomValues = this.settings.zoomValues.sort(); + } + get(zoom = null) { + if (zoom === null) { + return this.current; + } + if (parseFloat(zoom) == zoom) { + return zoom; + } + let $activepage = this.viewer.getActivePage(); + let zoomValues = []; + switch (zoom) { + case "in": + zoom = this.current; + zoomValues = this.settings.zoomValues.filter(x => x > zoom); + if (zoomValues.length > 0) { + zoom = Math.min(...zoomValues); + } + break; + case "out": + zoom = this.current; + zoomValues = this.settings.zoomValues.filter(x => x < zoom); + if (zoomValues.length > 0) { + zoom = Math.max(...zoomValues); + } + break; + case "fit": + zoom = Math.min(this.get("width"), this.get("height")); + break; + case "width": + zoom = this.settings.fillArea * this.viewer.$container.width() / $activepage.data("width"); + break; + case "height": + zoom = this.settings.fillArea * this.viewer.$container.height() / $activepage.data("height"); + break; + default: + zoom = this.current; + break; + } + return zoom; + } + zoomPages(zoom) { + zoom = this.get(zoom); + this.viewer.getPages().forEach(function (page) { + let $page = page.$div; + let c_width = $page.data("width"); + let c_height = $page.data("height"); + $page.width(c_width * zoom).height(c_height * zoom); + $page.data("zoom", zoom); + $page.find(`.${this.viewer.settings.contentClass}`).width(c_width * zoom).height(c_height * zoom); + }.bind(this)); + this.current = zoom; + } + } + class PDFjsViewer { + version = "2.0.0"; + constructor($container, options = {}) { + this.settings = Object.assign({}, defaults, options); + this._zoom = new Zoomer(this, { + zoomValues: this.settings.zoomValues, + fillArea: this.settings.zoomFillArea + }); + $container = $($container); + this.$container = $container; + $container.get(0)._pdfjsViewer = this; + this._setScrollListener(); + this.pages = []; + this.pdf = null; + this._documentReady = false; + } + setZoom(zoom) { + let container = this.$container.get(0); + let prevzoom = this._zoom.current; + let prevScroll = { + top: container.scrollTop, + left: container.scrollLeft + }; + this._zoom.zoomPages(zoom); + container.scrollLeft = prevScroll.left * this._zoom.current / prevzoom; + container.scrollTop = prevScroll.top * this._zoom.current / prevzoom; + this._visiblePages(true); + if (this._documentReady) { + if (typeof this.settings.onZoomChange === "function") this.settings.onZoomChange.call(this, this._zoom.current); + this.$container.get(0).dispatchEvent(new CustomEvent("zoomchange", { + detail: { + zoom: this._zoom.current + } + })); + } + return this._zoom.current; + } + getZoom() { + return this._zoom.current; + } + _cleanPage($page) { + let $emptyContent = this.settings.emptyContent(); + $page.find(`.${this.settings.contentClass}`).html("").append($emptyContent); + } + _setPageContent($page, $content) { + $page.find(`.${this.settings.contentClass}`).html("").append($content); + } + refreshAll() { + this._visiblePages(true); + } + _setScrollListener() { + let scrollLock = false; + let scrollPos = { + top: 0, + left: 0 + }; + this.__scrollHandler = function (e) { + if (scrollLock === true) { + return; + } + scrollLock = true; + let container = this.$container.get(0); + if (Math.abs(container.scrollTop - scrollPos.top) > container.clientHeight * .2 * this._zoom.current || Math.abs(container.scrollLeft - scrollPos.left) > container.clientWidth * .2 * this._zoom.current) { + scrollPos = { + top: container.scrollTop, + left: container.scrollLeft + }; + this._visiblePages(); + } + scrollLock = false; + }.bind(this); + this.$container.off("scroll"); + this.$container.on("scroll", this.__scrollHandler); + } + _createSkeleton(page, i) { + let pageinfo = { + $div: null, + width: 0, + height: 0, + loaded: false + }; + if (page.getViewport !== undefined) { + let viewport = page.getViewport({ + rotation: this._rotation, + scale: 1 + }); + pageinfo.width = viewport.width; + pageinfo.height = viewport.height; + pageinfo.loaded = true; + } else { + pageinfo.width = page.width; + pageinfo.height = page.height; + } + console.assert(pageinfo.width > 0 && pageinfo.height > 0, "Page width and height must be greater than 0"); + pageinfo.$div = $(`
`).attr("data-page", i).data("width", pageinfo.width).data("height", pageinfo.height).data("zoom", this._zoom.current).addClass(this.settings.pageClass).width(pageinfo.width * this._zoom.current).height(pageinfo.height * this._zoom.current); + let $content = $(`
`).width(pageinfo.width).height(pageinfo.height); + pageinfo.$div.append($content); + this._cleanPage(pageinfo.$div); + return pageinfo; + } + _placeSkeleton(pageinfo, i) { + let prevpage = i - 1; + let $prevpage = null; + while (prevpage > 0 && ($prevpage = this.$container.find(`.${this.settings.pageClass}[data-page="${prevpage}"]`)).length === 0) { + prevpage--; + } + if (prevpage === 0) { + this.$container.append(pageinfo.$div); + } else { + $prevpage.after(pageinfo.$div); + } + } + _createSkeletons(pageinfo) { + for (let i = 1; i <= this.pageCount; i++) { + if (this.pages[i] === undefined) { + pageinfo = this._createSkeleton(pageinfo, i); + this.pages[i] = pageinfo; + this._placeSkeleton(pageinfo, i); + if (typeof this.settings.onNewPage === "function") { + this.settings.onNewPage.call(this, pageinfo.$div.get(0), i); + } + this.$container.get(0).dispatchEvent(new CustomEvent("newpage", { + detail: { + pageNumber: i, + page: pageinfo.$div.get(0) + } + })); + } + } + } + _setActivePage(i) { + if (this._activePage !== i) { + this._activePage = i; + let activePage = this.getActivePage(); + if (this._documentReady) { + activePage = activePage == null ? null : activePage.get(0); + if (typeof this.settings.onActivePageChanged === "function") { + this.settings.onActivePageChanged.call(this, activePage, i); + } + this.$container.get(0).dispatchEvent(new CustomEvent("activepagechanged", { + detail: { + activePageNumber: i, + activePage: activePage + } + })); + } + } + } + _areaOfPageVisible($page) { + if ($page === undefined) { + return 0; + } + let c_offset = this.$container.offset(); + let c_width = this.$container.width(); + let c_height = this.$container.height(); + let position = $page.offset(); + position.top -= c_offset.top; + position.left -= c_offset.left; + position.bottom = position.top + $page.outerHeight(); + position.right = position.left + $page.outerWidth(); + let page_y0 = Math.min(Math.max(position.top, 0), c_height); + let page_y1 = Math.min(Math.max($page.outerHeight() + position.top, 0), c_height); + let page_x0 = Math.min(Math.max(position.left, 0), c_width); + let page_x1 = Math.min(Math.max($page.outerWidth() + position.left, 0), c_width); + let vis_x = page_x1 - page_x0; + let vis_y = page_y1 - page_y0; + return vis_x * vis_y; + } + isPageVisible(i) { + if (this.pdf === null || i === undefined || i === null || i < 1 || i > this.pdf.numPages) { + return false; + } + if (typeof i === "string") { + i = parseInt(i); + } + let $page = i; + if (typeof i === "number") { + if (this.pages[i] === undefined) return false; + $page = this.pages[i].$div; + } + return this._areaOfPageVisible($page) > $page.outerWidth() * $page.outerHeight() * this.settings.visibleThreshold; + } + _visiblePages(forceRedraw = false) { + let max_area = 0; + let i_page = null; + if (this.pages.length === 0) { + this._visibles = []; + this._setActivePage(0); + return; + } + let $visibles = this.pages.filter(function (pageinfo) { + let areaVisible = this._areaOfPageVisible(pageinfo.$div); + if (areaVisible > max_area) { + max_area = areaVisible; + i_page = pageinfo.$div.data("page"); + } + return areaVisible > 0; + }.bind(this)).map(x => x.$div); + this._setActivePage(i_page); + let visibles = $visibles.map(x => { + return parseInt($(x).data("page")); + }); + if (visibles.length > 0) { + let minVisible = Math.min(...visibles); + let maxVisible = Math.max(...visibles); + for (let i = Math.max(1, minVisible - this.settings.extraPagesToLoad); i < minVisible; i++) { + if (!visibles.includes(i)) visibles.push(i); + } + for (let i = maxVisible + 1; i <= Math.min(maxVisible + this.settings.extraPagesToLoad, this.pdf.numPages); i++) { + if (!visibles.includes(i)) visibles.push(i); + } + } + let nowVisibles = visibles; + if (!forceRedraw) { + nowVisibles = visibles.filter(function (x) { + return !this._visibles.includes(x); + }.bind(this)); + } + this._visibles.filter(function (x) { + return !visibles.includes(x); + }).forEach(function (i) { + this._cleanPage(this.pages[i].$div); + }.bind(this)); + this._visibles = visibles; + this.loadPages(...nowVisibles); + } + loadPages(...pages) { + this._pagesLoading.push(...pages); + if (this._loading) { + return; + } + this._loadingTask(); + } + _loadingTask() { + this._loading = true; + if (this._pagesLoading.length > 0) { + let pagei = this._pagesLoading.shift(); + this.pdf.getPage(pagei).then(function (page) { + this._renderPage(page, pagei); + }.bind(this)).then(function (pageinfo) { + if (this._pagesLoading.length > 0) { + this._loadingTask(); + } + }.bind(this)); + } + this._loading = false; + } + scrollToPage(i) { + if (this.pages.length === 0 || this.pages[i] === undefined) { + return; + } + let $page = this.pages[i].$div; + if ($page.length === 0) { + console.warn(`Page ${i} not found`); + return; + } + let position = $page.position(); + let containerPosition = this.$container.position(); + if (position !== undefined) { + this.$container.get(0).scrollTop = this.$container.get(0).scrollTop + position.top - containerPosition.top; + this.$container.get(0).scrollLeft = this.$container.get(0).scrollLeft + position.left - containerPosition.left; + } + this._setActivePage(i); + } + _renderPage(page, i) { + let pageinfo = this.pages[i]; + let scale = this.settings.renderingScale; + let pixel_ratio = window.devicePixelRatio || 1; + let viewport = page.getViewport({ + rotation: this._rotation, + scale: this._zoom.current * scale + }); + pageinfo.width = viewport.width / this._zoom.current / scale; + pageinfo.height = viewport.height / this._zoom.current / scale; + pageinfo.$div.data("width", pageinfo.width); + pageinfo.$div.data("height", pageinfo.height); + pageinfo.$div.width(pageinfo.width * this._zoom.current); + pageinfo.$div.height(pageinfo.height * this._zoom.current); + pageinfo.loaded = true; + let $canvas = $(""); + let canvas = $canvas.get(0); + let context = canvas.getContext("2d"); + canvas.height = viewport.height * pixel_ratio; + canvas.width = viewport.width * pixel_ratio; + canvas.getContext("2d"); + var transform = pixel_ratio !== 1 ? [pixel_ratio, 0, 0, pixel_ratio, 0, 0] : null; + var renderContext = { + canvasContext: context, + viewport: viewport, + transform: transform + }; + return page.render(renderContext).promise.then(function () { + this._setPageContent(pageinfo.$div, $canvas); + if (this._documentReady) { + if (typeof this.settings.onPageRender === "function") { + this.settings.onPageRender.call(this, pageinfo.$div.get(0), i); + } + this.$container.get(0).dispatchEvent(new CustomEvent("pagerender", { + detail: { + pageNumber: i, + page: pageinfo.$div.get(0) + } + })); + } + return pageinfo; + }.bind(this)); + } + getActivePage() { + if (this._activePage === null || this.pdf === null) { + return null; + } + if (this._activePage < 1 || this._activePage > this.pdf.numPages) { + return null; + } + return this.pages[this._activePage].$div; + } + getPages() { + return this.pages; + } + getPageCount() { + if (this.pdf === null) { + return 0; + } + return this.pdf.numPages; + } + next() { + if (this._activePage < this.pdf.numPages) { + this.scrollToPage(this._activePage + 1); + } + } + prev() { + if (this._activePage > 1) { + this.scrollToPage(this._activePage - 1); + } + } + first() { + if (this._activePage !== 1) { + this.scrollToPage(1); + } + } + last() { + if (this.pdf === null) return; + if (this._activePage !== this.pdf.numPages) { + this.scrollToPage(this.pdf.numPages); + } + } + rotate(deg, accumulate = false) { + if (accumulate) { + deg = deg + this._rotation; + } + this._rotation = deg; + let container = this.$container.get(0); + let prevScroll = { + top: container.scrollTop, + left: container.scrollLeft, + height: container.scrollHeight, + width: container.scrollWidth + }; + return this.forceViewerInitialization().then(function () { + let newScroll = { + top: container.scrollTop, + left: container.scrollLeft, + height: container.scrollHeight, + width: container.scrollWidth + }; + container.scrollTop = prevScroll.top * (newScroll.height / prevScroll.height); + container.scrollLeft = prevScroll.left * (newScroll.width / prevScroll.width); + }.bind(this)); + } + forceViewerInitialization() { + this.pages = []; + this.$container.find(`.${this.settings.pageClass}`).remove(); + this._pagesLoading = []; + this._loading = false; + this._visibles = []; + this._activePage = null; + return this.pdf.getPage(1).then(function (page) { + this._createSkeletons(page); + this._visiblePages(); + this._setActivePage(1); + }.bind(this)); + } + async loadDocument(document) { + this._documentReady = false; + this.pages = []; + this.$container.find(`.${this.settings.pageClass}`).remove(); + this.pdf = null; + let loadingTask = pdfjsLib.getDocument(document); + return loadingTask.promise.then(function (pdf) { + this.pdf = pdf; + this.pageCount = pdf.numPages; + this._rotation = 0; + return this.forceViewerInitialization(); + }.bind(this)).then(function () { + if (typeof this.settings.onDocumentReady === "function") { + this.settings.onDocumentReady.call(this); + } + this.$container.get(0).dispatchEvent(new CustomEvent("documentready", { + detail: { + document: this.pdf + } + })); + this._setActivePage(0); + this._documentReady = true; + this._setActivePage(1); + }.bind(this)); + } + } + + function recoverAttributes(target, attributeDefaults) { + const camelcaseToSnakecase = str => str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`); + let $target = $(target); + let result = {}; + if ($target.length > 0) { + $target = $($target[0]); + for (let originalAttributeName in attributeDefaults) { + let attributeName = camelcaseToSnakecase(originalAttributeName); + let attributeValue = $target.attr(attributeName); + if (attributeValue != null) { + switch (typeof attributeDefaults[originalAttributeName]) { + case "float": + try { + attributeValue = parseFloat(attributeValue); + } catch (_) {} + break; + case "number": + try { + attributeValue = parseInt(attributeValue); + } catch (_) {} + break; + case "function": + let functionString = attributeValue; + attributeValue = function () { + eval(functionString); + }.bind(target[0]); + break; + default: + break; + } + result[originalAttributeName] = attributeValue; + } + } + } + return result; + } + + function init(element) { + let options = recoverAttributes(element, Object.assign({ + pdfDocument: "", + initialZoom: "" + }, defaults)); + if (options["pdfDocument"] != null) { + let pdfViewer = new PDFjsViewer($(element), options); + pdfViewer.loadDocument(options["pdfDocument"]).then(function () { + if (options["initialZoom"] != null) { + pdfViewer.setZoom(options["initialZoom"]); + } + }); + element.get(0).pdfViewer = pdfViewer; + } + } + $(function () { + $(".pdfjs-viewer").each(function () { + let $viewer = $(this); + init($viewer); + }); + }); + exports.PDFjsViewer = PDFjsViewer; +})(window, window._$ ?? window.jQuery ?? undefined); diff --git a/pdfjs-viewer.min.css b/dist/pdfjs-viewer.min.css similarity index 95% rename from pdfjs-viewer.min.css rename to dist/pdfjs-viewer.min.css index bc59ea9..ea745a9 100644 --- a/pdfjs-viewer.min.css +++ b/dist/pdfjs-viewer.min.css @@ -1,2 +1,2 @@ -/* Copyright 2021 Carlos A. (https://github.com/dealfonso); License: http://www.apache.org/licenses/LICENSE-2.0 */ -.pdfjs-viewer{overflow:auto;border:1px solid #aaa;background:#ccc}.pdfjs-viewer.horizontal-scroll{display:flex}.pdfjs-viewer.horizontal-scroll .pdfpage{margin-left:1em;margin-top:.25em!important;margin-bottom:.25em!important;display:block}.pdfpage{position:relative;margin-bottom:1em;margin-top:1em;margin-left:auto;margin-right:auto;box-shadow:0 4px 8px 0 rgba(0,0,0,.1),0 6px 20px 0 rgba(0,0,0,.09)}.pdfpage canvas{position:absolute;left:0;top:0;height:100%;width:100%}.pdfpage.placeholder{display:flex;margin-bottom:0!important;margin-top:0!important;height:100%;width:100%}.pdfpage .content-wrapper{margin:0!important;padding:0!important;display:flex!important}.pdfpage .content-wrapper .loader{border:2px solid #f3f3f3;border-top:3px solid #3498db;border-radius:50%;width:24px;height:24px;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.pdfjs-toolbar{width:100%;height:32px;background:#ddd;z-index:100;vertical-align:middle;display:flex;margin:0;padding:0}.pdfjs-toolbar *{margin:auto 0}.pdfjs-toolbar span{margin-right:.5em;margin-left:.5em;width:4em!important;font-size:12px}.pdfjs-toolbar a.button,.pdfjs-toolbar button,.pdfjs-toolbar label.button{min-width:26px;height:28px;border:none;padding:2px 4px 0;margin:auto 1px;border-radius:2px;line-height:12px;font-size:14px;background-color:#ddd;cursor:pointer}.pdfjs-toolbar button i,.pdfjs-toolbar label.button i{font-size:26px;padding:0;margin:0}.pdfjs-toolbar a.button:hover,.pdfjs-toolbar button:hover,.pdfjs-toolbar label.button:hover{background-color:#ccc}button.pushed{background-color:#aaa!important}.pdfjs-toolbar a.button{color:inherit}.pdfjs-toolbar .divider{flex:1}.pdfjs-toolbar .v-sep{width:0;height:20px;border-left:1px solid #bbb}.pdfjs-toolbar .h-sep{width:100%;height:0;border-top:1px solid #bbb;margin:.25em 0}.pdfjs-toolbar .dropdown.dropdown-right,.pdfjs-toolbar .dropdown.right{float:right}.pdfjs-toolbar .dropdown.dropdown-right .dropdown-content,.pdfjs-toolbar .dropdown.right .dropdown-content{right:0;left:auto}.pdfjs-toolbar .dropdown-value{background-color:#ccc;padding:0 4px 2;cursor:pointer}.pdfjs-toolbar .dropdown-value i{width:auto;font-size:12px}.pdfjs-toolbar .dropdown-content{display:none;position:absolute;margin-top:0;background-color:#eee;min-width:10em;z-index:1;font-size:12px;box-shadow:0 4px 8px 0 rgba(0,0,0,.1),0 6px 20px 0 rgba(0,0,0,.09)}.pdfjs-toolbar .dropdown-content a{all:initial;font:inherit;color:#000;padding:6px 8px;text-decoration:none;display:flex;cursor:pointer}.pdfjs-toolbar .dropdown-content i{font-size:16px;padding-right:.5em}.pdfjs-toolbar .dropdown-content a:hover{background-color:#ddd}.dropdown .dropdown-content:hover,.pdfjs-toolbar .dropdown:hover .dropdown-content{display:block} \ No newline at end of file +.pdfjs-viewer{overflow:auto;border:1px solid #aaa;background:#ccc}.pdfjs-viewer.horizontal-scroll{display:flex}.pdfjs-viewer.horizontal-scroll .pdfpage{margin-left:1em;margin-top:.25em!important;margin-bottom:.25em!important;display:block}.pdfpage{position:relative;margin-bottom:1em;margin-top:1em;margin-left:auto;margin-right:auto;box-shadow:0 4px 8px 0 rgba(0,0,0,.1),0 6px 20px 0 rgba(0,0,0,.09)}.pdfpage canvas{position:absolute;left:0;top:0;height:100%;width:100%}.pdfpage.placeholder{display:flex;margin-bottom:0!important;margin-top:0!important;height:100%;width:100%}.pdfpage .content-wrapper{margin:0!important;padding:0!important;display:flex!important}.pdfpage .content-wrapper .loader{border:2px solid #f3f3f3;border-top:3px solid #3498db;border-radius:50%;width:24px;height:24px;animation:spin 1s linear infinite;margin:auto}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.pdfjs-toolbar{width:100%;height:32px;background:#ddd;z-index:100;vertical-align:middle;display:flex;margin:0;padding:0}.pdfjs-toolbar *{margin:auto 0}.pdfjs-toolbar span{margin-right:.5em;margin-left:.5em;width:4em!important;font-size:12px}.pdfjs-toolbar a.button,.pdfjs-toolbar button,.pdfjs-toolbar label.button{min-width:26px;height:28px;border:none;padding:2px 4px 0;margin:auto 1px;border-radius:2px;line-height:12px;font-size:14px;background-color:#ddd;cursor:pointer}.pdfjs-toolbar button i,.pdfjs-toolbar label.button i{font-size:26px;padding:0;margin:0}.pdfjs-toolbar a.button:hover,.pdfjs-toolbar button:hover,.pdfjs-toolbar label.button:hover{background-color:#ccc}button.pushed{background-color:#aaa!important}.pdfjs-toolbar a.button{color:inherit}.pdfjs-toolbar .divider{flex:1}.pdfjs-toolbar .v-sep{width:0;height:20px;border-left:1px solid #bbb}.pdfjs-toolbar .h-sep{width:100%;height:0;border-top:1px solid #bbb;margin:.25em 0}.pdfjs-toolbar .dropdown.dropdown-right,.pdfjs-toolbar .dropdown.right{float:right}.pdfjs-toolbar .dropdown.dropdown-right .dropdown-content,.pdfjs-toolbar .dropdown.right .dropdown-content{right:0;left:auto}.pdfjs-toolbar .dropdown-value{background-color:#ccc;padding:0 4px 2;cursor:pointer}.pdfjs-toolbar .dropdown-value i{width:auto;font-size:12px}.pdfjs-toolbar .dropdown-content{display:none;position:absolute;margin-top:0;background-color:#eee;min-width:10em;z-index:1;font-size:12px;box-shadow:0 4px 8px 0 rgba(0,0,0,.1),0 6px 20px 0 rgba(0,0,0,.09)}.pdfjs-toolbar .dropdown-content a{all:initial;font:inherit;color:#000;padding:6px 8px;text-decoration:none;display:flex;cursor:pointer}.pdfjs-toolbar .dropdown-content i{font-size:16px;padding-right:.5em}.pdfjs-toolbar .dropdown-content a:hover{background-color:#ddd}.dropdown .dropdown-content:hover,.pdfjs-toolbar .dropdown:hover .dropdown-content{display:block} +/*# sourceMappingURL=pdfjs-viewer.min.css.map */ \ No newline at end of file diff --git a/dist/pdfjs-viewer.min.css.map b/dist/pdfjs-viewer.min.css.map new file mode 100644 index 0000000..1ff709a --- /dev/null +++ b/dist/pdfjs-viewer.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["dist/pdfjs-viewer.css"],"names":[],"mappings":"AAgBA,cACE,SAAU,KACV,OAAQ,IAAI,MAAM,KAClB,WAAY,KAEd,gCACE,QAAS,KAEX,yCACE,YAAa,IACb,WAAY,gBACZ,cAAe,gBACf,QAAS,MAEX,SACE,SAAU,SACV,cAAe,IACf,WAAY,IACZ,YAAa,KACb,aAAc,KACd,WAAY,EAAE,IAAI,IAAI,EAAE,cAAc,CAAC,EAAE,IAAI,KAAK,EAAE,gBAEtD,gBACE,SAAU,SACV,KAAM,EACN,IAAK,EACL,OAAQ,KACR,MAAO,KAET,qBACE,QAAS,KACT,cAAe,YACf,WAAY,YACZ,OAAQ,KACR,MAAO,KAET,0BACE,OAAQ,YACR,QAAS,YACT,QAAS,eAEX,kCACE,OAAQ,IAAI,MAAM,QAClB,WAAY,IAAI,MAAM,QACtB,cAAe,IACf,MAAO,KACP,OAAQ,KACR,UAAW,KAAK,GAAG,OAAO,SAC1B,OAAQ,KAEV,gBACE,GACE,UAAW,UAEb,KACE,UAAW,gBAGf,eACE,MAAO,KACP,OAAQ,KACR,WAAY,KACZ,QAAS,IACT,eAAgB,OAChB,QAAS,KACT,OAAQ,EACR,QAAS,EAEX,iBACE,OAAQ,KAAK,EAEf,oBACE,aAAc,KACd,YAAa,KACb,MAAO,cACP,UAAW,KAEb,wBACA,sBACA,4BACE,UAAW,KACX,OAAQ,KACR,OAAQ,KACR,QAAS,IAAI,IAAI,EACjB,OAAQ,KAAK,IACb,cAAe,IACf,YAAa,KACb,UAAW,KACX,iBAAkB,KAClB,OAAQ,QAEV,wBACA,8BACE,UAAW,KACX,QAAS,EACT,OAAQ,EAEV,8BACA,4BACA,kCACE,iBAAkB,KAEpB,cACE,iBAAkB,eAEpB,wBACE,MAAO,QAET,wBACE,KAAM,EAER,sBACE,MAAO,EACP,OAAQ,KACR,YAAa,IAAI,MAAM,KAEzB,sBACE,MAAO,KACP,OAAQ,EACR,WAAY,IAAI,MAAM,KACtB,OAAQ,MAAM,EAEhB,wCACA,+BACE,MAAO,MAET,0DACA,iDACE,MAAO,EACP,KAAM,KAER,+BACE,iBAAkB,KAClB,QAAS,EAAE,IAAI,EACf,OAAQ,QAEV,iCACE,MAAO,KACP,UAAW,KAEb,iCACE,QAAS,KACT,SAAU,SACV,WAAY,EACZ,iBAAkB,KAClB,UAAW,KACX,QAAS,EACT,UAAW,KACX,WAAY,EAAE,IAAI,IAAI,EAAE,cAAc,CAAC,EAAE,IAAI,KAAK,EAAE,gBAEtD,mCACE,IAAK,QACL,KAAM,QACN,MAAO,KACP,QAAS,IAAI,IACb,gBAAiB,KACjB,QAAS,KACT,OAAQ,QAEV,mCACE,UAAW,KACX,cAAe,KAEjB,yCACE,iBAAkB,KAEpB,kCACA,iDACE,QAAS","sourcesContent":["/**\n Copyright 2021 Carlos A. (https://github.com/dealfonso)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\n.pdfjs-viewer {\n overflow: auto;\n border: 1px solid #aaa;\n background: #ccc\n}\n.pdfjs-viewer.horizontal-scroll {\n display: flex\n}\n.pdfjs-viewer.horizontal-scroll .pdfpage {\n margin-left: 1em;\n margin-top: .25em!important;\n margin-bottom: .25em!important;\n display: block\n}\n.pdfpage {\n position: relative;\n margin-bottom: 1em;\n margin-top: 1em;\n margin-left: auto;\n margin-right: auto;\n box-shadow: 0 4px 8px 0 rgba(0,0,0,.1),0 6px 20px 0 rgba(0,0,0,.09)\n}\n.pdfpage canvas {\n position: absolute;\n left: 0;\n top: 0;\n height: 100%;\n width: 100%\n}\n.pdfpage.placeholder {\n display: flex;\n margin-bottom: 0!important;\n margin-top: 0!important;\n height: 100%;\n width: 100%\n}\n.pdfpage .content-wrapper {\n margin: 0!important;\n padding: 0!important;\n display: flex!important\n}\n.pdfpage .content-wrapper .loader {\n border: 2px solid #f3f3f3;\n border-top: 3px solid #3498db;\n border-radius: 50%;\n width: 24px;\n height: 24px;\n animation: spin 1s linear infinite;\n margin: auto\n}\n@keyframes spin {\n 0% {\n transform: rotate(0)\n }\n 100% {\n transform: rotate(360deg)\n }\n}\n.pdfjs-toolbar {\n width: 100%;\n height: 32px;\n background: #ddd;\n z-index: 100;\n vertical-align: middle;\n display: flex;\n margin: 0;\n padding: 0\n}\n.pdfjs-toolbar * {\n margin: auto 0\n}\n.pdfjs-toolbar span {\n margin-right: .5em;\n margin-left: .5em;\n width: 4em!important;\n font-size: 12px\n}\n.pdfjs-toolbar a.button,\n.pdfjs-toolbar button,\n.pdfjs-toolbar label.button {\n min-width: 26px;\n height: 28px;\n border: none;\n padding: 2px 4px 0;\n margin: auto 1px;\n border-radius: 2px;\n line-height: 12px;\n font-size: 14px;\n background-color: #ddd;\n cursor: pointer\n}\n.pdfjs-toolbar button i,\n.pdfjs-toolbar label.button i {\n font-size: 26px;\n padding: 0;\n margin: 0\n}\n.pdfjs-toolbar a.button:hover,\n.pdfjs-toolbar button:hover,\n.pdfjs-toolbar label.button:hover {\n background-color: #ccc\n}\nbutton.pushed {\n background-color: #aaa!important\n}\n.pdfjs-toolbar a.button {\n color: inherit\n}\n.pdfjs-toolbar .divider {\n flex: 1\n}\n.pdfjs-toolbar .v-sep {\n width: 0;\n height: 20px;\n border-left: 1px solid #bbb\n}\n.pdfjs-toolbar .h-sep {\n width: 100%;\n height: 0;\n border-top: 1px solid #bbb;\n margin: .25em 0\n}\n.pdfjs-toolbar .dropdown.dropdown-right,\n.pdfjs-toolbar .dropdown.right {\n float: right\n}\n.pdfjs-toolbar .dropdown.dropdown-right .dropdown-content,\n.pdfjs-toolbar .dropdown.right .dropdown-content {\n right: 0;\n left: auto\n}\n.pdfjs-toolbar .dropdown-value {\n background-color: #ccc;\n padding: 0 4px 2;\n cursor: pointer\n}\n.pdfjs-toolbar .dropdown-value i {\n width: auto;\n font-size: 12px\n}\n.pdfjs-toolbar .dropdown-content {\n display: none;\n position: absolute;\n margin-top: 0;\n background-color: #eee;\n min-width: 10em;\n z-index: 1;\n font-size: 12px;\n box-shadow: 0 4px 8px 0 rgba(0,0,0,.1),0 6px 20px 0 rgba(0,0,0,.09)\n}\n.pdfjs-toolbar .dropdown-content a {\n all: initial;\n font: inherit;\n color: #000;\n padding: 6px 8px;\n text-decoration: none;\n display: flex;\n cursor: pointer\n}\n.pdfjs-toolbar .dropdown-content i {\n font-size: 16px;\n padding-right: .5em\n}\n.pdfjs-toolbar .dropdown-content a:hover {\n background-color: #ddd\n}\n.dropdown .dropdown-content:hover,\n.pdfjs-toolbar .dropdown:hover .dropdown-content {\n display: block\n}"]} \ No newline at end of file diff --git a/dist/pdfjs-viewer.min.js b/dist/pdfjs-viewer.min.js new file mode 100644 index 0000000..2f22de9 --- /dev/null +++ b/dist/pdfjs-viewer.min.js @@ -0,0 +1,2 @@ +/* Copyright 2021 Carlos A. (https://github.com/dealfonso); License: http://www.apache.org/licenses/LICENSE-2.0 */ +(function(exports,$){"use strict";if($===undefined){console.error("jQuery-like library not available");return}let defaults={visibleThreshold:.5,extraPagesToLoad:3,pageClass:"pdfpage",contentClass:"content-wrapper",onDocumentReady:()=>{},onNewPage:(t,e)=>{},onPageRender:(t,e)=>{},zoomValues:[.25,.5,.75,1,1.25,1.5,2,4,8],onZoomChange:t=>{},onActivePageChanged:(t,e)=>{},zoomFillArea:.95,emptyContent:()=>$('
'),renderingScale:1.5};class Zoomer{constructor(t,e={}){let i={zoomValues:[.25,.5,.75,1,1.25,1.5,2,4,8],fillArea:.9};this.current=1;this.viewer=t;this.settings=Object.assign({},i,e);this.settings.zoomValues=this.settings.zoomValues.sort()}get(e=null){if(e===null){return this.current}if(parseFloat(e)==e){return e}let t=this.viewer.getActivePage();let i=[];switch(e){case"in":e=this.current;i=this.settings.zoomValues.filter(t=>t>e);if(i.length>0){e=Math.min(...i)}break;case"out":e=this.current;i=this.settings.zoomValues.filter(t=>t0){e=Math.max(...i)}break;case"fit":e=Math.min(this.get("width"),this.get("height"));break;case"width":e=this.settings.fillArea*this.viewer.$container.width()/t.data("width");break;case"height":e=this.settings.fillArea*this.viewer.$container.height()/t.data("height");break;default:e=this.current;break}return e}zoomPages(n){n=this.get(n);this.viewer.getPages().forEach(function(t){let e=t.$div;let i=e.data("width");let s=e.data("height");e.width(i*n).height(s*n);e.data("zoom",n);e.find(`.${this.viewer.settings.contentClass}`).width(i*n).height(s*n)}.bind(this));this.current=n}}class PDFjsViewer{version="2.0.0";constructor(t,e={}){this.settings=Object.assign({},defaults,e);this._zoom=new Zoomer(this,{zoomValues:this.settings.zoomValues,fillArea:this.settings.zoomFillArea});t=$(t);this.$container=t;t.get(0)._pdfjsViewer=this;this._setScrollListener();this.pages=[];this.pdf=null;this._documentReady=false}setZoom(t){let e=this.$container.get(0);let i=this._zoom.current;let s={top:e.scrollTop,left:e.scrollLeft};this._zoom.zoomPages(t);e.scrollLeft=s.left*this._zoom.current/i;e.scrollTop=s.top*this._zoom.current/i;this._visiblePages(true);if(this._documentReady){if(typeof this.settings.onZoomChange==="function")this.settings.onZoomChange.call(this,this._zoom.current);this.$container.get(0).dispatchEvent(new CustomEvent("zoomchange",{detail:{zoom:this._zoom.current}}))}return this._zoom.current}getZoom(){return this._zoom.current}_cleanPage(t){let e=this.settings.emptyContent();t.find(`.${this.settings.contentClass}`).html("").append(e)}_setPageContent(t,e){t.find(`.${this.settings.contentClass}`).html("").append(e)}refreshAll(){this._visiblePages(true)}_setScrollListener(){let i=false;let s={top:0,left:0};this.__scrollHandler=function(t){if(i===true){return}i=true;let e=this.$container.get(0);if(Math.abs(e.scrollTop-s.top)>e.clientHeight*.2*this._zoom.current||Math.abs(e.scrollLeft-s.left)>e.clientWidth*.2*this._zoom.current){s={top:e.scrollTop,left:e.scrollLeft};this._visiblePages()}i=false}.bind(this);this.$container.off("scroll");this.$container.on("scroll",this.__scrollHandler)}_createSkeleton(e,t){let i={$div:null,width:0,height:0,loaded:false};if(e.getViewport!==undefined){let t=e.getViewport({rotation:this._rotation,scale:1});i.width=t.width;i.height=t.height;i.loaded=true}else{i.width=e.width;i.height=e.height}console.assert(i.width>0&&i.height>0,"Page width and height must be greater than 0");i.$div=$(`
`).attr("data-page",t).data("width",i.width).data("height",i.height).data("zoom",this._zoom.current).addClass(this.settings.pageClass).width(i.width*this._zoom.current).height(i.height*this._zoom.current);let s=$(`
`).width(i.width).height(i.height);i.$div.append(s);this._cleanPage(i.$div);return i}_placeSkeleton(t,e){let i=e-1;let s=null;while(i>0&&(s=this.$container.find(`.${this.settings.pageClass}[data-page="${i}"]`)).length===0){i--}if(i===0){this.$container.append(t.$div)}else{s.after(t.$div)}}_createSkeletons(e){for(let t=1;t<=this.pageCount;t++){if(this.pages[t]===undefined){e=this._createSkeleton(e,t);this.pages[t]=e;this._placeSkeleton(e,t);if(typeof this.settings.onNewPage==="function"){this.settings.onNewPage.call(this,e.$div.get(0),t)}this.$container.get(0).dispatchEvent(new CustomEvent("newpage",{detail:{pageNumber:t,page:e.$div.get(0)}}))}}}_setActivePage(e){if(this._activePage!==e){this._activePage=e;let t=this.getActivePage();if(this._documentReady){t=t==null?null:t.get(0);if(typeof this.settings.onActivePageChanged==="function"){this.settings.onActivePageChanged.call(this,t,e)}this.$container.get(0).dispatchEvent(new CustomEvent("activepagechanged",{detail:{activePageNumber:e,activePage:t}}))}}}_areaOfPageVisible(t){if(t===undefined){return 0}let e=this.$container.offset();let i=this.$container.width();let s=this.$container.height();let n=t.offset();n.top-=e.top;n.left-=e.left;n.bottom=n.top+t.outerHeight();n.right=n.left+t.outerWidth();let a=Math.min(Math.max(n.top,0),s);let h=Math.min(Math.max(t.outerHeight()+n.top,0),s);let o=Math.min(Math.max(n.left,0),i);let l=Math.min(Math.max(t.outerWidth()+n.left,0),i);let r=l-o;let g=h-a;return r*g}isPageVisible(t){if(this.pdf===null||t===undefined||t===null||t<1||t>this.pdf.numPages){return false}if(typeof t==="string"){t=parseInt(t)}let e=t;if(typeof t==="number"){if(this.pages[t]===undefined)return false;e=this.pages[t].$div}return this._areaOfPageVisible(e)>e.outerWidth()*e.outerHeight()*this.settings.visibleThreshold}_visiblePages(t=false){let i=0;let s=null;if(this.pages.length===0){this._visibles=[];this._setActivePage(0);return}let e=this.pages.filter(function(t){let e=this._areaOfPageVisible(t.$div);if(e>i){i=e;s=t.$div.data("page")}return e>0}.bind(this)).map(t=>t.$div);this._setActivePage(s);let n=e.map(t=>{return parseInt($(t).data("page"))});if(n.length>0){let e=Math.min(...n);let i=Math.max(...n);for(let t=Math.max(1,e-this.settings.extraPagesToLoad);t0){let e=this._pagesLoading.shift();this.pdf.getPage(e).then(function(t){this._renderPage(t,e)}.bind(this)).then(function(t){if(this._pagesLoading.length>0){this._loadingTask()}}.bind(this))}this._loading=false}scrollToPage(t){if(this.pages.length===0||this.pages[t]===undefined){return}let e=this.pages[t].$div;if(e.length===0){console.warn(`Page ${t} not found`);return}let i=e.position();let s=this.$container.position();if(i!==undefined){this.$container.get(0).scrollTop=this.$container.get(0).scrollTop+i.top-s.top;this.$container.get(0).scrollLeft=this.$container.get(0).scrollLeft+i.left-s.left}this._setActivePage(t)}_renderPage(t,e){let i=this.pages[e];let s=this.settings.renderingScale;let n=window.devicePixelRatio||1;let a=t.getViewport({rotation:this._rotation,scale:this._zoom.current*s});i.width=a.width/this._zoom.current/s;i.height=a.height/this._zoom.current/s;i.$div.data("width",i.width);i.$div.data("height",i.height);i.$div.width(i.width*this._zoom.current);i.$div.height(i.height*this._zoom.current);i.loaded=true;let h=$("");let o=h.get(0);let l=o.getContext("2d");o.height=a.height*n;o.width=a.width*n;o.getContext("2d");var r=n!==1?[n,0,0,n,0,0]:null;var g={canvasContext:l,viewport:a,transform:r};return t.render(g).promise.then(function(){this._setPageContent(i.$div,h);if(this._documentReady){if(typeof this.settings.onPageRender==="function"){this.settings.onPageRender.call(this,i.$div.get(0),e)}this.$container.get(0).dispatchEvent(new CustomEvent("pagerender",{detail:{pageNumber:e,page:i.$div.get(0)}}))}return i}.bind(this))}getActivePage(){if(this._activePage===null||this.pdf===null){return null}if(this._activePage<1||this._activePage>this.pdf.numPages){return null}return this.pages[this._activePage].$div}getPages(){return this.pages}getPageCount(){if(this.pdf===null){return 0}return this.pdf.numPages}next(){if(this._activePage1){this.scrollToPage(this._activePage-1)}}first(){if(this._activePage!==1){this.scrollToPage(1)}}last(){if(this.pdf===null)return;if(this._activePage!==this.pdf.numPages){this.scrollToPage(this.pdf.numPages)}}rotate(t,e=false){if(e){t=t+this._rotation}this._rotation=t;let i=this.$container.get(0);let s={top:i.scrollTop,left:i.scrollLeft,height:i.scrollHeight,width:i.scrollWidth};return this.forceViewerInitialization().then(function(){let t={top:i.scrollTop,left:i.scrollLeft,height:i.scrollHeight,width:i.scrollWidth};i.scrollTop=s.top*(t.height/s.height);i.scrollLeft=s.left*(t.width/s.width)}.bind(this))}forceViewerInitialization(){this.pages=[];this.$container.find(`.${this.settings.pageClass}`).remove();this._pagesLoading=[];this._loading=false;this._visibles=[];this._activePage=null;return this.pdf.getPage(1).then(function(t){this._createSkeletons(t);this._visiblePages();this._setActivePage(1)}.bind(this))}async loadDocument(t){this._documentReady=false;this.pages=[];this.$container.find(`.${this.settings.pageClass}`).remove();this.pdf=null;let e=pdfjsLib.getDocument(t);return e.promise.then(function(t){this.pdf=t;this.pageCount=t.numPages;this._rotation=0;return this.forceViewerInitialization()}.bind(this)).then(function(){if(typeof this.settings.onDocumentReady==="function"){this.settings.onDocumentReady.call(this)}this.$container.get(0).dispatchEvent(new CustomEvent("documentready",{detail:{document:this.pdf}}));this._setActivePage(0);this._documentReady=true;this._setActivePage(1)}.bind(this))}}function recoverAttributes(target,attributeDefaults){const camelcaseToSnakecase=t=>t.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`);let $target=$(target);let result={};if($target.length>0){$target=$($target[0]);for(let originalAttributeName in attributeDefaults){let attributeName=camelcaseToSnakecase(originalAttributeName);let attributeValue=$target.attr(attributeName);if(attributeValue!=null){switch(typeof attributeDefaults[originalAttributeName]){case"float":try{attributeValue=parseFloat(attributeValue)}catch(_){}break;case"number":try{attributeValue=parseInt(attributeValue)}catch(_){}break;case"function":let functionString=attributeValue;attributeValue=function(){eval(functionString)}.bind(target[0]);break;default:break}result[originalAttributeName]=attributeValue}}}return result}function init(e){let i=recoverAttributes(e,Object.assign({pdfDocument:"",initialZoom:""},defaults));if(i["pdfDocument"]!=null){let t=new PDFjsViewer($(e),i);t.loadDocument(i["pdfDocument"]).then(function(){if(i["initialZoom"]!=null){t.setZoom(i["initialZoom"])}});e.get(0).pdfViewer=t}}$(function(){$(".pdfjs-viewer").each(function(){let t=$(this);init(t)})});exports.PDFjsViewer=PDFjsViewer})(window,window._$??window.jQuery??undefined); \ No newline at end of file diff --git a/dist/pdfjs-viewer.min.js.map b/dist/pdfjs-viewer.min.js.map new file mode 100644 index 0000000..980f569 --- /dev/null +++ b/dist/pdfjs-viewer.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pdfjs-viewer.min.js.map","sources":["pdfjs-viewer.js"],"sourcesContent":["/**\n Copyright 2021 Carlos A. (https://github.com/dealfonso)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\n(function (exports, $) {\n\t\"use strict\";\n\tif ($ === undefined) {\n\t\tconsole.error(\"jQuery-like library not available\");\n\t\treturn;\n\t}\n\tlet defaults = {\n\t\tvisibleThreshold: .5,\n\t\textraPagesToLoad: 3,\n\t\tpageClass: \"pdfpage\",\n\t\tcontentClass: \"content-wrapper\",\n\t\tonDocumentReady: () => {},\n\t\tonNewPage: (page, i) => {},\n\t\tonPageRender: (page, i) => {},\n\t\tzoomValues: [.25, .5, .75, 1, 1.25, 1.5, 2, 4, 8],\n\t\tonZoomChange: zoomlevel => {},\n\t\tonActivePageChanged: (page, i) => {},\n\t\tzoomFillArea: .95,\n\t\temptyContent: () => $('
'),\n\t\trenderingScale: 1.5\n\t};\n\tclass Zoomer {\n\t\tconstructor(viewer, options = {}) {\n\t\t\tlet defaults = {\n\t\t\t\tzoomValues: [.25, .5, .75, 1, 1.25, 1.5, 2, 4, 8],\n\t\t\t\tfillArea: .9\n\t\t\t};\n\t\t\tthis.current = 1;\n\t\t\tthis.viewer = viewer;\n\t\t\tthis.settings = Object.assign({}, defaults, options);\n\t\t\tthis.settings.zoomValues = this.settings.zoomValues.sort();\n\t\t}\n\t\tget(zoom = null) {\n\t\t\tif (zoom === null) {\n\t\t\t\treturn this.current;\n\t\t\t}\n\t\t\tif (parseFloat(zoom) == zoom) {\n\t\t\t\treturn zoom;\n\t\t\t}\n\t\t\tlet $activepage = this.viewer.getActivePage();\n\t\t\tlet zoomValues = [];\n\t\t\tswitch (zoom) {\n\t\t\tcase \"in\":\n\t\t\t\tzoom = this.current;\n\t\t\t\tzoomValues = this.settings.zoomValues.filter(x => x > zoom);\n\t\t\t\tif (zoomValues.length > 0) {\n\t\t\t\t\tzoom = Math.min(...zoomValues);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"out\":\n\t\t\t\tzoom = this.current;\n\t\t\t\tzoomValues = this.settings.zoomValues.filter(x => x < zoom);\n\t\t\t\tif (zoomValues.length > 0) {\n\t\t\t\t\tzoom = Math.max(...zoomValues);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"fit\":\n\t\t\t\tzoom = Math.min(this.get(\"width\"), this.get(\"height\"));\n\t\t\t\tbreak;\n\t\t\tcase \"width\":\n\t\t\t\tzoom = this.settings.fillArea * this.viewer.$container.width() / $activepage.data(\"width\");\n\t\t\t\tbreak;\n\t\t\tcase \"height\":\n\t\t\t\tzoom = this.settings.fillArea * this.viewer.$container.height() / $activepage.data(\"height\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tzoom = this.current;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn zoom;\n\t\t}\n\t\tzoomPages(zoom) {\n\t\t\tzoom = this.get(zoom);\n\t\t\tthis.viewer.getPages().forEach(function (page) {\n\t\t\t\tlet $page = page.$div;\n\t\t\t\tlet c_width = $page.data(\"width\");\n\t\t\t\tlet c_height = $page.data(\"height\");\n\t\t\t\t$page.width(c_width * zoom).height(c_height * zoom);\n\t\t\t\t$page.data(\"zoom\", zoom);\n\t\t\t\t$page.find(`.${this.viewer.settings.contentClass}`).width(c_width * zoom).height(c_height * zoom);\n\t\t\t}.bind(this));\n\t\t\tthis.current = zoom;\n\t\t}\n\t}\n\tclass PDFjsViewer {\n\t\tversion = \"2.0.0\";\n\t\tconstructor($container, options = {}) {\n\t\t\tthis.settings = Object.assign({}, defaults, options);\n\t\t\tthis._zoom = new Zoomer(this, {\n\t\t\t\tzoomValues: this.settings.zoomValues,\n\t\t\t\tfillArea: this.settings.zoomFillArea\n\t\t\t});\n\t\t\t$container = $($container);\n\t\t\tthis.$container = $container;\n\t\t\t$container.get(0)._pdfjsViewer = this;\n\t\t\tthis._setScrollListener();\n\t\t\tthis.pages = [];\n\t\t\tthis.pdf = null;\n\t\t\tthis._documentReady = false;\n\t\t}\n\t\tsetZoom(zoom) {\n\t\t\tlet container = this.$container.get(0);\n\t\t\tlet prevzoom = this._zoom.current;\n\t\t\tlet prevScroll = {\n\t\t\t\ttop: container.scrollTop,\n\t\t\t\tleft: container.scrollLeft\n\t\t\t};\n\t\t\tthis._zoom.zoomPages(zoom);\n\t\t\tcontainer.scrollLeft = prevScroll.left * this._zoom.current / prevzoom;\n\t\t\tcontainer.scrollTop = prevScroll.top * this._zoom.current / prevzoom;\n\t\t\tthis._visiblePages(true);\n\t\t\tif (this._documentReady) {\n\t\t\t\tif (typeof this.settings.onZoomChange === \"function\") this.settings.onZoomChange.call(this, this._zoom.current);\n\t\t\t\tthis.$container.get(0).dispatchEvent(new CustomEvent(\"zoomchange\", {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tzoom: this._zoom.current\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t}\n\t\t\treturn this._zoom.current;\n\t\t}\n\t\tgetZoom() {\n\t\t\treturn this._zoom.current;\n\t\t}\n\t\t_cleanPage($page) {\n\t\t\tlet $emptyContent = this.settings.emptyContent();\n\t\t\t$page.find(`.${this.settings.contentClass}`).html(\"\").append($emptyContent);\n\t\t}\n\t\t_setPageContent($page, $content) {\n\t\t\t$page.find(`.${this.settings.contentClass}`).html(\"\").append($content);\n\t\t}\n\t\trefreshAll() {\n\t\t\tthis._visiblePages(true);\n\t\t}\n\t\t_setScrollListener() {\n\t\t\tlet scrollLock = false;\n\t\t\tlet scrollPos = {\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t};\n\t\t\tthis.__scrollHandler = function (e) {\n\t\t\t\tif (scrollLock === true) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tscrollLock = true;\n\t\t\t\tlet container = this.$container.get(0);\n\t\t\t\tif (Math.abs(container.scrollTop - scrollPos.top) > container.clientHeight * .2 * this._zoom.current || Math.abs(container.scrollLeft - scrollPos.left) > container.clientWidth * .2 * this._zoom.current) {\n\t\t\t\t\tscrollPos = {\n\t\t\t\t\t\ttop: container.scrollTop,\n\t\t\t\t\t\tleft: container.scrollLeft\n\t\t\t\t\t};\n\t\t\t\t\tthis._visiblePages();\n\t\t\t\t}\n\t\t\t\tscrollLock = false;\n\t\t\t}.bind(this);\n\t\t\tthis.$container.off(\"scroll\");\n\t\t\tthis.$container.on(\"scroll\", this.__scrollHandler);\n\t\t}\n\t\t_createSkeleton(page, i) {\n\t\t\tlet pageinfo = {\n\t\t\t\t$div: null,\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0,\n\t\t\t\tloaded: false\n\t\t\t};\n\t\t\tif (page.getViewport !== undefined) {\n\t\t\t\tlet viewport = page.getViewport({\n\t\t\t\t\trotation: this._rotation,\n\t\t\t\t\tscale: 1\n\t\t\t\t});\n\t\t\t\tpageinfo.width = viewport.width;\n\t\t\t\tpageinfo.height = viewport.height;\n\t\t\t\tpageinfo.loaded = true;\n\t\t\t} else {\n\t\t\t\tpageinfo.width = page.width;\n\t\t\t\tpageinfo.height = page.height;\n\t\t\t}\n\t\t\tconsole.assert(pageinfo.width > 0 && pageinfo.height > 0, \"Page width and height must be greater than 0\");\n\t\t\tpageinfo.$div = $(`
`).attr(\"data-page\", i).data(\"width\", pageinfo.width).data(\"height\", pageinfo.height).data(\"zoom\", this._zoom.current).addClass(this.settings.pageClass).width(pageinfo.width * this._zoom.current).height(pageinfo.height * this._zoom.current);\n\t\t\tlet $content = $(`
`).width(pageinfo.width).height(pageinfo.height);\n\t\t\tpageinfo.$div.append($content);\n\t\t\tthis._cleanPage(pageinfo.$div);\n\t\t\treturn pageinfo;\n\t\t}\n\t\t_placeSkeleton(pageinfo, i) {\n\t\t\tlet prevpage = i - 1;\n\t\t\tlet $prevpage = null;\n\t\t\twhile (prevpage > 0 && ($prevpage = this.$container.find(`.${this.settings.pageClass}[data-page=\"${prevpage}\"]`)).length === 0) {\n\t\t\t\tprevpage--;\n\t\t\t}\n\t\t\tif (prevpage === 0) {\n\t\t\t\tthis.$container.append(pageinfo.$div);\n\t\t\t} else {\n\t\t\t\t$prevpage.after(pageinfo.$div);\n\t\t\t}\n\t\t}\n\t\t_createSkeletons(pageinfo) {\n\t\t\tfor (let i = 1; i <= this.pageCount; i++) {\n\t\t\t\tif (this.pages[i] === undefined) {\n\t\t\t\t\tpageinfo = this._createSkeleton(pageinfo, i);\n\t\t\t\t\tthis.pages[i] = pageinfo;\n\t\t\t\t\tthis._placeSkeleton(pageinfo, i);\n\t\t\t\t\tif (typeof this.settings.onNewPage === \"function\") {\n\t\t\t\t\t\tthis.settings.onNewPage.call(this, pageinfo.$div.get(0), i);\n\t\t\t\t\t}\n\t\t\t\t\tthis.$container.get(0).dispatchEvent(new CustomEvent(\"newpage\", {\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\tpageNumber: i,\n\t\t\t\t\t\t\tpage: pageinfo.$div.get(0)\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_setActivePage(i) {\n\t\t\tif (this._activePage !== i) {\n\t\t\t\tthis._activePage = i;\n\t\t\t\tlet activePage = this.getActivePage();\n\t\t\t\tif (this._documentReady) {\n\t\t\t\t\tactivePage = activePage == null ? null : activePage.get(0);\n\t\t\t\t\tif (typeof this.settings.onActivePageChanged === \"function\") {\n\t\t\t\t\t\tthis.settings.onActivePageChanged.call(this, activePage, i);\n\t\t\t\t\t}\n\t\t\t\t\tthis.$container.get(0).dispatchEvent(new CustomEvent(\"activepagechanged\", {\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\tactivePageNumber: i,\n\t\t\t\t\t\t\tactivePage: activePage\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_areaOfPageVisible($page) {\n\t\t\tif ($page === undefined) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tlet c_offset = this.$container.offset();\n\t\t\tlet c_width = this.$container.width();\n\t\t\tlet c_height = this.$container.height();\n\t\t\tlet position = $page.offset();\n\t\t\tposition.top -= c_offset.top;\n\t\t\tposition.left -= c_offset.left;\n\t\t\tposition.bottom = position.top + $page.outerHeight();\n\t\t\tposition.right = position.left + $page.outerWidth();\n\t\t\tlet page_y0 = Math.min(Math.max(position.top, 0), c_height);\n\t\t\tlet page_y1 = Math.min(Math.max($page.outerHeight() + position.top, 0), c_height);\n\t\t\tlet page_x0 = Math.min(Math.max(position.left, 0), c_width);\n\t\t\tlet page_x1 = Math.min(Math.max($page.outerWidth() + position.left, 0), c_width);\n\t\t\tlet vis_x = page_x1 - page_x0;\n\t\t\tlet vis_y = page_y1 - page_y0;\n\t\t\treturn vis_x * vis_y;\n\t\t}\n\t\tisPageVisible(i) {\n\t\t\tif (this.pdf === null || i === undefined || i === null || i < 1 || i > this.pdf.numPages) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (typeof i === \"string\") {\n\t\t\t\ti = parseInt(i);\n\t\t\t}\n\t\t\tlet $page = i;\n\t\t\tif (typeof i === \"number\") {\n\t\t\t\tif (this.pages[i] === undefined) return false;\n\t\t\t\t$page = this.pages[i].$div;\n\t\t\t}\n\t\t\treturn this._areaOfPageVisible($page) > $page.outerWidth() * $page.outerHeight() * this.settings.visibleThreshold;\n\t\t}\n\t\t_visiblePages(forceRedraw = false) {\n\t\t\tlet max_area = 0;\n\t\t\tlet i_page = null;\n\t\t\tif (this.pages.length === 0) {\n\t\t\t\tthis._visibles = [];\n\t\t\t\tthis._setActivePage(0);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet $visibles = this.pages.filter(function (pageinfo) {\n\t\t\t\tlet areaVisible = this._areaOfPageVisible(pageinfo.$div);\n\t\t\t\tif (areaVisible > max_area) {\n\t\t\t\t\tmax_area = areaVisible;\n\t\t\t\t\ti_page = pageinfo.$div.data(\"page\");\n\t\t\t\t}\n\t\t\t\treturn areaVisible > 0;\n\t\t\t}.bind(this)).map(x => x.$div);\n\t\t\tthis._setActivePage(i_page);\n\t\t\tlet visibles = $visibles.map(x => {\n\t\t\t\treturn parseInt($(x).data(\"page\"));\n\t\t\t});\n\t\t\tif (visibles.length > 0) {\n\t\t\t\tlet minVisible = Math.min(...visibles);\n\t\t\t\tlet maxVisible = Math.max(...visibles);\n\t\t\t\tfor (let i = Math.max(1, minVisible - this.settings.extraPagesToLoad); i < minVisible; i++) {\n\t\t\t\t\tif (!visibles.includes(i)) visibles.push(i);\n\t\t\t\t}\n\t\t\t\tfor (let i = maxVisible + 1; i <= Math.min(maxVisible + this.settings.extraPagesToLoad, this.pdf.numPages); i++) {\n\t\t\t\t\tif (!visibles.includes(i)) visibles.push(i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet nowVisibles = visibles;\n\t\t\tif (!forceRedraw) {\n\t\t\t\tnowVisibles = visibles.filter(function (x) {\n\t\t\t\t\treturn !this._visibles.includes(x);\n\t\t\t\t}.bind(this));\n\t\t\t}\n\t\t\tthis._visibles.filter(function (x) {\n\t\t\t\treturn !visibles.includes(x);\n\t\t\t}).forEach(function (i) {\n\t\t\t\tthis._cleanPage(this.pages[i].$div);\n\t\t\t}.bind(this));\n\t\t\tthis._visibles = visibles;\n\t\t\tthis.loadPages(...nowVisibles);\n\t\t}\n\t\tloadPages(...pages) {\n\t\t\tthis._pagesLoading.push(...pages);\n\t\t\tif (this._loading) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis._loadingTask();\n\t\t}\n\t\t_loadingTask() {\n\t\t\tthis._loading = true;\n\t\t\tif (this._pagesLoading.length > 0) {\n\t\t\t\tlet pagei = this._pagesLoading.shift();\n\t\t\t\tthis.pdf.getPage(pagei).then(function (page) {\n\t\t\t\t\tthis._renderPage(page, pagei);\n\t\t\t\t}.bind(this)).then(function (pageinfo) {\n\t\t\t\t\tif (this._pagesLoading.length > 0) {\n\t\t\t\t\t\tthis._loadingTask();\n\t\t\t\t\t}\n\t\t\t\t}.bind(this));\n\t\t\t}\n\t\t\tthis._loading = false;\n\t\t}\n\t\tscrollToPage(i) {\n\t\t\tif (this.pages.length === 0 || this.pages[i] === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet $page = this.pages[i].$div;\n\t\t\tif ($page.length === 0) {\n\t\t\t\tconsole.warn(`Page ${i} not found`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet position = $page.position();\n\t\t\tlet containerPosition = this.$container.position();\n\t\t\tif (position !== undefined) {\n\t\t\t\tthis.$container.get(0).scrollTop = this.$container.get(0).scrollTop + position.top - containerPosition.top;\n\t\t\t\tthis.$container.get(0).scrollLeft = this.$container.get(0).scrollLeft + position.left - containerPosition.left;\n\t\t\t}\n\t\t\tthis._setActivePage(i);\n\t\t}\n\t\t_renderPage(page, i) {\n\t\t\tlet pageinfo = this.pages[i];\n\t\t\tlet scale = this.settings.renderingScale;\n\t\t\tlet pixel_ratio = window.devicePixelRatio || 1;\n\t\t\tlet viewport = page.getViewport({\n\t\t\t\trotation: this._rotation,\n\t\t\t\tscale: this._zoom.current * scale\n\t\t\t});\n\t\t\tpageinfo.width = viewport.width / this._zoom.current / scale;\n\t\t\tpageinfo.height = viewport.height / this._zoom.current / scale;\n\t\t\tpageinfo.$div.data(\"width\", pageinfo.width);\n\t\t\tpageinfo.$div.data(\"height\", pageinfo.height);\n\t\t\tpageinfo.$div.width(pageinfo.width * this._zoom.current);\n\t\t\tpageinfo.$div.height(pageinfo.height * this._zoom.current);\n\t\t\tpageinfo.loaded = true;\n\t\t\tlet $canvas = $(\"\");\n\t\t\tlet canvas = $canvas.get(0);\n\t\t\tlet context = canvas.getContext(\"2d\");\n\t\t\tcanvas.height = viewport.height * pixel_ratio;\n\t\t\tcanvas.width = viewport.width * pixel_ratio;\n\t\t\tcanvas.getContext(\"2d\");\n\t\t\tvar transform = pixel_ratio !== 1 ? [pixel_ratio, 0, 0, pixel_ratio, 0, 0] : null;\n\t\t\tvar renderContext = {\n\t\t\t\tcanvasContext: context,\n\t\t\t\tviewport: viewport,\n\t\t\t\ttransform: transform\n\t\t\t};\n\t\t\treturn page.render(renderContext).promise.then(function () {\n\t\t\t\tthis._setPageContent(pageinfo.$div, $canvas);\n\t\t\t\tif (this._documentReady) {\n\t\t\t\t\tif (typeof this.settings.onPageRender === \"function\") {\n\t\t\t\t\t\tthis.settings.onPageRender.call(this, pageinfo.$div.get(0), i);\n\t\t\t\t\t}\n\t\t\t\t\tthis.$container.get(0).dispatchEvent(new CustomEvent(\"pagerender\", {\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\tpageNumber: i,\n\t\t\t\t\t\t\tpage: pageinfo.$div.get(0)\n\t\t\t\t\t\t}\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t\treturn pageinfo;\n\t\t\t}.bind(this));\n\t\t}\n\t\tgetActivePage() {\n\t\t\tif (this._activePage === null || this.pdf === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (this._activePage < 1 || this._activePage > this.pdf.numPages) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn this.pages[this._activePage].$div;\n\t\t}\n\t\tgetPages() {\n\t\t\treturn this.pages;\n\t\t}\n\t\tgetPageCount() {\n\t\t\tif (this.pdf === null) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn this.pdf.numPages;\n\t\t}\n\t\tnext() {\n\t\t\tif (this._activePage < this.pdf.numPages) {\n\t\t\t\tthis.scrollToPage(this._activePage + 1);\n\t\t\t}\n\t\t}\n\t\tprev() {\n\t\t\tif (this._activePage > 1) {\n\t\t\t\tthis.scrollToPage(this._activePage - 1);\n\t\t\t}\n\t\t}\n\t\tfirst() {\n\t\t\tif (this._activePage !== 1) {\n\t\t\t\tthis.scrollToPage(1);\n\t\t\t}\n\t\t}\n\t\tlast() {\n\t\t\tif (this.pdf === null) return;\n\t\t\tif (this._activePage !== this.pdf.numPages) {\n\t\t\t\tthis.scrollToPage(this.pdf.numPages);\n\t\t\t}\n\t\t}\n\t\trotate(deg, accumulate = false) {\n\t\t\tif (accumulate) {\n\t\t\t\tdeg = deg + this._rotation;\n\t\t\t}\n\t\t\tthis._rotation = deg;\n\t\t\tlet container = this.$container.get(0);\n\t\t\tlet prevScroll = {\n\t\t\t\ttop: container.scrollTop,\n\t\t\t\tleft: container.scrollLeft,\n\t\t\t\theight: container.scrollHeight,\n\t\t\t\twidth: container.scrollWidth\n\t\t\t};\n\t\t\treturn this.forceViewerInitialization().then(function () {\n\t\t\t\tlet newScroll = {\n\t\t\t\t\ttop: container.scrollTop,\n\t\t\t\t\tleft: container.scrollLeft,\n\t\t\t\t\theight: container.scrollHeight,\n\t\t\t\t\twidth: container.scrollWidth\n\t\t\t\t};\n\t\t\t\tcontainer.scrollTop = prevScroll.top * (newScroll.height / prevScroll.height);\n\t\t\t\tcontainer.scrollLeft = prevScroll.left * (newScroll.width / prevScroll.width);\n\t\t\t}.bind(this));\n\t\t}\n\t\tforceViewerInitialization() {\n\t\t\tthis.pages = [];\n\t\t\tthis.$container.find(`.${this.settings.pageClass}`).remove();\n\t\t\tthis._pagesLoading = [];\n\t\t\tthis._loading = false;\n\t\t\tthis._visibles = [];\n\t\t\tthis._activePage = null;\n\t\t\treturn this.pdf.getPage(1).then(function (page) {\n\t\t\t\tthis._createSkeletons(page);\n\t\t\t\tthis._visiblePages();\n\t\t\t\tthis._setActivePage(1);\n\t\t\t}.bind(this));\n\t\t}\n\t\tasync loadDocument(document) {\n\t\t\tthis._documentReady = false;\n\t\t\tthis.pages = [];\n\t\t\tthis.$container.find(`.${this.settings.pageClass}`).remove();\n\t\t\tthis.pdf = null;\n\t\t\tlet loadingTask = pdfjsLib.getDocument(document);\n\t\t\treturn loadingTask.promise.then(function (pdf) {\n\t\t\t\tthis.pdf = pdf;\n\t\t\t\tthis.pageCount = pdf.numPages;\n\t\t\t\tthis._rotation = 0;\n\t\t\t\treturn this.forceViewerInitialization();\n\t\t\t}.bind(this)).then(function () {\n\t\t\t\tif (typeof this.settings.onDocumentReady === \"function\") {\n\t\t\t\t\tthis.settings.onDocumentReady.call(this);\n\t\t\t\t}\n\t\t\t\tthis.$container.get(0).dispatchEvent(new CustomEvent(\"documentready\", {\n\t\t\t\t\tdetail: {\n\t\t\t\t\t\tdocument: this.pdf\n\t\t\t\t\t}\n\t\t\t\t}));\n\t\t\t\tthis._setActivePage(0);\n\t\t\t\tthis._documentReady = true;\n\t\t\t\tthis._setActivePage(1);\n\t\t\t}.bind(this));\n\t\t}\n\t}\n\n\tfunction recoverAttributes(target, attributeDefaults) {\n\t\tconst camelcaseToSnakecase = str => str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`);\n\t\tlet $target = $(target);\n\t\tlet result = {};\n\t\tif ($target.length > 0) {\n\t\t\t$target = $($target[0]);\n\t\t\tfor (let originalAttributeName in attributeDefaults) {\n\t\t\t\tlet attributeName = camelcaseToSnakecase(originalAttributeName);\n\t\t\t\tlet attributeValue = $target.attr(attributeName);\n\t\t\t\tif (attributeValue != null) {\n\t\t\t\t\tswitch (typeof attributeDefaults[originalAttributeName]) {\n\t\t\t\t\tcase \"float\":\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tattributeValue = parseFloat(attributeValue);\n\t\t\t\t\t\t} catch (_) {}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tattributeValue = parseInt(attributeValue);\n\t\t\t\t\t\t} catch (_) {}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"function\":\n\t\t\t\t\t\tlet functionString = attributeValue;\n\t\t\t\t\t\tattributeValue = function () {\n\t\t\t\t\t\t\teval(functionString);\n\t\t\t\t\t\t}.bind(target[0]);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tresult[originalAttributeName] = attributeValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction init(element) {\n\t\tlet options = recoverAttributes(element, Object.assign({\n\t\t\tpdfDocument: \"\",\n\t\t\tinitialZoom: \"\"\n\t\t}, defaults));\n\t\tif (options[\"pdfDocument\"] != null) {\n\t\t\tlet pdfViewer = new PDFjsViewer($(element), options);\n\t\t\tpdfViewer.loadDocument(options[\"pdfDocument\"]).then(function () {\n\t\t\t\tif (options[\"initialZoom\"] != null) {\n\t\t\t\t\tpdfViewer.setZoom(options[\"initialZoom\"]);\n\t\t\t\t}\n\t\t\t});\n\t\t\telement.get(0).pdfViewer = pdfViewer;\n\t\t}\n\t}\n\t$(function () {\n\t\t$(\".pdfjs-viewer\").each(function () {\n\t\t\tlet $viewer = $(this);\n\t\t\tinit($viewer);\n\t\t});\n\t});\n\texports.PDFjsViewer = PDFjsViewer;\n})(window, window._$ ?? window.jQuery ?? undefined);\n"],"names":["exports","$","undefined","console","error","let","defaults","visibleThreshold","extraPagesToLoad","pageClass","contentClass","onDocumentReady","onNewPage","page","i","onPageRender","zoomValues","onZoomChange","zoomlevel","onActivePageChanged","zoomFillArea","emptyContent","renderingScale","Zoomer","constructor","viewer","options","fillArea","this","current","settings","Object","assign","sort","get","zoom","parseFloat","$activepage","getActivePage","filter","x","length","Math","min","max","$container","width","data","height","zoomPages","getPages","forEach","$page","$div","c_width","c_height","find","bind","PDFjsViewer","version","_zoom","_pdfjsViewer","_setScrollListener","pages","pdf","_documentReady","setZoom","container","prevzoom","prevScroll","top","scrollTop","left","scrollLeft","_visiblePages","call","dispatchEvent","CustomEvent","detail","getZoom","_cleanPage","$emptyContent","html","append","_setPageContent","$content","refreshAll","scrollLock","scrollPos","__scrollHandler","e","abs","clientHeight","clientWidth","off","on","_createSkeleton","pageinfo","loaded","getViewport","viewport","rotation","_rotation","scale","assert","attr","addClass","_placeSkeleton","prevpage","$prevpage","after","_createSkeletons","pageCount","pageNumber","_setActivePage","_activePage","activePage","activePageNumber","_areaOfPageVisible","c_offset","offset","position","bottom","outerHeight","right","outerWidth","page_y0","page_y1","page_x0","page_x1","vis_x","vis_y","isPageVisible","numPages","parseInt","forceRedraw","max_area","i_page","_visibles","$visibles","areaVisible","map","visibles","minVisible","maxVisible","includes","push","nowVisibles","loadPages","_pagesLoading","_loading","_loadingTask","pagei","shift","getPage","then","_renderPage","scrollToPage","warn","containerPosition","pixel_ratio","window","devicePixelRatio","$canvas","canvas","context","getContext","transform","renderContext","canvasContext","render","promise","getPageCount","next","prev","first","last","rotate","deg","accumulate","scrollHeight","scrollWidth","forceViewerInitialization","newScroll","remove","loadDocument","document","loadingTask","pdfjsLib","getDocument","recoverAttributes","target","attributeDefaults","camelcaseToSnakecase","str","replace","letter","toLowerCase","$target","result","originalAttributeName","attributeName","attributeValue","_","functionString","eval","init","element","pdfDocument","initialZoom","pdfViewer","each","$viewer","_$","jQuery"],"mappings":";CAgBA,SAAWA,QAASC,GACnB,aACA,GAAIA,IAAMC,UAAW,CACpBC,QAAQC,MAAM,mCAAmC,EACjD,MACD,CACAC,IAAIC,SAAW,CACdC,iBAAkB,GAClBC,iBAAkB,EAClBC,UAAW,UACXC,aAAc,kBACdC,gBAAiB,OACjBC,UAAW,CAACC,EAAMC,OAClBC,aAAc,CAACF,EAAMC,OACrBE,WAAY,CAAC,IAAK,GAAI,IAAK,EAAG,KAAM,IAAK,EAAG,EAAG,GAC/CC,aAAcC,MACdC,oBAAqB,CAACN,EAAMC,OAC5BM,aAAc,IACdC,aAAc,IAAMpB,EAAE,4BAA4B,EAClDqB,eAAgB,GACjB,QACMC,OACLC,YAAYC,EAAQC,EAAU,IAC7BrB,IAAIC,EAAW,CACdU,WAAY,CAAC,IAAK,GAAI,IAAK,EAAG,KAAM,IAAK,EAAG,EAAG,GAC/CW,SAAU,EACX,EACAC,KAAKC,QAAU,EACfD,KAAKH,OAASA,EACdG,KAAKE,SAAWC,OAAOC,OAAO,GAAI1B,EAAUoB,CAAO,EACnDE,KAAKE,SAASd,WAAaY,KAAKE,SAASd,WAAWiB,KAAK,CAC1D,CACAC,IAAIC,EAAO,MACV,GAAIA,IAAS,KAAM,CAClB,OAAOP,KAAKC,OACb,CACA,GAAIO,WAAWD,CAAI,GAAKA,EAAM,CAC7B,OAAOA,CACR,CACA9B,IAAIgC,EAAcT,KAAKH,OAAOa,cAAc,EAC5CjC,IAAIW,EAAa,GACjB,OAAQmB,GACR,IAAK,KACJA,EAAOP,KAAKC,QACZb,EAAaY,KAAKE,SAASd,WAAWuB,OAAOC,GAAKA,EAAIL,CAAI,EAC1D,GAAInB,EAAWyB,OAAS,EAAG,CAC1BN,EAAOO,KAAKC,IAAI,GAAG3B,CAAU,CAC9B,CACA,MACD,IAAK,MACJmB,EAAOP,KAAKC,QACZb,EAAaY,KAAKE,SAASd,WAAWuB,OAAOC,GAAKA,EAAIL,CAAI,EAC1D,GAAInB,EAAWyB,OAAS,EAAG,CAC1BN,EAAOO,KAAKE,IAAI,GAAG5B,CAAU,CAC9B,CACA,MACD,IAAK,MACJmB,EAAOO,KAAKC,IAAIf,KAAKM,IAAI,OAAO,EAAGN,KAAKM,IAAI,QAAQ,CAAC,EACrD,MACD,IAAK,QACJC,EAAOP,KAAKE,SAASH,SAAWC,KAAKH,OAAOoB,WAAWC,MAAM,EAAIT,EAAYU,KAAK,OAAO,EACzF,MACD,IAAK,SACJZ,EAAOP,KAAKE,SAASH,SAAWC,KAAKH,OAAOoB,WAAWG,OAAO,EAAIX,EAAYU,KAAK,QAAQ,EAC3F,MACD,QACCZ,EAAOP,KAAKC,QACZ,KACD,CACA,OAAOM,CACR,CACAc,UAAUd,GACTA,EAAOP,KAAKM,IAAIC,CAAI,EACpBP,KAAKH,OAAOyB,SAAS,EAAEC,QAAQ,SAAUtC,GACxCR,IAAI+C,EAAQvC,EAAKwC,KACjBhD,IAAIiD,EAAUF,EAAML,KAAK,OAAO,EAChC1C,IAAIkD,EAAWH,EAAML,KAAK,QAAQ,EAClCK,EAAMN,MAAMQ,EAAUnB,CAAI,EAAEa,OAAOO,EAAWpB,CAAI,EAClDiB,EAAML,KAAK,OAAQZ,CAAI,EACvBiB,EAAMI,SAAS5B,KAAKH,OAAOK,SAASpB,cAAc,EAAEoC,MAAMQ,EAAUnB,CAAI,EAAEa,OAAOO,EAAWpB,CAAI,CACjG,EAAEsB,KAAK7B,IAAI,CAAC,EACZA,KAAKC,QAAUM,CAChB,CACD,OACMuB,YACLC,QAAU,QACVnC,YAAYqB,EAAYnB,EAAU,IACjCE,KAAKE,SAAWC,OAAOC,OAAO,GAAI1B,SAAUoB,CAAO,EACnDE,KAAKgC,MAAQ,IAAIrC,OAAOK,KAAM,CAC7BZ,WAAYY,KAAKE,SAASd,WAC1BW,SAAUC,KAAKE,SAASV,YACzB,CAAC,EACDyB,EAAa5C,EAAE4C,CAAU,EACzBjB,KAAKiB,WAAaA,EAClBA,EAAWX,IAAI,CAAC,EAAE2B,aAAejC,KACjCA,KAAKkC,mBAAmB,EACxBlC,KAAKmC,MAAQ,GACbnC,KAAKoC,IAAM,KACXpC,KAAKqC,eAAiB,KACvB,CACAC,QAAQ/B,GACP9B,IAAI8D,EAAYvC,KAAKiB,WAAWX,IAAI,CAAC,EACrC7B,IAAI+D,EAAWxC,KAAKgC,MAAM/B,QAC1BxB,IAAIgE,EAAa,CAChBC,IAAKH,EAAUI,UACfC,KAAML,EAAUM,UACjB,EACA7C,KAAKgC,MAAMX,UAAUd,CAAI,EACzBgC,EAAUM,WAAaJ,EAAWG,KAAO5C,KAAKgC,MAAM/B,QAAUuC,EAC9DD,EAAUI,UAAYF,EAAWC,IAAM1C,KAAKgC,MAAM/B,QAAUuC,EAC5DxC,KAAK8C,cAAc,IAAI,EACvB,GAAI9C,KAAKqC,eAAgB,CACxB,GAAI,OAAOrC,KAAKE,SAASb,eAAiB,WAAYW,KAAKE,SAASb,aAAa0D,KAAK/C,KAAMA,KAAKgC,MAAM/B,OAAO,EAC9GD,KAAKiB,WAAWX,IAAI,CAAC,EAAE0C,cAAc,IAAIC,YAAY,aAAc,CAClEC,OAAQ,CACP3C,KAAMP,KAAKgC,MAAM/B,OAClB,CACD,CAAC,CAAC,CACH,CACA,OAAOD,KAAKgC,MAAM/B,OACnB,CACAkD,UACC,OAAOnD,KAAKgC,MAAM/B,OACnB,CACAmD,WAAW5B,GACV/C,IAAI4E,EAAgBrD,KAAKE,SAAST,aAAa,EAC/C+B,EAAMI,SAAS5B,KAAKE,SAASpB,cAAc,EAAEwE,KAAK,EAAE,EAAEC,OAAOF,CAAa,CAC3E,CACAG,gBAAgBhC,EAAOiC,GACtBjC,EAAMI,SAAS5B,KAAKE,SAASpB,cAAc,EAAEwE,KAAK,EAAE,EAAEC,OAAOE,CAAQ,CACtE,CACAC,aACC1D,KAAK8C,cAAc,IAAI,CACxB,CACAZ,qBACCzD,IAAIkF,EAAa,MACjBlF,IAAImF,EAAY,CACflB,IAAK,EACLE,KAAM,CACP,EACA5C,KAAK6D,gBAAkB,SAAUC,GAChC,GAAIH,IAAe,KAAM,CACxB,MACD,CACAA,EAAa,KACblF,IAAI8D,EAAYvC,KAAKiB,WAAWX,IAAI,CAAC,EACrC,GAAIQ,KAAKiD,IAAIxB,EAAUI,UAAYiB,EAAUlB,GAAG,EAAIH,EAAUyB,aAAe,GAAKhE,KAAKgC,MAAM/B,SAAWa,KAAKiD,IAAIxB,EAAUM,WAAae,EAAUhB,IAAI,EAAIL,EAAU0B,YAAc,GAAKjE,KAAKgC,MAAM/B,QAAS,CAC1M2D,EAAY,CACXlB,IAAKH,EAAUI,UACfC,KAAML,EAAUM,UACjB,EACA7C,KAAK8C,cAAc,CACpB,CACAa,EAAa,KACd,EAAE9B,KAAK7B,IAAI,EACXA,KAAKiB,WAAWiD,IAAI,QAAQ,EAC5BlE,KAAKiB,WAAWkD,GAAG,SAAUnE,KAAK6D,eAAe,CAClD,CACAO,gBAAgBnF,EAAMC,GACrBT,IAAI4F,EAAW,CACd5C,KAAM,KACNP,MAAO,EACPE,OAAQ,EACRkD,OAAQ,KACT,EACA,GAAIrF,EAAKsF,cAAgBjG,UAAW,CACnCG,IAAI+F,EAAWvF,EAAKsF,YAAY,CAC/BE,SAAUzE,KAAK0E,UACfC,MAAO,CACR,CAAC,EACDN,EAASnD,MAAQsD,EAAStD,MAC1BmD,EAASjD,OAASoD,EAASpD,OAC3BiD,EAASC,OAAS,IACnB,KAAO,CACND,EAASnD,MAAQjC,EAAKiC,MACtBmD,EAASjD,OAASnC,EAAKmC,MACxB,CACA7C,QAAQqG,OAAOP,EAASnD,MAAQ,GAAKmD,EAASjD,OAAS,EAAG,8CAA8C,EACxGiD,EAAS5C,KAAOpD,mBAAmBa,KAAK,EAAE2F,KAAK,YAAa3F,CAAC,EAAEiC,KAAK,QAASkD,EAASnD,KAAK,EAAEC,KAAK,SAAUkD,EAASjD,MAAM,EAAED,KAAK,OAAQnB,KAAKgC,MAAM/B,OAAO,EAAE6E,SAAS9E,KAAKE,SAASrB,SAAS,EAAEqC,MAAMmD,EAASnD,MAAQlB,KAAKgC,MAAM/B,OAAO,EAAEmB,OAAOiD,EAASjD,OAASpB,KAAKgC,MAAM/B,OAAO,EACtRxB,IAAIgF,EAAWpF,iBAAiB2B,KAAKE,SAASpB,gBAAgB,EAAEoC,MAAMmD,EAASnD,KAAK,EAAEE,OAAOiD,EAASjD,MAAM,EAC5GiD,EAAS5C,KAAK8B,OAAOE,CAAQ,EAC7BzD,KAAKoD,WAAWiB,EAAS5C,IAAI,EAC7B,OAAO4C,CACR,CACAU,eAAeV,EAAUnF,GACxBT,IAAIuG,EAAW9F,EAAI,EACnBT,IAAIwG,EAAY,KAChB,MAAOD,EAAW,IAAMC,EAAYjF,KAAKiB,WAAWW,SAAS5B,KAAKE,SAASrB,wBAAwBmG,KAAY,GAAGnE,SAAW,EAAG,CAC/HmE,CAAQ,EACT,CACA,GAAIA,IAAa,EAAG,CACnBhF,KAAKiB,WAAWsC,OAAOc,EAAS5C,IAAI,CACrC,KAAO,CACNwD,EAAUC,MAAMb,EAAS5C,IAAI,CAC9B,CACD,CACA0D,iBAAiBd,GAChB,IAAK5F,IAAIS,EAAI,EAAGA,GAAKc,KAAKoF,UAAWlG,CAAC,GAAI,CACzC,GAAIc,KAAKmC,MAAMjD,KAAOZ,UAAW,CAChC+F,EAAWrE,KAAKoE,gBAAgBC,EAAUnF,CAAC,EAC3Cc,KAAKmC,MAAMjD,GAAKmF,EAChBrE,KAAK+E,eAAeV,EAAUnF,CAAC,EAC/B,GAAI,OAAOc,KAAKE,SAASlB,YAAc,WAAY,CAClDgB,KAAKE,SAASlB,UAAU+D,KAAK/C,KAAMqE,EAAS5C,KAAKnB,IAAI,CAAC,EAAGpB,CAAC,CAC3D,CACAc,KAAKiB,WAAWX,IAAI,CAAC,EAAE0C,cAAc,IAAIC,YAAY,UAAW,CAC/DC,OAAQ,CACPmC,WAAYnG,EACZD,KAAMoF,EAAS5C,KAAKnB,IAAI,CAAC,CAC1B,CACD,CAAC,CAAC,CACH,CACD,CACD,CACAgF,eAAepG,GACd,GAAIc,KAAKuF,cAAgBrG,EAAG,CAC3Bc,KAAKuF,YAAcrG,EACnBT,IAAI+G,EAAaxF,KAAKU,cAAc,EACpC,GAAIV,KAAKqC,eAAgB,CACxBmD,EAAaA,GAAc,KAAO,KAAOA,EAAWlF,IAAI,CAAC,EACzD,GAAI,OAAON,KAAKE,SAASX,sBAAwB,WAAY,CAC5DS,KAAKE,SAASX,oBAAoBwD,KAAK/C,KAAMwF,EAAYtG,CAAC,CAC3D,CACAc,KAAKiB,WAAWX,IAAI,CAAC,EAAE0C,cAAc,IAAIC,YAAY,oBAAqB,CACzEC,OAAQ,CACPuC,iBAAkBvG,EAClBsG,WAAYA,CACb,CACD,CAAC,CAAC,CACH,CACD,CACD,CACAE,mBAAmBlE,GAClB,GAAIA,IAAUlD,UAAW,CACxB,OAAO,CACR,CACAG,IAAIkH,EAAW3F,KAAKiB,WAAW2E,OAAO,EACtCnH,IAAIiD,EAAU1B,KAAKiB,WAAWC,MAAM,EACpCzC,IAAIkD,EAAW3B,KAAKiB,WAAWG,OAAO,EACtC3C,IAAIoH,EAAWrE,EAAMoE,OAAO,EAC5BC,EAASnD,KAAOiD,EAASjD,IACzBmD,EAASjD,MAAQ+C,EAAS/C,KAC1BiD,EAASC,OAASD,EAASnD,IAAMlB,EAAMuE,YAAY,EACnDF,EAASG,MAAQH,EAASjD,KAAOpB,EAAMyE,WAAW,EAClDxH,IAAIyH,EAAUpF,KAAKC,IAAID,KAAKE,IAAI6E,EAASnD,IAAK,CAAC,EAAGf,CAAQ,EAC1DlD,IAAI0H,EAAUrF,KAAKC,IAAID,KAAKE,IAAIQ,EAAMuE,YAAY,EAAIF,EAASnD,IAAK,CAAC,EAAGf,CAAQ,EAChFlD,IAAI2H,EAAUtF,KAAKC,IAAID,KAAKE,IAAI6E,EAASjD,KAAM,CAAC,EAAGlB,CAAO,EAC1DjD,IAAI4H,EAAUvF,KAAKC,IAAID,KAAKE,IAAIQ,EAAMyE,WAAW,EAAIJ,EAASjD,KAAM,CAAC,EAAGlB,CAAO,EAC/EjD,IAAI6H,EAAQD,EAAUD,EACtB3H,IAAI8H,EAAQJ,EAAUD,EACtB,OAAOI,EAAQC,CAChB,CACAC,cAActH,GACb,GAAIc,KAAKoC,MAAQ,MAAQlD,IAAMZ,WAAaY,IAAM,MAAQA,EAAI,GAAKA,EAAIc,KAAKoC,IAAIqE,SAAU,CACzF,OAAO,KACR,CACA,GAAI,OAAOvH,IAAM,SAAU,CAC1BA,EAAIwH,SAASxH,CAAC,CACf,CACAT,IAAI+C,EAAQtC,EACZ,GAAI,OAAOA,IAAM,SAAU,CAC1B,GAAIc,KAAKmC,MAAMjD,KAAOZ,UAAW,OAAO,MACxCkD,EAAQxB,KAAKmC,MAAMjD,GAAGuC,IACvB,CACA,OAAOzB,KAAK0F,mBAAmBlE,CAAK,EAAIA,EAAMyE,WAAW,EAAIzE,EAAMuE,YAAY,EAAI/F,KAAKE,SAASvB,gBAClG,CACAmE,cAAc6D,EAAc,OAC3BlI,IAAImI,EAAW,EACfnI,IAAIoI,EAAS,KACb,GAAI7G,KAAKmC,MAAMtB,SAAW,EAAG,CAC5Bb,KAAK8G,UAAY,GACjB9G,KAAKsF,eAAe,CAAC,EACrB,MACD,CACA7G,IAAIsI,EAAY/G,KAAKmC,MAAMxB,OAAO,SAAU0D,GAC3C5F,IAAIuI,EAAchH,KAAK0F,mBAAmBrB,EAAS5C,IAAI,EACvD,GAAIuF,EAAcJ,EAAU,CAC3BA,EAAWI,EACXH,EAASxC,EAAS5C,KAAKN,KAAK,MAAM,CACnC,CACA,OAAO6F,EAAc,CACtB,EAAEnF,KAAK7B,IAAI,CAAC,EAAEiH,IAAIrG,GAAKA,EAAEa,IAAI,EAC7BzB,KAAKsF,eAAeuB,CAAM,EAC1BpI,IAAIyI,EAAWH,EAAUE,IAAIrG,IAC5B,OAAO8F,SAASrI,EAAEuC,CAAC,EAAEO,KAAK,MAAM,CAAC,CAClC,CAAC,EACD,GAAI+F,EAASrG,OAAS,EAAG,CACxBpC,IAAI0I,EAAarG,KAAKC,IAAI,GAAGmG,CAAQ,EACrCzI,IAAI2I,EAAatG,KAAKE,IAAI,GAAGkG,CAAQ,EACrC,IAAKzI,IAAIS,EAAI4B,KAAKE,IAAI,EAAGmG,EAAanH,KAAKE,SAAStB,gBAAgB,EAAGM,EAAIiI,EAAYjI,CAAC,GAAI,CAC3F,GAAI,CAACgI,EAASG,SAASnI,CAAC,EAAGgI,EAASI,KAAKpI,CAAC,CAC3C,CACA,IAAKT,IAAIS,EAAIkI,EAAa,EAAGlI,GAAK4B,KAAKC,IAAIqG,EAAapH,KAAKE,SAAStB,iBAAkBoB,KAAKoC,IAAIqE,QAAQ,EAAGvH,CAAC,GAAI,CAChH,GAAI,CAACgI,EAASG,SAASnI,CAAC,EAAGgI,EAASI,KAAKpI,CAAC,CAC3C,CACD,CACAT,IAAI8I,EAAcL,EAClB,GAAI,CAACP,EAAa,CACjBY,EAAcL,EAASvG,OAAO,SAAUC,GACvC,MAAO,CAACZ,KAAK8G,UAAUO,SAASzG,CAAC,CAClC,EAAEiB,KAAK7B,IAAI,CAAC,CACb,CACAA,KAAK8G,UAAUnG,OAAO,SAAUC,GAC/B,MAAO,CAACsG,EAASG,SAASzG,CAAC,CAC5B,CAAC,EAAEW,QAAQ,SAAUrC,GACpBc,KAAKoD,WAAWpD,KAAKmC,MAAMjD,GAAGuC,IAAI,CACnC,EAAEI,KAAK7B,IAAI,CAAC,EACZA,KAAK8G,UAAYI,EACjBlH,KAAKwH,UAAU,GAAGD,CAAW,CAC9B,CACAC,aAAarF,GACZnC,KAAKyH,cAAcH,KAAK,GAAGnF,CAAK,EAChC,GAAInC,KAAK0H,SAAU,CAClB,MACD,CACA1H,KAAK2H,aAAa,CACnB,CACAA,eACC3H,KAAK0H,SAAW,KAChB,GAAI1H,KAAKyH,cAAc5G,OAAS,EAAG,CAClCpC,IAAImJ,EAAQ5H,KAAKyH,cAAcI,MAAM,EACrC7H,KAAKoC,IAAI0F,QAAQF,CAAK,EAAEG,KAAK,SAAU9I,GACtCe,KAAKgI,YAAY/I,EAAM2I,CAAK,CAC7B,EAAE/F,KAAK7B,IAAI,CAAC,EAAE+H,KAAK,SAAU1D,GAC5B,GAAIrE,KAAKyH,cAAc5G,OAAS,EAAG,CAClCb,KAAK2H,aAAa,CACnB,CACD,EAAE9F,KAAK7B,IAAI,CAAC,CACb,CACAA,KAAK0H,SAAW,KACjB,CACAO,aAAa/I,GACZ,GAAIc,KAAKmC,MAAMtB,SAAW,GAAKb,KAAKmC,MAAMjD,KAAOZ,UAAW,CAC3D,MACD,CACAG,IAAI+C,EAAQxB,KAAKmC,MAAMjD,GAAGuC,KAC1B,GAAID,EAAMX,SAAW,EAAG,CACvBtC,QAAQ2J,aAAahJ,aAAa,EAClC,MACD,CACAT,IAAIoH,EAAWrE,EAAMqE,SAAS,EAC9BpH,IAAI0J,EAAoBnI,KAAKiB,WAAW4E,SAAS,EACjD,GAAIA,IAAavH,UAAW,CAC3B0B,KAAKiB,WAAWX,IAAI,CAAC,EAAEqC,UAAY3C,KAAKiB,WAAWX,IAAI,CAAC,EAAEqC,UAAYkD,EAASnD,IAAMyF,EAAkBzF,IACvG1C,KAAKiB,WAAWX,IAAI,CAAC,EAAEuC,WAAa7C,KAAKiB,WAAWX,IAAI,CAAC,EAAEuC,WAAagD,EAASjD,KAAOuF,EAAkBvF,IAC3G,CACA5C,KAAKsF,eAAepG,CAAC,CACtB,CACA8I,YAAY/I,EAAMC,GACjBT,IAAI4F,EAAWrE,KAAKmC,MAAMjD,GAC1BT,IAAIkG,EAAQ3E,KAAKE,SAASR,eAC1BjB,IAAI2J,EAAcC,OAAOC,kBAAoB,EAC7C7J,IAAI+F,EAAWvF,EAAKsF,YAAY,CAC/BE,SAAUzE,KAAK0E,UACfC,MAAO3E,KAAKgC,MAAM/B,QAAU0E,CAC7B,CAAC,EACDN,EAASnD,MAAQsD,EAAStD,MAAQlB,KAAKgC,MAAM/B,QAAU0E,EACvDN,EAASjD,OAASoD,EAASpD,OAASpB,KAAKgC,MAAM/B,QAAU0E,EACzDN,EAAS5C,KAAKN,KAAK,QAASkD,EAASnD,KAAK,EAC1CmD,EAAS5C,KAAKN,KAAK,SAAUkD,EAASjD,MAAM,EAC5CiD,EAAS5C,KAAKP,MAAMmD,EAASnD,MAAQlB,KAAKgC,MAAM/B,OAAO,EACvDoE,EAAS5C,KAAKL,OAAOiD,EAASjD,OAASpB,KAAKgC,MAAM/B,OAAO,EACzDoE,EAASC,OAAS,KAClB7F,IAAI8J,EAAUlK,EAAE,mBAAmB,EACnCI,IAAI+J,EAASD,EAAQjI,IAAI,CAAC,EAC1B7B,IAAIgK,EAAUD,EAAOE,WAAW,IAAI,EACpCF,EAAOpH,OAASoD,EAASpD,OAASgH,EAClCI,EAAOtH,MAAQsD,EAAStD,MAAQkH,EAChCI,EAAOE,WAAW,IAAI,EACtB,IAAIC,EAAYP,IAAgB,EAAI,CAACA,EAAa,EAAG,EAAGA,EAAa,EAAG,GAAK,KAC7E,IAAIQ,EAAgB,CACnBC,cAAeJ,EACfjE,SAAUA,EACVmE,UAAWA,CACZ,EACA,OAAO1J,EAAK6J,OAAOF,CAAa,EAAEG,QAAQhB,KAAK,WAC9C/H,KAAKwD,gBAAgBa,EAAS5C,KAAM8G,CAAO,EAC3C,GAAIvI,KAAKqC,eAAgB,CACxB,GAAI,OAAOrC,KAAKE,SAASf,eAAiB,WAAY,CACrDa,KAAKE,SAASf,aAAa4D,KAAK/C,KAAMqE,EAAS5C,KAAKnB,IAAI,CAAC,EAAGpB,CAAC,CAC9D,CACAc,KAAKiB,WAAWX,IAAI,CAAC,EAAE0C,cAAc,IAAIC,YAAY,aAAc,CAClEC,OAAQ,CACPmC,WAAYnG,EACZD,KAAMoF,EAAS5C,KAAKnB,IAAI,CAAC,CAC1B,CACD,CAAC,CAAC,CACH,CACA,OAAO+D,CACR,EAAExC,KAAK7B,IAAI,CAAC,CACb,CACAU,gBACC,GAAIV,KAAKuF,cAAgB,MAAQvF,KAAKoC,MAAQ,KAAM,CACnD,OAAO,IACR,CACA,GAAIpC,KAAKuF,YAAc,GAAKvF,KAAKuF,YAAcvF,KAAKoC,IAAIqE,SAAU,CACjE,OAAO,IACR,CACA,OAAOzG,KAAKmC,MAAMnC,KAAKuF,aAAa9D,IACrC,CACAH,WACC,OAAOtB,KAAKmC,KACb,CACA6G,eACC,GAAIhJ,KAAKoC,MAAQ,KAAM,CACtB,OAAO,CACR,CACA,OAAOpC,KAAKoC,IAAIqE,QACjB,CACAwC,OACC,GAAIjJ,KAAKuF,YAAcvF,KAAKoC,IAAIqE,SAAU,CACzCzG,KAAKiI,aAAajI,KAAKuF,YAAc,CAAC,CACvC,CACD,CACA2D,OACC,GAAIlJ,KAAKuF,YAAc,EAAG,CACzBvF,KAAKiI,aAAajI,KAAKuF,YAAc,CAAC,CACvC,CACD,CACA4D,QACC,GAAInJ,KAAKuF,cAAgB,EAAG,CAC3BvF,KAAKiI,aAAa,CAAC,CACpB,CACD,CACAmB,OACC,GAAIpJ,KAAKoC,MAAQ,KAAM,OACvB,GAAIpC,KAAKuF,cAAgBvF,KAAKoC,IAAIqE,SAAU,CAC3CzG,KAAKiI,aAAajI,KAAKoC,IAAIqE,QAAQ,CACpC,CACD,CACA4C,OAAOC,EAAKC,EAAa,OACxB,GAAIA,EAAY,CACfD,EAAMA,EAAMtJ,KAAK0E,SAClB,CACA1E,KAAK0E,UAAY4E,EACjB7K,IAAI8D,EAAYvC,KAAKiB,WAAWX,IAAI,CAAC,EACrC7B,IAAIgE,EAAa,CAChBC,IAAKH,EAAUI,UACfC,KAAML,EAAUM,WAChBzB,OAAQmB,EAAUiH,aAClBtI,MAAOqB,EAAUkH,WAClB,EACA,OAAOzJ,KAAK0J,0BAA0B,EAAE3B,KAAK,WAC5CtJ,IAAIkL,EAAY,CACfjH,IAAKH,EAAUI,UACfC,KAAML,EAAUM,WAChBzB,OAAQmB,EAAUiH,aAClBtI,MAAOqB,EAAUkH,WAClB,EACAlH,EAAUI,UAAYF,EAAWC,KAAOiH,EAAUvI,OAASqB,EAAWrB,QACtEmB,EAAUM,WAAaJ,EAAWG,MAAQ+G,EAAUzI,MAAQuB,EAAWvB,MACxE,EAAEW,KAAK7B,IAAI,CAAC,CACb,CACA0J,4BACC1J,KAAKmC,MAAQ,GACbnC,KAAKiB,WAAWW,SAAS5B,KAAKE,SAASrB,WAAW,EAAE+K,OAAO,EAC3D5J,KAAKyH,cAAgB,GACrBzH,KAAK0H,SAAW,MAChB1H,KAAK8G,UAAY,GACjB9G,KAAKuF,YAAc,KACnB,OAAOvF,KAAKoC,IAAI0F,QAAQ,CAAC,EAAEC,KAAK,SAAU9I,GACzCe,KAAKmF,iBAAiBlG,CAAI,EAC1Be,KAAK8C,cAAc,EACnB9C,KAAKsF,eAAe,CAAC,CACtB,EAAEzD,KAAK7B,IAAI,CAAC,CACb,CACA6J,mBAAmBC,GAClB9J,KAAKqC,eAAiB,MACtBrC,KAAKmC,MAAQ,GACbnC,KAAKiB,WAAWW,SAAS5B,KAAKE,SAASrB,WAAW,EAAE+K,OAAO,EAC3D5J,KAAKoC,IAAM,KACX3D,IAAIsL,EAAcC,SAASC,YAAYH,CAAQ,EAC/C,OAAOC,EAAYhB,QAAQhB,KAAK,SAAU3F,GACzCpC,KAAKoC,IAAMA,EACXpC,KAAKoF,UAAYhD,EAAIqE,SACrBzG,KAAK0E,UAAY,EACjB,OAAO1E,KAAK0J,0BAA0B,CACvC,EAAE7H,KAAK7B,IAAI,CAAC,EAAE+H,KAAK,WAClB,GAAI,OAAO/H,KAAKE,SAASnB,kBAAoB,WAAY,CACxDiB,KAAKE,SAASnB,gBAAgBgE,KAAK/C,IAAI,CACxC,CACAA,KAAKiB,WAAWX,IAAI,CAAC,EAAE0C,cAAc,IAAIC,YAAY,gBAAiB,CACrEC,OAAQ,CACP4G,SAAU9J,KAAKoC,GAChB,CACD,CAAC,CAAC,EACFpC,KAAKsF,eAAe,CAAC,EACrBtF,KAAKqC,eAAiB,KACtBrC,KAAKsF,eAAe,CAAC,CACtB,EAAEzD,KAAK7B,IAAI,CAAC,CACb,CACD,CAEA,SAASkK,kBAAkBC,OAAQC,mBAClC,MAAMC,qBAAuBC,GAAOA,EAAIC,QAAQ,SAAUC,OAAcA,EAAOC,YAAY,GAAG,EAC9FhM,IAAIiM,QAAUrM,EAAE8L,MAAM,EACtB1L,IAAIkM,OAAS,GACb,GAAID,QAAQ7J,OAAS,EAAG,CACvB6J,QAAUrM,EAAEqM,QAAQ,EAAE,EACtB,IAAKjM,IAAImM,yBAAyBR,kBAAmB,CACpD3L,IAAIoM,cAAgBR,qBAAqBO,qBAAqB,EAC9DnM,IAAIqM,eAAiBJ,QAAQ7F,KAAKgG,aAAa,EAC/C,GAAIC,gBAAkB,KAAM,CAC3B,OAAQ,OAAOV,kBAAkBQ,wBACjC,IAAK,QACJ,IACCE,eAAiBtK,WAAWsK,cAAc,CAC9B,CAAX,MAAOC,IACT,MACD,IAAK,SACJ,IACCD,eAAiBpE,SAASoE,cAAc,CAC5B,CAAX,MAAOC,IACT,MACD,IAAK,WACJtM,IAAIuM,eAAiBF,eACrBA,eAAiB,WAChBG,KAAKD,cAAc,CACpB,EAAEnJ,KAAKsI,OAAO,EAAE,EAChB,MACD,QACC,KACD,CACAQ,OAAOC,uBAAyBE,cACjC,CACD,CACD,CACA,OAAOH,MACR,CAEA,SAASO,KAAKC,GACb1M,IAAIqB,EAAUoK,kBAAkBiB,EAAShL,OAAOC,OAAO,CACtDgL,YAAa,GACbC,YAAa,EACd,EAAG3M,QAAQ,CAAC,EACZ,GAAIoB,EAAQ,gBAAkB,KAAM,CACnCrB,IAAI6M,EAAY,IAAIxJ,YAAYzD,EAAE8M,CAAO,EAAGrL,CAAO,EACnDwL,EAAUzB,aAAa/J,EAAQ,cAAc,EAAEiI,KAAK,WACnD,GAAIjI,EAAQ,gBAAkB,KAAM,CACnCwL,EAAUhJ,QAAQxC,EAAQ,cAAc,CACzC,CACD,CAAC,EACDqL,EAAQ7K,IAAI,CAAC,EAAEgL,UAAYA,CAC5B,CACD,CACAjN,EAAE,WACDA,EAAE,eAAe,EAAEkN,KAAK,WACvB9M,IAAI+M,EAAUnN,EAAE2B,IAAI,EACpBkL,KAAKM,CAAO,CACb,CAAC,CACF,CAAC,EACDpN,QAAQ0D,YAAcA,WACtB,GAAEuG,OAAQA,OAAOoD,IAAMpD,OAAOqD,QAAUpN,SAAS"} \ No newline at end of file diff --git a/examples/example.html b/examples/example.html index 57aff02..37d9e7b 100644 --- a/examples/example.html +++ b/examples/example.html @@ -194,25 +194,26 @@ pdfViewer.scrollToPage(i); } /** Now create the PDFjsViewer object in the DIV */ - let pdfViewer = new PDFjsViewer($('.maindoc'), { + let pdfViewer = new PDFjsViewer( + document.querySelector('.maindoc'), { zoomValues: [ 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4 ], /** Update the zoom value in the toolbar */ onZoomChange: function(zoom) { zoom = parseInt(zoom * 10000) / 100; - $('.zoomval').text(zoom + '%'); + document.querySelector('#zoomval').innerText = zoom + '%'; }, /** Update the active page */ onActivePageChanged: function(page) { - let pageno = $(page).data('page'); + let pageno = page.dataset["page"]; let pagetotal = this.getPageCount(); - if (! $(page).hasClass('hidden')) { + if (! page.classList.contains('hidden')) { pdfThumbnails.setActivePage(pageno); - $('#pageno').val(pageno); - $('#pageno').attr('max', pagetotal); - $('#pagecount').text('de ' + pagetotal); + document.querySelector('#pageno').value = pageno; + document.querySelector('#pageno').max = pagetotal; + document.querySelector('#pagecount').innerText = 'de ' + pagetotal; } }, @@ -232,29 +233,35 @@ }); /** Create the thumbnails */ - let pdfThumbnails = new PDFjsViewer($('.thumbnails'), { - zoomFillArea: 0.7, - onNewPage: function(page, i) { - $('
').text(i).appendTo(page); - page.on('click', function() { - pdfThumbnails.setActivePage(page.data('page')); - if (!pdfViewer.isPageVisible(page.data('page'))) { - pdfViewer.scrollToPage(page.data('page')); - } - }) - }, - onDocumentReady: function() { - this.setZoom('fit'); + let pdfThumbnails = new PDFjsViewer( + document.querySelector('.thumbnails'), + { + zoomFillArea: 0.7, + onNewPage: function(page, i) { + let div = document.createElement('div'); + div.classList.add('numbering'); + div.innerText = i; + page.appendChild(div); + page.addEventListener('click', function() { + pdfThumbnails.setActivePage(page.dataset['page']); + if (!pdfViewer.isPageVisible(page.dataset['page'])) { + pdfViewer.scrollToPage(page.dataset['page']); + } + }); + }, + onDocumentReady: function() { + this.setZoom('fit'); + } } - }); + ); pdfThumbnails.setActivePage = function(pageno) { this.$container.find('.pdfpage').removeClass('selected'); let $npage = this.$container.find('.pdfpage[data-page="' + pageno + '"]').addClass('selected'); - $('#hideselected').removeClass('pushed'); + document.querySelector('#hideselected').classList.remove('pushed'); if ($npage.hasClass('hidden')) - $('#hideselected').addClass('pushed'); + document.querySelector('#hideselected').classList.add('pushed'); if (!this.isPageVisible(pageno)) { this.scrollToPage(pageno); diff --git a/js/pdfjs-viewer.js b/js/pdfjs-viewer.js index 9758181..41a8104 100644 --- a/js/pdfjs-viewer.js +++ b/js/pdfjs-viewer.js @@ -15,7 +15,12 @@ */ (function(exports, $) { 'use strict'; - + + if ($ === undefined) { + console.error("jQuery-like library not available"); + return; + } + let defaults = { // Threshold to consider that a page is visible visibleThreshold: 0.5, @@ -27,14 +32,10 @@ contentClass: "content-wrapper", // Function called when a document has been loaded and its structure has been created onDocumentReady: () => {}, - // Function called when a new page is created (it is binded to the object, and receives a jQuery object as parameter) + // Function called when a new page is created (it is bound to the object, and receives a html object as parameter, and the page number) onNewPage: (page, i) => {}, - // Function called when a page is rendered + // Function called when a page is rendered (it is bound to the object, and receives a html object as parameter, and the page number) onPageRender: (page, i) => {}, - // Function called to obtain a page that shows an error when the document could not be loaded (returns a jQuery object) - errorPage: () => { - $(`
`).addClass(this.settings.pageClass).append($(`

`).text("could not load document")) - }, // Posible zoom values to iterate over using "in" and "out" zoomValues: [ 0.25, 0.5, 0.75, 1, 1.25, 1.50, 2, 4, 8 ], // Function called when the zoom level changes (it receives the zoom level) @@ -70,7 +71,7 @@ // The viewer instance whose pages may be zoomed this.viewer = viewer; // The settings - this.settings = $.extend(defaults, options); + this.settings = Object.assign({}, defaults, options); // Need having the zoom values in order this.settings.zoomValues = this.settings.zoomValues.sort(); @@ -145,6 +146,9 @@ } class PDFjsViewer { + // The version of the viewer + version = "2.0.0"; + /** * Constructs the object, and initializes actions: * - add the scroll handler to the container @@ -155,7 +159,7 @@ */ constructor($container, options = {}) { - this.settings = $.extend(Object.assign({}, defaults), options); + this.settings = Object.assign({}, defaults, options); // Create the zoomer helper this._zoom = new Zoomer(this, { @@ -163,6 +167,8 @@ fillArea: this.settings.zoomFillArea, }); + $container = $($container); + // Store the container this.$container = $container; @@ -229,7 +235,7 @@ */ _cleanPage($page) { let $emptyContent = this.settings.emptyContent(); - $page.find(`.${this.settings.contentClass}`).empty().append($emptyContent) + $page.find(`.${this.settings.contentClass}`).html("").append($emptyContent) } /** @@ -238,7 +244,7 @@ * @param {*} $content the new content that will be set in the page */ _setPageContent($page, $content) { - $page.find(`.${this.settings.contentClass}`).empty().append($content) + $page.find(`.${this.settings.contentClass}`).html("").append($content) } /** @@ -362,14 +368,12 @@ pageinfo = this._createSkeleton(pageinfo, i); this.pages[i] = pageinfo; this._placeSkeleton(pageinfo, i); - + // Call the callback function (if provided) - if (this._documentReady) { - if (typeof this.settings.onNewPage === "function") { - this.settings.onNewPage.call(this, pageinfo.$div, i); - } - this.$container.get(0).dispatchEvent(new CustomEvent("newpage", { detail: { pageNumber: i, page: pageinfo.$div.get(0) } })); + if (typeof this.settings.onNewPage === "function") { + this.settings.onNewPage.call(this, pageinfo.$div.get(0), i); } + this.$container.get(0).dispatchEvent(new CustomEvent("newpage", { detail: { pageNumber: i, page: pageinfo.$div.get(0) } })); } } } @@ -383,9 +387,11 @@ this._activePage = i; let activePage = this.getActivePage(); if (this._documentReady) { - if (typeof this.settings.onActivePageChanged === "function") + activePage = activePage==null?null:activePage.get(0); + if (typeof this.settings.onActivePageChanged === "function") { this.settings.onActivePageChanged.call(this, activePage, i); - this.$container.get(0).dispatchEvent(new CustomEvent("activepagechanged", { detail: { activePageNumber: i, activePage: activePage==null?null:activePage.get(0) } })); + } + this.$container.get(0).dispatchEvent(new CustomEvent("activepagechanged", { detail: { activePageNumber: i, activePage: activePage } })); } } } @@ -425,6 +431,9 @@ if ((this.pdf === null) || (i === undefined) || (i === null) || (i < 1) || (i > this.pdf.numPages)) { return false; } + if (typeof i === "string") { + i = parseInt(i); + } let $page = i; if (typeof i === "number") { if (this.pages[i] === undefined) @@ -464,7 +473,9 @@ this._setActivePage(i_page); // Now get the visible pages - let visibles = $visibles.map((x) => $(x).data('page')); + let visibles = $visibles.map((x) => { + return parseInt($(x).data('page')) + }); if (visibles.length > 0) { // Now will add some extra pages (before and after) the visible ones, to have them prepared in case of scroll let minVisible = Math.min(...visibles); @@ -603,7 +614,7 @@ // Call the callback (if provided) if (this._documentReady) { if (typeof this.settings.onPageRender === "function") { - this.settings.onPageRender.call(this, pageinfo.$div, i); + this.settings.onPageRender.call(this, pageinfo.$div.get(0), i); } this.$container.get(0).dispatchEvent(new CustomEvent("pagerender", { detail: { pageNumber: i, page: pageinfo.$div.get(0) } })); } @@ -813,4 +824,4 @@ }); exports.PDFjsViewer = PDFjsViewer; -})(window, jQuery) \ No newline at end of file +})(window, window._$??window.jQuery??undefined); \ No newline at end of file diff --git a/pdfjs-viewer.js b/pdfjs-viewer.js deleted file mode 100644 index 0d4e0ad..0000000 --- a/pdfjs-viewer.js +++ /dev/null @@ -1,566 +0,0 @@ -/** - Copyright 2021 Carlos A. (https://github.com/dealfonso) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -(function(exports, $) { - "use strict"; - let defaults = { - visibleThreshold: .5, - extraPagesToLoad: 3, - pageClass: "pdfpage", - contentClass: "content-wrapper", - onDocumentReady: () => {}, - onNewPage: (page, i) => {}, - onPageRender: (page, i) => {}, - errorPage: () => { - $(`
`).addClass(this.settings.pageClass).append($(`

`).text("could not load document")); - }, - zoomValues: [ .25, .5, .75, 1, 1.25, 1.5, 2, 4, 8 ], - onZoomChange: zoomlevel => {}, - onActivePageChanged: (page, i) => {}, - zoomFillArea: .95, - emptyContent: () => $('
'), - renderingScale: 1.5 - }; - class Zoomer { - constructor(viewer, options = {}) { - let defaults = { - zoomValues: [ .25, .5, .75, 1, 1.25, 1.5, 2, 4, 8 ], - fillArea: .9 - }; - this.current = 1; - this.viewer = viewer; - this.settings = $.extend(defaults, options); - this.settings.zoomValues = this.settings.zoomValues.sort(); - } - get(zoom = null) { - if (zoom === null) { - return this.current; - } - if (parseFloat(zoom) == zoom) { - return zoom; - } - let $activepage = this.viewer.getActivePage(); - let zoomValues = []; - switch (zoom) { - case "in": - zoom = this.current; - zoomValues = this.settings.zoomValues.filter(x => x > zoom); - if (zoomValues.length > 0) { - zoom = Math.min(...zoomValues); - } - break; - - case "out": - zoom = this.current; - zoomValues = this.settings.zoomValues.filter(x => x < zoom); - if (zoomValues.length > 0) { - zoom = Math.max(...zoomValues); - } - break; - - case "fit": - zoom = Math.min(this.get("width"), this.get("height")); - break; - - case "width": - zoom = this.settings.fillArea * this.viewer.$container.width() / $activepage.data("width"); - break; - - case "height": - zoom = this.settings.fillArea * this.viewer.$container.height() / $activepage.data("height"); - break; - - default: - zoom = this.current; - break; - } - return zoom; - } - zoomPages(zoom) { - zoom = this.get(zoom); - this.viewer.getPages().forEach(function(page) { - let $page = page.$div; - let c_width = $page.data("width"); - let c_height = $page.data("height"); - $page.width(c_width * zoom).height(c_height * zoom); - $page.data("zoom", zoom); - $page.find(`.${this.viewer.settings.contentClass}`).width(c_width * zoom).height(c_height * zoom); - }.bind(this)); - this.current = zoom; - } - } - class PDFjsViewer { - constructor($container, options = {}) { - this.settings = $.extend(Object.assign({}, defaults), options); - this._zoom = new Zoomer(this, { - zoomValues: this.settings.zoomValues, - fillArea: this.settings.zoomFillArea - }); - this.$container = $container; - $container.get(0)._pdfjsViewer = this; - this._setScrollListener(); - this.pages = []; - this.pdf = null; - this._documentReady = false; - } - setZoom(zoom) { - let container = this.$container.get(0); - let prevzoom = this._zoom.current; - let prevScroll = { - top: container.scrollTop, - left: container.scrollLeft - }; - this._zoom.zoomPages(zoom); - container.scrollLeft = prevScroll.left * this._zoom.current / prevzoom; - container.scrollTop = prevScroll.top * this._zoom.current / prevzoom; - this._visiblePages(true); - if (this._documentReady) { - if (typeof this.settings.onZoomChange === "function") this.settings.onZoomChange.call(this, this._zoom.current); - this.$container.get(0).dispatchEvent(new CustomEvent("zoomchange", { - detail: { - zoom: this._zoom.current - } - })); - } - return this._zoom.current; - } - getZoom() { - return this._zoom.current; - } - _cleanPage($page) { - let $emptyContent = this.settings.emptyContent(); - $page.find(`.${this.settings.contentClass}`).empty().append($emptyContent); - } - _setPageContent($page, $content) { - $page.find(`.${this.settings.contentClass}`).empty().append($content); - } - refreshAll() { - this._visiblePages(true); - } - _setScrollListener() { - let scrollLock = false; - let scrollPos = { - top: 0, - left: 0 - }; - this.__scrollHandler = function(e) { - if (scrollLock === true) { - return; - } - scrollLock = true; - let container = this.$container.get(0); - if (Math.abs(container.scrollTop - scrollPos.top) > container.clientHeight * .2 * this._zoom.current || Math.abs(container.scrollLeft - scrollPos.left) > container.clientWidth * .2 * this._zoom.current) { - scrollPos = { - top: container.scrollTop, - left: container.scrollLeft - }; - this._visiblePages(); - } - scrollLock = false; - }.bind(this); - this.$container.off("scroll"); - this.$container.on("scroll", this.__scrollHandler); - } - _createSkeleton(page, i) { - let pageinfo = { - $div: null, - width: 0, - height: 0, - loaded: false - }; - if (page.getViewport !== undefined) { - let viewport = page.getViewport({ - rotation: this._rotation, - scale: 1 - }); - pageinfo.width = viewport.width; - pageinfo.height = viewport.height; - pageinfo.loaded = true; - } else { - pageinfo.width = page.width; - pageinfo.height = page.height; - } - console.assert(pageinfo.width > 0 && pageinfo.height > 0, "Page width and height must be greater than 0"); - pageinfo.$div = $(`
`).attr("data-page", i).data("width", pageinfo.width).data("height", pageinfo.height).data("zoom", this._zoom.current).addClass(this.settings.pageClass).width(pageinfo.width * this._zoom.current).height(pageinfo.height * this._zoom.current); - let $content = $(`
`).width(pageinfo.width).height(pageinfo.height); - pageinfo.$div.append($content); - this._cleanPage(pageinfo.$div); - return pageinfo; - } - _placeSkeleton(pageinfo, i) { - let prevpage = i - 1; - let $prevpage = null; - while (prevpage > 0 && ($prevpage = this.$container.find(`.${this.settings.pageClass}[data-page="${prevpage}"]`)).length === 0) { - prevpage--; - } - if (prevpage === 0) { - this.$container.append(pageinfo.$div); - } else { - $prevpage.after(pageinfo.$div); - } - } - _createSkeletons(pageinfo) { - for (let i = 1; i <= this.pageCount; i++) { - if (this.pages[i] === undefined) { - pageinfo = this._createSkeleton(pageinfo, i); - this.pages[i] = pageinfo; - this._placeSkeleton(pageinfo, i); - if (this._documentReady) { - if (typeof this.settings.onNewPage === "function") { - this.settings.onNewPage.call(this, pageinfo.$div, i); - } - this.$container.get(0).dispatchEvent(new CustomEvent("newpage", { - detail: { - pageNumber: i, - page: pageinfo.$div.get(0) - } - })); - } - } - } - } - _setActivePage(i) { - if (this._activePage !== i) { - this._activePage = i; - let activePage = this.getActivePage(); - if (this._documentReady) { - if (typeof this.settings.onActivePageChanged === "function") this.settings.onActivePageChanged.call(this, activePage, i); - this.$container.get(0).dispatchEvent(new CustomEvent("activepagechanged", { - detail: { - activePageNumber: i, - activePage: activePage == null ? null : activePage.get(0) - } - })); - } - } - } - _areaOfPageVisible($page) { - if ($page === undefined) { - return 0; - } - let c_offset = this.$container.offset(); - let c_width = this.$container.width(); - let c_height = this.$container.height(); - let position = $page.offset(); - position.top -= c_offset.top; - position.left -= c_offset.left; - position.bottom = position.top + $page.outerHeight(); - position.right = position.left + $page.outerWidth(); - let page_y0 = Math.min(Math.max(position.top, 0), c_height); - let page_y1 = Math.min(Math.max($page.outerHeight() + position.top, 0), c_height); - let page_x0 = Math.min(Math.max(position.left, 0), c_width); - let page_x1 = Math.min(Math.max($page.outerWidth() + position.left, 0), c_width); - let vis_x = page_x1 - page_x0; - let vis_y = page_y1 - page_y0; - return vis_x * vis_y; - } - isPageVisible(i) { - if (this.pdf === null || i === undefined || i === null || i < 1 || i > this.pdf.numPages) { - return false; - } - let $page = i; - if (typeof i === "number") { - if (this.pages[i] === undefined) return false; - $page = this.pages[i].$div; - } - return this._areaOfPageVisible($page) > $page.outerWidth() * $page.outerHeight() * this.settings.visibleThreshold; - } - _visiblePages(forceRedraw = false) { - let max_area = 0; - let i_page = null; - if (this.pages.length === 0) { - this._visibles = []; - this._setActivePage(0); - return; - } - let $visibles = this.pages.filter(function(pageinfo) { - let areaVisible = this._areaOfPageVisible(pageinfo.$div); - if (areaVisible > max_area) { - max_area = areaVisible; - i_page = pageinfo.$div.data("page"); - } - return areaVisible > 0; - }.bind(this)).map(x => x.$div); - this._setActivePage(i_page); - let visibles = $visibles.map(x => $(x).data("page")); - if (visibles.length > 0) { - let minVisible = Math.min(...visibles); - let maxVisible = Math.max(...visibles); - for (let i = Math.max(1, minVisible - this.settings.extraPagesToLoad); i < minVisible; i++) { - if (!visibles.includes(i)) visibles.push(i); - } - for (let i = maxVisible + 1; i <= Math.min(maxVisible + this.settings.extraPagesToLoad, this.pdf.numPages); i++) { - if (!visibles.includes(i)) visibles.push(i); - } - } - let nowVisibles = visibles; - if (!forceRedraw) { - nowVisibles = visibles.filter(function(x) { - return !this._visibles.includes(x); - }.bind(this)); - } - this._visibles.filter(function(x) { - return !visibles.includes(x); - }).forEach(function(i) { - this._cleanPage(this.pages[i].$div); - }.bind(this)); - this._visibles = visibles; - this.loadPages(...nowVisibles); - } - loadPages(...pages) { - this._pagesLoading.push(...pages); - if (this._loading) { - return; - } - this._loadingTask(); - } - _loadingTask() { - this._loading = true; - if (this._pagesLoading.length > 0) { - let pagei = this._pagesLoading.shift(); - this.pdf.getPage(pagei).then(function(page) { - this._renderPage(page, pagei); - }.bind(this)).then(function(pageinfo) { - if (this._pagesLoading.length > 0) { - this._loadingTask(); - } - }.bind(this)); - } - this._loading = false; - } - scrollToPage(i) { - if (this.pages.length === 0 || this.pages[i] === undefined) { - return; - } - let $page = this.pages[i].$div; - if ($page.length === 0) { - console.warn(`Page ${i} not found`); - return; - } - let position = $page.position(); - let containerPosition = this.$container.position(); - if (position !== undefined) { - this.$container.get(0).scrollTop = this.$container.get(0).scrollTop + position.top - containerPosition.top; - this.$container.get(0).scrollLeft = this.$container.get(0).scrollLeft + position.left - containerPosition.left; - } - this._setActivePage(i); - } - _renderPage(page, i) { - let pageinfo = this.pages[i]; - let scale = this.settings.renderingScale; - let pixel_ratio = window.devicePixelRatio || 1; - let viewport = page.getViewport({ - rotation: this._rotation, - scale: this._zoom.current * scale - }); - pageinfo.width = viewport.width / this._zoom.current / scale; - pageinfo.height = viewport.height / this._zoom.current / scale; - pageinfo.$div.data("width", pageinfo.width); - pageinfo.$div.data("height", pageinfo.height); - pageinfo.$div.width(pageinfo.width * this._zoom.current); - pageinfo.$div.height(pageinfo.height * this._zoom.current); - pageinfo.loaded = true; - let $canvas = $(""); - let canvas = $canvas.get(0); - let context = canvas.getContext("2d"); - canvas.height = viewport.height * pixel_ratio; - canvas.width = viewport.width * pixel_ratio; - canvas.getContext("2d"); - var transform = pixel_ratio !== 1 ? [ pixel_ratio, 0, 0, pixel_ratio, 0, 0 ] : null; - var renderContext = { - canvasContext: context, - viewport: viewport, - transform: transform - }; - return page.render(renderContext).promise.then(function() { - this._setPageContent(pageinfo.$div, $canvas); - if (this._documentReady) { - if (typeof this.settings.onPageRender === "function") { - this.settings.onPageRender.call(this, pageinfo.$div, i); - } - this.$container.get(0).dispatchEvent(new CustomEvent("pagerender", { - detail: { - pageNumber: i, - page: pageinfo.$div.get(0) - } - })); - } - return pageinfo; - }.bind(this)); - } - getActivePage() { - if (this._activePage === null || this.pdf === null) { - return null; - } - if (this._activePage < 1 || this._activePage > this.pdf.numPages) { - return null; - } - return this.pages[this._activePage].$div; - } - getPages() { - return this.pages; - } - getPageCount() { - if (this.pdf === null) { - return 0; - } - return this.pdf.numPages; - } - next() { - if (this._activePage < this.pdf.numPages) { - this.scrollToPage(this._activePage + 1); - } - } - prev() { - if (this._activePage > 1) { - this.scrollToPage(this._activePage - 1); - } - } - first() { - if (this._activePage !== 1) { - this.scrollToPage(1); - } - } - last() { - if (this.pdf === null) return; - if (this._activePage !== this.pdf.numPages) { - this.scrollToPage(this.pdf.numPages); - } - } - rotate(deg, accumulate = false) { - if (accumulate) { - deg = deg + this._rotation; - } - this._rotation = deg; - let container = this.$container.get(0); - let prevScroll = { - top: container.scrollTop, - left: container.scrollLeft, - height: container.scrollHeight, - width: container.scrollWidth - }; - return this.forceViewerInitialization().then(function() { - let newScroll = { - top: container.scrollTop, - left: container.scrollLeft, - height: container.scrollHeight, - width: container.scrollWidth - }; - container.scrollTop = prevScroll.top * (newScroll.height / prevScroll.height); - container.scrollLeft = prevScroll.left * (newScroll.width / prevScroll.width); - }.bind(this)); - } - forceViewerInitialization() { - this.pages = []; - this.$container.find(`.${this.settings.pageClass}`).remove(); - this._pagesLoading = []; - this._loading = false; - this._visibles = []; - this._activePage = null; - return this.pdf.getPage(1).then(function(page) { - this._createSkeletons(page); - this._visiblePages(); - this._setActivePage(1); - }.bind(this)); - } - async loadDocument(document) { - this._documentReady = false; - this.pages = []; - this.$container.find(`.${this.settings.pageClass}`).remove(); - this.pdf = null; - let loadingTask = pdfjsLib.getDocument(document); - return loadingTask.promise.then(function(pdf) { - this.pdf = pdf; - this.pageCount = pdf.numPages; - this._rotation = 0; - return this.forceViewerInitialization(); - }.bind(this)).then(function() { - if (typeof this.settings.onDocumentReady === "function") { - this.settings.onDocumentReady.call(this); - } - this.$container.get(0).dispatchEvent(new CustomEvent("documentready", { - detail: { - document: this.pdf - } - })); - this._setActivePage(0); - this._documentReady = true; - this._setActivePage(1); - }.bind(this)); - } - } - function recoverAttributes(target, attributeDefaults) { - const camelcaseToSnakecase = str => str.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`); - let $target = $(target); - let result = {}; - if ($target.length > 0) { - $target = $($target[0]); - for (let originalAttributeName in attributeDefaults) { - let attributeName = camelcaseToSnakecase(originalAttributeName); - let attributeValue = $target.attr(attributeName); - if (attributeValue != null) { - switch (typeof attributeDefaults[originalAttributeName]) { - case "float": - try { - attributeValue = parseFloat(attributeValue); - } catch (_) {} - break; - - case "number": - try { - attributeValue = parseInt(attributeValue); - } catch (_) {} - break; - - case "function": - let functionString = attributeValue; - attributeValue = function() { - eval(functionString); - }.bind(target[0]); - break; - - default: - break; - } - result[originalAttributeName] = attributeValue; - } - } - } - return result; - } - function init(element) { - let options = recoverAttributes(element, Object.assign({ - pdfDocument: "", - initialZoom: "" - }, defaults)); - if (options["pdfDocument"] != null) { - let pdfViewer = new PDFjsViewer($(element), options); - pdfViewer.loadDocument(options["pdfDocument"]).then(function() { - if (options["initialZoom"] != null) { - pdfViewer.setZoom(options["initialZoom"]); - } - }); - element.get(0).pdfViewer = pdfViewer; - } - } - $(function() { - $(".pdfjs-viewer").each(function() { - let $viewer = $(this); - init($viewer); - }); - }); - exports.PDFjsViewer = PDFjsViewer; -})(window, jQuery); diff --git a/pdfjs-viewer.min.js b/pdfjs-viewer.min.js deleted file mode 100644 index b031903..0000000 --- a/pdfjs-viewer.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/* Copyright 2021 Carlos A. (https://github.com/dealfonso); License: http://www.apache.org/licenses/LICENSE-2.0 */ -(function(exports,$){"use strict";let defaults={visibleThreshold:.5,extraPagesToLoad:3,pageClass:"pdfpage",contentClass:"content-wrapper",onDocumentReady:()=>{},onNewPage:(page,i)=>{},onPageRender:(page,i)=>{},errorPage:()=>{$(`
`).addClass(this.settings.pageClass).append($(`

`).text("could not load document"))},zoomValues:[.25,.5,.75,1,1.25,1.5,2,4,8],onZoomChange:zoomlevel=>{},onActivePageChanged:(page,i)=>{},zoomFillArea:.95,emptyContent:()=>$('
'),renderingScale:1.5};class Zoomer{constructor(viewer,options={}){let defaults={zoomValues:[.25,.5,.75,1,1.25,1.5,2,4,8],fillArea:.9};this.current=1;this.viewer=viewer;this.settings=$.extend(defaults,options);this.settings.zoomValues=this.settings.zoomValues.sort()}get(zoom=null){if(zoom===null){return this.current}if(parseFloat(zoom)==zoom){return zoom}let $activepage=this.viewer.getActivePage();let zoomValues=[];switch(zoom){case"in":zoom=this.current;zoomValues=this.settings.zoomValues.filter(x=>x>zoom);if(zoomValues.length>0){zoom=Math.min(...zoomValues)}break;case"out":zoom=this.current;zoomValues=this.settings.zoomValues.filter(x=>x0){zoom=Math.max(...zoomValues)}break;case"fit":zoom=Math.min(this.get("width"),this.get("height"));break;case"width":zoom=this.settings.fillArea*this.viewer.$container.width()/$activepage.data("width");break;case"height":zoom=this.settings.fillArea*this.viewer.$container.height()/$activepage.data("height");break;default:zoom=this.current;break}return zoom}zoomPages(zoom){zoom=this.get(zoom);this.viewer.getPages().forEach(function(page){let $page=page.$div;let c_width=$page.data("width");let c_height=$page.data("height");$page.width(c_width*zoom).height(c_height*zoom);$page.data("zoom",zoom);$page.find(`.${this.viewer.settings.contentClass}`).width(c_width*zoom).height(c_height*zoom)}.bind(this));this.current=zoom}}class PDFjsViewer{constructor($container,options={}){this.settings=$.extend(Object.assign({},defaults),options);this._zoom=new Zoomer(this,{zoomValues:this.settings.zoomValues,fillArea:this.settings.zoomFillArea});this.$container=$container;$container.get(0)._pdfjsViewer=this;this._setScrollListener();this.pages=[];this.pdf=null;this._documentReady=false}setZoom(zoom){let container=this.$container.get(0);let prevzoom=this._zoom.current;let prevScroll={top:container.scrollTop,left:container.scrollLeft};this._zoom.zoomPages(zoom);container.scrollLeft=prevScroll.left*this._zoom.current/prevzoom;container.scrollTop=prevScroll.top*this._zoom.current/prevzoom;this._visiblePages(true);if(this._documentReady){if(typeof this.settings.onZoomChange==="function")this.settings.onZoomChange.call(this,this._zoom.current);this.$container.get(0).dispatchEvent(new CustomEvent("zoomchange",{detail:{zoom:this._zoom.current}}))}return this._zoom.current}getZoom(){return this._zoom.current}_cleanPage($page){let $emptyContent=this.settings.emptyContent();$page.find(`.${this.settings.contentClass}`).empty().append($emptyContent)}_setPageContent($page,$content){$page.find(`.${this.settings.contentClass}`).empty().append($content)}refreshAll(){this._visiblePages(true)}_setScrollListener(){let scrollLock=false;let scrollPos={top:0,left:0};this.__scrollHandler=function(e){if(scrollLock===true){return}scrollLock=true;let container=this.$container.get(0);if(Math.abs(container.scrollTop-scrollPos.top)>container.clientHeight*.2*this._zoom.current||Math.abs(container.scrollLeft-scrollPos.left)>container.clientWidth*.2*this._zoom.current){scrollPos={top:container.scrollTop,left:container.scrollLeft};this._visiblePages()}scrollLock=false}.bind(this);this.$container.off("scroll");this.$container.on("scroll",this.__scrollHandler)}_createSkeleton(page,i){let pageinfo={$div:null,width:0,height:0,loaded:false};if(page.getViewport!==undefined){let viewport=page.getViewport({rotation:this._rotation,scale:1});pageinfo.width=viewport.width;pageinfo.height=viewport.height;pageinfo.loaded=true}else{pageinfo.width=page.width;pageinfo.height=page.height}console.assert(pageinfo.width>0&&pageinfo.height>0,"Page width and height must be greater than 0");pageinfo.$div=$(`
`).attr("data-page",i).data("width",pageinfo.width).data("height",pageinfo.height).data("zoom",this._zoom.current).addClass(this.settings.pageClass).width(pageinfo.width*this._zoom.current).height(pageinfo.height*this._zoom.current);let $content=$(`
`).width(pageinfo.width).height(pageinfo.height);pageinfo.$div.append($content);this._cleanPage(pageinfo.$div);return pageinfo}_placeSkeleton(pageinfo,i){let prevpage=i-1;let $prevpage=null;while(prevpage>0&&($prevpage=this.$container.find(`.${this.settings.pageClass}[data-page="${prevpage}"]`)).length===0){prevpage--}if(prevpage===0){this.$container.append(pageinfo.$div)}else{$prevpage.after(pageinfo.$div)}}_createSkeletons(pageinfo){for(let i=1;i<=this.pageCount;i++){if(this.pages[i]===undefined){pageinfo=this._createSkeleton(pageinfo,i);this.pages[i]=pageinfo;this._placeSkeleton(pageinfo,i);if(this._documentReady){if(typeof this.settings.onNewPage==="function"){this.settings.onNewPage.call(this,pageinfo.$div,i)}this.$container.get(0).dispatchEvent(new CustomEvent("newpage",{detail:{pageNumber:i,page:pageinfo.$div.get(0)}}))}}}}_setActivePage(i){if(this._activePage!==i){this._activePage=i;let activePage=this.getActivePage();if(this._documentReady){if(typeof this.settings.onActivePageChanged==="function")this.settings.onActivePageChanged.call(this,activePage,i);this.$container.get(0).dispatchEvent(new CustomEvent("activepagechanged",{detail:{activePageNumber:i,activePage:activePage==null?null:activePage.get(0)}}))}}}_areaOfPageVisible($page){if($page===undefined){return 0}let c_offset=this.$container.offset();let c_width=this.$container.width();let c_height=this.$container.height();let position=$page.offset();position.top-=c_offset.top;position.left-=c_offset.left;position.bottom=position.top+$page.outerHeight();position.right=position.left+$page.outerWidth();let page_y0=Math.min(Math.max(position.top,0),c_height);let page_y1=Math.min(Math.max($page.outerHeight()+position.top,0),c_height);let page_x0=Math.min(Math.max(position.left,0),c_width);let page_x1=Math.min(Math.max($page.outerWidth()+position.left,0),c_width);let vis_x=page_x1-page_x0;let vis_y=page_y1-page_y0;return vis_x*vis_y}isPageVisible(i){if(this.pdf===null||i===undefined||i===null||i<1||i>this.pdf.numPages){return false}let $page=i;if(typeof i==="number"){if(this.pages[i]===undefined)return false;$page=this.pages[i].$div}return this._areaOfPageVisible($page)>$page.outerWidth()*$page.outerHeight()*this.settings.visibleThreshold}_visiblePages(forceRedraw=false){let max_area=0;let i_page=null;if(this.pages.length===0){this._visibles=[];this._setActivePage(0);return}let $visibles=this.pages.filter(function(pageinfo){let areaVisible=this._areaOfPageVisible(pageinfo.$div);if(areaVisible>max_area){max_area=areaVisible;i_page=pageinfo.$div.data("page")}return areaVisible>0}.bind(this)).map(x=>x.$div);this._setActivePage(i_page);let visibles=$visibles.map(x=>$(x).data("page"));if(visibles.length>0){let minVisible=Math.min(...visibles);let maxVisible=Math.max(...visibles);for(let i=Math.max(1,minVisible-this.settings.extraPagesToLoad);i0){let pagei=this._pagesLoading.shift();this.pdf.getPage(pagei).then(function(page){this._renderPage(page,pagei)}.bind(this)).then(function(pageinfo){if(this._pagesLoading.length>0){this._loadingTask()}}.bind(this))}this._loading=false}scrollToPage(i){if(this.pages.length===0||this.pages[i]===undefined){return}let $page=this.pages[i].$div;if($page.length===0){console.warn(`Page ${i} not found`);return}let position=$page.position();let containerPosition=this.$container.position();if(position!==undefined){this.$container.get(0).scrollTop=this.$container.get(0).scrollTop+position.top-containerPosition.top;this.$container.get(0).scrollLeft=this.$container.get(0).scrollLeft+position.left-containerPosition.left}this._setActivePage(i)}_renderPage(page,i){let pageinfo=this.pages[i];let scale=this.settings.renderingScale;let pixel_ratio=window.devicePixelRatio||1;let viewport=page.getViewport({rotation:this._rotation,scale:this._zoom.current*scale});pageinfo.width=viewport.width/this._zoom.current/scale;pageinfo.height=viewport.height/this._zoom.current/scale;pageinfo.$div.data("width",pageinfo.width);pageinfo.$div.data("height",pageinfo.height);pageinfo.$div.width(pageinfo.width*this._zoom.current);pageinfo.$div.height(pageinfo.height*this._zoom.current);pageinfo.loaded=true;let $canvas=$("");let canvas=$canvas.get(0);let context=canvas.getContext("2d");canvas.height=viewport.height*pixel_ratio;canvas.width=viewport.width*pixel_ratio;canvas.getContext("2d");var transform=pixel_ratio!==1?[pixel_ratio,0,0,pixel_ratio,0,0]:null;var renderContext={canvasContext:context,viewport:viewport,transform:transform};return page.render(renderContext).promise.then(function(){this._setPageContent(pageinfo.$div,$canvas);if(this._documentReady){if(typeof this.settings.onPageRender==="function"){this.settings.onPageRender.call(this,pageinfo.$div,i)}this.$container.get(0).dispatchEvent(new CustomEvent("pagerender",{detail:{pageNumber:i,page:pageinfo.$div.get(0)}}))}return pageinfo}.bind(this))}getActivePage(){if(this._activePage===null||this.pdf===null){return null}if(this._activePage<1||this._activePage>this.pdf.numPages){return null}return this.pages[this._activePage].$div}getPages(){return this.pages}getPageCount(){if(this.pdf===null){return 0}return this.pdf.numPages}next(){if(this._activePage1){this.scrollToPage(this._activePage-1)}}first(){if(this._activePage!==1){this.scrollToPage(1)}}last(){if(this.pdf===null)return;if(this._activePage!==this.pdf.numPages){this.scrollToPage(this.pdf.numPages)}}rotate(deg,accumulate=false){if(accumulate){deg=deg+this._rotation}this._rotation=deg;let container=this.$container.get(0);let prevScroll={top:container.scrollTop,left:container.scrollLeft,height:container.scrollHeight,width:container.scrollWidth};return this.forceViewerInitialization().then(function(){let newScroll={top:container.scrollTop,left:container.scrollLeft,height:container.scrollHeight,width:container.scrollWidth};container.scrollTop=prevScroll.top*(newScroll.height/prevScroll.height);container.scrollLeft=prevScroll.left*(newScroll.width/prevScroll.width)}.bind(this))}forceViewerInitialization(){this.pages=[];this.$container.find(`.${this.settings.pageClass}`).remove();this._pagesLoading=[];this._loading=false;this._visibles=[];this._activePage=null;return this.pdf.getPage(1).then(function(page){this._createSkeletons(page);this._visiblePages();this._setActivePage(1)}.bind(this))}async loadDocument(document){this._documentReady=false;this.pages=[];this.$container.find(`.${this.settings.pageClass}`).remove();this.pdf=null;let loadingTask=pdfjsLib.getDocument(document);return loadingTask.promise.then(function(pdf){this.pdf=pdf;this.pageCount=pdf.numPages;this._rotation=0;return this.forceViewerInitialization()}.bind(this)).then(function(){if(typeof this.settings.onDocumentReady==="function"){this.settings.onDocumentReady.call(this)}this.$container.get(0).dispatchEvent(new CustomEvent("documentready",{detail:{document:this.pdf}}));this._setActivePage(0);this._documentReady=true;this._setActivePage(1)}.bind(this))}}function recoverAttributes(target,attributeDefaults){const camelcaseToSnakecase=str=>str.replace(/[A-Z]/g,letter=>`-${letter.toLowerCase()}`);let $target=$(target);let result={};if($target.length>0){$target=$($target[0]);for(let originalAttributeName in attributeDefaults){let attributeName=camelcaseToSnakecase(originalAttributeName);let attributeValue=$target.attr(attributeName);if(attributeValue!=null){switch(typeof attributeDefaults[originalAttributeName]){case"float":try{attributeValue=parseFloat(attributeValue)}catch(_){}break;case"number":try{attributeValue=parseInt(attributeValue)}catch(_){}break;case"function":let functionString=attributeValue;attributeValue=function(){eval(functionString)}.bind(target[0]);break;default:break}result[originalAttributeName]=attributeValue}}}return result}function init(element){let options=recoverAttributes(element,Object.assign({pdfDocument:"",initialZoom:""},defaults));if(options["pdfDocument"]!=null){let pdfViewer=new PDFjsViewer($(element),options);pdfViewer.loadDocument(options["pdfDocument"]).then(function(){if(options["initialZoom"]!=null){pdfViewer.setZoom(options["initialZoom"])}});element.get(0).pdfViewer=pdfViewer}}$(function(){$(".pdfjs-viewer").each(function(){let $viewer=$(this);init($viewer)})});exports.PDFjsViewer=PDFjsViewer})(window,jQuery);