UNPKG

pdf-parse

Version:

Pure javascript cross-platform module to extract text from PDFs.

1,407 lines (1,327 loc) 350 kB
/* Copyright 2017 Mozilla Foundation * * 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(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // identity function for calling harmony imports with the correct context /******/ __webpack_require__.i = function(value) { return value; }; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 33); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.localized = exports.animationStarted = exports.normalizeWheelEventDelta = exports.binarySearchFirstItem = exports.watchScroll = exports.scrollIntoView = exports.getOutputScale = exports.approximateFraction = exports.roundToDivide = exports.getVisibleElements = exports.parseQueryString = exports.noContextMenuHandler = exports.getPDFFileNameFromURL = exports.ProgressBar = exports.EventBus = exports.NullL10n = exports.mozL10n = exports.RendererType = exports.cloneObj = exports.VERTICAL_PADDING = exports.SCROLLBAR_PADDING = exports.MAX_AUTO_SCALE = exports.UNKNOWN_SCALE = exports.MAX_SCALE = exports.MIN_SCALE = exports.DEFAULT_SCALE = exports.DEFAULT_SCALE_VALUE = exports.CSS_UNITS = undefined; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _pdfjsLib = __webpack_require__(1); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var CSS_UNITS = 96.0 / 72.0; var DEFAULT_SCALE_VALUE = 'auto'; var DEFAULT_SCALE = 1.0; var MIN_SCALE = 0.25; var MAX_SCALE = 10.0; var UNKNOWN_SCALE = 0; var MAX_AUTO_SCALE = 1.25; var SCROLLBAR_PADDING = 40; var VERTICAL_PADDING = 5; var RendererType = { CANVAS: 'canvas', SVG: 'svg' }; function formatL10nValue(text, args) { if (!args) { return text; } return text.replace(/\{\{\s*(\w+)\s*\}\}/g, function (all, name) { return name in args ? args[name] : '{{' + name + '}}'; }); } var NullL10n = { get: function get(property, args, fallback) { return Promise.resolve(formatL10nValue(fallback, args)); }, translate: function translate(element) { return Promise.resolve(); } }; _pdfjsLib.PDFJS.disableFullscreen = _pdfjsLib.PDFJS.disableFullscreen === undefined ? false : _pdfjsLib.PDFJS.disableFullscreen; _pdfjsLib.PDFJS.useOnlyCssZoom = _pdfjsLib.PDFJS.useOnlyCssZoom === undefined ? false : _pdfjsLib.PDFJS.useOnlyCssZoom; _pdfjsLib.PDFJS.maxCanvasPixels = _pdfjsLib.PDFJS.maxCanvasPixels === undefined ? 16777216 : _pdfjsLib.PDFJS.maxCanvasPixels; _pdfjsLib.PDFJS.disableHistory = _pdfjsLib.PDFJS.disableHistory === undefined ? false : _pdfjsLib.PDFJS.disableHistory; _pdfjsLib.PDFJS.disableTextLayer = _pdfjsLib.PDFJS.disableTextLayer === undefined ? false : _pdfjsLib.PDFJS.disableTextLayer; _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom = _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom === undefined ? false : _pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom; { _pdfjsLib.PDFJS.locale = _pdfjsLib.PDFJS.locale === undefined && typeof navigator !== 'undefined' ? navigator.language : _pdfjsLib.PDFJS.locale; } function getOutputScale(ctx) { var devicePixelRatio = window.devicePixelRatio || 1; var backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1; var pixelRatio = devicePixelRatio / backingStoreRatio; return { sx: pixelRatio, sy: pixelRatio, scaled: pixelRatio !== 1 }; } function scrollIntoView(element, spot) { var skipOverflowHiddenElements = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var parent = element.offsetParent; if (!parent) { console.error('offsetParent is not set -- cannot scroll'); return; } var offsetY = element.offsetTop + element.clientTop; var offsetX = element.offsetLeft + element.clientLeft; while (parent.clientHeight === parent.scrollHeight || skipOverflowHiddenElements && getComputedStyle(parent).overflow === 'hidden') { if (parent.dataset._scaleY) { offsetY /= parent.dataset._scaleY; offsetX /= parent.dataset._scaleX; } offsetY += parent.offsetTop; offsetX += parent.offsetLeft; parent = parent.offsetParent; if (!parent) { return; } } if (spot) { if (spot.top !== undefined) { offsetY += spot.top; } if (spot.left !== undefined) { offsetX += spot.left; parent.scrollLeft = offsetX; } } parent.scrollTop = offsetY; } function watchScroll(viewAreaElement, callback) { var debounceScroll = function debounceScroll(evt) { if (rAF) { return; } rAF = window.requestAnimationFrame(function viewAreaElementScrolled() { rAF = null; var currentY = viewAreaElement.scrollTop; var lastY = state.lastY; if (currentY !== lastY) { state.down = currentY > lastY; } state.lastY = currentY; callback(state); }); }; var state = { down: true, lastY: viewAreaElement.scrollTop, _eventHandler: debounceScroll }; var rAF = null; viewAreaElement.addEventListener('scroll', debounceScroll, true); return state; } function parseQueryString(query) { var parts = query.split('&'); var params = Object.create(null); for (var i = 0, ii = parts.length; i < ii; ++i) { var param = parts[i].split('='); var key = param[0].toLowerCase(); var value = param.length > 1 ? param[1] : null; params[decodeURIComponent(key)] = decodeURIComponent(value); } return params; } function binarySearchFirstItem(items, condition) { var minIndex = 0; var maxIndex = items.length - 1; if (items.length === 0 || !condition(items[maxIndex])) { return items.length; } if (condition(items[minIndex])) { return minIndex; } while (minIndex < maxIndex) { var currentIndex = minIndex + maxIndex >> 1; var currentItem = items[currentIndex]; if (condition(currentItem)) { maxIndex = currentIndex; } else { minIndex = currentIndex + 1; } } return minIndex; } function approximateFraction(x) { if (Math.floor(x) === x) { return [x, 1]; } var xinv = 1 / x; var limit = 8; if (xinv > limit) { return [1, limit]; } else if (Math.floor(xinv) === xinv) { return [1, xinv]; } var x_ = x > 1 ? xinv : x; var a = 0, b = 1, c = 1, d = 1; while (true) { var p = a + c, q = b + d; if (q > limit) { break; } if (x_ <= p / q) { c = p; d = q; } else { a = p; b = q; } } var result = void 0; if (x_ - a / b < c / d - x_) { result = x_ === x ? [a, b] : [b, a]; } else { result = x_ === x ? [c, d] : [d, c]; } return result; } function roundToDivide(x, div) { var r = x % div; return r === 0 ? x : Math.round(x - r + div); } function getVisibleElements(scrollEl, views) { var sortByVisibility = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight; var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth; function isElementBottomBelowViewTop(view) { var element = view.div; var elementBottom = element.offsetTop + element.clientTop + element.clientHeight; return elementBottom > top; } var visible = [], view = void 0, element = void 0; var currentHeight = void 0, viewHeight = void 0, hiddenHeight = void 0, percentHeight = void 0; var currentWidth = void 0, viewWidth = void 0; var firstVisibleElementInd = views.length === 0 ? 0 : binarySearchFirstItem(views, isElementBottomBelowViewTop); for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) { view = views[i]; element = view.div; currentHeight = element.offsetTop + element.clientTop; viewHeight = element.clientHeight; if (currentHeight > bottom) { break; } currentWidth = element.offsetLeft + element.clientLeft; viewWidth = element.clientWidth; if (currentWidth + viewWidth < left || currentWidth > right) { continue; } hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, currentHeight + viewHeight - bottom); percentHeight = (viewHeight - hiddenHeight) * 100 / viewHeight | 0; visible.push({ id: view.id, x: currentWidth, y: currentHeight, view: view, percent: percentHeight }); } var first = visible[0]; var last = visible[visible.length - 1]; if (sortByVisibility) { visible.sort(function (a, b) { var pc = a.percent - b.percent; if (Math.abs(pc) > 0.001) { return -pc; } return a.id - b.id; }); } return { first: first, last: last, views: visible }; } function noContextMenuHandler(evt) { evt.preventDefault(); } function isDataSchema(url) { var i = 0, ii = url.length; while (i < ii && url[i].trim() === '') { i++; } return url.substr(i, 5).toLowerCase() === 'data:'; } function getPDFFileNameFromURL(url) { var defaultFilename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'document.pdf'; if (isDataSchema(url)) { console.warn('getPDFFileNameFromURL: ' + 'ignoring "data:" URL for performance reasons.'); return defaultFilename; } var reURI = /^(?:(?:[^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i; var splitURI = reURI.exec(url); var suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]); if (suggestedFilename) { suggestedFilename = suggestedFilename[0]; if (suggestedFilename.indexOf('%') !== -1) { try { suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0]; } catch (ex) {} } } return suggestedFilename || defaultFilename; } function normalizeWheelEventDelta(evt) { var delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY); var angle = Math.atan2(evt.deltaY, evt.deltaX); if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) { delta = -delta; } var MOUSE_DOM_DELTA_PIXEL_MODE = 0; var MOUSE_DOM_DELTA_LINE_MODE = 1; var MOUSE_PIXELS_PER_LINE = 30; var MOUSE_LINES_PER_PAGE = 30; if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) { delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE; } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) { delta /= MOUSE_LINES_PER_PAGE; } return delta; } function cloneObj(obj) { var result = Object.create(null); for (var i in obj) { if (Object.prototype.hasOwnProperty.call(obj, i)) { result[i] = obj[i]; } } return result; } var animationStarted = new Promise(function (resolve) { window.requestAnimationFrame(resolve); }); var mozL10n = void 0; var localized = Promise.resolve(); var EventBus = function () { function EventBus() { _classCallCheck(this, EventBus); this._listeners = Object.create(null); } _createClass(EventBus, [{ key: 'on', value: function on(eventName, listener) { var eventListeners = this._listeners[eventName]; if (!eventListeners) { eventListeners = []; this._listeners[eventName] = eventListeners; } eventListeners.push(listener); } }, { key: 'off', value: function off(eventName, listener) { var eventListeners = this._listeners[eventName]; var i = void 0; if (!eventListeners || (i = eventListeners.indexOf(listener)) < 0) { return; } eventListeners.splice(i, 1); } }, { key: 'dispatch', value: function dispatch(eventName) { var eventListeners = this._listeners[eventName]; if (!eventListeners || eventListeners.length === 0) { return; } var args = Array.prototype.slice.call(arguments, 1); eventListeners.slice(0).forEach(function (listener) { listener.apply(null, args); }); } }]); return EventBus; }(); function clamp(v, min, max) { return Math.min(Math.max(v, min), max); } var ProgressBar = function () { function ProgressBar(id) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, height = _ref.height, width = _ref.width, units = _ref.units; _classCallCheck(this, ProgressBar); this.visible = true; this.div = document.querySelector(id + ' .progress'); this.bar = this.div.parentNode; this.height = height || 100; this.width = width || 100; this.units = units || '%'; this.div.style.height = this.height + this.units; this.percent = 0; } _createClass(ProgressBar, [{ key: '_updateBar', value: function _updateBar() { if (this._indeterminate) { this.div.classList.add('indeterminate'); this.div.style.width = this.width + this.units; return; } this.div.classList.remove('indeterminate'); var progressSize = this.width * this._percent / 100; this.div.style.width = progressSize + this.units; } }, { key: 'setWidth', value: function setWidth(viewer) { if (!viewer) { return; } var container = viewer.parentNode; var scrollbarWidth = container.offsetWidth - viewer.offsetWidth; if (scrollbarWidth > 0) { this.bar.setAttribute('style', 'width: calc(100% - ' + scrollbarWidth + 'px);'); } } }, { key: 'hide', value: function hide() { if (!this.visible) { return; } this.visible = false; this.bar.classList.add('hidden'); document.body.classList.remove('loadingInProgress'); } }, { key: 'show', value: function show() { if (this.visible) { return; } this.visible = true; document.body.classList.add('loadingInProgress'); this.bar.classList.remove('hidden'); } }, { key: 'percent', get: function get() { return this._percent; }, set: function set(val) { this._indeterminate = isNaN(val); this._percent = clamp(val, 0, 100); this._updateBar(); } }]); return ProgressBar; }(); exports.CSS_UNITS = CSS_UNITS; exports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE; exports.DEFAULT_SCALE = DEFAULT_SCALE; exports.MIN_SCALE = MIN_SCALE; exports.MAX_SCALE = MAX_SCALE; exports.UNKNOWN_SCALE = UNKNOWN_SCALE; exports.MAX_AUTO_SCALE = MAX_AUTO_SCALE; exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING; exports.VERTICAL_PADDING = VERTICAL_PADDING; exports.cloneObj = cloneObj; exports.RendererType = RendererType; exports.mozL10n = mozL10n; exports.NullL10n = NullL10n; exports.EventBus = EventBus; exports.ProgressBar = ProgressBar; exports.getPDFFileNameFromURL = getPDFFileNameFromURL; exports.noContextMenuHandler = noContextMenuHandler; exports.parseQueryString = parseQueryString; exports.getVisibleElements = getVisibleElements; exports.roundToDivide = roundToDivide; exports.approximateFraction = approximateFraction; exports.getOutputScale = getOutputScale; exports.scrollIntoView = scrollIntoView; exports.watchScroll = watchScroll; exports.binarySearchFirstItem = binarySearchFirstItem; exports.normalizeWheelEventDelta = normalizeWheelEventDelta; exports.animationStarted = animationStarted; exports.localized = localized; /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var pdfjsLib; if (typeof window !== 'undefined' && window['pdfjs-dist/build/pdf']) { pdfjsLib = window['pdfjs-dist/build/pdf']; } else { pdfjsLib = require('../build/pdf.js'); } module.exports = pdfjsLib; /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getGlobalEventBus = exports.attachDOMEventsToEventBus = undefined; var _ui_utils = __webpack_require__(0); function attachDOMEventsToEventBus(eventBus) { eventBus.on('documentload', function () { var event = document.createEvent('CustomEvent'); event.initCustomEvent('documentload', true, true, {}); window.dispatchEvent(event); }); eventBus.on('pagerendered', function (evt) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('pagerendered', true, true, { pageNumber: evt.pageNumber, cssTransform: evt.cssTransform }); evt.source.div.dispatchEvent(event); }); eventBus.on('textlayerrendered', function (evt) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('textlayerrendered', true, true, { pageNumber: evt.pageNumber }); evt.source.textLayerDiv.dispatchEvent(event); }); eventBus.on('pagechange', function (evt) { var event = document.createEvent('UIEvents'); event.initUIEvent('pagechange', true, true, window, 0); event.pageNumber = evt.pageNumber; evt.source.container.dispatchEvent(event); }); eventBus.on('pagesinit', function (evt) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('pagesinit', true, true, null); evt.source.container.dispatchEvent(event); }); eventBus.on('pagesloaded', function (evt) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('pagesloaded', true, true, { pagesCount: evt.pagesCount }); evt.source.container.dispatchEvent(event); }); eventBus.on('scalechange', function (evt) { var event = document.createEvent('UIEvents'); event.initUIEvent('scalechange', true, true, window, 0); event.scale = evt.scale; event.presetValue = evt.presetValue; evt.source.container.dispatchEvent(event); }); eventBus.on('updateviewarea', function (evt) { var event = document.createEvent('UIEvents'); event.initUIEvent('updateviewarea', true, true, window, 0); event.location = evt.location; evt.source.container.dispatchEvent(event); }); eventBus.on('find', function (evt) { if (evt.source === window) { return; } var event = document.createEvent('CustomEvent'); event.initCustomEvent('find' + evt.type, true, true, { query: evt.query, phraseSearch: evt.phraseSearch, caseSensitive: evt.caseSensitive, highlightAll: evt.highlightAll, findPrevious: evt.findPrevious }); window.dispatchEvent(event); }); eventBus.on('attachmentsloaded', function (evt) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('attachmentsloaded', true, true, { attachmentsCount: evt.attachmentsCount }); evt.source.container.dispatchEvent(event); }); eventBus.on('sidebarviewchanged', function (evt) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('sidebarviewchanged', true, true, { view: evt.view }); evt.source.outerContainer.dispatchEvent(event); }); eventBus.on('pagemode', function (evt) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('pagemode', true, true, { mode: evt.mode }); evt.source.pdfViewer.container.dispatchEvent(event); }); eventBus.on('namedaction', function (evt) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('namedaction', true, true, { action: evt.action }); evt.source.pdfViewer.container.dispatchEvent(event); }); eventBus.on('presentationmodechanged', function (evt) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('presentationmodechanged', true, true, { active: evt.active, switchInProgress: evt.switchInProgress }); window.dispatchEvent(event); }); eventBus.on('outlineloaded', function (evt) { var event = document.createEvent('CustomEvent'); event.initCustomEvent('outlineloaded', true, true, { outlineCount: evt.outlineCount }); evt.source.container.dispatchEvent(event); }); } var globalEventBus = null; function getGlobalEventBus() { if (globalEventBus) { return globalEventBus; } globalEventBus = new _ui_utils.EventBus(); attachDOMEventsToEventBus(globalEventBus); return globalEventBus; } exports.attachDOMEventsToEventBus = attachDOMEventsToEventBus; exports.getGlobalEventBus = getGlobalEventBus; /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var CLEANUP_TIMEOUT = 30000; var RenderingStates = { INITIAL: 0, RUNNING: 1, PAUSED: 2, FINISHED: 3 }; var PDFRenderingQueue = function () { function PDFRenderingQueue() { _classCallCheck(this, PDFRenderingQueue); this.pdfViewer = null; this.pdfThumbnailViewer = null; this.onIdle = null; this.highestPriorityPage = null; this.idleTimeout = null; this.printing = false; this.isThumbnailViewEnabled = false; } _createClass(PDFRenderingQueue, [{ key: "setViewer", value: function setViewer(pdfViewer) { this.pdfViewer = pdfViewer; } }, { key: "setThumbnailViewer", value: function setThumbnailViewer(pdfThumbnailViewer) { this.pdfThumbnailViewer = pdfThumbnailViewer; } }, { key: "isHighestPriority", value: function isHighestPriority(view) { return this.highestPriorityPage === view.renderingId; } }, { key: "renderHighestPriority", value: function renderHighestPriority(currentlyVisiblePages) { if (this.idleTimeout) { clearTimeout(this.idleTimeout); this.idleTimeout = null; } if (this.pdfViewer.forceRendering(currentlyVisiblePages)) { return; } if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) { if (this.pdfThumbnailViewer.forceRendering()) { return; } } if (this.printing) { return; } if (this.onIdle) { this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT); } } }, { key: "getHighestPriority", value: function getHighestPriority(visible, views, scrolledDown) { var visibleViews = visible.views; var numVisible = visibleViews.length; if (numVisible === 0) { return false; } for (var i = 0; i < numVisible; ++i) { var view = visibleViews[i].view; if (!this.isViewFinished(view)) { return view; } } if (scrolledDown) { var nextPageIndex = visible.last.id; if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) { return views[nextPageIndex]; } } else { var previousPageIndex = visible.first.id - 2; if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) { return views[previousPageIndex]; } } return null; } }, { key: "isViewFinished", value: function isViewFinished(view) { return view.renderingState === RenderingStates.FINISHED; } }, { key: "renderView", value: function renderView(view) { var _this = this; switch (view.renderingState) { case RenderingStates.FINISHED: return false; case RenderingStates.PAUSED: this.highestPriorityPage = view.renderingId; view.resume(); break; case RenderingStates.RUNNING: this.highestPriorityPage = view.renderingId; break; case RenderingStates.INITIAL: this.highestPriorityPage = view.renderingId; var continueRendering = function continueRendering() { _this.renderHighestPriority(); }; view.draw().then(continueRendering, continueRendering); break; } return true; } }]); return PDFRenderingQueue; }(); exports.RenderingStates = RenderingStates; exports.PDFRenderingQueue = PDFRenderingQueue; /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PDFPrintServiceFactory = exports.DefaultExternalServices = exports.PDFViewerApplication = undefined; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _ui_utils = __webpack_require__(0); var _pdfjsLib = __webpack_require__(1); var _pdf_cursor_tools = __webpack_require__(6); var _pdf_rendering_queue = __webpack_require__(3); var _pdf_sidebar = __webpack_require__(24); var _pdf_viewer = __webpack_require__(27); var _dom_events = __webpack_require__(2); var _overlay_manager = __webpack_require__(15); var _password_prompt = __webpack_require__(16); var _pdf_attachment_viewer = __webpack_require__(17); var _pdf_document_properties = __webpack_require__(18); var _pdf_find_bar = __webpack_require__(19); var _pdf_find_controller = __webpack_require__(7); var _pdf_history = __webpack_require__(20); var _pdf_link_service = __webpack_require__(5); var _pdf_outline_viewer = __webpack_require__(21); var _pdf_presentation_mode = __webpack_require__(23); var _pdf_thumbnail_viewer = __webpack_require__(26); var _secondary_toolbar = __webpack_require__(29); var _toolbar = __webpack_require__(31); var _view_history = __webpack_require__(32); var DEFAULT_SCALE_DELTA = 1.1; var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000; function configure(PDFJS) { PDFJS.imageResourcesPath = './images/'; PDFJS.workerSrc = '../build/pdf.worker.js'; PDFJS.cMapUrl = '../web/cmaps/'; PDFJS.cMapPacked = true; } var DefaultExternalServices = { updateFindControlState: function updateFindControlState(data) {}, initPassiveLoading: function initPassiveLoading(callbacks) {}, fallback: function fallback(data, callback) {}, reportTelemetry: function reportTelemetry(data) {}, createDownloadManager: function createDownloadManager() { throw new Error('Not implemented: createDownloadManager'); }, createPreferences: function createPreferences() { throw new Error('Not implemented: createPreferences'); }, createL10n: function createL10n() { throw new Error('Not implemented: createL10n'); }, supportsIntegratedFind: false, supportsDocumentFonts: true, supportsDocumentColors: true, supportedMouseWheelZoomModifierKeys: { ctrlKey: true, metaKey: true } }; var PDFViewerApplication = { initialBookmark: document.location.hash.substring(1), initialDestination: null, initialized: false, fellback: false, appConfig: null, pdfDocument: null, pdfLoadingTask: null, printService: null, pdfViewer: null, pdfThumbnailViewer: null, pdfRenderingQueue: null, pdfPresentationMode: null, pdfDocumentProperties: null, pdfLinkService: null, pdfHistory: null, pdfSidebar: null, pdfOutlineViewer: null, pdfAttachmentViewer: null, pdfCursorTools: null, store: null, downloadManager: null, overlayManager: null, preferences: null, toolbar: null, secondaryToolbar: null, eventBus: null, l10n: null, isInitialViewSet: false, downloadComplete: false, viewerPrefs: { sidebarViewOnLoad: _pdf_sidebar.SidebarView.NONE, pdfBugEnabled: false, showPreviousViewOnLoad: true, defaultZoomValue: '', disablePageMode: false, disablePageLabels: false, renderer: 'canvas', enhanceTextSelection: false, renderInteractiveForms: false, enablePrintAutoRotate: false }, isViewerEmbedded: window.parent !== window, url: '', baseUrl: '', externalServices: DefaultExternalServices, _boundEvents: {}, initialize: function initialize(appConfig) { var _this = this; this.preferences = this.externalServices.createPreferences(); configure(_pdfjsLib.PDFJS); this.appConfig = appConfig; return this._readPreferences().then(function () { return _this._initializeL10n(); }).then(function () { return _this._initializeViewerComponents(); }).then(function () { _this.bindEvents(); _this.bindWindowEvents(); var appContainer = appConfig.appContainer || document.documentElement; _this.l10n.translate(appContainer).then(function () { _this.eventBus.dispatch('localized'); }); if (_this.isViewerEmbedded && !_pdfjsLib.PDFJS.isExternalLinkTargetSet()) { _pdfjsLib.PDFJS.externalLinkTarget = _pdfjsLib.PDFJS.LinkTarget.TOP; } _this.initialized = true; }); }, _readPreferences: function _readPreferences() { var preferences = this.preferences, viewerPrefs = this.viewerPrefs; return Promise.all([preferences.get('enableWebGL').then(function resolved(value) { _pdfjsLib.PDFJS.disableWebGL = !value; }), preferences.get('sidebarViewOnLoad').then(function resolved(value) { viewerPrefs['sidebarViewOnLoad'] = value; }), preferences.get('pdfBugEnabled').then(function resolved(value) { viewerPrefs['pdfBugEnabled'] = value; }), preferences.get('showPreviousViewOnLoad').then(function resolved(value) { viewerPrefs['showPreviousViewOnLoad'] = value; }), preferences.get('defaultZoomValue').then(function resolved(value) { viewerPrefs['defaultZoomValue'] = value; }), preferences.get('enhanceTextSelection').then(function resolved(value) { viewerPrefs['enhanceTextSelection'] = value; }), preferences.get('disableTextLayer').then(function resolved(value) { if (_pdfjsLib.PDFJS.disableTextLayer === true) { return; } _pdfjsLib.PDFJS.disableTextLayer = value; }), preferences.get('disableRange').then(function resolved(value) { if (_pdfjsLib.PDFJS.disableRange === true) { return; } _pdfjsLib.PDFJS.disableRange = value; }), preferences.get('disableStream').then(function resolved(value) { if (_pdfjsLib.PDFJS.disableStream === true) { return; } _pdfjsLib.PDFJS.disableStream = value; }), preferences.get('disableAutoFetch').then(function resolved(value) { _pdfjsLib.PDFJS.disableAutoFetch = value; }), preferences.get('disableFontFace').then(function resolved(value) { if (_pdfjsLib.PDFJS.disableFontFace === true) { return; } _pdfjsLib.PDFJS.disableFontFace = value; }), preferences.get('useOnlyCssZoom').then(function resolved(value) { _pdfjsLib.PDFJS.useOnlyCssZoom = value; }), preferences.get('externalLinkTarget').then(function resolved(value) { if (_pdfjsLib.PDFJS.isExternalLinkTargetSet()) { return; } _pdfjsLib.PDFJS.externalLinkTarget = value; }), preferences.get('renderer').then(function resolved(value) { viewerPrefs['renderer'] = value; }), preferences.get('renderInteractiveForms').then(function resolved(value) { viewerPrefs['renderInteractiveForms'] = value; }), preferences.get('disablePageMode').then(function resolved(value) { viewerPrefs['disablePageMode'] = value; }), preferences.get('disablePageLabels').then(function resolved(value) { viewerPrefs['disablePageLabels'] = value; }), preferences.get('enablePrintAutoRotate').then(function resolved(value) { viewerPrefs['enablePrintAutoRotate'] = value; })]).catch(function (reason) {}); }, _initializeL10n: function _initializeL10n() { if (this.viewerPrefs['pdfBugEnabled']) { var hash = document.location.hash.substring(1); var hashParams = (0, _ui_utils.parseQueryString)(hash); if ('locale' in hashParams) { _pdfjsLib.PDFJS.locale = hashParams['locale']; } } this.l10n = this.externalServices.createL10n(); return this.l10n.getDirection().then(function (dir) { document.getElementsByTagName('html')[0].dir = dir; }); }, _initializeViewerComponents: function _initializeViewerComponents() { var _this2 = this; var appConfig = this.appConfig; return new Promise(function (resolve, reject) { _this2.overlayManager = new _overlay_manager.OverlayManager(); var eventBus = appConfig.eventBus || (0, _dom_events.getGlobalEventBus)(); _this2.eventBus = eventBus; var pdfRenderingQueue = new _pdf_rendering_queue.PDFRenderingQueue(); pdfRenderingQueue.onIdle = _this2.cleanup.bind(_this2); _this2.pdfRenderingQueue = pdfRenderingQueue; var pdfLinkService = new _pdf_link_service.PDFLinkService({ eventBus: eventBus }); _this2.pdfLinkService = pdfLinkService; var downloadManager = _this2.externalServices.createDownloadManager(); _this2.downloadManager = downloadManager; var container = appConfig.mainContainer; var viewer = appConfig.viewerContainer; _this2.pdfViewer = new _pdf_viewer.PDFViewer({ container: container, viewer: viewer, eventBus: eventBus, renderingQueue: pdfRenderingQueue, linkService: pdfLinkService, downloadManager: downloadManager, renderer: _this2.viewerPrefs['renderer'], l10n: _this2.l10n, enhanceTextSelection: _this2.viewerPrefs['enhanceTextSelection'], renderInteractiveForms: _this2.viewerPrefs['renderInteractiveForms'], enablePrintAutoRotate: _this2.viewerPrefs['enablePrintAutoRotate'] }); pdfRenderingQueue.setViewer(_this2.pdfViewer); pdfLinkService.setViewer(_this2.pdfViewer); var thumbnailContainer = appConfig.sidebar.thumbnailView; _this2.pdfThumbnailViewer = new _pdf_thumbnail_viewer.PDFThumbnailViewer({ container: thumbnailContainer, renderingQueue: pdfRenderingQueue, linkService: pdfLinkService, l10n: _this2.l10n }); pdfRenderingQueue.setThumbnailViewer(_this2.pdfThumbnailViewer); _this2.pdfHistory = new _pdf_history.PDFHistory({ linkService: pdfLinkService, eventBus: eventBus }); pdfLinkService.setHistory(_this2.pdfHistory); _this2.findController = new _pdf_find_controller.PDFFindController({ pdfViewer: _this2.pdfViewer }); _this2.findController.onUpdateResultsCount = function (matchCount) { if (_this2.supportsIntegratedFind) { return; } _this2.findBar.updateResultsCount(matchCount); }; _this2.findController.onUpdateState = function (state, previous, matchCount) { if (_this2.supportsIntegratedFind) { _this2.externalServices.updateFindControlState({ result: state, findPrevious: previous }); } else { _this2.findBar.updateUIState(state, previous, matchCount); } }; _this2.pdfViewer.setFindController(_this2.findController); var findBarConfig = Object.create(appConfig.findBar); findBarConfig.findController = _this2.findController; findBarConfig.eventBus = eventBus; _this2.findBar = new _pdf_find_bar.PDFFindBar(findBarConfig, _this2.l10n); _this2.pdfDocumentProperties = new _pdf_document_properties.PDFDocumentProperties(appConfig.documentProperties, _this2.overlayManager, _this2.l10n); _this2.pdfCursorTools = new _pdf_cursor_tools.PDFCursorTools({ container: container, eventBus: eventBus, preferences: _this2.preferences }); _this2.toolbar = new _toolbar.Toolbar(appConfig.toolbar, container, eventBus, _this2.l10n); _this2.secondaryToolbar = new _secondary_toolbar.SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus); if (_this2.supportsFullscreen) { _this2.pdfPresentationMode = new _pdf_presentation_mode.PDFPresentationMode({ container: container, viewer: viewer, pdfViewer: _this2.pdfViewer, eventBus: eventBus, contextMenuItems: appConfig.fullscreen }); } _this2.passwordPrompt = new _password_prompt.PasswordPrompt(appConfig.passwordOverlay, _this2.overlayManager, _this2.l10n); _this2.pdfOutlineViewer = new _pdf_outline_viewer.PDFOutlineViewer({ container: appConfig.sidebar.outlineView, eventBus: eventBus, linkService: pdfLinkService }); _this2.pdfAttachmentViewer = new _pdf_attachment_viewer.PDFAttachmentViewer({ container: appConfig.sidebar.attachmentsView, eventBus: eventBus, downloadManager: downloadManager }); var sidebarConfig = Object.create(appConfig.sidebar); sidebarConfig.pdfViewer = _this2.pdfViewer; sidebarConfig.pdfThumbnailViewer = _this2.pdfThumbnailViewer; sidebarConfig.pdfOutlineViewer = _this2.pdfOutlineViewer; sidebarConfig.eventBus = eventBus; _this2.pdfSidebar = new _pdf_sidebar.PDFSidebar(sidebarConfig, _this2.l10n); _this2.pdfSidebar.onToggled = _this2.forceRendering.bind(_this2); resolve(undefined); }); }, run: function run(config) { this.initialize(config).then(webViewerInitialized); }, zoomIn: function zoomIn(ticks) { var newScale = this.pdfViewer.currentScale; do { newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2); newScale = Math.ceil(newScale * 10) / 10; newScale = Math.min(_ui_utils.MAX_SCALE, newScale); } while (--ticks > 0 && newScale < _ui_utils.MAX_SCALE); this.pdfViewer.currentScaleValue = newScale; }, zoomOut: function zoomOut(ticks) { var newScale = this.pdfViewer.currentScale; do { newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2); newScale = Math.floor(newScale * 10) / 10; newScale = Math.max(_ui_utils.MIN_SCALE, newScale); } while (--ticks > 0 && newScale > _ui_utils.MIN_SCALE); this.pdfViewer.currentScaleValue = newScale; }, get pagesCount() { return this.pdfDocument ? this.pdfDocument.numPages : 0; }, get pageRotation() { return this.pdfViewer.pagesRotation; }, set page(val) { this.pdfViewer.currentPageNumber = val; }, get page() { return this.pdfViewer.currentPageNumber; }, get printing() { return !!this.printService; }, get supportsPrinting() { return PDFPrintServiceFactory.instance.supportsPrinting; }, get supportsFullscreen() { var support = void 0; var doc = document.documentElement; support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || doc.webkitRequestFullScreen || doc.msRequestFullscreen); if (document.fullscreenEnabled === false || document.mozFullScreenEnabled === false || document.webkitFullscreenEnabled === false || document.msFullscreenEnabled === false) { support = false; } if (support && _pdfjsLib.PDFJS.disableFullscreen === true) { support = false; } return (0, _pdfjsLib.shadow)(this, 'supportsFullscreen', support); }, get supportsIntegratedFind() { return this.externalServices.supportsIntegratedFind; }, get supportsDocumentFonts() { return this.externalServices.supportsDocumentFonts; }, get supportsDocumentColors() { return this.externalServices.supportsDocumentColors; }, get loadingBar() { var bar = new _ui_utils.ProgressBar('#loadingBar'); return (0, _pdfjsLib.shadow)(this, 'loadingBar', bar); }, get supportedMouseWheelZoomModifierKeys() { return this.externalServices.supportedMouseWheelZoomModifierKeys; }, initPassiveLoading: function initPassiveLoading() { throw new Error('Not implemented: initPassiveLoading'); }, setTitleUsingUrl: function setTitleUsingUrl(url) { this.url = url; this.baseUrl = url.split('#')[0]; var title = (0, _ui_utils.getPDFFileNameFromURL)(url, ''); if (!title) { try { title = decodeURIComponent((0, _pdfjsLib.getFilenameFromUrl)(url)) || url; } catch (ex) { title = url; } } this.setTitle(title); }, setTitle: function setTitle(title) { if (this.isViewerEmbedded) { return; } document.title = title; }, close: function close() { var errorWrapper = this.appConfig.errorWrapper.container; errorWrapper.setAttribute('hidden', 'true'); if (!this.pdfLoadingTask) { return Promise.resolve(); } var promise = this.pdfLoadingTask.destroy(); this.pdfLoadingTask = null; if (this.pdfDocument) { this.pdfDocument = null; this.pdfThumbnailViewer.setDocument(null); this.pdfViewer.setDocument(null); this.pdfLinkService.setDocument(null, null); this.pdfDocumentProperties.setDocument(null, null); } this.store = null; this.isInitialViewSet = false; this.downloadComplete = false; this.pdfSidebar.reset(); this.pdfOutlineViewer.reset(); this.pdfAttachmentViewer.reset(); this.findController.reset(); this.findBar.reset(); this.toolbar.reset(); this.secondaryToolbar.reset(); if (typeof PDFBug !== 'undefined') { PDFBug.cleanup(); } return promise; }, open: function open(file, args) { var _this3 = this; if (arguments.length > 2 || typeof args === 'number') { return Promise.reject(new Error('Call of open() with obsolete signature.')); } if (this.pdfLoadingTask) { return this.close().then(function () { _this3.preferences.reload(); return _this3.open(file, args); }); } var parameters = Object.create(null), scale = void 0; if (typeof file === 'string') { this.setTitleUsingUrl(file); parameters.url = file; } else if (file && 'byteLength' in file) { parameters.data = file; } else if (file.url && file.originalUrl) { this.setTitleUsingUrl(file.originalUrl); parameters.url = file.url; } if (args) { for (var prop in args) { parameters[prop] = args[prop]; } if (args.scale) { scale = args.scale; } if (args.length) { this.pdfDocumentProperties.setFileSize(args.length); } } var loadingTask = (0, _pdfjsLib.getDocument)(parameters); this.pdfLoadingTask = loadingTask; loadingTask.onPassword = function (updateCallback, reason) { _this3.passwordPrompt.setUpdateCallback(updateCallback, reason); _this3.passwordPrompt.open(); }; loadingTask.onProgress = function (_ref) { var loaded = _ref.loaded, total = _ref.total; _this3.progress(loaded / total); }; loadingTask.onUnsupportedFeature = this.fallback.bind(this); return loadingTask.promise.then(function (pdfDocument) { _this3.load(pdfDocument, scale); }, function (exception) { var message = exception && exception.message; var loadingErrorMessage = void 0; if (exception instanceof _pdfjsLib.InvalidPDFException) { loadingErrorMessage = _this3.l10n.get('invalid_file_error', null, 'Invalid or corrupted PDF file.'); } else if (exception instanceof _pdfjsLib.MissingPDFException) { loadingErrorMessage = _this3.l10n.get('missing_file_error', null, 'Missing PDF file.'); } else if (exception instanceof _pdfjsLib.UnexpectedResponseException) { loadingErrorMessage = _this3.l10n.get('unexpected_response_error', null, 'Unexpected server response.'); } else { loadingErrorMessage = _this3.l10n.get('loading_error', null, 'An error occurred while loading the PDF.'); } return loadingErrorMessage.then(function (msg) { _this3.error(msg, { message: message }); throw new Error(msg); }); }); }, download: function download() { var _this4 = this; function downloadByUrl() { downloadManager.downloadUrl(url, filename); } var url = this.baseUrl; var filename = (0, _ui_utils.getPDFFileNameFromURL)(this.url); var downloadManager = this.downloadManager; downloadManager.onerror = function (err) { _this4.error('PDF failed to download: ' + err); }; if (!this.pdfDocument || !this.downloadComplete) { downloadByUrl(); return; } this.pdfDocument.getData().then(function (data) { var blob = (0, _pdfjsLib.createBlob)(data, 'application/pdf'); downloadManager.download(blob, url, filename); }).catch(downloadByUrl); }, fallback: function fallback(featureId) {}, error: function error(message, moreInfo) { var moreInfoText = [this.l10n.get('error_version_info', { version: _pdfjsLib.version || '?', build: _pdfjsLib.build || '?' }, 'PDF.js v{{version}} (build: {{build}})')]; if (moreInfo) { moreInfoText.push(this.l10n.get('error_message', { message: moreInfo.message }, 'Message: {{message}}')); if (moreInfo.stack) { moreInfoText.push(this.l10n.get('error_stack', { stack: moreInfo.stack }, 'Stack: {{stack}}')); } else { if (moreInfo.filename) { moreInfoText.push(this.l10n.get('error_file', { file: moreInfo.filename }, 'File: {{file}}')); } if (moreInfo.lineNumber) { moreInfoText.push(this.l10n.get('error_line', { line: moreInfo.lineNumber }, 'Line: {{line}}')); } } } var errorWrapperConfig = this.appConfig.errorWrapper; var errorWrapper = errorWrapperConfig.container; errorWrapper.removeAttribute('hidden'); var errorMessage = errorWrapperConfig.errorMessage; errorMessage.textContent = message; var closeButton = errorWrapperConfig.closeButton; closeButton.onclick = function () { errorWrapper.setAttribute('hidden', 'true'); }; var errorMoreInfo = errorWrapperConfig.errorMoreInfo; var moreInfoButton = errorWrapperConfig.moreInfoButton; var less