/** * @licstart The following is the entire license notice for the * Javascript code in this page * * Copyright 2021 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. * * @licend The above is the entire license notice for the * Javascript code in this page */ (function webpackUniversalModuleDefinition (root, factory) { if (typeof exports === 'object' && typeof module === 'object') module.exports = factory() else if (typeof define === 'function' && define.amd) define('pdfjs-dist/web/pdf_viewer', [], factory) else if (typeof exports === 'object') exports['pdfjs-dist/web/pdf_viewer'] = factory() else root['pdfjs-dist/web/pdf_viewer'] = root.pdfjsViewer = factory() })(this, function () { return /******/ (() => { // webpackBootstrap /******/ 'use strict' /******/ var __webpack_modules__ = ([ /* 0 */, /* 1 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.DefaultAnnotationLayerFactory = exports.AnnotationLayerBuilder = void 0 var _pdfjsLib = __w_pdfjs_require__(2) var _l10n_utils = __w_pdfjs_require__(3) var _pdf_link_service = __w_pdfjs_require__(4) class AnnotationLayerBuilder { constructor ({ pageDiv, pdfPage, linkService, downloadManager, annotationStorage = null, imageResourcesPath = '', renderInteractiveForms = true, l10n = _l10n_utils.NullL10n, enableScripting = false, hasJSActionsPromise = null, mouseState = null }) { this.pageDiv = pageDiv this.pdfPage = pdfPage this.linkService = linkService this.downloadManager = downloadManager this.imageResourcesPath = imageResourcesPath this.renderInteractiveForms = renderInteractiveForms this.l10n = l10n this.annotationStorage = annotationStorage this.enableScripting = enableScripting this._hasJSActionsPromise = hasJSActionsPromise this._mouseState = mouseState this.div = null this._cancelled = false } render (viewport, intent = 'display') { return Promise.all([this.pdfPage.getAnnotations({ intent }), this._hasJSActionsPromise]).then(([annotations, hasJSActions = false]) => { if (this._cancelled) { return } if (annotations.length === 0) { return } const parameters = { viewport: viewport.clone({ dontFlip: true }), div: this.div, annotations, page: this.pdfPage, imageResourcesPath: this.imageResourcesPath, renderInteractiveForms: this.renderInteractiveForms, linkService: this.linkService, downloadManager: this.downloadManager, annotationStorage: this.annotationStorage, enableScripting: this.enableScripting, hasJSActions, mouseState: this._mouseState } if (this.div) { _pdfjsLib.AnnotationLayer.update(parameters) } else { this.div = document.createElement('div') this.div.className = 'annotationLayer' this.pageDiv.appendChild(this.div) parameters.div = this.div _pdfjsLib.AnnotationLayer.render(parameters) this.l10n.translate(this.div) } }) } cancel () { this._cancelled = true } hide () { if (!this.div) { return } this.div.hidden = true } } exports.AnnotationLayerBuilder = AnnotationLayerBuilder class DefaultAnnotationLayerFactory { createAnnotationLayerBuilder (pageDiv, pdfPage, annotationStorage = null, imageResourcesPath = '', renderInteractiveForms = true, l10n = _l10n_utils.NullL10n, enableScripting = false, hasJSActionsPromise = null, mouseState = null) { return new AnnotationLayerBuilder({ pageDiv, pdfPage, imageResourcesPath, renderInteractiveForms, linkService: new _pdf_link_service.SimpleLinkService(), l10n, annotationStorage, enableScripting, hasJSActionsPromise, mouseState }) } } exports.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory /***/ }), /* 2 */ /***/ ((module) => { let 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 /***/ }), /* 3 */ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.getL10nFallback = getL10nFallback exports.NullL10n = void 0 const DEFAULT_L10N_STRINGS = { of_pages: 'of {{pagesCount}}', page_of_pages: '({{pageNumber}} of {{pagesCount}})', document_properties_kb: '{{size_kb}} KB ({{size_b}} bytes)', document_properties_mb: '{{size_mb}} MB ({{size_b}} bytes)', document_properties_date_string: '{{date}}, {{time}}', document_properties_page_size_unit_inches: 'in', document_properties_page_size_unit_millimeters: 'mm', document_properties_page_size_orientation_portrait: 'portrait', document_properties_page_size_orientation_landscape: 'landscape', document_properties_page_size_name_a3: 'A3', document_properties_page_size_name_a4: 'A4', document_properties_page_size_name_letter: 'Letter', document_properties_page_size_name_legal: 'Legal', document_properties_page_size_dimension_string: '{{width}} × {{height}} {{unit}} ({{orientation}})', document_properties_page_size_dimension_name_string: '{{width}} × {{height}} {{unit}} ({{name}}, {{orientation}})', document_properties_linearized_yes: 'Yes', document_properties_linearized_no: 'No', print_progress_percent: '{{progress}}%', 'toggle_sidebar.title': 'Toggle Sidebar', 'toggle_sidebar_notification2.title': 'Toggle Sidebar (document contains outline/attachments/layers)', additional_layers: 'Additional Layers', page_landmark: 'Page {{page}}', thumb_page_title: 'Page {{page}}', thumb_page_canvas: 'Thumbnail of Page {{page}}', find_reached_top: 'Reached top of document, continued from bottom', find_reached_bottom: 'Reached end of document, continued from top', 'find_match_count[one]': '{{current}} of {{total}} match', 'find_match_count[other]': '{{current}} of {{total}} matches', 'find_match_count_limit[one]': 'More than {{limit}} match', 'find_match_count_limit[other]': 'More than {{limit}} matches', find_not_found: 'Phrase not found', error_version_info: 'PDF.js v{{version}} (build: {{build}})', error_message: 'Message: {{message}}', error_stack: 'Stack: {{stack}}', error_file: 'File: {{file}}', error_line: 'Line: {{line}}', rendering_error: 'An error occurred while rendering the page.', page_scale_width: 'Page Width', page_scale_fit: 'Page Fit', page_scale_auto: 'Automatic Zoom', page_scale_actual: 'Actual Size', page_scale_percent: '{{scale}}%', loading: 'Loading…', loading_error: 'An error occurred while loading the PDF.', invalid_file_error: 'Invalid or corrupted PDF file.', missing_file_error: 'Missing PDF file.', unexpected_response_error: 'Unexpected server response.', printing_not_supported: 'Warning: Printing is not fully supported by this browser.', printing_not_ready: 'Warning: The PDF is not fully loaded for printing.', web_fonts_disabled: 'Web fonts are disabled: unable to use embedded PDF fonts.' } function getL10nFallback (key, args) { switch (key) { case 'find_match_count': key = `find_match_count[${args.total === 1 ? 'one' : 'other'}]` break case 'find_match_count_limit': key = `find_match_count_limit[${args.limit === 1 ? 'one' : 'other'}]` break } return DEFAULT_L10N_STRINGS[key] || '' } function formatL10nValue (text, args) { if (!args) { return text } return text.replace(/\{\{\s*(\w+)\s*\}\}/g, (all, name) => { return name in args ? args[name] : '{{' + name + '}}' }) } const NullL10n = { async getLanguage () { return 'en-us' }, async getDirection () { return 'ltr' }, async get (key, args = null, fallback = getL10nFallback(key, args)) { return formatL10nValue(fallback, args) }, async translate (element) {} } exports.NullL10n = NullL10n /***/ }), /* 4 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.SimpleLinkService = exports.PDFLinkService = void 0 var _ui_utils = __w_pdfjs_require__(5) class PDFLinkService { constructor ({ eventBus, externalLinkTarget = null, externalLinkRel = null, externalLinkEnabled = true, ignoreDestinationZoom = false } = {}) { this.eventBus = eventBus this.externalLinkTarget = externalLinkTarget this.externalLinkRel = externalLinkRel this.externalLinkEnabled = externalLinkEnabled this._ignoreDestinationZoom = ignoreDestinationZoom this.baseUrl = null this.pdfDocument = null this.pdfViewer = null this.pdfHistory = null this._pagesRefCache = null } setDocument (pdfDocument, baseUrl = null) { this.baseUrl = baseUrl this.pdfDocument = pdfDocument this._pagesRefCache = Object.create(null) } setViewer (pdfViewer) { this.pdfViewer = pdfViewer } setHistory (pdfHistory) { this.pdfHistory = pdfHistory } get pagesCount () { return this.pdfDocument ? this.pdfDocument.numPages : 0 } get page () { return this.pdfViewer.currentPageNumber } set page (value) { this.pdfViewer.currentPageNumber = value } get rotation () { return this.pdfViewer.pagesRotation } set rotation (value) { this.pdfViewer.pagesRotation = value } navigateTo (dest) { console.error('Deprecated method: `navigateTo`, use `goToDestination` instead.') this.goToDestination(dest) } _goToDestinationHelper (rawDest, namedDest = null, explicitDest) { const destRef = explicitDest[0] let pageNumber if (destRef instanceof Object) { pageNumber = this._cachedPageNumber(destRef) if (pageNumber === null) { this.pdfDocument.getPageIndex(destRef).then(pageIndex => { this.cachePageRef(pageIndex + 1, destRef) this._goToDestinationHelper(rawDest, namedDest, explicitDest) }).catch(() => { console.error(`PDFLinkService._goToDestinationHelper: "${destRef}" is not ` + `a valid page reference, for dest="${rawDest}".`) }) return } } else if (Number.isInteger(destRef)) { pageNumber = destRef + 1 } else { console.error(`PDFLinkService._goToDestinationHelper: "${destRef}" is not ` + `a valid destination reference, for dest="${rawDest}".`) return } if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) { console.error(`PDFLinkService._goToDestinationHelper: "${pageNumber}" is not ` + `a valid page number, for dest="${rawDest}".`) return } if (this.pdfHistory) { this.pdfHistory.pushCurrentPosition() this.pdfHistory.push({ namedDest, explicitDest, pageNumber }) } this.pdfViewer.scrollPageIntoView({ pageNumber, destArray: explicitDest, ignoreDestinationZoom: this._ignoreDestinationZoom }) } async goToDestination (dest) { if (!this.pdfDocument) { return } let namedDest, explicitDest if (typeof dest === 'string') { namedDest = dest explicitDest = await this.pdfDocument.getDestination(dest) } else { namedDest = null explicitDest = await dest } if (!Array.isArray(explicitDest)) { console.error(`PDFLinkService.goToDestination: "${explicitDest}" is not ` + `a valid destination array, for dest="${dest}".`) return } this._goToDestinationHelper(dest, namedDest, explicitDest) } goToPage (val) { if (!this.pdfDocument) { return } const pageNumber = typeof val === 'string' && this.pdfViewer.pageLabelToPageNumber(val) || val | 0 if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) { console.error(`PDFLinkService.goToPage: "${val}" is not a valid page.`) return } if (this.pdfHistory) { this.pdfHistory.pushCurrentPosition() this.pdfHistory.pushPage(pageNumber) } this.pdfViewer.scrollPageIntoView({ pageNumber }) } getDestinationHash (dest) { if (typeof dest === 'string') { if (dest.length > 0) { return this.getAnchorUrl('#' + escape(dest)) } } else if (Array.isArray(dest)) { const str = JSON.stringify(dest) if (str.length > 0) { return this.getAnchorUrl('#' + escape(str)) } } return this.getAnchorUrl('') } getAnchorUrl (anchor) { return (this.baseUrl || '') + anchor } setHash (hash) { if (!this.pdfDocument) { return } let pageNumber, dest if (hash.includes('=')) { const params = (0, _ui_utils.parseQueryString)(hash) if ('search' in params) { this.eventBus.dispatch('findfromurlhash', { source: this, query: params.search.replace(/"/g, ''), phraseSearch: params.phrase === 'true' }) } if ('page' in params) { pageNumber = params.page | 0 || 1 } if ('zoom' in params) { const zoomArgs = params.zoom.split(',') const zoomArg = zoomArgs[0] const zoomArgNumber = parseFloat(zoomArg) if (!zoomArg.includes('Fit')) { dest = [null, { name: 'XYZ' }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg] } else { if (zoomArg === 'Fit' || zoomArg === 'FitB') { dest = [null, { name: zoomArg }] } else if (zoomArg === 'FitH' || zoomArg === 'FitBH' || zoomArg === 'FitV' || zoomArg === 'FitBV') { dest = [null, { name: zoomArg }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null] } else if (zoomArg === 'FitR') { if (zoomArgs.length !== 5) { console.error('PDFLinkService.setHash: Not enough parameters for "FitR".') } else { dest = [null, { name: zoomArg }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0] } } else { console.error(`PDFLinkService.setHash: "${zoomArg}" is not ` + 'a valid zoom value.') } } } if (dest) { this.pdfViewer.scrollPageIntoView({ pageNumber: pageNumber || this.page, destArray: dest, allowNegativeOffset: true }) } else if (pageNumber) { this.page = pageNumber } if ('pagemode' in params) { this.eventBus.dispatch('pagemode', { source: this, mode: params.pagemode }) } if ('nameddest' in params) { this.goToDestination(params.nameddest) } } else { dest = unescape(hash) try { dest = JSON.parse(dest) if (!Array.isArray(dest)) { dest = dest.toString() } } catch (ex) {} if (typeof dest === 'string' || isValidExplicitDestination(dest)) { this.goToDestination(dest) return } console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not ` + 'a valid destination.') } } executeNamedAction (action) { switch (action) { case 'GoBack': if (this.pdfHistory) { this.pdfHistory.back() } break case 'GoForward': if (this.pdfHistory) { this.pdfHistory.forward() } break case 'NextPage': this.pdfViewer.nextPage() break case 'PrevPage': this.pdfViewer.previousPage() break case 'LastPage': this.page = this.pagesCount break case 'FirstPage': this.page = 1 break default: break } this.eventBus.dispatch('namedaction', { source: this, action }) } cachePageRef (pageNum, pageRef) { if (!pageRef) { return } const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}` this._pagesRefCache[refStr] = pageNum } _cachedPageNumber (pageRef) { const refStr = pageRef.gen === 0 ? `${pageRef.num}R` : `${pageRef.num}R${pageRef.gen}` return this._pagesRefCache?.[refStr] || null } isPageVisible (pageNumber) { return this.pdfViewer.isPageVisible(pageNumber) } isPageCached (pageNumber) { return this.pdfViewer.isPageCached(pageNumber) } } exports.PDFLinkService = PDFLinkService function isValidExplicitDestination (dest) { if (!Array.isArray(dest)) { return false } const destLength = dest.length if (destLength < 2) { return false } const page = dest[0] if (!(typeof page === 'object' && Number.isInteger(page.num) && Number.isInteger(page.gen)) && !(Number.isInteger(page) && page >= 0)) { return false } const zoom = dest[1] if (!(typeof zoom === 'object' && typeof zoom.name === 'string')) { return false } let allowNull = true switch (zoom.name) { case 'XYZ': if (destLength !== 5) { return false } break case 'Fit': case 'FitB': return destLength === 2 case 'FitH': case 'FitBH': case 'FitV': case 'FitBV': if (destLength !== 3) { return false } break case 'FitR': if (destLength !== 6) { return false } allowNull = false break default: return false } for (let i = 2; i < destLength; i++) { const param = dest[i] if (!(typeof param === 'number' || allowNull && param === null)) { return false } } return true } class SimpleLinkService { constructor () { this.externalLinkTarget = null this.externalLinkRel = null this.externalLinkEnabled = true this._ignoreDestinationZoom = false } get pagesCount () { return 0 } get page () { return 0 } set page (value) {} get rotation () { return 0 } set rotation (value) {} async goToDestination (dest) {} goToPage (val) {} getDestinationHash (dest) { return '#' } getAnchorUrl (hash) { return '#' } setHash (hash) {} executeNamedAction (action) {} cachePageRef (pageNum, pageRef) {} isPageVisible (pageNumber) { return true } isPageCached (pageNumber) { return true } } exports.SimpleLinkService = SimpleLinkService /***/ }), /* 5 */ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.apiPageLayoutToSpreadMode = apiPageLayoutToSpreadMode exports.apiPageModeToSidebarView = apiPageModeToSidebarView exports.approximateFraction = approximateFraction exports.backtrackBeforeAllVisibleElements = backtrackBeforeAllVisibleElements exports.binarySearchFirstItem = binarySearchFirstItem exports.getActiveOrFocusedElement = getActiveOrFocusedElement exports.getOutputScale = getOutputScale exports.getPageSizeInches = getPageSizeInches exports.getVisibleElements = getVisibleElements exports.isPortraitOrientation = isPortraitOrientation exports.isValidRotation = isValidRotation exports.isValidScrollMode = isValidScrollMode exports.isValidSpreadMode = isValidSpreadMode exports.moveToEndOfArray = moveToEndOfArray exports.noContextMenuHandler = noContextMenuHandler exports.normalizeWheelEventDelta = normalizeWheelEventDelta exports.normalizeWheelEventDirection = normalizeWheelEventDirection exports.parseQueryString = parseQueryString exports.roundToDivide = roundToDivide exports.scrollIntoView = scrollIntoView exports.waitOnEventOrTimeout = waitOnEventOrTimeout exports.watchScroll = watchScroll exports.WaitOnType = exports.VERTICAL_PADDING = exports.UNKNOWN_SCALE = exports.TextLayerMode = exports.SpreadMode = exports.SidebarView = exports.ScrollMode = exports.SCROLLBAR_PADDING = exports.RendererType = exports.ProgressBar = exports.PresentationModeState = exports.MIN_SCALE = exports.MAX_SCALE = exports.MAX_AUTO_SCALE = exports.EventBus = exports.DEFAULT_SCALE_VALUE = exports.DEFAULT_SCALE = exports.CSS_UNITS = exports.AutoPrintRegExp = exports.animationStarted = void 0 const CSS_UNITS = 96.0 / 72.0 exports.CSS_UNITS = CSS_UNITS const DEFAULT_SCALE_VALUE = 'auto' exports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE const DEFAULT_SCALE = 1.0 exports.DEFAULT_SCALE = DEFAULT_SCALE const MIN_SCALE = 0.1 exports.MIN_SCALE = MIN_SCALE const MAX_SCALE = 10.0 exports.MAX_SCALE = MAX_SCALE const UNKNOWN_SCALE = 0 exports.UNKNOWN_SCALE = UNKNOWN_SCALE const MAX_AUTO_SCALE = 1.25 exports.MAX_AUTO_SCALE = MAX_AUTO_SCALE const SCROLLBAR_PADDING = 40 exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING const VERTICAL_PADDING = 5 exports.VERTICAL_PADDING = VERTICAL_PADDING const LOADINGBAR_END_OFFSET_VAR = '--loadingBar-end-offset' const PresentationModeState = { UNKNOWN: 0, NORMAL: 1, CHANGING: 2, FULLSCREEN: 3 } exports.PresentationModeState = PresentationModeState const SidebarView = { UNKNOWN: -1, NONE: 0, THUMBS: 1, OUTLINE: 2, ATTACHMENTS: 3, LAYERS: 4 } exports.SidebarView = SidebarView const RendererType = { CANVAS: 'canvas', SVG: 'svg' } exports.RendererType = RendererType const TextLayerMode = { DISABLE: 0, ENABLE: 1, ENABLE_ENHANCE: 2 } exports.TextLayerMode = TextLayerMode const ScrollMode = { UNKNOWN: -1, VERTICAL: 0, HORIZONTAL: 1, WRAPPED: 2 } exports.ScrollMode = ScrollMode const SpreadMode = { UNKNOWN: -1, NONE: 0, ODD: 1, EVEN: 2 } exports.SpreadMode = SpreadMode const AutoPrintRegExp = /\bprint\s*\(/ exports.AutoPrintRegExp = AutoPrintRegExp function getOutputScale (ctx) { const devicePixelRatio = window.devicePixelRatio || 1 const backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.backingStorePixelRatio || 1 const pixelRatio = devicePixelRatio / backingStoreRatio return { sx: pixelRatio, sy: pixelRatio, scaled: pixelRatio !== 1 } } function scrollIntoView (element, spot, skipOverflowHiddenElements = true) { let parent = element.offsetParent if (!parent) { console.error('offsetParent is not set -- cannot scroll') return } let offsetY = element.offsetTop + element.clientTop let offsetX = element.offsetLeft + element.clientLeft while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || 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 } } if (parent && parent.classList.contains('pdfViewer')) { parent = parent.parentElement } parent.scrollTop = offsetY } function watchScroll (viewAreaElement, callback) { const debounceScroll = function (evt) { if (rAF) { return } rAF = window.requestAnimationFrame(function viewAreaElementScrolled () { rAF = null const currentX = viewAreaElement.scrollLeft const lastX = state.lastX if (currentX !== lastX) { state.right = currentX > lastX } state.lastX = currentX const currentY = viewAreaElement.scrollTop const lastY = state.lastY if (currentY !== lastY) { state.down = currentY > lastY } state.lastY = currentY callback(state) }) } const state = { right: true, down: true, lastX: viewAreaElement.scrollLeft, lastY: viewAreaElement.scrollTop, _eventHandler: debounceScroll } let rAF = null viewAreaElement.addEventListener('scroll', debounceScroll, true) return state } function parseQueryString (query) { const parts = query.split('&') const params = Object.create(null) for (let i = 0, ii = parts.length; i < ii; ++i) { const param = parts[i].split('=') const key = param[0].toLowerCase() const value = param.length > 1 ? param[1] : null params[decodeURIComponent(key)] = decodeURIComponent(value) } return params } function binarySearchFirstItem (items, condition) { let minIndex = 0 let maxIndex = items.length - 1 if (maxIndex < 0 || !condition(items[maxIndex])) { return items.length } if (condition(items[minIndex])) { return minIndex } while (minIndex < maxIndex) { const currentIndex = minIndex + maxIndex >> 1 const 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] } const xinv = 1 / x const limit = 8 if (xinv > limit) { return [1, limit] } else if (Math.floor(xinv) === xinv) { return [1, xinv] } const x_ = x > 1 ? xinv : x let a = 0, b = 1, c = 1, d = 1 while (true) { const p = a + c, q = b + d if (q > limit) { break } if (x_ <= p / q) { c = p d = q } else { a = p b = q } } let result 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) { const r = x % div return r === 0 ? x : Math.round(x - r + div) } function getPageSizeInches ({ view, userUnit, rotate }) { const [x1, y1, x2, y2] = view const changeOrientation = rotate % 180 !== 0 const width = (x2 - x1) / 72 * userUnit const height = (y2 - y1) / 72 * userUnit return { width: changeOrientation ? height : width, height: changeOrientation ? width : height } } function backtrackBeforeAllVisibleElements (index, views, top) { if (index < 2) { return index } let elt = views[index].div let pageTop = elt.offsetTop + elt.clientTop if (pageTop >= top) { elt = views[index - 1].div pageTop = elt.offsetTop + elt.clientTop } for (let i = index - 2; i >= 0; --i) { elt = views[i].div if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) { break } index = i } return index } function getVisibleElements ({ scrollEl, views, sortByVisibility = false, horizontal = false, rtl = false }) { const top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight const left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth function isElementBottomAfterViewTop (view) { const element = view.div const elementBottom = element.offsetTop + element.clientTop + element.clientHeight return elementBottom > top } function isElementNextAfterViewHorizontally (view) { const element = view.div const elementLeft = element.offsetLeft + element.clientLeft const elementRight = elementLeft + element.clientWidth return rtl ? elementLeft < right : elementRight > left } const visible = [], numViews = views.length let firstVisibleElementInd = binarySearchFirstItem(views, horizontal ? isElementNextAfterViewHorizontally : isElementBottomAfterViewTop) if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) { firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top) } let lastEdge = horizontal ? right : -1 for (let i = firstVisibleElementInd; i < numViews; i++) { const view = views[i], element = view.div const currentWidth = element.offsetLeft + element.clientLeft const currentHeight = element.offsetTop + element.clientTop const viewWidth = element.clientWidth, viewHeight = element.clientHeight const viewRight = currentWidth + viewWidth const viewBottom = currentHeight + viewHeight if (lastEdge === -1) { if (viewBottom >= bottom) { lastEdge = viewBottom } } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) { break } if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) { continue } const hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom) const hiddenWidth = Math.max(0, left - currentWidth) + Math.max(0, viewRight - right) const fractionHeight = (viewHeight - hiddenHeight) / viewHeight, fractionWidth = (viewWidth - hiddenWidth) / viewWidth const percent = fractionHeight * fractionWidth * 100 | 0 visible.push({ id: view.id, x: currentWidth, y: currentHeight, view, percent, widthPercent: fractionWidth * 100 | 0 }) } const first = visible[0], last = visible[visible.length - 1] if (sortByVisibility) { visible.sort(function (a, b) { const pc = a.percent - b.percent if (Math.abs(pc) > 0.001) { return -pc } return a.id - b.id }) } return { first, last, views: visible } } function noContextMenuHandler (evt) { evt.preventDefault() } function normalizeWheelEventDirection (evt) { let delta = Math.hypot(evt.deltaX, evt.deltaY) const angle = Math.atan2(evt.deltaY, evt.deltaX) if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) { delta = -delta } return delta } function normalizeWheelEventDelta (evt) { let delta = normalizeWheelEventDirection(evt) const MOUSE_DOM_DELTA_PIXEL_MODE = 0 const MOUSE_DOM_DELTA_LINE_MODE = 1 const MOUSE_PIXELS_PER_LINE = 30 const 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 isValidRotation (angle) { return Number.isInteger(angle) && angle % 90 === 0 } function isValidScrollMode (mode) { return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN } function isValidSpreadMode (mode) { return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN } function isPortraitOrientation (size) { return size.width <= size.height } const WaitOnType = { EVENT: 'event', TIMEOUT: 'timeout' } exports.WaitOnType = WaitOnType function waitOnEventOrTimeout ({ target, name, delay = 0 }) { return new Promise(function (resolve, reject) { if (typeof target !== 'object' || !(name && typeof name === 'string') || !(Number.isInteger(delay) && delay >= 0)) { throw new Error('waitOnEventOrTimeout - invalid parameters.') } function handler (type) { if (target instanceof EventBus) { target._off(name, eventHandler) } else { target.removeEventListener(name, eventHandler) } if (timeout) { clearTimeout(timeout) } resolve(type) } const eventHandler = handler.bind(null, WaitOnType.EVENT) if (target instanceof EventBus) { target._on(name, eventHandler) } else { target.addEventListener(name, eventHandler) } const timeoutHandler = handler.bind(null, WaitOnType.TIMEOUT) const timeout = setTimeout(timeoutHandler, delay) }) } const animationStarted = new Promise(function (resolve) { window.requestAnimationFrame(resolve) }) exports.animationStarted = animationStarted function dispatchDOMEvent (eventName, args = null) { throw new Error('Not implemented: dispatchDOMEvent') } class EventBus { constructor (options) { this._listeners = Object.create(null) } on (eventName, listener, options = null) { this._on(eventName, listener, { external: true, once: options?.once }) } off (eventName, listener, options = null) { this._off(eventName, listener, { external: true, once: options?.once }) } dispatch (eventName) { const eventListeners = this._listeners[eventName] if (!eventListeners || eventListeners.length === 0) { return } const args = Array.prototype.slice.call(arguments, 1) let externalListeners eventListeners.slice(0).forEach(({ listener, external, once }) => { if (once) { this._off(eventName, listener) } if (external) { (externalListeners || (externalListeners = [])).push(listener) return } listener.apply(null, args) }) if (externalListeners) { externalListeners.forEach(listener => { listener.apply(null, args) }) externalListeners = null } } _on (eventName, listener, options = null) { var _this$_listeners const eventListeners = (_this$_listeners = this._listeners)[eventName] || (_this$_listeners[eventName] = []) eventListeners.push({ listener, external: options?.external === true, once: options?.once === true }) } _off (eventName, listener, options = null) { const eventListeners = this._listeners[eventName] if (!eventListeners) { return } for (let i = 0, ii = eventListeners.length; i < ii; i++) { if (eventListeners[i].listener === listener) { eventListeners.splice(i, 1) return } } } } exports.EventBus = EventBus function clamp (v, min, max) { return Math.min(Math.max(v, min), max) } class ProgressBar { constructor (id, { height, width, units } = {}) { 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 } _updateBar () { if (this._indeterminate) { this.div.classList.add('indeterminate') this.div.style.width = this.width + this.units return } this.div.classList.remove('indeterminate') const progressSize = this.width * this._percent / 100 this.div.style.width = progressSize + this.units } get percent () { return this._percent } set percent (val) { this._indeterminate = isNaN(val) this._percent = clamp(val, 0, 100) this._updateBar() } setWidth (viewer) { if (!viewer) { return } const container = viewer.parentNode const scrollbarWidth = container.offsetWidth - viewer.offsetWidth if (scrollbarWidth > 0) { const doc = document.documentElement doc.style.setProperty(LOADINGBAR_END_OFFSET_VAR, `${scrollbarWidth}px`) } } hide () { if (!this.visible) { return } this.visible = false this.bar.classList.add('hidden') } show () { if (this.visible) { return } this.visible = true this.bar.classList.remove('hidden') } } exports.ProgressBar = ProgressBar function moveToEndOfArray (arr, condition) { const moved = [], len = arr.length let write = 0 for (let read = 0; read < len; ++read) { if (condition(arr[read])) { moved.push(arr[read]) } else { arr[write] = arr[read] ++write } } for (let read = 0; write < len; ++read, ++write) { arr[write] = moved[read] } } function getActiveOrFocusedElement () { let curRoot = document let curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(':focus') while (curActiveOrFocused?.shadowRoot) { curRoot = curActiveOrFocused.shadowRoot curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(':focus') } return curActiveOrFocused } function apiPageLayoutToSpreadMode (layout) { switch (layout) { case 'SinglePage': case 'OneColumn': return SpreadMode.NONE case 'TwoColumnLeft': case 'TwoPageLeft': return SpreadMode.ODD case 'TwoColumnRight': case 'TwoPageRight': return SpreadMode.EVEN } return SpreadMode.NONE } function apiPageModeToSidebarView (mode) { switch (mode) { case 'UseNone': return SidebarView.NONE case 'UseThumbs': return SidebarView.THUMBS case 'UseOutlines': return SidebarView.OUTLINE case 'UseAttachments': return SidebarView.ATTACHMENTS case 'UseOC': return SidebarView.LAYERS } return SidebarView.NONE } /***/ }), /* 6 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.TextLayerBuilder = exports.DefaultTextLayerFactory = void 0 var _pdfjsLib = __w_pdfjs_require__(2) const EXPAND_DIVS_TIMEOUT = 300 class TextLayerBuilder { constructor ({ textLayerDiv, eventBus, pageIndex, viewport, findController = null, enhanceTextSelection = false }) { this.textLayerDiv = textLayerDiv this.eventBus = eventBus this.textContent = null this.textContentItemsStr = [] this.textContentStream = null this.renderingDone = false this.pageIdx = pageIndex this.pageNumber = this.pageIdx + 1 this.matches = [] this.viewport = viewport this.textDivs = [] this.findController = findController this.textLayerRenderTask = null this.enhanceTextSelection = enhanceTextSelection this._onUpdateTextLayerMatches = null this._bindMouse() } _finishRendering () { this.renderingDone = true if (!this.enhanceTextSelection) { const endOfContent = document.createElement('div') endOfContent.className = 'endOfContent' this.textLayerDiv.appendChild(endOfContent) } this.eventBus.dispatch('textlayerrendered', { source: this, pageNumber: this.pageNumber, numTextDivs: this.textDivs.length }) } render (timeout = 0) { if (!(this.textContent || this.textContentStream) || this.renderingDone) { return } this.cancel() this.textDivs = [] const textLayerFrag = document.createDocumentFragment() this.textLayerRenderTask = (0, _pdfjsLib.renderTextLayer)({ textContent: this.textContent, textContentStream: this.textContentStream, container: textLayerFrag, viewport: this.viewport, textDivs: this.textDivs, textContentItemsStr: this.textContentItemsStr, timeout, enhanceTextSelection: this.enhanceTextSelection }) this.textLayerRenderTask.promise.then(() => { this.textLayerDiv.appendChild(textLayerFrag) this._finishRendering() this._updateMatches() }, function (reason) {}) if (!this._onUpdateTextLayerMatches) { this._onUpdateTextLayerMatches = evt => { if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) { this._updateMatches() } } this.eventBus._on('updatetextlayermatches', this._onUpdateTextLayerMatches) } } cancel () { if (this.textLayerRenderTask) { this.textLayerRenderTask.cancel() this.textLayerRenderTask = null } if (this._onUpdateTextLayerMatches) { this.eventBus._off('updatetextlayermatches', this._onUpdateTextLayerMatches) this._onUpdateTextLayerMatches = null } } setTextContentStream (readableStream) { this.cancel() this.textContentStream = readableStream } setTextContent (textContent) { this.cancel() this.textContent = textContent } _convertMatches (matches, matchesLength) { if (!matches) { return [] } const { textContentItemsStr } = this let i = 0, iIndex = 0 const end = textContentItemsStr.length - 1 const result = [] for (let m = 0, mm = matches.length; m < mm; m++) { let matchIdx = matches[m] while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) { iIndex += textContentItemsStr[i].length i++ } if (i === textContentItemsStr.length) { console.error('Could not find a matching mapping') } const match = { begin: { divIdx: i, offset: matchIdx - iIndex } } matchIdx += matchesLength[m] while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) { iIndex += textContentItemsStr[i].length i++ } match.end = { divIdx: i, offset: matchIdx - iIndex } result.push(match) } return result } _renderMatches (matches) { if (matches.length === 0) { return } const { findController, pageIdx, textContentItemsStr, textDivs } = this const isSelectedPage = pageIdx === findController.selected.pageIdx const selectedMatchIdx = findController.selected.matchIdx const highlightAll = findController.state.highlightAll let prevEnd = null const infinity = { divIdx: -1, offset: undefined } function beginText (begin, className) { const divIdx = begin.divIdx textDivs[divIdx].textContent = '' appendTextToDiv(divIdx, 0, begin.offset, className) } function appendTextToDiv (divIdx, fromOffset, toOffset, className) { const div = textDivs[divIdx] const content = textContentItemsStr[divIdx].substring(fromOffset, toOffset) const node = document.createTextNode(content) if (className) { const span = document.createElement('span') span.className = className span.appendChild(node) div.appendChild(span) return } div.appendChild(node) } let i0 = selectedMatchIdx, i1 = i0 + 1 if (highlightAll) { i0 = 0 i1 = matches.length } else if (!isSelectedPage) { return } for (let i = i0; i < i1; i++) { const match = matches[i] const begin = match.begin const end = match.end const isSelected = isSelectedPage && i === selectedMatchIdx const highlightSuffix = isSelected ? ' selected' : '' if (isSelected) { findController.scrollMatchIntoView({ element: textDivs[begin.divIdx], pageIndex: pageIdx, matchIndex: selectedMatchIdx }) } if (!prevEnd || begin.divIdx !== prevEnd.divIdx) { if (prevEnd !== null) { appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset) } beginText(begin) } else { appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset) } if (begin.divIdx === end.divIdx) { appendTextToDiv(begin.divIdx, begin.offset, end.offset, 'highlight' + highlightSuffix) } else { appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, 'highlight begin' + highlightSuffix) for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) { textDivs[n0].className = 'highlight middle' + highlightSuffix } beginText(end, 'highlight end' + highlightSuffix) } prevEnd = end } if (prevEnd) { appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset) } } _updateMatches () { if (!this.renderingDone) { return } const { findController, matches, pageIdx, textContentItemsStr, textDivs } = this let clearedUntilDivIdx = -1 for (let i = 0, ii = matches.length; i < ii; i++) { const match = matches[i] const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx) for (let n = begin, end = match.end.divIdx; n <= end; n++) { const div = textDivs[n] div.textContent = textContentItemsStr[n] div.className = '' } clearedUntilDivIdx = match.end.divIdx + 1 } if (!findController?.highlightMatches) { return } const pageMatches = findController.pageMatches[pageIdx] || null const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null this.matches = this._convertMatches(pageMatches, pageMatchesLength) this._renderMatches(this.matches) } _bindMouse () { const div = this.textLayerDiv let expandDivsTimer = null div.addEventListener('mousedown', evt => { if (this.enhanceTextSelection && this.textLayerRenderTask) { this.textLayerRenderTask.expandTextDivs(true) if (expandDivsTimer) { clearTimeout(expandDivsTimer) expandDivsTimer = null } return } const end = div.querySelector('.endOfContent') if (!end) { return } let adjustTop = evt.target !== div adjustTop = adjustTop && window.getComputedStyle(end).getPropertyValue('-moz-user-select') !== 'none' if (adjustTop) { const divBounds = div.getBoundingClientRect() const r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height) end.style.top = (r * 100).toFixed(2) + '%' } end.classList.add('active') }) div.addEventListener('mouseup', () => { if (this.enhanceTextSelection && this.textLayerRenderTask) { expandDivsTimer = setTimeout(() => { if (this.textLayerRenderTask) { this.textLayerRenderTask.expandTextDivs(false) } expandDivsTimer = null }, EXPAND_DIVS_TIMEOUT) return } const end = div.querySelector('.endOfContent') if (!end) { return } end.style.top = '' end.classList.remove('active') }) } } exports.TextLayerBuilder = TextLayerBuilder class DefaultTextLayerFactory { createTextLayerBuilder (textLayerDiv, pageIndex, viewport, enhanceTextSelection = false, eventBus) { return new TextLayerBuilder({ textLayerDiv, pageIndex, viewport, enhanceTextSelection, eventBus }) } } exports.DefaultTextLayerFactory = DefaultTextLayerFactory /***/ }), /* 7 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.DownloadManager = void 0 var _pdfjsLib = __w_pdfjs_require__(2) var _viewer_compatibility = __w_pdfjs_require__(8) function download (blobUrl, filename) { const a = document.createElement('a') if (!a.click) { throw new Error('DownloadManager: "a.click()" is not supported.') } a.href = blobUrl a.target = '_parent' if ('download' in a) { a.download = filename } (document.body || document.documentElement).appendChild(a) a.click() a.remove() } class DownloadManager { constructor () { this._openBlobUrls = new WeakMap() } downloadUrl (url, filename) { if (!(0, _pdfjsLib.createValidAbsoluteUrl)(url, 'http://example.com')) { return } download(url + '#pdfjs.action=download', filename) } downloadData (data, filename, contentType) { const blobUrl = (0, _pdfjsLib.createObjectURL)(data, contentType, _viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) download(blobUrl, filename) } openOrDownloadData (element, data, filename) { const isPdfData = (0, _pdfjsLib.isPdfFile)(filename) const contentType = isPdfData ? 'application/pdf' : '' if (isPdfData && !_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) { let blobUrl = this._openBlobUrls.get(element) if (!blobUrl) { blobUrl = URL.createObjectURL(new Blob([data], { type: contentType })) this._openBlobUrls.set(element, blobUrl) } let viewerUrl viewerUrl = '?file=' + encodeURIComponent(blobUrl + '#' + filename) try { window.open(viewerUrl) return true } catch (ex) { console.error(`openOrDownloadData: ${ex}`) URL.revokeObjectURL(blobUrl) this._openBlobUrls.delete(element) } } this.downloadData(data, filename, contentType) return false } download (blob, url, filename, sourceEventType = 'download') { if (_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) { this.downloadUrl(url, filename) return } const blobUrl = URL.createObjectURL(blob) download(blobUrl, filename) } } exports.DownloadManager = DownloadManager /***/ }), /* 8 */ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.viewerCompatibilityParams = void 0 const compatibilityParams = Object.create(null) { const userAgent = typeof navigator !== 'undefined' && navigator.userAgent || '' const platform = typeof navigator !== 'undefined' && navigator.platform || '' const maxTouchPoints = typeof navigator !== 'undefined' && navigator.maxTouchPoints || 1 const isAndroid = /Android/.test(userAgent) const isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === 'MacIntel' && maxTouchPoints > 1 const isIOSChrome = /CriOS/.test(userAgent); (function checkOnBlobSupport () { if (isIOSChrome) { compatibilityParams.disableCreateObjectURL = true } })(); (function checkCanvasSizeLimitation () { if (isIOS || isAndroid) { compatibilityParams.maxCanvasPixels = 5242880 } })() } const viewerCompatibilityParams = Object.freeze(compatibilityParams) exports.viewerCompatibilityParams = viewerCompatibilityParams /***/ }), /* 9 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.GenericL10n = void 0 __w_pdfjs_require__(10) var _l10n_utils = __w_pdfjs_require__(3) const webL10n = document.webL10n class GenericL10n { constructor (lang) { this._lang = lang this._ready = new Promise((resolve, reject) => { webL10n.setLanguage(lang, () => { resolve(webL10n) }) }) } async getLanguage () { const l10n = await this._ready return l10n.getLanguage() } async getDirection () { const l10n = await this._ready return l10n.getDirection() } async get (key, args = null, fallback = (0, _l10n_utils.getL10nFallback)(key, args)) { const l10n = await this._ready return l10n.get(key, args, fallback) } async translate (element) { const l10n = await this._ready return l10n.translate(element) } } exports.GenericL10n = GenericL10n /***/ }), /* 10 */ /***/ (() => { document.webL10n = function (window, document, undefined) { var gL10nData = {} var gTextData = '' var gTextProp = 'textContent' var gLanguage = '' var gMacros = {} var gReadyState = 'loading' var gAsyncResourceLoading = true function getL10nResourceLinks () { return document.querySelectorAll('link[type="application/l10n"]') } function getL10nDictionary () { var script = document.querySelector('script[type="application/l10n"]') return script ? JSON.parse(script.innerHTML) : null } function getTranslatableChildren (element) { return element ? element.querySelectorAll('*[data-l10n-id]') : [] } function getL10nAttributes (element) { if (!element) return {} var l10nId = element.getAttribute('data-l10n-id') var l10nArgs = element.getAttribute('data-l10n-args') var args = {} if (l10nArgs) { try { args = JSON.parse(l10nArgs) } catch (e) { console.warn('could not parse arguments for #' + l10nId) } } return { id: l10nId, args: args } } function xhrLoadText (url, onSuccess, onFailure) { onSuccess = onSuccess || function _onSuccess (data) {} onFailure = onFailure || function _onFailure () {} var xhr = new XMLHttpRequest() xhr.open('GET', url, gAsyncResourceLoading) if (xhr.overrideMimeType) { xhr.overrideMimeType('text/plain; charset=utf-8') } xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status == 200 || xhr.status === 0) { onSuccess(xhr.responseText) } else { onFailure() } } } xhr.onerror = onFailure xhr.ontimeout = onFailure try { xhr.send(null) } catch (e) { onFailure() } } function parseResource (href, lang, successCallback, failureCallback) { var baseURL = href.replace(/[^\/]*$/, '') || './' function evalString (text) { if (text.lastIndexOf('\\') < 0) return text return text.replace(/\\\\/g, '\\').replace(/\\n/g, '\n').replace(/\\r/g, '\r').replace(/\\t/g, '\t').replace(/\\b/g, '\b').replace(/\\f/g, '\f').replace(/\\{/g, '{').replace(/\\}/g, '}').replace(/\\"/g, '"').replace(/\\'/g, '\'') } function parseProperties (text, parsedPropertiesCallback) { var dictionary = {} var reBlank = /^\s*|\s*$/ var reComment = /^\s*#|^\s*$/ var reSection = /^\s*\[(.*)\]\s*$/ var reImport = /^\s*@import\s+url\((.*)\)\s*$/i var reSplit = /^([^=\s]*)\s*=\s*(.+)$/ function parseRawLines (rawText, extendedSyntax, parsedRawLinesCallback) { var entries = rawText.replace(reBlank, '').split(/[\r\n]+/) var currentLang = '*' var genericLang = lang.split('-', 1)[0] var skipLang = false var match = '' function nextEntry () { while (true) { if (!entries.length) { parsedRawLinesCallback() return } var line = entries.shift() if (reComment.test(line)) continue if (extendedSyntax) { match = reSection.exec(line) if (match) { currentLang = match[1].toLowerCase() skipLang = currentLang !== '*' && currentLang !== lang && currentLang !== genericLang continue } else if (skipLang) { continue } match = reImport.exec(line) if (match) { loadImport(baseURL + match[1], nextEntry) return } } var tmp = line.match(reSplit) if (tmp && tmp.length == 3) { dictionary[tmp[1]] = evalString(tmp[2]) } } } nextEntry() } function loadImport (url, callback) { xhrLoadText(url, function (content) { parseRawLines(content, false, callback) }, function () { console.warn(url + ' not found.') callback() }) } parseRawLines(text, true, function () { parsedPropertiesCallback(dictionary) }) } xhrLoadText(href, function (response) { gTextData += response parseProperties(response, function (data) { for (var key in data) { var id, prop, index = key.lastIndexOf('.') if (index > 0) { id = key.substring(0, index) prop = key.substring(index + 1) } else { id = key prop = gTextProp } if (!gL10nData[id]) { gL10nData[id] = {} } gL10nData[id][prop] = data[key] } if (successCallback) { successCallback() } }) }, failureCallback) } function loadLocale (lang, callback) { if (lang) { lang = lang.toLowerCase() } callback = callback || function _callback () {} clear() gLanguage = lang var langLinks = getL10nResourceLinks() var langCount = langLinks.length if (langCount === 0) { var dict = getL10nDictionary() if (dict && dict.locales && dict.default_locale) { console.log('using the embedded JSON directory, early way out') gL10nData = dict.locales[lang] if (!gL10nData) { var defaultLocale = dict.default_locale.toLowerCase() for (var anyCaseLang in dict.locales) { anyCaseLang = anyCaseLang.toLowerCase() if (anyCaseLang === lang) { gL10nData = dict.locales[lang] break } else if (anyCaseLang === defaultLocale) { gL10nData = dict.locales[defaultLocale] } } } callback() } else { console.log('no resource to load, early way out') } gReadyState = 'complete' return } var onResourceLoaded = null var gResourceCount = 0 onResourceLoaded = function () { gResourceCount++ if (gResourceCount >= langCount) { callback() gReadyState = 'complete' } } function L10nResourceLink (link) { var href = link.href this.load = function (lang, callback) { parseResource(href, lang, callback, function () { console.warn(href + ' not found.') console.warn('"' + lang + '" resource not found') gLanguage = '' callback() }) } } for (var i = 0; i < langCount; i++) { var resource = new L10nResourceLink(langLinks[i]) resource.load(lang, onResourceLoaded) } } function clear () { gL10nData = {} gTextData = '' gLanguage = '' } function getPluralRules (lang) { var locales2rules = { 'af': 3, 'ak': 4, 'am': 4, 'ar': 1, 'asa': 3, 'az': 0, 'be': 11, 'bem': 3, 'bez': 3, 'bg': 3, 'bh': 4, 'bm': 0, 'bn': 3, 'bo': 0, 'br': 20, 'brx': 3, 'bs': 11, 'ca': 3, 'cgg': 3, 'chr': 3, 'cs': 12, 'cy': 17, 'da': 3, 'de': 3, 'dv': 3, 'dz': 0, 'ee': 3, 'el': 3, 'en': 3, 'eo': 3, 'es': 3, 'et': 3, 'eu': 3, 'fa': 0, 'ff': 5, 'fi': 3, 'fil': 4, 'fo': 3, 'fr': 5, 'fur': 3, 'fy': 3, 'ga': 8, 'gd': 24, 'gl': 3, 'gsw': 3, 'gu': 3, 'guw': 4, 'gv': 23, 'ha': 3, 'haw': 3, 'he': 2, 'hi': 4, 'hr': 11, 'hu': 0, 'id': 0, 'ig': 0, 'ii': 0, 'is': 3, 'it': 3, 'iu': 7, 'ja': 0, 'jmc': 3, 'jv': 0, 'ka': 0, 'kab': 5, 'kaj': 3, 'kcg': 3, 'kde': 0, 'kea': 0, 'kk': 3, 'kl': 3, 'km': 0, 'kn': 0, 'ko': 0, 'ksb': 3, 'ksh': 21, 'ku': 3, 'kw': 7, 'lag': 18, 'lb': 3, 'lg': 3, 'ln': 4, 'lo': 0, 'lt': 10, 'lv': 6, 'mas': 3, 'mg': 4, 'mk': 16, 'ml': 3, 'mn': 3, 'mo': 9, 'mr': 3, 'ms': 0, 'mt': 15, 'my': 0, 'nah': 3, 'naq': 7, 'nb': 3, 'nd': 3, 'ne': 3, 'nl': 3, 'nn': 3, 'no': 3, 'nr': 3, 'nso': 4, 'ny': 3, 'nyn': 3, 'om': 3, 'or': 3, 'pa': 3, 'pap': 3, 'pl': 13, 'ps': 3, 'pt': 3, 'rm': 3, 'ro': 9, 'rof': 3, 'ru': 11, 'rwk': 3, 'sah': 0, 'saq': 3, 'se': 7, 'seh': 3, 'ses': 0, 'sg': 0, 'sh': 11, 'shi': 19, 'sk': 12, 'sl': 14, 'sma': 7, 'smi': 7, 'smj': 7, 'smn': 7, 'sms': 7, 'sn': 3, 'so': 3, 'sq': 3, 'sr': 11, 'ss': 3, 'ssy': 3, 'st': 3, 'sv': 3, 'sw': 3, 'syr': 3, 'ta': 3, 'te': 3, 'teo': 3, 'th': 0, 'ti': 4, 'tig': 3, 'tk': 3, 'tl': 4, 'tn': 3, 'to': 0, 'tr': 0, 'ts': 3, 'tzm': 22, 'uk': 11, 'ur': 3, 've': 3, 'vi': 0, 'vun': 3, 'wa': 4, 'wae': 3, 'wo': 0, 'xh': 3, 'xog': 3, 'yo': 0, 'zh': 0, 'zu': 3 } function isIn (n, list) { return list.indexOf(n) !== -1 } function isBetween (n, start, end) { return start <= n && n <= end } var pluralRules = { '0': function (n) { return 'other' }, '1': function (n) { if (isBetween(n % 100, 3, 10)) return 'few' if (n === 0) return 'zero' if (isBetween(n % 100, 11, 99)) return 'many' if (n == 2) return 'two' if (n == 1) return 'one' return 'other' }, '2': function (n) { if (n !== 0 && n % 10 === 0) return 'many' if (n == 2) return 'two' if (n == 1) return 'one' return 'other' }, '3': function (n) { if (n == 1) return 'one' return 'other' }, '4': function (n) { if (isBetween(n, 0, 1)) return 'one' return 'other' }, '5': function (n) { if (isBetween(n, 0, 2) && n != 2) return 'one' return 'other' }, '6': function (n) { if (n === 0) return 'zero' if (n % 10 == 1 && n % 100 != 11) return 'one' return 'other' }, '7': function (n) { if (n == 2) return 'two' if (n == 1) return 'one' return 'other' }, '8': function (n) { if (isBetween(n, 3, 6)) return 'few' if (isBetween(n, 7, 10)) return 'many' if (n == 2) return 'two' if (n == 1) return 'one' return 'other' }, '9': function (n) { if (n === 0 || n != 1 && isBetween(n % 100, 1, 19)) return 'few' if (n == 1) return 'one' return 'other' }, '10': function (n) { if (isBetween(n % 10, 2, 9) && !isBetween(n % 100, 11, 19)) return 'few' if (n % 10 == 1 && !isBetween(n % 100, 11, 19)) return 'one' return 'other' }, '11': function (n) { if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few' if (n % 10 === 0 || isBetween(n % 10, 5, 9) || isBetween(n % 100, 11, 14)) return 'many' if (n % 10 == 1 && n % 100 != 11) return 'one' return 'other' }, '12': function (n) { if (isBetween(n, 2, 4)) return 'few' if (n == 1) return 'one' return 'other' }, '13': function (n) { if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few' if (n != 1 && isBetween(n % 10, 0, 1) || isBetween(n % 10, 5, 9) || isBetween(n % 100, 12, 14)) return 'many' if (n == 1) return 'one' return 'other' }, '14': function (n) { if (isBetween(n % 100, 3, 4)) return 'few' if (n % 100 == 2) return 'two' if (n % 100 == 1) return 'one' return 'other' }, '15': function (n) { if (n === 0 || isBetween(n % 100, 2, 10)) return 'few' if (isBetween(n % 100, 11, 19)) return 'many' if (n == 1) return 'one' return 'other' }, '16': function (n) { if (n % 10 == 1 && n != 11) return 'one' return 'other' }, '17': function (n) { if (n == 3) return 'few' if (n === 0) return 'zero' if (n == 6) return 'many' if (n == 2) return 'two' if (n == 1) return 'one' return 'other' }, '18': function (n) { if (n === 0) return 'zero' if (isBetween(n, 0, 2) && n !== 0 && n != 2) return 'one' return 'other' }, '19': function (n) { if (isBetween(n, 2, 10)) return 'few' if (isBetween(n, 0, 1)) return 'one' return 'other' }, '20': function (n) { if ((isBetween(n % 10, 3, 4) || n % 10 == 9) && !(isBetween(n % 100, 10, 19) || isBetween(n % 100, 70, 79) || isBetween(n % 100, 90, 99))) return 'few' if (n % 1000000 === 0 && n !== 0) return 'many' if (n % 10 == 2 && !isIn(n % 100, [12, 72, 92])) return 'two' if (n % 10 == 1 && !isIn(n % 100, [11, 71, 91])) return 'one' return 'other' }, '21': function (n) { if (n === 0) return 'zero' if (n == 1) return 'one' return 'other' }, '22': function (n) { if (isBetween(n, 0, 1) || isBetween(n, 11, 99)) return 'one' return 'other' }, '23': function (n) { if (isBetween(n % 10, 1, 2) || n % 20 === 0) return 'one' return 'other' }, '24': function (n) { if (isBetween(n, 3, 10) || isBetween(n, 13, 19)) return 'few' if (isIn(n, [2, 12])) return 'two' if (isIn(n, [1, 11])) return 'one' return 'other' } } var index = locales2rules[lang.replace(/-.*$/, '')] if (!(index in pluralRules)) { console.warn('plural form unknown for [' + lang + ']') return function () { return 'other' } } return pluralRules[index] } gMacros.plural = function (str, param, key, prop) { var n = parseFloat(param) if (isNaN(n)) return str if (prop != gTextProp) return str if (!gMacros._pluralRules) { gMacros._pluralRules = getPluralRules(gLanguage) } var index = '[' + gMacros._pluralRules(n) + ']' if (n === 0 && key + '[zero]' in gL10nData) { str = gL10nData[key + '[zero]'][prop] } else if (n == 1 && key + '[one]' in gL10nData) { str = gL10nData[key + '[one]'][prop] } else if (n == 2 && key + '[two]' in gL10nData) { str = gL10nData[key + '[two]'][prop] } else if (key + index in gL10nData) { str = gL10nData[key + index][prop] } else if (key + '[other]' in gL10nData) { str = gL10nData[key + '[other]'][prop] } return str } function getL10nData (key, args, fallback) { var data = gL10nData[key] if (!data) { console.warn('#' + key + ' is undefined.') if (!fallback) { return null } data = fallback } var rv = {} for (var prop in data) { var str = data[prop] str = substIndexes(str, args, key, prop) str = substArguments(str, args, key) rv[prop] = str } return rv } function substIndexes (str, args, key, prop) { var reIndex = /\{\[\s*([a-zA-Z]+)\(([a-zA-Z]+)\)\s*\]\}/ var reMatch = reIndex.exec(str) if (!reMatch || !reMatch.length) return str var macroName = reMatch[1] var paramName = reMatch[2] var param if (args && paramName in args) { param = args[paramName] } else if (paramName in gL10nData) { param = gL10nData[paramName] } if (macroName in gMacros) { var macro = gMacros[macroName] str = macro(str, param, key, prop) } return str } function substArguments (str, args, key) { var reArgs = /\{\{\s*(.+?)\s*\}\}/g return str.replace(reArgs, function (matched_text, arg) { if (args && arg in args) { return args[arg] } if (arg in gL10nData) { return gL10nData[arg] } console.log('argument {{' + arg + '}} for #' + key + ' is undefined.') return matched_text }) } function translateElement (element) { var l10n = getL10nAttributes(element) if (!l10n.id) return var data = getL10nData(l10n.id, l10n.args) if (!data) { console.warn('#' + l10n.id + ' is undefined.') return } if (data[gTextProp]) { if (getChildElementCount(element) === 0) { element[gTextProp] = data[gTextProp] } else { var children = element.childNodes var found = false for (var i = 0, l = children.length; i < l; i++) { if (children[i].nodeType === 3 && /\S/.test(children[i].nodeValue)) { if (found) { children[i].nodeValue = '' } else { children[i].nodeValue = data[gTextProp] found = true } } } if (!found) { var textNode = document.createTextNode(data[gTextProp]) element.insertBefore(textNode, element.firstChild) } } delete data[gTextProp] } for (var k in data) { element[k] = data[k] } } function getChildElementCount (element) { if (element.children) { return element.children.length } if (typeof element.childElementCount !== 'undefined') { return element.childElementCount } var count = 0 for (var i = 0; i < element.childNodes.length; i++) { count += element.nodeType === 1 ? 1 : 0 } return count } function translateFragment (element) { element = element || document.documentElement var children = getTranslatableChildren(element) var elementCount = children.length for (var i = 0; i < elementCount; i++) { translateElement(children[i]) } translateElement(element) } return { get: function (key, args, fallbackString) { var index = key.lastIndexOf('.') var prop = gTextProp if (index > 0) { prop = key.substring(index + 1) key = key.substring(0, index) } var fallback if (fallbackString) { fallback = {} fallback[prop] = fallbackString } var data = getL10nData(key, args, fallback) if (data && prop in data) { return data[prop] } return '{{' + key + '}}' }, getData: function () { return gL10nData }, getText: function () { return gTextData }, getLanguage: function () { return gLanguage }, setLanguage: function (lang, callback) { loadLocale(lang, function () { if (callback) callback() }) }, getDirection: function () { var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'] var shortCode = gLanguage.split('-', 1)[0] return rtlList.indexOf(shortCode) >= 0 ? 'rtl' : 'ltr' }, translate: translateFragment, getReadyState: function () { return gReadyState }, ready: function (callback) { if (!callback) { return } else if (gReadyState == 'complete' || gReadyState == 'interactive') { window.setTimeout(function () { callback() }) } else if (document.addEventListener) { document.addEventListener('localized', function once () { document.removeEventListener('localized', once) callback() }) } } } }(window, document) /***/ }), /* 11 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.PDFFindController = exports.FindState = void 0 var _pdfjsLib = __w_pdfjs_require__(2) var _pdf_find_utils = __w_pdfjs_require__(12) var _ui_utils = __w_pdfjs_require__(5) const FindState = { FOUND: 0, NOT_FOUND: 1, WRAPPED: 2, PENDING: 3 } exports.FindState = FindState const FIND_TIMEOUT = 250 const MATCH_SCROLL_OFFSET_TOP = -50 const MATCH_SCROLL_OFFSET_LEFT = -400 const CHARACTERS_TO_NORMALIZE = { '\u2018': '\'', '\u2019': '\'', '\u201A': '\'', '\u201B': '\'', '\u201C': '"', '\u201D': '"', '\u201E': '"', '\u201F': '"', '\u00BC': '1/4', '\u00BD': '1/2', '\u00BE': '3/4' } let normalizationRegex = null function normalize (text) { if (!normalizationRegex) { const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join('') normalizationRegex = new RegExp(`[${replace}]`, 'g') } let diffs = null const normalizedText = text.replace(normalizationRegex, function (ch, index) { const normalizedCh = CHARACTERS_TO_NORMALIZE[ch], diff = normalizedCh.length - ch.length if (diff !== 0) { (diffs || (diffs = [])).push([index, diff]) } return normalizedCh }) return [normalizedText, diffs] } function getOriginalIndex (matchIndex, diffs = null) { if (!diffs) { return matchIndex } let totalDiff = 0 for (const [index, diff] of diffs) { const currentIndex = index + totalDiff if (currentIndex >= matchIndex) { break } if (currentIndex + diff > matchIndex) { totalDiff += matchIndex - currentIndex break } totalDiff += diff } return matchIndex - totalDiff } class PDFFindController { constructor ({ linkService, eventBus }) { this._linkService = linkService this._eventBus = eventBus this._reset() eventBus._on('findbarclose', this._onFindBarClose.bind(this)) } get highlightMatches () { return this._highlightMatches } get pageMatches () { return this._pageMatches } get pageMatchesLength () { return this._pageMatchesLength } get selected () { return this._selected } get state () { return this._state } setDocument (pdfDocument) { if (this._pdfDocument) { this._reset() } if (!pdfDocument) { return } this._pdfDocument = pdfDocument this._firstPageCapability.resolve() } executeCommand (cmd, state) { if (!state) { return } const pdfDocument = this._pdfDocument if (this._state === null || this._shouldDirtyMatch(cmd, state)) { this._dirtyMatch = true } this._state = state if (cmd !== 'findhighlightallchange') { this._updateUIState(FindState.PENDING) } this._firstPageCapability.promise.then(() => { if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) { return } this._extractText() const findbarClosed = !this._highlightMatches const pendingTimeout = !!this._findTimeout if (this._findTimeout) { clearTimeout(this._findTimeout) this._findTimeout = null } if (cmd === 'find') { this._findTimeout = setTimeout(() => { this._nextMatch() this._findTimeout = null }, FIND_TIMEOUT) } else if (this._dirtyMatch) { this._nextMatch() } else if (cmd === 'findagain') { this._nextMatch() if (findbarClosed && this._state.highlightAll) { this._updateAllPages() } } else if (cmd === 'findhighlightallchange') { if (pendingTimeout) { this._nextMatch() } else { this._highlightMatches = true } this._updateAllPages() } else { this._nextMatch() } }) } scrollMatchIntoView ({ element = null, pageIndex = -1, matchIndex = -1 }) { if (!this._scrollMatches || !element) { return } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) { return } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) { return } this._scrollMatches = false const spot = { top: MATCH_SCROLL_OFFSET_TOP, left: MATCH_SCROLL_OFFSET_LEFT }; (0, _ui_utils.scrollIntoView)(element, spot, true) } _reset () { this._highlightMatches = false this._scrollMatches = false this._pdfDocument = null this._pageMatches = [] this._pageMatchesLength = [] this._state = null this._selected = { pageIdx: -1, matchIdx: -1 } this._offset = { pageIdx: null, matchIdx: null, wrapped: false } this._extractTextPromises = [] this._pageContents = [] this._pageDiffs = [] this._matchesCountTotal = 0 this._pagesToSearch = null this._pendingFindMatches = Object.create(null) this._resumePageIdx = null this._dirtyMatch = false clearTimeout(this._findTimeout) this._findTimeout = null this._firstPageCapability = (0, _pdfjsLib.createPromiseCapability)() } get _query () { if (this._state.query !== this._rawQuery) { this._rawQuery = this._state.query; [this._normalizedQuery] = normalize(this._state.query) } return this._normalizedQuery } _shouldDirtyMatch (cmd, state) { if (state.query !== this._state.query) { return true } switch (cmd) { case 'findagain': const pageNumber = this._selected.pageIdx + 1 const linkService = this._linkService if (pageNumber >= 1 && pageNumber <= linkService.pagesCount && pageNumber !== linkService.page && !linkService.isPageVisible(pageNumber)) { return true } return false case 'findhighlightallchange': return false } return true } _prepareMatches (matchesWithLength, matches, matchesLength) { function isSubTerm (currentIndex) { const currentElem = matchesWithLength[currentIndex] const nextElem = matchesWithLength[currentIndex + 1] if (currentIndex < matchesWithLength.length - 1 && currentElem.match === nextElem.match) { currentElem.skipped = true return true } for (let i = currentIndex - 1; i >= 0; i--) { const prevElem = matchesWithLength[i] if (prevElem.skipped) { continue } if (prevElem.match + prevElem.matchLength < currentElem.match) { break } if (prevElem.match + prevElem.matchLength >= currentElem.match + currentElem.matchLength) { currentElem.skipped = true return true } } return false } matchesWithLength.sort(function (a, b) { return a.match === b.match ? a.matchLength - b.matchLength : a.match - b.match }) for (let i = 0, len = matchesWithLength.length; i < len; i++) { if (isSubTerm(i)) { continue } matches.push(matchesWithLength[i].match) matchesLength.push(matchesWithLength[i].matchLength) } } _isEntireWord (content, startIdx, length) { if (startIdx > 0) { const first = content.charCodeAt(startIdx) const limit = content.charCodeAt(startIdx - 1) if ((0, _pdf_find_utils.getCharacterType)(first) === (0, _pdf_find_utils.getCharacterType)(limit)) { return false } } const endIdx = startIdx + length - 1 if (endIdx < content.length - 1) { const last = content.charCodeAt(endIdx) const limit = content.charCodeAt(endIdx + 1) if ((0, _pdf_find_utils.getCharacterType)(last) === (0, _pdf_find_utils.getCharacterType)(limit)) { return false } } return true } _calculatePhraseMatch (query, pageIndex, pageContent, pageDiffs, entireWord) { const matches = [], matchesLength = [] const queryLen = query.length let matchIdx = -queryLen while (true) { matchIdx = pageContent.indexOf(query, matchIdx + queryLen) if (matchIdx === -1) { break } if (entireWord && !this._isEntireWord(pageContent, matchIdx, queryLen)) { continue } const originalMatchIdx = getOriginalIndex(matchIdx, pageDiffs), matchEnd = matchIdx + queryLen - 1, originalQueryLen = getOriginalIndex(matchEnd, pageDiffs) - originalMatchIdx + 1 matches.push(originalMatchIdx) matchesLength.push(originalQueryLen) } this._pageMatches[pageIndex] = matches this._pageMatchesLength[pageIndex] = matchesLength } _calculateWordMatch (query, pageIndex, pageContent, pageDiffs, entireWord) { const matchesWithLength = [] const queryArray = query.match(/\S+/g) for (let i = 0, len = queryArray.length; i < len; i++) { const subquery = queryArray[i] const subqueryLen = subquery.length let matchIdx = -subqueryLen while (true) { matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen) if (matchIdx === -1) { break } if (entireWord && !this._isEntireWord(pageContent, matchIdx, subqueryLen)) { continue } const originalMatchIdx = getOriginalIndex(matchIdx, pageDiffs), matchEnd = matchIdx + subqueryLen - 1, originalQueryLen = getOriginalIndex(matchEnd, pageDiffs) - originalMatchIdx + 1 matchesWithLength.push({ match: originalMatchIdx, matchLength: originalQueryLen, skipped: false }) } } this._pageMatchesLength[pageIndex] = [] this._pageMatches[pageIndex] = [] this._prepareMatches(matchesWithLength, this._pageMatches[pageIndex], this._pageMatchesLength[pageIndex]) } _calculateMatch (pageIndex) { let pageContent = this._pageContents[pageIndex] const pageDiffs = this._pageDiffs[pageIndex] let query = this._query const { caseSensitive, entireWord, phraseSearch } = this._state if (query.length === 0) { return } if (!caseSensitive) { pageContent = pageContent.toLowerCase() query = query.toLowerCase() } if (phraseSearch) { this._calculatePhraseMatch(query, pageIndex, pageContent, pageDiffs, entireWord) } else { this._calculateWordMatch(query, pageIndex, pageContent, pageDiffs, entireWord) } if (this._state.highlightAll) { this._updatePage(pageIndex) } if (this._resumePageIdx === pageIndex) { this._resumePageIdx = null this._nextPageMatch() } const pageMatchesCount = this._pageMatches[pageIndex].length if (pageMatchesCount > 0) { this._matchesCountTotal += pageMatchesCount this._updateUIResultsCount() } } _extractText () { if (this._extractTextPromises.length > 0) { return } let promise = Promise.resolve() for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) { const extractTextCapability = (0, _pdfjsLib.createPromiseCapability)() this._extractTextPromises[i] = extractTextCapability.promise promise = promise.then(() => { return this._pdfDocument.getPage(i + 1).then(pdfPage => { return pdfPage.getTextContent({ normalizeWhitespace: true }) }).then(textContent => { const textItems = textContent.items const strBuf = [] for (let j = 0, jj = textItems.length; j < jj; j++) { strBuf.push(textItems[j].str) } [this._pageContents[i], this._pageDiffs[i]] = normalize(strBuf.join('')) extractTextCapability.resolve(i) }, reason => { console.error(`Unable to get text content for page ${i + 1}`, reason) this._pageContents[i] = '' this._pageDiffs[i] = null extractTextCapability.resolve(i) }) }) } } _updatePage (index) { if (this._scrollMatches && this._selected.pageIdx === index) { this._linkService.page = index + 1 } this._eventBus.dispatch('updatetextlayermatches', { source: this, pageIndex: index }) } _updateAllPages () { this._eventBus.dispatch('updatetextlayermatches', { source: this, pageIndex: -1 }) } _nextMatch () { const previous = this._state.findPrevious const currentPageIndex = this._linkService.page - 1 const numPages = this._linkService.pagesCount this._highlightMatches = true if (this._dirtyMatch) { this._dirtyMatch = false this._selected.pageIdx = this._selected.matchIdx = -1 this._offset.pageIdx = currentPageIndex this._offset.matchIdx = null this._offset.wrapped = false this._resumePageIdx = null this._pageMatches.length = 0 this._pageMatchesLength.length = 0 this._matchesCountTotal = 0 this._updateAllPages() for (let i = 0; i < numPages; i++) { if (this._pendingFindMatches[i] === true) { continue } this._pendingFindMatches[i] = true this._extractTextPromises[i].then(pageIdx => { delete this._pendingFindMatches[pageIdx] this._calculateMatch(pageIdx) }) } } if (this._query === '') { this._updateUIState(FindState.FOUND) return } if (this._resumePageIdx) { return } const offset = this._offset this._pagesToSearch = numPages if (offset.matchIdx !== null) { const numPageMatches = this._pageMatches[offset.pageIdx].length if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) { offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1 this._updateMatch(true) return } this._advanceOffsetPage(previous) } this._nextPageMatch() } _matchesReady (matches) { const offset = this._offset const numMatches = matches.length const previous = this._state.findPrevious if (numMatches) { offset.matchIdx = previous ? numMatches - 1 : 0 this._updateMatch(true) return true } this._advanceOffsetPage(previous) if (offset.wrapped) { offset.matchIdx = null if (this._pagesToSearch < 0) { this._updateMatch(false) return true } } return false } _nextPageMatch () { if (this._resumePageIdx !== null) { console.error('There can only be one pending page.') } let matches = null do { const pageIdx = this._offset.pageIdx matches = this._pageMatches[pageIdx] if (!matches) { this._resumePageIdx = pageIdx break } } while (!this._matchesReady(matches)) } _advanceOffsetPage (previous) { const offset = this._offset const numPages = this._linkService.pagesCount offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1 offset.matchIdx = null this._pagesToSearch-- if (offset.pageIdx >= numPages || offset.pageIdx < 0) { offset.pageIdx = previous ? numPages - 1 : 0 offset.wrapped = true } } _updateMatch (found = false) { let state = FindState.NOT_FOUND const wrapped = this._offset.wrapped this._offset.wrapped = false if (found) { const previousPage = this._selected.pageIdx this._selected.pageIdx = this._offset.pageIdx this._selected.matchIdx = this._offset.matchIdx state = wrapped ? FindState.WRAPPED : FindState.FOUND if (previousPage !== -1 && previousPage !== this._selected.pageIdx) { this._updatePage(previousPage) } } this._updateUIState(state, this._state.findPrevious) if (this._selected.pageIdx !== -1) { this._scrollMatches = true this._updatePage(this._selected.pageIdx) } } _onFindBarClose (evt) { const pdfDocument = this._pdfDocument this._firstPageCapability.promise.then(() => { if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) { return } if (this._findTimeout) { clearTimeout(this._findTimeout) this._findTimeout = null } if (this._resumePageIdx) { this._resumePageIdx = null this._dirtyMatch = true } this._updateUIState(FindState.FOUND) this._highlightMatches = false this._updateAllPages() }) } _requestMatchesCount () { const { pageIdx, matchIdx } = this._selected let current = 0, total = this._matchesCountTotal if (matchIdx !== -1) { for (let i = 0; i < pageIdx; i++) { current += this._pageMatches[i]?.length || 0 } current += matchIdx + 1 } if (current < 1 || current > total) { current = total = 0 } return { current, total } } _updateUIResultsCount () { this._eventBus.dispatch('updatefindmatchescount', { source: this, matchesCount: this._requestMatchesCount() }) } _updateUIState (state, previous) { this._eventBus.dispatch('updatefindcontrolstate', { source: this, state, previous, matchesCount: this._requestMatchesCount(), rawQuery: this._state?.query ?? null }) } } exports.PDFFindController = PDFFindController /***/ }), /* 12 */ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.getCharacterType = getCharacterType exports.CharacterType = void 0 const CharacterType = { SPACE: 0, ALPHA_LETTER: 1, PUNCT: 2, HAN_LETTER: 3, KATAKANA_LETTER: 4, HIRAGANA_LETTER: 5, HALFWIDTH_KATAKANA_LETTER: 6, THAI_LETTER: 7 } exports.CharacterType = CharacterType function isAlphabeticalScript (charCode) { return charCode < 0x2e80 } function isAscii (charCode) { return (charCode & 0xff80) === 0 } function isAsciiAlpha (charCode) { return charCode >= 0x61 && charCode <= 0x7a || charCode >= 0x41 && charCode <= 0x5a } function isAsciiDigit (charCode) { return charCode >= 0x30 && charCode <= 0x39 } function isAsciiSpace (charCode) { return charCode === 0x20 || charCode === 0x09 || charCode === 0x0d || charCode === 0x0a } function isHan (charCode) { return charCode >= 0x3400 && charCode <= 0x9fff || charCode >= 0xf900 && charCode <= 0xfaff } function isKatakana (charCode) { return charCode >= 0x30a0 && charCode <= 0x30ff } function isHiragana (charCode) { return charCode >= 0x3040 && charCode <= 0x309f } function isHalfwidthKatakana (charCode) { return charCode >= 0xff60 && charCode <= 0xff9f } function isThai (charCode) { return (charCode & 0xff80) === 0x0e00 } function getCharacterType (charCode) { if (isAlphabeticalScript(charCode)) { if (isAscii(charCode)) { if (isAsciiSpace(charCode)) { return CharacterType.SPACE } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5f) { return CharacterType.ALPHA_LETTER } return CharacterType.PUNCT } else if (isThai(charCode)) { return CharacterType.THAI_LETTER } else if (charCode === 0xa0) { return CharacterType.SPACE } return CharacterType.ALPHA_LETTER } if (isHan(charCode)) { return CharacterType.HAN_LETTER } else if (isKatakana(charCode)) { return CharacterType.KATAKANA_LETTER } else if (isHiragana(charCode)) { return CharacterType.HIRAGANA_LETTER } else if (isHalfwidthKatakana(charCode)) { return CharacterType.HALFWIDTH_KATAKANA_LETTER } return CharacterType.ALPHA_LETTER } /***/ }), /* 13 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.isDestArraysEqual = isDestArraysEqual exports.isDestHashesEqual = isDestHashesEqual exports.PDFHistory = void 0 var _ui_utils = __w_pdfjs_require__(5) const HASH_CHANGE_TIMEOUT = 1000 const POSITION_UPDATED_THRESHOLD = 50 const UPDATE_VIEWAREA_TIMEOUT = 1000 function getCurrentHash () { return document.location.hash } class PDFHistory { constructor ({ linkService, eventBus }) { this.linkService = linkService this.eventBus = eventBus this._initialized = false this._fingerprint = '' this.reset() this._boundEvents = null this._isViewerInPresentationMode = false this.eventBus._on('presentationmodechanged', evt => { this._isViewerInPresentationMode = evt.state !== _ui_utils.PresentationModeState.NORMAL }) this.eventBus._on('pagesinit', () => { this._isPagesLoaded = false this.eventBus._on('pagesloaded', evt => { this._isPagesLoaded = !!evt.pagesCount }, { once: true }) }) } initialize ({ fingerprint, resetHistory = false, updateUrl = false }) { if (!fingerprint || typeof fingerprint !== 'string') { console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.') return } if (this._initialized) { this.reset() } const reInitialized = this._fingerprint !== '' && this._fingerprint !== fingerprint this._fingerprint = fingerprint this._updateUrl = updateUrl === true this._initialized = true this._bindEvents() const state = window.history.state this._popStateInProgress = false this._blockHashChange = 0 this._currentHash = getCurrentHash() this._numPositionUpdates = 0 this._uid = this._maxUid = 0 this._destination = null this._position = null if (!this._isValidState(state, true) || resetHistory) { const { hash, page, rotation } = this._parseCurrentHash(true) if (!hash || reInitialized || resetHistory) { this._pushOrReplaceState(null, true) return } this._pushOrReplaceState({ hash, page, rotation }, true) return } const destination = state.destination this._updateInternalState(destination, state.uid, true) if (destination.rotation !== undefined) { this._initialRotation = destination.rotation } if (destination.dest) { this._initialBookmark = JSON.stringify(destination.dest) this._destination.page = null } else if (destination.hash) { this._initialBookmark = destination.hash } else if (destination.page) { this._initialBookmark = `page=${destination.page}` } } reset () { if (this._initialized) { this._pageHide() this._initialized = false this._unbindEvents() } if (this._updateViewareaTimeout) { clearTimeout(this._updateViewareaTimeout) this._updateViewareaTimeout = null } this._initialBookmark = null this._initialRotation = null } push ({ namedDest = null, explicitDest, pageNumber }) { if (!this._initialized) { return } if (namedDest && typeof namedDest !== 'string') { console.error('PDFHistory.push: ' + `"${namedDest}" is not a valid namedDest parameter.`) return } else if (!Array.isArray(explicitDest)) { console.error('PDFHistory.push: ' + `"${explicitDest}" is not a valid explicitDest parameter.`) return } else if (!this._isValidPage(pageNumber)) { if (pageNumber !== null || this._destination) { console.error('PDFHistory.push: ' + `"${pageNumber}" is not a valid pageNumber parameter.`) return } } const hash = namedDest || JSON.stringify(explicitDest) if (!hash) { return } let forceReplace = false if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || isDestArraysEqual(this._destination.dest, explicitDest))) { if (this._destination.page) { return } forceReplace = true } if (this._popStateInProgress && !forceReplace) { return } this._pushOrReplaceState({ dest: explicitDest, hash, page: pageNumber, rotation: this.linkService.rotation }, forceReplace) if (!this._popStateInProgress) { this._popStateInProgress = true Promise.resolve().then(() => { this._popStateInProgress = false }) } } pushPage (pageNumber) { if (!this._initialized) { return } if (!this._isValidPage(pageNumber)) { console.error(`PDFHistory.pushPage: "${pageNumber}" is not a valid page number.`) return } if (this._destination?.page === pageNumber) { return } if (this._popStateInProgress) { return } this._pushOrReplaceState({ dest: null, hash: `page=${pageNumber}`, page: pageNumber, rotation: this.linkService.rotation }) if (!this._popStateInProgress) { this._popStateInProgress = true Promise.resolve().then(() => { this._popStateInProgress = false }) } } pushCurrentPosition () { if (!this._initialized || this._popStateInProgress) { return } this._tryPushCurrentPosition() } back () { if (!this._initialized || this._popStateInProgress) { return } const state = window.history.state if (this._isValidState(state) && state.uid > 0) { window.history.back() } } forward () { if (!this._initialized || this._popStateInProgress) { return } const state = window.history.state if (this._isValidState(state) && state.uid < this._maxUid) { window.history.forward() } } get popStateInProgress () { return this._initialized && (this._popStateInProgress || this._blockHashChange > 0) } get initialBookmark () { return this._initialized ? this._initialBookmark : null } get initialRotation () { return this._initialized ? this._initialRotation : null } _pushOrReplaceState (destination, forceReplace = false) { const shouldReplace = forceReplace || !this._destination const newState = { fingerprint: this._fingerprint, uid: shouldReplace ? this._uid : this._uid + 1, destination } this._updateInternalState(destination, newState.uid) let newUrl if (this._updateUrl && destination?.hash) { const baseUrl = document.location.href.split('#')[0] if (!baseUrl.startsWith('file://')) { newUrl = `${baseUrl}#${destination.hash}` } } if (shouldReplace) { window.history.replaceState(newState, '', newUrl) } else { window.history.pushState(newState, '', newUrl) } } _tryPushCurrentPosition (temporary = false) { if (!this._position) { return } let position = this._position if (temporary) { position = Object.assign(Object.create(null), this._position) position.temporary = true } if (!this._destination) { this._pushOrReplaceState(position) return } if (this._destination.temporary) { this._pushOrReplaceState(position, true) return } if (this._destination.hash === position.hash) { return } if (!this._destination.page && (POSITION_UPDATED_THRESHOLD <= 0 || this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)) { return } let forceReplace = false if (this._destination.page >= position.first && this._destination.page <= position.page) { if (this._destination.dest !== undefined || !this._destination.first) { return } forceReplace = true } this._pushOrReplaceState(position, forceReplace) } _isValidPage (val) { return Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount } _isValidState (state, checkReload = false) { if (!state) { return false } if (state.fingerprint !== this._fingerprint) { if (checkReload) { if (typeof state.fingerprint !== 'string' || state.fingerprint.length !== this._fingerprint.length) { return false } const [perfEntry] = performance.getEntriesByType('navigation') if (perfEntry?.type !== 'reload') { return false } } else { return false } } if (!Number.isInteger(state.uid) || state.uid < 0) { return false } if (state.destination === null || typeof state.destination !== 'object') { return false } return true } _updateInternalState (destination, uid, removeTemporary = false) { if (this._updateViewareaTimeout) { clearTimeout(this._updateViewareaTimeout) this._updateViewareaTimeout = null } if (removeTemporary && destination?.temporary) { delete destination.temporary } this._destination = destination this._uid = uid this._maxUid = Math.max(this._maxUid, uid) this._numPositionUpdates = 0 } _parseCurrentHash (checkNameddest = false) { const hash = unescape(getCurrentHash()).substring(1) const params = (0, _ui_utils.parseQueryString)(hash) const nameddest = params.nameddest || '' let page = params.page | 0 if (!this._isValidPage(page) || checkNameddest && nameddest.length > 0) { page = null } return { hash, page, rotation: this.linkService.rotation } } _updateViewarea ({ location }) { if (this._updateViewareaTimeout) { clearTimeout(this._updateViewareaTimeout) this._updateViewareaTimeout = null } this._position = { hash: this._isViewerInPresentationMode ? `page=${location.pageNumber}` : location.pdfOpenParams.substring(1), page: this.linkService.page, first: location.pageNumber, rotation: location.rotation } if (this._popStateInProgress) { return } if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded && this._destination && !this._destination.page) { this._numPositionUpdates++ } if (UPDATE_VIEWAREA_TIMEOUT > 0) { this._updateViewareaTimeout = setTimeout(() => { if (!this._popStateInProgress) { this._tryPushCurrentPosition(true) } this._updateViewareaTimeout = null }, UPDATE_VIEWAREA_TIMEOUT) } } _popState ({ state }) { const newHash = getCurrentHash(), hashChanged = this._currentHash !== newHash this._currentHash = newHash if (!state) { this._uid++ const { hash, page, rotation } = this._parseCurrentHash() this._pushOrReplaceState({ hash, page, rotation }, true) return } if (!this._isValidState(state)) { return } this._popStateInProgress = true if (hashChanged) { this._blockHashChange++; (0, _ui_utils.waitOnEventOrTimeout)({ target: window, name: 'hashchange', delay: HASH_CHANGE_TIMEOUT }).then(() => { this._blockHashChange-- }) } const destination = state.destination this._updateInternalState(destination, state.uid, true) if ((0, _ui_utils.isValidRotation)(destination.rotation)) { this.linkService.rotation = destination.rotation } if (destination.dest) { this.linkService.goToDestination(destination.dest) } else if (destination.hash) { this.linkService.setHash(destination.hash) } else if (destination.page) { this.linkService.page = destination.page } Promise.resolve().then(() => { this._popStateInProgress = false }) } _pageHide () { if (!this._destination || this._destination.temporary) { this._tryPushCurrentPosition() } } _bindEvents () { if (this._boundEvents) { return } this._boundEvents = { updateViewarea: this._updateViewarea.bind(this), popState: this._popState.bind(this), pageHide: this._pageHide.bind(this) } this.eventBus._on('updateviewarea', this._boundEvents.updateViewarea) window.addEventListener('popstate', this._boundEvents.popState) window.addEventListener('pagehide', this._boundEvents.pageHide) } _unbindEvents () { if (!this._boundEvents) { return } this.eventBus._off('updateviewarea', this._boundEvents.updateViewarea) window.removeEventListener('popstate', this._boundEvents.popState) window.removeEventListener('pagehide', this._boundEvents.pageHide) this._boundEvents = null } } exports.PDFHistory = PDFHistory function isDestHashesEqual (destHash, pushHash) { if (typeof destHash !== 'string' || typeof pushHash !== 'string') { return false } if (destHash === pushHash) { return true } const { nameddest } = (0, _ui_utils.parseQueryString)(destHash) if (nameddest === pushHash) { return true } return false } function isDestArraysEqual (firstDest, secondDest) { function isEntryEqual (first, second) { if (typeof first !== typeof second) { return false } if (Array.isArray(first) || Array.isArray(second)) { return false } if (first !== null && typeof first === 'object' && second !== null) { if (Object.keys(first).length !== Object.keys(second).length) { return false } for (const key in first) { if (!isEntryEqual(first[key], second[key])) { return false } } return true } return first === second || Number.isNaN(first) && Number.isNaN(second) } if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) { return false } if (firstDest.length !== secondDest.length) { return false } for (let i = 0, ii = firstDest.length; i < ii; i++) { if (!isEntryEqual(firstDest[i], secondDest[i])) { return false } } return true } /***/ }), /* 14 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.PDFPageView = void 0 var _ui_utils = __w_pdfjs_require__(5) var _pdfjsLib = __w_pdfjs_require__(2) var _l10n_utils = __w_pdfjs_require__(3) var _pdf_rendering_queue = __w_pdfjs_require__(15) var _viewer_compatibility = __w_pdfjs_require__(8) const MAX_CANVAS_PIXELS = _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels || 16777216 class PDFPageView { constructor (options) { const container = options.container const defaultViewport = options.defaultViewport this.id = options.id this.renderingId = 'page' + this.id this.pdfPage = null this.pageLabel = null this.rotation = 0 this.scale = options.scale || _ui_utils.DEFAULT_SCALE this.viewport = defaultViewport this.pdfPageRotate = defaultViewport.rotation this._optionalContentConfigPromise = options.optionalContentConfigPromise || null this.hasRestrictedScaling = false this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : _ui_utils.TextLayerMode.ENABLE this.imageResourcesPath = options.imageResourcesPath || '' this.renderInteractiveForms = options.renderInteractiveForms !== false this.useOnlyCssZoom = options.useOnlyCssZoom || false this.maxCanvasPixels = options.maxCanvasPixels || MAX_CANVAS_PIXELS this.eventBus = options.eventBus this.renderingQueue = options.renderingQueue this.textLayerFactory = options.textLayerFactory this.annotationLayerFactory = options.annotationLayerFactory this.xfaLayerFactory = options.xfaLayerFactory this.renderer = options.renderer || _ui_utils.RendererType.CANVAS this.enableWebGL = options.enableWebGL || false this.l10n = options.l10n || _l10n_utils.NullL10n this.enableScripting = options.enableScripting === true this.paintTask = null this.paintedViewportMap = new WeakMap() this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL this.resume = null this._renderError = null this.annotationLayer = null this.textLayer = null this.zoomLayer = null this.xfaLayer = null const div = document.createElement('div') div.className = 'page' div.style.width = Math.floor(this.viewport.width) + 'px' div.style.height = Math.floor(this.viewport.height) + 'px' div.setAttribute('data-page-number', this.id) div.setAttribute('role', 'region') this.l10n.get('page_landmark', { page: this.id }).then(msg => { div.setAttribute('aria-label', msg) }) this.div = div container.appendChild(div) } setPdfPage (pdfPage) { this.pdfPage = pdfPage this.pdfPageRotate = pdfPage.rotate const totalRotation = (this.rotation + this.pdfPageRotate) % 360 this.viewport = pdfPage.getViewport({ scale: this.scale * _ui_utils.CSS_UNITS, rotation: totalRotation }) this.reset() } destroy () { this.reset() if (this.pdfPage) { this.pdfPage.cleanup() } } async _renderAnnotationLayer () { let error = null try { await this.annotationLayer.render(this.viewport, 'display') } catch (ex) { error = ex } finally { this.eventBus.dispatch('annotationlayerrendered', { source: this, pageNumber: this.id, error }) } } async _renderXfaLayer () { let error = null try { await this.xfaLayer.render(this.viewport, 'display') } catch (ex) { error = ex } finally { this.eventBus.dispatch('xfalayerrendered', { source: this, pageNumber: this.id, error }) } } _resetZoomLayer (removeFromDOM = false) { if (!this.zoomLayer) { return } const zoomLayerCanvas = this.zoomLayer.firstChild this.paintedViewportMap.delete(zoomLayerCanvas) zoomLayerCanvas.width = 0 zoomLayerCanvas.height = 0 if (removeFromDOM) { this.zoomLayer.remove() } this.zoomLayer = null } reset (keepZoomLayer = false, keepAnnotations = false) { this.cancelRendering(keepAnnotations) this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL const div = this.div div.style.width = Math.floor(this.viewport.width) + 'px' div.style.height = Math.floor(this.viewport.height) + 'px' const childNodes = div.childNodes const currentZoomLayerNode = keepZoomLayer && this.zoomLayer || null const currentAnnotationNode = keepAnnotations && this.annotationLayer?.div || null const currentXfaLayerNode = this.xfaLayer?.div || null for (let i = childNodes.length - 1; i >= 0; i--) { const node = childNodes[i] if (currentZoomLayerNode === node || currentAnnotationNode === node || currentXfaLayerNode === node) { continue } div.removeChild(node) } div.removeAttribute('data-loaded') if (currentAnnotationNode) { this.annotationLayer.hide() } else if (this.annotationLayer) { this.annotationLayer.cancel() this.annotationLayer = null } if (!currentZoomLayerNode) { if (this.canvas) { this.paintedViewportMap.delete(this.canvas) this.canvas.width = 0 this.canvas.height = 0 delete this.canvas } this._resetZoomLayer() } if (this.svg) { this.paintedViewportMap.delete(this.svg) delete this.svg } this.loadingIconDiv = document.createElement('div') this.loadingIconDiv.className = 'loadingIcon' this.loadingIconDiv.setAttribute('role', 'img') this.l10n.get('loading').then(msg => { this.loadingIconDiv?.setAttribute('aria-label', msg) }) div.appendChild(this.loadingIconDiv) } update (scale, rotation, optionalContentConfigPromise = null) { this.scale = scale || this.scale if (typeof rotation !== 'undefined') { this.rotation = rotation } if (optionalContentConfigPromise instanceof Promise) { this._optionalContentConfigPromise = optionalContentConfigPromise } const totalRotation = (this.rotation + this.pdfPageRotate) % 360 this.viewport = this.viewport.clone({ scale: this.scale * _ui_utils.CSS_UNITS, rotation: totalRotation }) if (this.svg) { this.cssTransform(this.svg, true) this.eventBus.dispatch('pagerendered', { source: this, pageNumber: this.id, cssTransform: true, timestamp: performance.now(), error: this._renderError }) return } let isScalingRestricted = false if (this.canvas && this.maxCanvasPixels > 0) { const outputScale = this.outputScale if ((Math.floor(this.viewport.width) * outputScale.sx | 0) * (Math.floor(this.viewport.height) * outputScale.sy | 0) > this.maxCanvasPixels) { isScalingRestricted = true } } if (this.canvas) { if (this.useOnlyCssZoom || this.hasRestrictedScaling && isScalingRestricted) { this.cssTransform(this.canvas, true) this.eventBus.dispatch('pagerendered', { source: this, pageNumber: this.id, cssTransform: true, timestamp: performance.now(), error: this._renderError }) return } if (!this.zoomLayer && !this.canvas.hidden) { this.zoomLayer = this.canvas.parentNode this.zoomLayer.style.position = 'absolute' } } if (this.zoomLayer) { this.cssTransform(this.zoomLayer.firstChild) } this.reset(true, true) } cancelRendering (keepAnnotations = false) { if (this.paintTask) { this.paintTask.cancel() this.paintTask = null } this.resume = null if (this.textLayer) { this.textLayer.cancel() this.textLayer = null } if (!keepAnnotations && this.annotationLayer) { this.annotationLayer.cancel() this.annotationLayer = null } } cssTransform (target, redrawAnnotations = false) { const width = this.viewport.width const height = this.viewport.height const div = this.div target.style.width = target.parentNode.style.width = div.style.width = Math.floor(width) + 'px' target.style.height = target.parentNode.style.height = div.style.height = Math.floor(height) + 'px' const relativeRotation = this.viewport.rotation - this.paintedViewportMap.get(target).rotation const absRotation = Math.abs(relativeRotation) let scaleX = 1, scaleY = 1 if (absRotation === 90 || absRotation === 270) { scaleX = height / width scaleY = width / height } target.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX}, ${scaleY})` if (this.textLayer) { const textLayerViewport = this.textLayer.viewport const textRelativeRotation = this.viewport.rotation - textLayerViewport.rotation const textAbsRotation = Math.abs(textRelativeRotation) let scale = width / textLayerViewport.width if (textAbsRotation === 90 || textAbsRotation === 270) { scale = width / textLayerViewport.height } const textLayerDiv = this.textLayer.textLayerDiv let transX, transY switch (textAbsRotation) { case 0: transX = transY = 0 break case 90: transX = 0 transY = '-' + textLayerDiv.style.height break case 180: transX = '-' + textLayerDiv.style.width transY = '-' + textLayerDiv.style.height break case 270: transX = '-' + textLayerDiv.style.width transY = 0 break default: console.error('Bad rotation value.') break } textLayerDiv.style.transform = `rotate(${textAbsRotation}deg) ` + `scale(${scale}) ` + `translate(${transX}, ${transY})` textLayerDiv.style.transformOrigin = '0% 0%' } if (redrawAnnotations && this.annotationLayer) { this._renderAnnotationLayer() } if (this.xfaLayer) { this._renderXfaLayer() } } get width () { return this.viewport.width } get height () { return this.viewport.height } getPagePoint (x, y) { return this.viewport.convertToPdfPoint(x, y) } draw () { if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) { console.error('Must be in new state before drawing') this.reset() } const { div, pdfPage } = this if (!pdfPage) { this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED if (this.loadingIconDiv) { div.removeChild(this.loadingIconDiv) delete this.loadingIconDiv } return Promise.reject(new Error('pdfPage is not loaded')) } this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING const canvasWrapper = document.createElement('div') canvasWrapper.style.width = div.style.width canvasWrapper.style.height = div.style.height canvasWrapper.classList.add('canvasWrapper') if (this.annotationLayer?.div) { div.insertBefore(canvasWrapper, this.annotationLayer.div) } else { div.appendChild(canvasWrapper) } let textLayer = null if (this.textLayerMode !== _ui_utils.TextLayerMode.DISABLE && this.textLayerFactory) { const textLayerDiv = document.createElement('div') textLayerDiv.className = 'textLayer' textLayerDiv.style.width = canvasWrapper.style.width textLayerDiv.style.height = canvasWrapper.style.height if (this.annotationLayer?.div) { div.insertBefore(textLayerDiv, this.annotationLayer.div) } else { div.appendChild(textLayerDiv) } textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport, this.textLayerMode === _ui_utils.TextLayerMode.ENABLE_ENHANCE, this.eventBus) } this.textLayer = textLayer let renderContinueCallback = null if (this.renderingQueue) { renderContinueCallback = cont => { if (!this.renderingQueue.isHighestPriority(this)) { this.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED this.resume = () => { this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING cont() } return } cont() } } const finishPaintTask = async (error = null) => { if (paintTask === this.paintTask) { this.paintTask = null } if (error instanceof _pdfjsLib.RenderingCancelledException) { this._renderError = null return } this._renderError = error this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED if (this.loadingIconDiv) { div.removeChild(this.loadingIconDiv) delete this.loadingIconDiv } this._resetZoomLayer(true) this.eventBus.dispatch('pagerendered', { source: this, pageNumber: this.id, cssTransform: false, timestamp: performance.now(), error: this._renderError }) if (error) { throw error } } const paintTask = this.renderer === _ui_utils.RendererType.SVG ? this.paintOnSvg(canvasWrapper) : this.paintOnCanvas(canvasWrapper) paintTask.onRenderContinue = renderContinueCallback this.paintTask = paintTask const resultPromise = paintTask.promise.then(function () { return finishPaintTask(null).then(function () { if (textLayer) { const readableStream = pdfPage.streamTextContent({ normalizeWhitespace: true }) textLayer.setTextContentStream(readableStream) textLayer.render() } }) }, function (reason) { return finishPaintTask(reason) }) if (this.annotationLayerFactory) { if (!this.annotationLayer) { this.annotationLayer = this.annotationLayerFactory.createAnnotationLayerBuilder(div, pdfPage, null, this.imageResourcesPath, this.renderInteractiveForms, this.l10n, this.enableScripting, null, null) } this._renderAnnotationLayer() } if (this.xfaLayerFactory) { if (!this.xfaLayer) { this.xfaLayer = this.xfaLayerFactory.createXfaLayerBuilder(div, pdfPage) } this._renderXfaLayer() } div.setAttribute('data-loaded', true) this.eventBus.dispatch('pagerender', { source: this, pageNumber: this.id }) return resultPromise } paintOnCanvas (canvasWrapper) { const renderCapability = (0, _pdfjsLib.createPromiseCapability)() const result = { promise: renderCapability.promise, onRenderContinue (cont) { cont() }, cancel () { renderTask.cancel() } } const viewport = this.viewport const canvas = document.createElement('canvas') canvas.hidden = true let isCanvasHidden = true const showCanvas = function () { if (isCanvasHidden) { canvas.hidden = false isCanvasHidden = false } } canvasWrapper.appendChild(canvas) this.canvas = canvas canvas.mozOpaque = true const ctx = canvas.getContext('2d', { alpha: false, }) const outputScale = (0, _ui_utils.getOutputScale)(ctx) this.outputScale = outputScale if (this.useOnlyCssZoom) { const actualSizeViewport = viewport.clone({ scale: _ui_utils.CSS_UNITS }) outputScale.sx *= actualSizeViewport.width / viewport.width outputScale.sy *= actualSizeViewport.height / viewport.height outputScale.scaled = true } if (this.maxCanvasPixels > 0) { const pixelsInViewport = viewport.width * viewport.height const maxScale = Math.sqrt(this.maxCanvasPixels / pixelsInViewport) if (outputScale.sx > maxScale || outputScale.sy > maxScale) { outputScale.sx = maxScale outputScale.sy = maxScale outputScale.scaled = true this.hasRestrictedScaling = true } else { this.hasRestrictedScaling = false } } const sfx = (0, _ui_utils.approximateFraction)(outputScale.sx) const sfy = (0, _ui_utils.approximateFraction)(outputScale.sy) canvas.width = (0, _ui_utils.roundToDivide)(viewport.width * outputScale.sx, sfx[0]) canvas.height = (0, _ui_utils.roundToDivide)(viewport.height * outputScale.sy, sfy[0]) canvas.style.width = (0, _ui_utils.roundToDivide)(viewport.width, sfx[1]) + 'px' canvas.style.height = (0, _ui_utils.roundToDivide)(viewport.height, sfy[1]) + 'px' this.paintedViewportMap.set(canvas, viewport) const transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0] const renderContext = { canvasContext: ctx, transform, viewport: this.viewport, enableWebGL: this.enableWebGL, renderInteractiveForms: this.renderInteractiveForms, optionalContentConfigPromise: this._optionalContentConfigPromise, // background: 'transparent', } const renderTask = this.pdfPage.render(renderContext) renderTask.onContinue = function (cont) { showCanvas() if (result.onRenderContinue) { result.onRenderContinue(cont) } else { cont() } } renderTask.promise.then(function () { showCanvas() renderCapability.resolve(undefined) }, function (error) { showCanvas() renderCapability.reject(error) }) return result } paintOnSvg (wrapper) { let cancelled = false const ensureNotCancelled = () => { if (cancelled) { throw new _pdfjsLib.RenderingCancelledException(`Rendering cancelled, page ${this.id}`, 'svg') } } const pdfPage = this.pdfPage const actualSizeViewport = this.viewport.clone({ scale: _ui_utils.CSS_UNITS }) const promise = pdfPage.getOperatorList().then(opList => { ensureNotCancelled() const svgGfx = new _pdfjsLib.SVGGraphics(pdfPage.commonObjs, pdfPage.objs, _viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) return svgGfx.getSVG(opList, actualSizeViewport).then(svg => { ensureNotCancelled() this.svg = svg this.paintedViewportMap.set(svg, actualSizeViewport) svg.style.width = wrapper.style.width svg.style.height = wrapper.style.height this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED wrapper.appendChild(svg) }) }) return { promise, onRenderContinue (cont) { cont() }, cancel () { cancelled = true } } } setPageLabel (label) { this.pageLabel = typeof label === 'string' ? label : null if (this.pageLabel !== null) { this.div.setAttribute('data-page-label', this.pageLabel) } else { this.div.removeAttribute('data-page-label') } } } exports.PDFPageView = PDFPageView /***/ }), /* 15 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.RenderingStates = exports.PDFRenderingQueue = void 0 var _pdfjsLib = __w_pdfjs_require__(2) const CLEANUP_TIMEOUT = 30000 const RenderingStates = { INITIAL: 0, RUNNING: 1, PAUSED: 2, FINISHED: 3 } exports.RenderingStates = RenderingStates class PDFRenderingQueue { constructor () { this.pdfViewer = null this.pdfThumbnailViewer = null this.onIdle = null this.highestPriorityPage = null this.idleTimeout = null this.printing = false this.isThumbnailViewEnabled = false } setViewer (pdfViewer) { this.pdfViewer = pdfViewer } setThumbnailViewer (pdfThumbnailViewer) { this.pdfThumbnailViewer = pdfThumbnailViewer } isHighestPriority (view) { return this.highestPriorityPage === view.renderingId } 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) } } getHighestPriority (visible, views, scrolledDown) { const visibleViews = visible.views const numVisible = visibleViews.length if (numVisible === 0) { return null } for (let i = 0; i < numVisible; ++i) { const view = visibleViews[i].view if (!this.isViewFinished(view)) { return view } } if (scrolledDown) { const nextPageIndex = visible.last.id if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) { return views[nextPageIndex] } } else { const previousPageIndex = visible.first.id - 2 if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) { return views[previousPageIndex] } } return null } isViewFinished (view) { return view.renderingState === RenderingStates.FINISHED } renderView (view) { 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 view.draw().finally(() => { this.renderHighestPriority() }).catch(reason => { if (reason instanceof _pdfjsLib.RenderingCancelledException) { return } console.error(`renderView: "${reason}"`) }) break } return true } } exports.PDFRenderingQueue = PDFRenderingQueue /***/ }), /* 16 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.PDFScriptingManager = void 0 var _pdfjsLib = __w_pdfjs_require__(2) var _ui_utils = __w_pdfjs_require__(5) var _pdf_rendering_queue = __w_pdfjs_require__(15) class PDFScriptingManager { constructor ({ eventBus, sandboxBundleSrc = null, scriptingFactory = null, docPropertiesLookup = null }) { this._pdfDocument = null this._pdfViewer = null this._closeCapability = null this._destroyCapability = null this._scripting = null this._mouseState = Object.create(null) this._pageEventsReady = false this._ready = false this._eventBus = eventBus this._sandboxBundleSrc = sandboxBundleSrc this._scriptingFactory = scriptingFactory this._docPropertiesLookup = docPropertiesLookup if (!this._scriptingFactory) { window.addEventListener('updatefromsandbox', event => { this._eventBus.dispatch('updatefromsandbox', { source: window, detail: event.detail }) }) } } setViewer (pdfViewer) { this._pdfViewer = pdfViewer } async setDocument (pdfDocument) { if (this._pdfDocument) { await this._destroyScripting() } this._pdfDocument = pdfDocument if (!pdfDocument) { return } const [objects, calculationOrder, docActions] = await Promise.all([pdfDocument.getFieldObjects(), pdfDocument.getCalculationOrderIds(), pdfDocument.getJSActions()]) if (!objects && !docActions) { await this._destroyScripting() return } if (pdfDocument !== this._pdfDocument) { return } this._scripting = this._createScripting() this._internalEvents.set('updatefromsandbox', event => { if (event?.source !== window) { return } this._updateFromSandbox(event.detail) }) this._internalEvents.set('dispatcheventinsandbox', event => { this._scripting?.dispatchEventInSandbox(event.detail) }) this._internalEvents.set('pagechanging', ({ pageNumber, previous }) => { if (pageNumber === previous) { return } this._dispatchPageClose(previous) this._dispatchPageOpen(pageNumber) }) this._internalEvents.set('pagerendered', ({ pageNumber }) => { if (!this._pageOpenPending.has(pageNumber)) { return } if (pageNumber !== this._pdfViewer.currentPageNumber) { return } this._dispatchPageOpen(pageNumber) }) this._internalEvents.set('pagesdestroy', async event => { await this._dispatchPageClose(this._pdfViewer.currentPageNumber) await this._scripting?.dispatchEventInSandbox({ id: 'doc', name: 'WillClose' }) this._closeCapability?.resolve() }) this._domEvents.set('mousedown', event => { this._mouseState.isDown = true }) this._domEvents.set('mouseup', event => { this._mouseState.isDown = false }) for (const [name, listener] of this._internalEvents) { this._eventBus._on(name, listener) } for (const [name, listener] of this._domEvents) { window.addEventListener(name, listener) } try { const docProperties = await this._getDocProperties() if (pdfDocument !== this._pdfDocument) { return } await this._scripting.createSandbox({ objects, calculationOrder, appInfo: { platform: navigator.platform, language: navigator.language }, docInfo: { ...docProperties, actions: docActions } }) this._eventBus.dispatch('sandboxcreated', { source: this }) } catch (error) { console.error(`PDFScriptingManager.setDocument: "${error?.message}".`) await this._destroyScripting() return } await this._scripting?.dispatchEventInSandbox({ id: 'doc', name: 'Open' }) await this._dispatchPageOpen(this._pdfViewer.currentPageNumber, true) Promise.resolve().then(() => { if (pdfDocument === this._pdfDocument) { this._ready = true } }) } async dispatchWillSave (detail) { return this._scripting?.dispatchEventInSandbox({ id: 'doc', name: 'WillSave' }) } async dispatchDidSave (detail) { return this._scripting?.dispatchEventInSandbox({ id: 'doc', name: 'DidSave' }) } async dispatchWillPrint (detail) { return this._scripting?.dispatchEventInSandbox({ id: 'doc', name: 'WillPrint' }) } async dispatchDidPrint (detail) { return this._scripting?.dispatchEventInSandbox({ id: 'doc', name: 'DidPrint' }) } get mouseState () { return this._mouseState } get destroyPromise () { return this._destroyCapability?.promise || null } get ready () { return this._ready } get _internalEvents () { return (0, _pdfjsLib.shadow)(this, '_internalEvents', new Map()) } get _domEvents () { return (0, _pdfjsLib.shadow)(this, '_domEvents', new Map()) } get _pageOpenPending () { return (0, _pdfjsLib.shadow)(this, '_pageOpenPending', new Set()) } get _visitedPages () { return (0, _pdfjsLib.shadow)(this, '_visitedPages', new Map()) } async _updateFromSandbox (detail) { const isInPresentationMode = this._pdfViewer.isInPresentationMode || this._pdfViewer.isChangingPresentationMode const { id, command, value } = detail if (!id) { switch (command) { case 'clear': console.clear() break case 'error': console.error(value) break case 'layout': this._pdfViewer.spreadMode = (0, _ui_utils.apiPageLayoutToSpreadMode)(value) break case 'page-num': this._pdfViewer.currentPageNumber = value + 1 break case 'print': await this._pdfViewer.pagesPromise this._eventBus.dispatch('print', { source: this }) break case 'println': console.log(value) break case 'zoom': if (isInPresentationMode) { return } this._pdfViewer.currentScaleValue = value break } return } if (isInPresentationMode) { if (detail.focus) { return } } const element = document.getElementById(id) if (element) { element.dispatchEvent(new CustomEvent('updatefromsandbox', { detail })) } else { delete detail.id this._pdfDocument?.annotationStorage.setValue(id, detail) } } async _dispatchPageOpen (pageNumber, initialize = false) { const pdfDocument = this._pdfDocument, visitedPages = this._visitedPages if (initialize) { this._closeCapability = (0, _pdfjsLib.createPromiseCapability)() this._pageEventsReady = true } if (!this._pageEventsReady) { return } const pageView = this._pdfViewer.getPageView(pageNumber - 1) if (pageView?.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) { this._pageOpenPending.add(pageNumber) return } this._pageOpenPending.delete(pageNumber) const actionsPromise = (async () => { const actions = await (!visitedPages.has(pageNumber) ? pageView.pdfPage?.getJSActions() : null) if (pdfDocument !== this._pdfDocument) { return } await this._scripting?.dispatchEventInSandbox({ id: 'page', name: 'PageOpen', pageNumber, actions }) })() visitedPages.set(pageNumber, actionsPromise) } async _dispatchPageClose (pageNumber) { const pdfDocument = this._pdfDocument, visitedPages = this._visitedPages if (!this._pageEventsReady) { return } if (this._pageOpenPending.has(pageNumber)) { return } const actionsPromise = visitedPages.get(pageNumber) if (!actionsPromise) { return } visitedPages.set(pageNumber, null) await actionsPromise if (pdfDocument !== this._pdfDocument) { return } await this._scripting?.dispatchEventInSandbox({ id: 'page', name: 'PageClose', pageNumber }) } async _getDocProperties () { if (this._docPropertiesLookup) { return this._docPropertiesLookup(this._pdfDocument) } const { docPropertiesLookup } = __w_pdfjs_require__(17) return docPropertiesLookup(this._pdfDocument) } _createScripting () { this._destroyCapability = (0, _pdfjsLib.createPromiseCapability)() if (this._scripting) { throw new Error('_createScripting: Scripting already exists.') } if (this._scriptingFactory) { return this._scriptingFactory.createScripting({ sandboxBundleSrc: this._sandboxBundleSrc }) } const { GenericScripting } = __w_pdfjs_require__(17) return new GenericScripting(this._sandboxBundleSrc) } async _destroyScripting () { if (!this._scripting) { this._pdfDocument = null this._destroyCapability?.resolve() return } if (this._closeCapability) { await Promise.race([this._closeCapability.promise, new Promise(resolve => { setTimeout(resolve, 1000) })]).catch(reason => {}) this._closeCapability = null } this._pdfDocument = null try { await this._scripting.destroySandbox() } catch (ex) {} for (const [name, listener] of this._internalEvents) { this._eventBus._off(name, listener) } this._internalEvents.clear() for (const [name, listener] of this._domEvents) { window.removeEventListener(name, listener) } this._domEvents.clear() this._pageOpenPending.clear() this._visitedPages.clear() this._scripting = null delete this._mouseState.isDown this._pageEventsReady = false this._ready = false this._destroyCapability?.resolve() } } exports.PDFScriptingManager = PDFScriptingManager /***/ }), /* 17 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.docPropertiesLookup = docPropertiesLookup exports.GenericScripting = void 0 var _pdfjsLib = __w_pdfjs_require__(2) async function docPropertiesLookup (pdfDocument) { const url = '', baseUrl = url.split('#')[0] let { info, metadata, contentDispositionFilename, contentLength } = await pdfDocument.getMetadata() if (!contentLength) { const { length } = await pdfDocument.getDownloadInfo() contentLength = length } return { ...info, baseURL: baseUrl, filesize: contentLength, filename: contentDispositionFilename || (0, _pdfjsLib.getPdfFilenameFromUrl)(url), metadata: metadata?.getRaw(), authors: metadata?.get('dc:creator'), numPages: pdfDocument.numPages, URL: url } } class GenericScripting { constructor (sandboxBundleSrc) { this._ready = (0, _pdfjsLib.loadScript)(sandboxBundleSrc, true).then(() => { return window.pdfjsSandbox.QuickJSSandbox() }) } async createSandbox (data) { const sandbox = await this._ready sandbox.create(data) } async dispatchEventInSandbox (event) { const sandbox = await this._ready sandbox.dispatchEvent(event) } async destroySandbox () { const sandbox = await this._ready sandbox.nukeSandbox() } } exports.GenericScripting = GenericScripting /***/ }), /* 18 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.PDFSinglePageViewer = void 0 var _base_viewer = __w_pdfjs_require__(19) var _pdfjsLib = __w_pdfjs_require__(2) class PDFSinglePageViewer extends _base_viewer.BaseViewer { constructor (options) { super(options) this.eventBus._on('pagesinit', evt => { this._ensurePageViewVisible() }) } get _viewerElement () { return (0, _pdfjsLib.shadow)(this, '_viewerElement', this._shadowViewer) } get _pageWidthScaleFactor () { return 1 } _resetView () { super._resetView() this._previousPageNumber = 1 this._shadowViewer = document.createDocumentFragment() this._updateScrollDown = null } _ensurePageViewVisible () { const pageView = this._pages[this._currentPageNumber - 1] const previousPageView = this._pages[this._previousPageNumber - 1] const viewerNodes = this.viewer.childNodes switch (viewerNodes.length) { case 0: this.viewer.appendChild(pageView.div) break case 1: if (viewerNodes[0] !== previousPageView.div) { throw new Error('_ensurePageViewVisible: Unexpected previously visible page.') } if (pageView === previousPageView) { break } this._shadowViewer.appendChild(previousPageView.div) this.viewer.appendChild(pageView.div) this.container.scrollTop = 0 break default: throw new Error('_ensurePageViewVisible: Only one page should be visible at a time.') } this._previousPageNumber = this._currentPageNumber } _scrollUpdate () { if (this._updateScrollDown) { this._updateScrollDown() } super._scrollUpdate() } _scrollIntoView ({ pageDiv, pageSpot = null, pageNumber = null }) { if (pageNumber) { this._setCurrentPageNumber(pageNumber) } const scrolledDown = this._currentPageNumber >= this._previousPageNumber this._ensurePageViewVisible() this.update() super._scrollIntoView({ pageDiv, pageSpot, pageNumber }) this._updateScrollDown = () => { this.scroll.down = scrolledDown this._updateScrollDown = null } } _getVisiblePages () { return this._getCurrentVisiblePage() } _updateHelper (visiblePages) {} get _isScrollModeHorizontal () { return (0, _pdfjsLib.shadow)(this, '_isScrollModeHorizontal', false) } _updateScrollMode () {} _updateSpreadMode () {} _getPageAdvance () { return 1 } } exports.PDFSinglePageViewer = PDFSinglePageViewer /***/ }), /* 19 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.BaseViewer = void 0 var _pdfjsLib = __w_pdfjs_require__(2) var _ui_utils = __w_pdfjs_require__(5) var _pdf_rendering_queue = __w_pdfjs_require__(15) var _annotation_layer_builder = __w_pdfjs_require__(1) var _l10n_utils = __w_pdfjs_require__(3) var _pdf_page_view = __w_pdfjs_require__(14) var _pdf_link_service = __w_pdfjs_require__(4) var _text_layer_builder = __w_pdfjs_require__(6) var _xfa_layer_builder = __w_pdfjs_require__(20) const DEFAULT_CACHE_SIZE = 10 function PDFPageViewBuffer (size) { const data = [] this.push = function (view) { const i = data.indexOf(view) if (i >= 0) { data.splice(i, 1) } data.push(view) if (data.length > size) { data.shift().destroy() } } this.resize = function (newSize, pagesToKeep) { size = newSize if (pagesToKeep) { const pageIdsToKeep = new Set() for (let i = 0, iMax = pagesToKeep.length; i < iMax; ++i) { pageIdsToKeep.add(pagesToKeep[i].id) } (0, _ui_utils.moveToEndOfArray)(data, function (page) { return pageIdsToKeep.has(page.id) }) } while (data.length > size) { data.shift().destroy() } } this.has = function (view) { return data.includes(view) } } function isSameScale (oldScale, newScale) { if (newScale === oldScale) { return true } if (Math.abs(newScale - oldScale) < 1e-15) { return true } return false } class BaseViewer { constructor (options) { if (this.constructor === BaseViewer) { throw new Error('Cannot initialize BaseViewer.') } const viewerVersion = '2.8.335' if (_pdfjsLib.version !== viewerVersion) { throw new Error(`The API version "${_pdfjsLib.version}" does not match the Viewer version "${viewerVersion}".`) } this._name = this.constructor.name this.container = options.container this.viewer = options.viewer || options.container.firstElementChild if (!(this.container?.tagName.toUpperCase() === 'DIV' && this.viewer?.tagName.toUpperCase() === 'DIV')) { throw new Error('Invalid `container` and/or `viewer` option.') } if (this.container.offsetParent && getComputedStyle(this.container).position !== 'absolute') { throw new Error('The `container` must be absolutely positioned.') } this.eventBus = options.eventBus this.linkService = options.linkService || new _pdf_link_service.SimpleLinkService() this.downloadManager = options.downloadManager || null this.findController = options.findController || null this._scriptingManager = options.scriptingManager || null this.removePageBorders = options.removePageBorders || false this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : _ui_utils.TextLayerMode.ENABLE this.imageResourcesPath = options.imageResourcesPath || '' this.renderInteractiveForms = options.renderInteractiveForms !== false this.enablePrintAutoRotate = options.enablePrintAutoRotate || false this.renderer = options.renderer || _ui_utils.RendererType.CANVAS this.enableWebGL = options.enableWebGL || false this.useOnlyCssZoom = options.useOnlyCssZoom || false this.maxCanvasPixels = options.maxCanvasPixels this.l10n = options.l10n || _l10n_utils.NullL10n this.enableScripting = options.enableScripting === true && !!this._scriptingManager this.defaultRenderingQueue = !options.renderingQueue if (this.defaultRenderingQueue) { this.renderingQueue = new _pdf_rendering_queue.PDFRenderingQueue() this.renderingQueue.setViewer(this) } else { this.renderingQueue = options.renderingQueue } this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdate.bind(this)) this.presentationModeState = _ui_utils.PresentationModeState.UNKNOWN this._onBeforeDraw = this._onAfterDraw = null this._resetView() if (this.removePageBorders) { this.viewer.classList.add('removePageBorders') } Promise.resolve().then(() => { this.eventBus.dispatch('baseviewerinit', { source: this }) }) } get pagesCount () { return this._pages.length } getPageView (index) { return this._pages[index] } get pageViewsReady () { if (!this._pagesCapability.settled) { return false } return this._pages.every(function (pageView) { return pageView?.pdfPage }) } get currentPageNumber () { return this._currentPageNumber } set currentPageNumber (val) { if (!Number.isInteger(val)) { throw new Error('Invalid page number.') } if (!this.pdfDocument) { return } if (!this._setCurrentPageNumber(val, true)) { console.error(`${this._name}.currentPageNumber: "${val}" is not a valid page.`) } } _setCurrentPageNumber (val, resetCurrentPageView = false) { if (this._currentPageNumber === val) { if (resetCurrentPageView) { this._resetCurrentPageView() } return true } if (!(0 < val && val <= this.pagesCount)) { return false } const previous = this._currentPageNumber this._currentPageNumber = val this.eventBus.dispatch('pagechanging', { source: this, pageNumber: val, pageLabel: this._pageLabels?.[val - 1] ?? null, previous }) if (resetCurrentPageView) { this._resetCurrentPageView() } return true } get currentPageLabel () { return this._pageLabels?.[this._currentPageNumber - 1] ?? null } set currentPageLabel (val) { if (!this.pdfDocument) { return } let page = val | 0 if (this._pageLabels) { const i = this._pageLabels.indexOf(val) if (i >= 0) { page = i + 1 } } if (!this._setCurrentPageNumber(page, true)) { console.error(`${this._name}.currentPageLabel: "${val}" is not a valid page.`) } } get currentScale () { return this._currentScale !== _ui_utils.UNKNOWN_SCALE ? this._currentScale : _ui_utils.DEFAULT_SCALE } set currentScale (val) { if (isNaN(val)) { throw new Error('Invalid numeric scale.') } if (!this.pdfDocument) { return } this._setScale(val, false) } get currentScaleValue () { return this._currentScaleValue } set currentScaleValue (val) { if (!this.pdfDocument) { return } this._setScale(val, false) } get pagesRotation () { return this._pagesRotation } set pagesRotation (rotation) { if (!(0, _ui_utils.isValidRotation)(rotation)) { throw new Error('Invalid pages rotation angle.') } if (!this.pdfDocument) { return } rotation %= 360 if (rotation < 0) { rotation += 360 } if (this._pagesRotation === rotation) { return } this._pagesRotation = rotation const pageNumber = this._currentPageNumber for (let i = 0, ii = this._pages.length; i < ii; i++) { const pageView = this._pages[i] pageView.update(pageView.scale, rotation) } if (this._currentScaleValue) { this._setScale(this._currentScaleValue, true) } this.eventBus.dispatch('rotationchanging', { source: this, pagesRotation: rotation, pageNumber }) if (this.defaultRenderingQueue) { this.update() } } get firstPagePromise () { return this.pdfDocument ? this._firstPageCapability.promise : null } get onePageRendered () { return this.pdfDocument ? this._onePageRenderedCapability.promise : null } get pagesPromise () { return this.pdfDocument ? this._pagesCapability.promise : null } get _viewerElement () { throw new Error('Not implemented: _viewerElement') } _onePageRenderedOrForceFetch () { if (!this.container.offsetParent || this._getVisiblePages().views.length === 0) { return Promise.resolve() } return this._onePageRenderedCapability.promise } setDocument (pdfDocument) { if (this.pdfDocument) { this.eventBus.dispatch('pagesdestroy', { source: this }) this._cancelRendering() this._resetView() if (this.findController) { this.findController.setDocument(null) } if (this._scriptingManager) { this._scriptingManager.setDocument(null) } } this.pdfDocument = pdfDocument if (!pdfDocument) { return } const isPureXfa = pdfDocument.isPureXfa const pagesCount = pdfDocument.numPages const firstPagePromise = pdfDocument.getPage(1) const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig() this._pagesCapability.promise.then(() => { this.eventBus.dispatch('pagesloaded', { source: this, pagesCount }) }) this._onBeforeDraw = evt => { const pageView = this._pages[evt.pageNumber - 1] if (!pageView) { return } this._buffer.push(pageView) } this.eventBus._on('pagerender', this._onBeforeDraw) this._onAfterDraw = evt => { if (evt.cssTransform || this._onePageRenderedCapability.settled) { return } this._onePageRenderedCapability.resolve() this.eventBus._off('pagerendered', this._onAfterDraw) this._onAfterDraw = null } this.eventBus._on('pagerendered', this._onAfterDraw) firstPagePromise.then(firstPdfPage => { this._firstPageCapability.resolve(firstPdfPage) this._optionalContentConfigPromise = optionalContentConfigPromise const scale = this.currentScale const viewport = firstPdfPage.getViewport({ scale: scale * _ui_utils.CSS_UNITS }) const textLayerFactory = this.textLayerMode !== _ui_utils.TextLayerMode.DISABLE ? this : null const xfaLayerFactory = isPureXfa ? this : null for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { const pageView = new _pdf_page_view.PDFPageView({ container: this._viewerElement, eventBus: this.eventBus, id: pageNum, scale, defaultViewport: viewport.clone(), optionalContentConfigPromise, renderingQueue: this.renderingQueue, textLayerFactory, textLayerMode: this.textLayerMode, annotationLayerFactory: this, xfaLayerFactory, imageResourcesPath: this.imageResourcesPath, renderInteractiveForms: this.renderInteractiveForms, renderer: this.renderer, enableWebGL: this.enableWebGL, useOnlyCssZoom: this.useOnlyCssZoom, maxCanvasPixels: this.maxCanvasPixels, l10n: this.l10n, enableScripting: this.enableScripting }) this._pages.push(pageView) } const firstPageView = this._pages[0] if (firstPageView) { firstPageView.setPdfPage(firstPdfPage) this.linkService.cachePageRef(1, firstPdfPage.ref) } if (this._spreadMode !== _ui_utils.SpreadMode.NONE) { this._updateSpreadMode() } this._onePageRenderedOrForceFetch().then(() => { if (this.findController) { this.findController.setDocument(pdfDocument) } if (this.enableScripting) { this._scriptingManager.setDocument(pdfDocument) } if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > 7500) { this._pagesCapability.resolve() return } let getPagesLeft = pagesCount - 1 if (getPagesLeft <= 0) { this._pagesCapability.resolve() return } for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) { pdfDocument.getPage(pageNum).then(pdfPage => { const pageView = this._pages[pageNum - 1] if (!pageView.pdfPage) { pageView.setPdfPage(pdfPage) } this.linkService.cachePageRef(pageNum, pdfPage.ref) if (--getPagesLeft === 0) { this._pagesCapability.resolve() } }, reason => { console.error(`Unable to get page ${pageNum} to initialize viewer`, reason) if (--getPagesLeft === 0) { this._pagesCapability.resolve() } }) } }) this.eventBus.dispatch('pagesinit', { source: this }) if (this.defaultRenderingQueue) { this.update() } }).catch(reason => { console.error('Unable to initialize viewer', reason) }) } setPageLabels (labels) { if (!this.pdfDocument) { return } if (!labels) { this._pageLabels = null } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) { this._pageLabels = null console.error(`${this._name}.setPageLabels: Invalid page labels.`) } else { this._pageLabels = labels } for (let i = 0, ii = this._pages.length; i < ii; i++) { this._pages[i].setPageLabel(this._pageLabels?.[i] ?? null) } } _resetView () { this._pages = [] this._currentPageNumber = 1 this._currentScale = _ui_utils.UNKNOWN_SCALE this._currentScaleValue = null this._pageLabels = null this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE) this._location = null this._pagesRotation = 0 this._optionalContentConfigPromise = null this._pagesRequests = new WeakMap() this._firstPageCapability = (0, _pdfjsLib.createPromiseCapability)() this._onePageRenderedCapability = (0, _pdfjsLib.createPromiseCapability)() this._pagesCapability = (0, _pdfjsLib.createPromiseCapability)() this._scrollMode = _ui_utils.ScrollMode.VERTICAL this._spreadMode = _ui_utils.SpreadMode.NONE if (this._onBeforeDraw) { this.eventBus._off('pagerender', this._onBeforeDraw) this._onBeforeDraw = null } if (this._onAfterDraw) { this.eventBus._off('pagerendered', this._onAfterDraw) this._onAfterDraw = null } this.viewer.textContent = '' this._updateScrollMode() } _scrollUpdate () { if (this.pagesCount === 0) { return } this.update() } _scrollIntoView ({ pageDiv, pageSpot = null, pageNumber = null }) { (0, _ui_utils.scrollIntoView)(pageDiv, pageSpot) } _setScaleUpdatePages (newScale, newValue, noScroll = false, preset = false) { this._currentScaleValue = newValue.toString() if (isSameScale(this._currentScale, newScale)) { if (preset) { this.eventBus.dispatch('scalechanging', { source: this, scale: newScale, presetValue: newValue }) } return } for (let i = 0, ii = this._pages.length; i < ii; i++) { this._pages[i].update(newScale) } this._currentScale = newScale if (!noScroll) { let page = this._currentPageNumber, dest if (this._location && !(this.isInPresentationMode || this.isChangingPresentationMode)) { page = this._location.pageNumber dest = [null, { name: 'XYZ' }, this._location.left, this._location.top, null] } this.scrollPageIntoView({ pageNumber: page, destArray: dest, allowNegativeOffset: true }) } this.eventBus.dispatch('scalechanging', { source: this, scale: newScale, presetValue: preset ? newValue : undefined }) if (this.defaultRenderingQueue) { this.update() } } get _pageWidthScaleFactor () { if (this._spreadMode !== _ui_utils.SpreadMode.NONE && this._scrollMode !== _ui_utils.ScrollMode.HORIZONTAL && !this.isInPresentationMode) { return 2 } return 1 } _setScale (value, noScroll = false) { let scale = parseFloat(value) if (scale > 0) { this._setScaleUpdatePages(scale, value, noScroll, false) } else { const currentPage = this._pages[this._currentPageNumber - 1] if (!currentPage) { return } const noPadding = this.isInPresentationMode || this.removePageBorders let hPadding = noPadding ? 0 : _ui_utils.SCROLLBAR_PADDING let vPadding = noPadding ? 0 : _ui_utils.VERTICAL_PADDING if (!noPadding && this._isScrollModeHorizontal) { [hPadding, vPadding] = [vPadding, hPadding] } const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale / this._pageWidthScaleFactor const pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale switch (value) { case 'page-actual': scale = 1 break case 'page-width': scale = pageWidthScale break case 'page-height': scale = pageHeightScale break case 'page-fit': scale = Math.min(pageWidthScale, pageHeightScale) break case 'auto': const horizontalScale = (0, _ui_utils.isPortraitOrientation)(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale) scale = Math.min(_ui_utils.MAX_AUTO_SCALE, horizontalScale) break default: console.error(`${this._name}._setScale: "${value}" is an unknown zoom value.`) return } this._setScaleUpdatePages(scale, value, noScroll, true) } } _resetCurrentPageView () { if (this.isInPresentationMode) { this._setScale(this._currentScaleValue, true) } const pageView = this._pages[this._currentPageNumber - 1] this._scrollIntoView({ pageDiv: pageView.div }) } pageLabelToPageNumber (label) { if (!this._pageLabels) { return null } const i = this._pageLabels.indexOf(label) if (i < 0) { return null } return i + 1 } scrollPageIntoView ({ pageNumber, destArray = null, allowNegativeOffset = false, ignoreDestinationZoom = false }) { if (!this.pdfDocument) { return } const pageView = Number.isInteger(pageNumber) && this._pages[pageNumber - 1] if (!pageView) { console.error(`${this._name}.scrollPageIntoView: ` + `"${pageNumber}" is not a valid pageNumber parameter.`) return } if (this.isInPresentationMode || !destArray) { this._setCurrentPageNumber(pageNumber, true) return } let x = 0, y = 0 let width = 0, height = 0, widthScale, heightScale const changeOrientation = pageView.rotation % 180 !== 0 const pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / _ui_utils.CSS_UNITS const pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / _ui_utils.CSS_UNITS let scale = 0 switch (destArray[1].name) { case 'XYZ': x = destArray[2] y = destArray[3] scale = destArray[4] x = x !== null ? x : 0 y = y !== null ? y : pageHeight break case 'Fit': case 'FitB': scale = 'page-fit' break case 'FitH': case 'FitBH': y = destArray[2] scale = 'page-width' if (y === null && this._location) { x = this._location.left y = this._location.top } else if (typeof y !== 'number') { y = pageHeight } break case 'FitV': case 'FitBV': x = destArray[2] width = pageWidth height = pageHeight scale = 'page-height' break case 'FitR': x = destArray[2] y = destArray[3] width = destArray[4] - x height = destArray[5] - y const hPadding = this.removePageBorders ? 0 : _ui_utils.SCROLLBAR_PADDING const vPadding = this.removePageBorders ? 0 : _ui_utils.VERTICAL_PADDING widthScale = (this.container.clientWidth - hPadding) / width / _ui_utils.CSS_UNITS heightScale = (this.container.clientHeight - vPadding) / height / _ui_utils.CSS_UNITS scale = Math.min(Math.abs(widthScale), Math.abs(heightScale)) break default: console.error(`${this._name}.scrollPageIntoView: ` + `"${destArray[1].name}" is not a valid destination type.`) return } if (!ignoreDestinationZoom) { if (scale && scale !== this._currentScale) { this.currentScaleValue = scale } else if (this._currentScale === _ui_utils.UNKNOWN_SCALE) { this.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE } } if (scale === 'page-fit' && !destArray[4]) { this._scrollIntoView({ pageDiv: pageView.div, pageNumber }) return } const boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)] let left = Math.min(boundingRect[0][0], boundingRect[1][0]) let top = Math.min(boundingRect[0][1], boundingRect[1][1]) if (!allowNegativeOffset) { left = Math.max(left, 0) top = Math.max(top, 0) } this._scrollIntoView({ pageDiv: pageView.div, pageSpot: { left, top }, pageNumber }) } _updateLocation (firstPage) { const currentScale = this._currentScale const currentScaleValue = this._currentScaleValue const normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue const pageNumber = firstPage.id let pdfOpenParams = '#page=' + pageNumber pdfOpenParams += '&zoom=' + normalizedScaleValue const currentPageView = this._pages[pageNumber - 1] const container = this.container const topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y) const intLeft = Math.round(topLeft[0]) const intTop = Math.round(topLeft[1]) pdfOpenParams += ',' + intLeft + ',' + intTop this._location = { pageNumber, scale: normalizedScaleValue, top: intTop, left: intLeft, rotation: this._pagesRotation, pdfOpenParams } } _updateHelper (visiblePages) { throw new Error('Not implemented: _updateHelper') } update () { const visible = this._getVisiblePages() const visiblePages = visible.views, numVisiblePages = visiblePages.length if (numVisiblePages === 0) { return } const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1) this._buffer.resize(newCacheSize, visiblePages) this.renderingQueue.renderHighestPriority(visible) this._updateHelper(visiblePages) this._updateLocation(visible.first) this.eventBus.dispatch('updateviewarea', { source: this, location: this._location }) } containsElement (element) { return this.container.contains(element) } focus () { this.container.focus() } get _isScrollModeHorizontal () { return this.isInPresentationMode ? false : this._scrollMode === _ui_utils.ScrollMode.HORIZONTAL } get _isContainerRtl () { return getComputedStyle(this.container).direction === 'rtl' } get isInPresentationMode () { return this.presentationModeState === _ui_utils.PresentationModeState.FULLSCREEN } get isChangingPresentationMode () { return this.presentationModeState === _ui_utils.PresentationModeState.CHANGING } get isHorizontalScrollbarEnabled () { return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth } get isVerticalScrollbarEnabled () { return this.isInPresentationMode ? false : this.container.scrollHeight > this.container.clientHeight } _getCurrentVisiblePage () { if (!this.pagesCount) { return { views: [] } } const pageView = this._pages[this._currentPageNumber - 1] const element = pageView.div const view = { id: pageView.id, x: element.offsetLeft + element.clientLeft, y: element.offsetTop + element.clientTop, view: pageView } return { first: view, last: view, views: [view] } } _getVisiblePages () { return (0, _ui_utils.getVisibleElements)({ scrollEl: this.container, views: this._pages, sortByVisibility: true, horizontal: this._isScrollModeHorizontal, rtl: this._isScrollModeHorizontal && this._isContainerRtl }) } isPageVisible (pageNumber) { if (!this.pdfDocument) { return false } if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) { console.error(`${this._name}.isPageVisible: "${pageNumber}" is not a valid page.`) return false } return this._getVisiblePages().views.some(function (view) { return view.id === pageNumber }) } isPageCached (pageNumber) { if (!this.pdfDocument || !this._buffer) { return false } if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) { console.error(`${this._name}.isPageCached: "${pageNumber}" is not a valid page.`) return false } const pageView = this._pages[pageNumber - 1] if (!pageView) { return false } return this._buffer.has(pageView) } cleanup () { for (let i = 0, ii = this._pages.length; i < ii; i++) { if (this._pages[i] && this._pages[i].renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) { this._pages[i].reset() } } } _cancelRendering () { for (let i = 0, ii = this._pages.length; i < ii; i++) { if (this._pages[i]) { this._pages[i].cancelRendering() } } } _ensurePdfPageLoaded (pageView) { if (pageView.pdfPage) { return Promise.resolve(pageView.pdfPage) } if (this._pagesRequests.has(pageView)) { return this._pagesRequests.get(pageView) } const promise = this.pdfDocument.getPage(pageView.id).then(pdfPage => { if (!pageView.pdfPage) { pageView.setPdfPage(pdfPage) } this._pagesRequests.delete(pageView) return pdfPage }).catch(reason => { console.error('Unable to get page for page view', reason) this._pagesRequests.delete(pageView) }) this._pagesRequests.set(pageView, promise) return promise } forceRendering (currentlyVisiblePages) { const visiblePages = currentlyVisiblePages || this._getVisiblePages() const scrollAhead = this._isScrollModeHorizontal ? this.scroll.right : this.scroll.down const pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead) if (pageView) { this._ensurePdfPageLoaded(pageView).then(() => { this.renderingQueue.renderView(pageView) }) return true } return false } createTextLayerBuilder (textLayerDiv, pageIndex, viewport, enhanceTextSelection = false, eventBus) { return new _text_layer_builder.TextLayerBuilder({ textLayerDiv, eventBus, pageIndex, viewport, findController: this.isInPresentationMode ? null : this.findController, enhanceTextSelection: this.isInPresentationMode ? false : enhanceTextSelection }) } createAnnotationLayerBuilder (pageDiv, pdfPage, annotationStorage = null, imageResourcesPath = '', renderInteractiveForms = false, l10n = _l10n_utils.NullL10n, enableScripting = false, hasJSActionsPromise = null, mouseState = null) { return new _annotation_layer_builder.AnnotationLayerBuilder({ pageDiv, pdfPage, annotationStorage: annotationStorage || this.pdfDocument?.annotationStorage, imageResourcesPath, renderInteractiveForms, linkService: this.linkService, downloadManager: this.downloadManager, l10n, enableScripting, hasJSActionsPromise: hasJSActionsPromise || this.pdfDocument?.hasJSActions(), mouseState: mouseState || this._scriptingManager?.mouseState }) } createXfaLayerBuilder (pageDiv, pdfPage) { return new _xfa_layer_builder.XfaLayerBuilder({ pageDiv, pdfPage }) } get hasEqualPageSizes () { const firstPageView = this._pages[0] for (let i = 1, ii = this._pages.length; i < ii; ++i) { const pageView = this._pages[i] if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) { return false } } return true } getPagesOverview () { return this._pages.map(pageView => { const viewport = pageView.pdfPage.getViewport({ scale: 1 }) if (!this.enablePrintAutoRotate || (0, _ui_utils.isPortraitOrientation)(viewport)) { return { width: viewport.width, height: viewport.height, rotation: viewport.rotation } } return { width: viewport.height, height: viewport.width, rotation: (viewport.rotation - 90) % 360 } }) } get optionalContentConfigPromise () { if (!this.pdfDocument) { return Promise.resolve(null) } if (!this._optionalContentConfigPromise) { return this.pdfDocument.getOptionalContentConfig() } return this._optionalContentConfigPromise } set optionalContentConfigPromise (promise) { if (!(promise instanceof Promise)) { throw new Error(`Invalid optionalContentConfigPromise: ${promise}`) } if (!this.pdfDocument) { return } if (!this._optionalContentConfigPromise) { return } this._optionalContentConfigPromise = promise for (const pageView of this._pages) { pageView.update(pageView.scale, pageView.rotation, promise) } this.update() this.eventBus.dispatch('optionalcontentconfigchanged', { source: this, promise }) } get scrollMode () { return this._scrollMode } set scrollMode (mode) { if (this._scrollMode === mode) { return } if (!(0, _ui_utils.isValidScrollMode)(mode)) { throw new Error(`Invalid scroll mode: ${mode}`) } this._scrollMode = mode this.eventBus.dispatch('scrollmodechanged', { source: this, mode }) this._updateScrollMode(this._currentPageNumber) } _updateScrollMode (pageNumber = null) { const scrollMode = this._scrollMode, viewer = this.viewer viewer.classList.toggle('scrollHorizontal', scrollMode === _ui_utils.ScrollMode.HORIZONTAL) viewer.classList.toggle('scrollWrapped', scrollMode === _ui_utils.ScrollMode.WRAPPED) if (!this.pdfDocument || !pageNumber) { return } if (this._currentScaleValue && isNaN(this._currentScaleValue)) { this._setScale(this._currentScaleValue, true) } this._setCurrentPageNumber(pageNumber, true) this.update() } get spreadMode () { return this._spreadMode } set spreadMode (mode) { if (this._spreadMode === mode) { return } if (!(0, _ui_utils.isValidSpreadMode)(mode)) { throw new Error(`Invalid spread mode: ${mode}`) } this._spreadMode = mode this.eventBus.dispatch('spreadmodechanged', { source: this, mode }) this._updateSpreadMode(this._currentPageNumber) } _updateSpreadMode (pageNumber = null) { if (!this.pdfDocument) { return } const viewer = this.viewer, pages = this._pages viewer.textContent = '' if (this._spreadMode === _ui_utils.SpreadMode.NONE) { for (let i = 0, iMax = pages.length; i < iMax; ++i) { viewer.appendChild(pages[i].div) } } else { const parity = this._spreadMode - 1 let spread = null for (let i = 0, iMax = pages.length; i < iMax; ++i) { if (spread === null) { spread = document.createElement('div') spread.className = 'spread' viewer.appendChild(spread) } else if (i % 2 === parity) { spread = spread.cloneNode(false) viewer.appendChild(spread) } spread.appendChild(pages[i].div) } } if (!pageNumber) { return } if (this._currentScaleValue && isNaN(this._currentScaleValue)) { this._setScale(this._currentScaleValue, true) } this._setCurrentPageNumber(pageNumber, true) this.update() } _getPageAdvance (currentPageNumber, previous = false) { if (this.isInPresentationMode) { return 1 } switch (this._scrollMode) { case _ui_utils.ScrollMode.WRAPPED: { const { views } = this._getVisiblePages(), pageLayout = new Map() for (const { id, y, percent, widthPercent } of views) { if (percent === 0 || widthPercent < 100) { continue } let yArray = pageLayout.get(y) if (!yArray) { pageLayout.set(y, yArray || (yArray = [])) } yArray.push(id) } for (const yArray of pageLayout.values()) { const currentIndex = yArray.indexOf(currentPageNumber) if (currentIndex === -1) { continue } const numPages = yArray.length if (numPages === 1) { break } if (previous) { for (let i = currentIndex - 1, ii = 0; i >= ii; i--) { const currentId = yArray[i], expectedId = yArray[i + 1] - 1 if (currentId < expectedId) { return currentPageNumber - expectedId } } } else { for (let i = currentIndex + 1, ii = numPages; i < ii; i++) { const currentId = yArray[i], expectedId = yArray[i - 1] + 1 if (currentId > expectedId) { return expectedId - currentPageNumber } } } if (previous) { const firstId = yArray[0] if (firstId < currentPageNumber) { return currentPageNumber - firstId + 1 } } else { const lastId = yArray[numPages - 1] if (lastId > currentPageNumber) { return lastId - currentPageNumber + 1 } } break } break } case _ui_utils.ScrollMode.HORIZONTAL: { break } case _ui_utils.ScrollMode.VERTICAL: { if (this._spreadMode === _ui_utils.SpreadMode.NONE) { break } const parity = this._spreadMode - 1 if (previous && currentPageNumber % 2 !== parity) { break } else if (!previous && currentPageNumber % 2 === parity) { break } const { views } = this._getVisiblePages(), expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1 for (const { id, percent, widthPercent } of views) { if (id !== expectedId) { continue } if (percent > 0 && widthPercent === 100) { return 2 } break } break } } return 1 } nextPage () { const currentPageNumber = this._currentPageNumber, pagesCount = this.pagesCount if (currentPageNumber >= pagesCount) { return false } const advance = this._getPageAdvance(currentPageNumber, false) || 1 this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount) return true } previousPage () { const currentPageNumber = this._currentPageNumber if (currentPageNumber <= 1) { return false } const advance = this._getPageAdvance(currentPageNumber, true) || 1 this.currentPageNumber = Math.max(currentPageNumber - advance, 1) return true } } exports.BaseViewer = BaseViewer /***/ }), /* 20 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.XfaLayerBuilder = exports.DefaultXfaLayerFactory = void 0 var _pdfjsLib = __w_pdfjs_require__(2) class XfaLayerBuilder { constructor ({ pageDiv, pdfPage }) { this.pageDiv = pageDiv this.pdfPage = pdfPage this.div = null this._cancelled = false } render (viewport, intent = 'display') { return this.pdfPage.getXfa().then(xfa => { if (this._cancelled) { return } const parameters = { viewport: viewport.clone({ dontFlip: true }), div: this.div, xfa, page: this.pdfPage } if (this.div) { _pdfjsLib.XfaLayer.update(parameters) } else { this.div = document.createElement('div') this.pageDiv.appendChild(this.div) parameters.div = this.div _pdfjsLib.XfaLayer.render(parameters) } }) } cancel () { this._cancelled = true } hide () { if (!this.div) { return } this.div.hidden = true } } exports.XfaLayerBuilder = XfaLayerBuilder class DefaultXfaLayerFactory { createXfaLayerBuilder (pageDiv, pdfPage) { return new XfaLayerBuilder({ pageDiv, pdfPage }) } } exports.DefaultXfaLayerFactory = DefaultXfaLayerFactory /***/ }), /* 21 */ /***/ ((__unused_webpack_module, exports, __w_pdfjs_require__) => { Object.defineProperty(exports, '__esModule', ({ value: true })) exports.PDFViewer = void 0 var _ui_utils = __w_pdfjs_require__(5) var _base_viewer = __w_pdfjs_require__(19) var _pdfjsLib = __w_pdfjs_require__(2) class PDFViewer extends _base_viewer.BaseViewer { get _viewerElement () { return (0, _pdfjsLib.shadow)(this, '_viewerElement', this.viewer) } _scrollIntoView ({ pageDiv, pageSpot = null, pageNumber = null }) { if (!pageSpot && !this.isInPresentationMode) { const left = pageDiv.offsetLeft + pageDiv.clientLeft const right = left + pageDiv.clientWidth const { scrollLeft, clientWidth } = this.container if (this._isScrollModeHorizontal || left < scrollLeft || right > scrollLeft + clientWidth) { pageSpot = { left: 0, top: 0 } } } super._scrollIntoView({ pageDiv, pageSpot, pageNumber }) } _getVisiblePages () { if (this.isInPresentationMode) { return this._getCurrentVisiblePage() } return super._getVisiblePages() } _updateHelper (visiblePages) { if (this.isInPresentationMode) { return } let currentId = this._currentPageNumber let stillFullyVisible = false for (const page of visiblePages) { if (page.percent < 100) { break } if (page.id === currentId && this._scrollMode === _ui_utils.ScrollMode.VERTICAL && this._spreadMode === _ui_utils.SpreadMode.NONE) { stillFullyVisible = true break } } if (!stillFullyVisible) { currentId = visiblePages[0].id } this._setCurrentPageNumber(currentId) } } exports.PDFViewer = PDFViewer /***/ }) /******/]) /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {} /******/ /******/ // The require function /******/ function __w_pdfjs_require__ (moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId] /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ } /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __w_pdfjs_require__) /******/ /******/ // Return the exports of the module /******/ return module.exports /******/ } /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. (() => { var exports = __webpack_exports__ Object.defineProperty(exports, '__esModule', ({ value: true })) Object.defineProperty(exports, 'AnnotationLayerBuilder', ({ enumerable: true, get: function () { return _annotation_layer_builder.AnnotationLayerBuilder } })) Object.defineProperty(exports, 'DefaultAnnotationLayerFactory', ({ enumerable: true, get: function () { return _annotation_layer_builder.DefaultAnnotationLayerFactory } })) Object.defineProperty(exports, 'DefaultTextLayerFactory', ({ enumerable: true, get: function () { return _text_layer_builder.DefaultTextLayerFactory } })) Object.defineProperty(exports, 'TextLayerBuilder', ({ enumerable: true, get: function () { return _text_layer_builder.TextLayerBuilder } })) Object.defineProperty(exports, 'EventBus', ({ enumerable: true, get: function () { return _ui_utils.EventBus } })) Object.defineProperty(exports, 'ProgressBar', ({ enumerable: true, get: function () { return _ui_utils.ProgressBar } })) Object.defineProperty(exports, 'PDFLinkService', ({ enumerable: true, get: function () { return _pdf_link_service.PDFLinkService } })) Object.defineProperty(exports, 'SimpleLinkService', ({ enumerable: true, get: function () { return _pdf_link_service.SimpleLinkService } })) Object.defineProperty(exports, 'DownloadManager', ({ enumerable: true, get: function () { return _download_manager.DownloadManager } })) Object.defineProperty(exports, 'GenericL10n', ({ enumerable: true, get: function () { return _genericl10n.GenericL10n } })) Object.defineProperty(exports, 'NullL10n', ({ enumerable: true, get: function () { return _l10n_utils.NullL10n } })) Object.defineProperty(exports, 'PDFFindController', ({ enumerable: true, get: function () { return _pdf_find_controller.PDFFindController } })) Object.defineProperty(exports, 'PDFHistory', ({ enumerable: true, get: function () { return _pdf_history.PDFHistory } })) Object.defineProperty(exports, 'PDFPageView', ({ enumerable: true, get: function () { return _pdf_page_view.PDFPageView } })) Object.defineProperty(exports, 'PDFScriptingManager', ({ enumerable: true, get: function () { return _pdf_scripting_manager.PDFScriptingManager } })) Object.defineProperty(exports, 'PDFSinglePageViewer', ({ enumerable: true, get: function () { return _pdf_single_page_viewer.PDFSinglePageViewer } })) Object.defineProperty(exports, 'PDFViewer', ({ enumerable: true, get: function () { return _pdf_viewer.PDFViewer } })) var _annotation_layer_builder = __w_pdfjs_require__(1) var _text_layer_builder = __w_pdfjs_require__(6) var _ui_utils = __w_pdfjs_require__(5) var _pdf_link_service = __w_pdfjs_require__(4) var _download_manager = __w_pdfjs_require__(7) var _genericl10n = __w_pdfjs_require__(9) var _l10n_utils = __w_pdfjs_require__(3) var _pdf_find_controller = __w_pdfjs_require__(11) var _pdf_history = __w_pdfjs_require__(13) var _pdf_page_view = __w_pdfjs_require__(14) var _pdf_scripting_manager = __w_pdfjs_require__(16) var _pdf_single_page_viewer = __w_pdfjs_require__(18) var _pdf_viewer = __w_pdfjs_require__(21) const pdfjsVersion = '2.8.335' const pdfjsBuild = '228adbf67' })() /******/ return __webpack_exports__ /******/ })() }) //# sourceMappingURL=pdf_viewer.js.map