2019-04-13 13:02:01 +00:00
/ * *
* @ licstart The following is the entire license notice for the
* Javascript code in this page
*
2021-03-25 17:57:40 +00:00
* Copyright 2020 Mozilla Foundation
2016-07-09 08:54:13 +00:00
*
* 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 .
2019-04-13 13:02:01 +00:00
*
* @ licend The above is the entire license notice for the
* Javascript code in this page
2016-07-09 08:54:13 +00:00
* /
2019-04-13 13:02:01 +00:00
/******/ ( function ( modules ) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = { } ;
/******/
/******/ // The require function
/******/ function _ _webpack _require _ _ ( moduleId ) {
/******/
/******/ // Check if module is in cache
/******/ if ( installedModules [ moduleId ] ) {
/******/ return installedModules [ moduleId ] . exports ;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules [ moduleId ] = {
/******/ i : moduleId ,
/******/ l : false ,
/******/ exports : { }
/******/ } ;
/******/
/******/ // Execute the module function
/******/ modules [ moduleId ] . call ( module . exports , module , module . exports , _ _webpack _require _ _ ) ;
/******/
/******/ // Flag the module as loaded
/******/ module . l = true ;
/******/
/******/ // Return the exports of the module
/******/ return module . exports ;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ _ _webpack _require _ _ . m = modules ;
/******/
/******/ // expose the module cache
/******/ _ _webpack _require _ _ . c = installedModules ;
/******/
/******/ // define getter function for harmony exports
/******/ _ _webpack _require _ _ . d = function ( exports , name , getter ) {
/******/ if ( ! _ _webpack _require _ _ . o ( exports , name ) ) {
/******/ Object . defineProperty ( exports , name , { enumerable : true , get : getter } ) ;
/******/ }
/******/ } ;
/******/
/******/ // define __esModule on exports
/******/ _ _webpack _require _ _ . r = function ( exports ) {
/******/ if ( typeof Symbol !== 'undefined' && Symbol . toStringTag ) {
/******/ Object . defineProperty ( exports , Symbol . toStringTag , { value : 'Module' } ) ;
/******/ }
/******/ Object . defineProperty ( exports , '__esModule' , { value : true } ) ;
/******/ } ;
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ _ _webpack _require _ _ . t = function ( value , mode ) {
/******/ if ( mode & 1 ) value = _ _webpack _require _ _ ( value ) ;
/******/ if ( mode & 8 ) return value ;
/******/ if ( ( mode & 4 ) && typeof value === 'object' && value && value . _ _esModule ) return value ;
/******/ var ns = Object . create ( null ) ;
/******/ _ _webpack _require _ _ . r ( ns ) ;
/******/ Object . defineProperty ( ns , 'default' , { enumerable : true , value : value } ) ;
/******/ if ( mode & 2 && typeof value != 'string' ) for ( var key in value ) _ _webpack _require _ _ . d ( ns , key , function ( key ) { return value [ key ] ; } . bind ( null , key ) ) ;
/******/ return ns ;
/******/ } ;
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ _ _webpack _require _ _ . n = function ( module ) {
/******/ var getter = module && module . _ _esModule ?
/******/ function getDefault ( ) { return module [ 'default' ] ; } :
/******/ function getModuleExports ( ) { return module ; } ;
/******/ _ _webpack _require _ _ . d ( getter , 'a' , getter ) ;
/******/ return getter ;
/******/ } ;
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ _ _webpack _require _ _ . o = function ( object , property ) { return Object . prototype . hasOwnProperty . call ( object , property ) ; } ;
/******/
/******/ // __webpack_public_path__
/******/ _ _webpack _require _ _ . p = "" ;
/******/
/******/
/******/ // Load entry module and return exports
/******/ return _ _webpack _require _ _ ( _ _webpack _require _ _ . s = 0 ) ;
/******/ } )
/************************************************************************/
/******/ ( [
/* 0 */
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
2017-05-13 12:01:52 +00:00
;
2021-03-25 17:57:40 +00:00
let pdfjsWebApp , pdfjsWebAppOptions ;
2017-05-13 12:01:52 +00:00
{
2019-04-13 13:02:01 +00:00
pdfjsWebApp = _ _webpack _require _ _ ( 1 ) ;
2021-03-25 17:57:40 +00:00
pdfjsWebAppOptions = _ _webpack _require _ _ ( 3 ) ;
2019-04-13 13:02:01 +00:00
}
;
{
2021-03-25 17:57:40 +00:00
_ _webpack _require _ _ ( 35 ) ;
2019-04-13 13:02:01 +00:00
}
;
{
2021-03-25 17:57:40 +00:00
_ _webpack _require _ _ ( 40 ) ;
2019-04-13 13:02:01 +00:00
}
function getViewerConfiguration ( ) {
return {
appContainer : document . body ,
2021-03-25 17:57:40 +00:00
mainContainer : document . getElementById ( "viewerContainer" ) ,
viewerContainer : document . getElementById ( "viewer" ) ,
2019-04-13 13:02:01 +00:00
eventBus : null ,
toolbar : {
2021-03-25 17:57:40 +00:00
container : document . getElementById ( "toolbarViewer" ) ,
numPages : document . getElementById ( "numPages" ) ,
pageNumber : document . getElementById ( "pageNumber" ) ,
scaleSelectContainer : document . getElementById ( "scaleSelectContainer" ) ,
scaleSelect : document . getElementById ( "scaleSelect" ) ,
customScaleOption : document . getElementById ( "customScaleOption" ) ,
previous : document . getElementById ( "previous" ) ,
next : document . getElementById ( "next" ) ,
zoomIn : document . getElementById ( "zoomIn" ) ,
zoomOut : document . getElementById ( "zoomOut" ) ,
viewFind : document . getElementById ( "viewFind" ) ,
openFile : document . getElementById ( "openFile" ) ,
print : document . getElementById ( "print" ) ,
presentationModeButton : document . getElementById ( "presentationMode" ) ,
download : document . getElementById ( "download" ) ,
viewBookmark : document . getElementById ( "viewBookmark" )
2016-07-09 08:54:13 +00:00
} ,
2019-04-13 13:02:01 +00:00
secondaryToolbar : {
2021-03-25 17:57:40 +00:00
toolbar : document . getElementById ( "secondaryToolbar" ) ,
toggleButton : document . getElementById ( "secondaryToolbarToggle" ) ,
toolbarButtonContainer : document . getElementById ( "secondaryToolbarButtonContainer" ) ,
presentationModeButton : document . getElementById ( "secondaryPresentationMode" ) ,
openFileButton : document . getElementById ( "secondaryOpenFile" ) ,
printButton : document . getElementById ( "secondaryPrint" ) ,
downloadButton : document . getElementById ( "secondaryDownload" ) ,
viewBookmarkButton : document . getElementById ( "secondaryViewBookmark" ) ,
firstPageButton : document . getElementById ( "firstPage" ) ,
lastPageButton : document . getElementById ( "lastPage" ) ,
pageRotateCwButton : document . getElementById ( "pageRotateCw" ) ,
pageRotateCcwButton : document . getElementById ( "pageRotateCcw" ) ,
cursorSelectToolButton : document . getElementById ( "cursorSelectTool" ) ,
cursorHandToolButton : document . getElementById ( "cursorHandTool" ) ,
scrollVerticalButton : document . getElementById ( "scrollVertical" ) ,
scrollHorizontalButton : document . getElementById ( "scrollHorizontal" ) ,
scrollWrappedButton : document . getElementById ( "scrollWrapped" ) ,
spreadNoneButton : document . getElementById ( "spreadNone" ) ,
spreadOddButton : document . getElementById ( "spreadOdd" ) ,
spreadEvenButton : document . getElementById ( "spreadEven" ) ,
documentPropertiesButton : document . getElementById ( "documentProperties" )
2016-07-09 08:54:13 +00:00
} ,
2019-04-13 13:02:01 +00:00
fullscreen : {
2021-03-25 17:57:40 +00:00
contextFirstPage : document . getElementById ( "contextFirstPage" ) ,
contextLastPage : document . getElementById ( "contextLastPage" ) ,
contextPageRotateCw : document . getElementById ( "contextPageRotateCw" ) ,
contextPageRotateCcw : document . getElementById ( "contextPageRotateCcw" )
2017-05-13 12:01:52 +00:00
} ,
2019-04-13 13:02:01 +00:00
sidebar : {
2021-03-25 17:57:40 +00:00
outerContainer : document . getElementById ( "outerContainer" ) ,
viewerContainer : document . getElementById ( "viewerContainer" ) ,
toggleButton : document . getElementById ( "sidebarToggle" ) ,
thumbnailButton : document . getElementById ( "viewThumbnail" ) ,
outlineButton : document . getElementById ( "viewOutline" ) ,
attachmentsButton : document . getElementById ( "viewAttachments" ) ,
layersButton : document . getElementById ( "viewLayers" ) ,
thumbnailView : document . getElementById ( "thumbnailView" ) ,
outlineView : document . getElementById ( "outlineView" ) ,
attachmentsView : document . getElementById ( "attachmentsView" ) ,
layersView : document . getElementById ( "layersView" )
2017-05-13 12:01:52 +00:00
} ,
2019-04-13 13:02:01 +00:00
sidebarResizer : {
2021-03-25 17:57:40 +00:00
outerContainer : document . getElementById ( "outerContainer" ) ,
resizer : document . getElementById ( "sidebarResizer" )
2017-05-13 12:01:52 +00:00
} ,
2019-04-13 13:02:01 +00:00
findBar : {
2021-03-25 17:57:40 +00:00
bar : document . getElementById ( "findbar" ) ,
toggleButton : document . getElementById ( "viewFind" ) ,
findField : document . getElementById ( "findInput" ) ,
highlightAllCheckbox : document . getElementById ( "findHighlightAll" ) ,
caseSensitiveCheckbox : document . getElementById ( "findMatchCase" ) ,
entireWordCheckbox : document . getElementById ( "findEntireWord" ) ,
findMsg : document . getElementById ( "findMsg" ) ,
findResultsCount : document . getElementById ( "findResultsCount" ) ,
findPreviousButton : document . getElementById ( "findPrevious" ) ,
findNextButton : document . getElementById ( "findNext" )
2017-05-13 12:01:52 +00:00
} ,
2019-04-13 13:02:01 +00:00
passwordOverlay : {
2021-03-25 17:57:40 +00:00
overlayName : "passwordOverlay" ,
container : document . getElementById ( "passwordOverlay" ) ,
label : document . getElementById ( "passwordText" ) ,
input : document . getElementById ( "password" ) ,
submitButton : document . getElementById ( "passwordSubmit" ) ,
cancelButton : document . getElementById ( "passwordCancel" )
2017-05-13 12:01:52 +00:00
} ,
2019-04-13 13:02:01 +00:00
documentProperties : {
2021-03-25 17:57:40 +00:00
overlayName : "documentPropertiesOverlay" ,
container : document . getElementById ( "documentPropertiesOverlay" ) ,
closeButton : document . getElementById ( "documentPropertiesClose" ) ,
2019-04-13 13:02:01 +00:00
fields : {
2021-03-25 17:57:40 +00:00
fileName : document . getElementById ( "fileNameField" ) ,
fileSize : document . getElementById ( "fileSizeField" ) ,
title : document . getElementById ( "titleField" ) ,
author : document . getElementById ( "authorField" ) ,
subject : document . getElementById ( "subjectField" ) ,
keywords : document . getElementById ( "keywordsField" ) ,
creationDate : document . getElementById ( "creationDateField" ) ,
modificationDate : document . getElementById ( "modificationDateField" ) ,
creator : document . getElementById ( "creatorField" ) ,
producer : document . getElementById ( "producerField" ) ,
version : document . getElementById ( "versionField" ) ,
pageCount : document . getElementById ( "pageCountField" ) ,
pageSize : document . getElementById ( "pageSizeField" ) ,
linearized : document . getElementById ( "linearizedField" )
2017-05-13 12:01:52 +00:00
}
2016-07-09 08:54:13 +00:00
} ,
2019-04-13 13:02:01 +00:00
errorWrapper : {
2021-03-25 17:57:40 +00:00
container : document . getElementById ( "errorWrapper" ) ,
errorMessage : document . getElementById ( "errorMessage" ) ,
closeButton : document . getElementById ( "errorClose" ) ,
errorMoreInfo : document . getElementById ( "errorMoreInfo" ) ,
moreInfoButton : document . getElementById ( "errorShowMore" ) ,
lessInfoButton : document . getElementById ( "errorShowLess" )
2016-07-09 08:54:13 +00:00
} ,
2021-03-25 17:57:40 +00:00
printContainer : document . getElementById ( "printContainer" ) ,
openFileInputName : "fileInput" ,
debuggerScriptPath : "./debugger.js"
2019-04-13 13:02:01 +00:00
} ;
}
function webViewerLoad ( ) {
2021-03-25 17:57:40 +00:00
const config = getViewerConfiguration ( ) ;
2019-04-13 13:02:01 +00:00
window . PDFViewerApplication = pdfjsWebApp . PDFViewerApplication ;
window . PDFViewerApplicationOptions = pdfjsWebAppOptions . AppOptions ;
2021-03-25 17:57:40 +00:00
const event = document . createEvent ( "CustomEvent" ) ;
event . initCustomEvent ( "webviewerloaded" , true , true , {
source : window
} ) ;
try {
parent . document . dispatchEvent ( event ) ;
} catch ( ex ) {
console . error ( ` webviewerloaded: ${ ex } ` ) ;
document . dispatchEvent ( event ) ;
}
2019-04-13 13:02:01 +00:00
pdfjsWebApp . PDFViewerApplication . run ( config ) ;
}
2021-03-25 17:57:40 +00:00
if ( document . readyState === "interactive" || document . readyState === "complete" ) {
2019-04-13 13:02:01 +00:00
webViewerLoad ( ) ;
} else {
2021-03-25 17:57:40 +00:00
document . addEventListener ( "DOMContentLoaded" , webViewerLoad , true ) ;
2019-04-13 13:02:01 +00:00
}
/***/ } ) ,
/* 1 */
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFPrintServiceFactory = exports . DefaultExternalServices = exports . PDFViewerApplication = void 0 ;
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _app _options = _ _webpack _require _ _ ( 3 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _cursor _tools = _ _webpack _require _ _ ( 6 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _rendering _queue = _ _webpack _require _ _ ( 8 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _sidebar = _ _webpack _require _ _ ( 9 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _overlay _manager = _ _webpack _require _ _ ( 10 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _password _prompt = _ _webpack _require _ _ ( 11 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _attachment _viewer = _ _webpack _require _ _ ( 12 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _document _properties = _ _webpack _require _ _ ( 14 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _find _bar = _ _webpack _require _ _ ( 15 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _find _controller = _ _webpack _require _ _ ( 16 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _history = _ _webpack _require _ _ ( 18 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _layer _viewer = _ _webpack _require _ _ ( 19 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _link _service = _ _webpack _require _ _ ( 20 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _outline _viewer = _ _webpack _require _ _ ( 21 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _presentation _mode = _ _webpack _require _ _ ( 22 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _sidebar _resizer = _ _webpack _require _ _ ( 23 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _thumbnail _viewer = _ _webpack _require _ _ ( 24 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _viewer = _ _webpack _require _ _ ( 26 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _secondary _toolbar = _ _webpack _require _ _ ( 31 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _toolbar = _ _webpack _require _ _ ( 33 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _viewer _compatibility = _ _webpack _require _ _ ( 4 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _view _history = _ _webpack _require _ _ ( 34 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const DEFAULT _SCALE _DELTA = 1.1 ;
const DISABLE _AUTO _FETCH _LOADING _BAR _TIMEOUT = 5000 ;
const FORCE _PAGES _LOADED _TIMEOUT = 10000 ;
const WHEEL _ZOOM _DISABLED _TIMEOUT = 1000 ;
const ENABLE _PERMISSIONS _CLASS = "enablePermissions" ;
const ViewOnLoad = {
UNKNOWN : - 1 ,
PREVIOUS : 0 ,
INITIAL : 1
} ;
const KNOWN _VERSIONS = [ "1.0" , "1.1" , "1.2" , "1.3" , "1.4" , "1.5" , "1.6" , "1.7" , "1.8" , "1.9" , "2.0" , "2.1" , "2.2" , "2.3" ] ;
const KNOWN _GENERATORS = [ "acrobat distiller" , "acrobat pdfwriter" , "adobe livecycle" , "adobe pdf library" , "adobe photoshop" , "ghostscript" , "tcpdf" , "cairo" , "dvipdfm" , "dvips" , "pdftex" , "pdfkit" , "itext" , "prince" , "quarkxpress" , "mac os x" , "microsoft" , "openoffice" , "oracle" , "luradocument" , "pdf-xchange" , "antenna house" , "aspose.cells" , "fpdf" ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class DefaultExternalServices {
constructor ( ) {
throw new Error ( "Cannot initialize DefaultExternalServices." ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
static updateFindControlState ( data ) { }
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
static updateFindMatchesCount ( data ) { }
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
static initPassiveLoading ( callbacks ) { }
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
static fallback ( data , callback ) { }
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
static reportTelemetry ( data ) { }
static createDownloadManager ( options ) {
throw new Error ( "Not implemented: createDownloadManager" ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
static createPreferences ( ) {
throw new Error ( "Not implemented: createPreferences" ) ;
}
static createL10n ( options ) {
throw new Error ( "Not implemented: createL10n" ) ;
}
static get supportsIntegratedFind ( ) {
return ( 0 , _pdfjsLib . shadow ) ( this , "supportsIntegratedFind" , false ) ;
}
static get supportsDocumentFonts ( ) {
return ( 0 , _pdfjsLib . shadow ) ( this , "supportsDocumentFonts" , true ) ;
}
static get supportedMouseWheelZoomModifierKeys ( ) {
return ( 0 , _pdfjsLib . shadow ) ( this , "supportedMouseWheelZoomModifierKeys" , {
ctrlKey : true ,
metaKey : true
} ) ;
}
static get isInAutomation ( ) {
return ( 0 , _pdfjsLib . shadow ) ( this , "isInAutomation" , false ) ;
}
}
2019-04-13 13:02:01 +00:00
exports . DefaultExternalServices = DefaultExternalServices ;
2021-03-25 17:57:40 +00:00
const PDFViewerApplication = {
2019-04-13 13:02:01 +00:00
initialBookmark : document . location . hash . substring ( 1 ) ,
2021-03-25 17:57:40 +00:00
_initializedCapability : ( 0 , _pdfjsLib . createPromiseCapability ) ( ) ,
2019-04-13 13:02:01 +00:00
fellback : false ,
appConfig : null ,
pdfDocument : null ,
pdfLoadingTask : null ,
printService : null ,
pdfViewer : null ,
pdfThumbnailViewer : null ,
pdfRenderingQueue : null ,
pdfPresentationMode : null ,
pdfDocumentProperties : null ,
pdfLinkService : null ,
pdfHistory : null ,
pdfSidebar : null ,
pdfSidebarResizer : null ,
pdfOutlineViewer : null ,
pdfAttachmentViewer : null ,
2021-03-25 17:57:40 +00:00
pdfLayerViewer : null ,
2019-04-13 13:02:01 +00:00
pdfCursorTools : null ,
store : null ,
downloadManager : null ,
overlayManager : null ,
preferences : null ,
toolbar : null ,
secondaryToolbar : null ,
eventBus : null ,
l10n : null ,
isInitialViewSet : false ,
downloadComplete : false ,
isViewerEmbedded : window . parent !== window ,
2021-03-25 17:57:40 +00:00
url : "" ,
baseUrl : "" ,
2019-04-13 13:02:01 +00:00
externalServices : DefaultExternalServices ,
_boundEvents : { } ,
contentDispositionFilename : null ,
2021-03-25 17:57:40 +00:00
triggerDelayedFallback : null ,
_saveInProgress : false ,
_wheelUnusedTicks : 0 ,
async initialize ( appConfig ) {
this . preferences = this . externalServices . createPreferences ( ) ;
this . appConfig = appConfig ;
await this . _readPreferences ( ) ;
await this . _parseHashParameters ( ) ;
await this . _initializeL10n ( ) ;
if ( this . isViewerEmbedded && _app _options . AppOptions . get ( "externalLinkTarget" ) === _pdfjsLib . LinkTarget . NONE ) {
_app _options . AppOptions . set ( "externalLinkTarget" , _pdfjsLib . LinkTarget . TOP ) ;
}
await this . _initializeViewerComponents ( ) ;
this . bindEvents ( ) ;
this . bindWindowEvents ( ) ;
const appContainer = appConfig . appContainer || document . documentElement ;
this . l10n . translate ( appContainer ) . then ( ( ) => {
this . eventBus . dispatch ( "localized" , {
source : this
} ) ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _initializedCapability . resolve ( ) ;
} ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async _readPreferences ( ) {
if ( _app _options . AppOptions . get ( "disablePreferences" ) ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
try {
const prefs = await this . preferences . getAll ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( const name in prefs ) {
_app _options . AppOptions . set ( name , prefs [ name ] ) ;
}
} catch ( reason ) {
console . error ( ` _readPreferences: " ${ reason . message } ". ` ) ;
}
} ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async _parseHashParameters ( ) {
if ( ! _app _options . AppOptions . get ( "pdfBugEnabled" ) ) {
return undefined ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const hash = document . location . hash . substring ( 1 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! hash ) {
return undefined ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const hashParams = ( 0 , _ui _utils . parseQueryString ) ( hash ) ,
waitOn = [ ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "disableworker" in hashParams && hashParams . disableworker === "true" ) {
waitOn . push ( loadFakeWorker ( ) ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "disablerange" in hashParams ) {
_app _options . AppOptions . set ( "disableRange" , hashParams . disablerange === "true" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "disablestream" in hashParams ) {
_app _options . AppOptions . set ( "disableStream" , hashParams . disablestream === "true" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "disableautofetch" in hashParams ) {
_app _options . AppOptions . set ( "disableAutoFetch" , hashParams . disableautofetch === "true" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "disablefontface" in hashParams ) {
_app _options . AppOptions . set ( "disableFontFace" , hashParams . disablefontface === "true" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "disablehistory" in hashParams ) {
_app _options . AppOptions . set ( "disableHistory" , hashParams . disablehistory === "true" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "webgl" in hashParams ) {
_app _options . AppOptions . set ( "enableWebGL" , hashParams . webgl === "true" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "verbosity" in hashParams ) {
_app _options . AppOptions . set ( "verbosity" , hashParams . verbosity | 0 ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "textlayer" in hashParams ) {
switch ( hashParams . textlayer ) {
case "off" :
_app _options . AppOptions . set ( "textLayerMode" , _ui _utils . TextLayerMode . DISABLE ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case "visible" :
case "shadow" :
case "hover" :
const viewer = this . appConfig . viewerContainer ;
viewer . classList . add ( "textLayer-" + hashParams . textlayer ) ;
break ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "pdfbug" in hashParams ) {
_app _options . AppOptions . set ( "pdfBug" , true ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_app _options . AppOptions . set ( "fontExtraProperties" , true ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const enabled = hashParams . pdfbug . split ( "," ) ;
waitOn . push ( loadAndEnablePDFBug ( enabled ) ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "locale" in hashParams ) {
_app _options . AppOptions . set ( "locale" , hashParams . locale ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return Promise . all ( waitOn ) . catch ( reason => {
console . error ( ` _parseHashParameters: " ${ reason . message } ". ` ) ;
} ) ;
} ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async _initializeL10n ( ) {
this . l10n = this . externalServices . createL10n ( {
locale : _app _options . AppOptions . get ( "locale" )
} ) ;
const dir = await this . l10n . getDirection ( ) ;
document . getElementsByTagName ( "html" ) [ 0 ] . dir = dir ;
} ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async _initializeViewerComponents ( ) {
const appConfig = this . appConfig ;
const eventBus = appConfig . eventBus || new _ui _utils . EventBus ( {
isInAutomation : this . externalServices . isInAutomation
} ) ;
this . eventBus = eventBus ;
this . overlayManager = new _overlay _manager . OverlayManager ( ) ;
const pdfRenderingQueue = new _pdf _rendering _queue . PDFRenderingQueue ( ) ;
pdfRenderingQueue . onIdle = this . cleanup . bind ( this ) ;
this . pdfRenderingQueue = pdfRenderingQueue ;
const pdfLinkService = new _pdf _link _service . PDFLinkService ( {
eventBus ,
externalLinkTarget : _app _options . AppOptions . get ( "externalLinkTarget" ) ,
externalLinkRel : _app _options . AppOptions . get ( "externalLinkRel" ) ,
ignoreDestinationZoom : _app _options . AppOptions . get ( "ignoreDestinationZoom" )
} ) ;
this . pdfLinkService = pdfLinkService ;
const downloadManager = this . externalServices . createDownloadManager ( ) ;
this . downloadManager = downloadManager ;
const findController = new _pdf _find _controller . PDFFindController ( {
linkService : pdfLinkService ,
eventBus
} ) ;
this . findController = findController ;
const container = appConfig . mainContainer ;
const viewer = appConfig . viewerContainer ;
this . pdfViewer = new _pdf _viewer . PDFViewer ( {
container ,
viewer ,
eventBus ,
renderingQueue : pdfRenderingQueue ,
linkService : pdfLinkService ,
downloadManager ,
findController ,
renderer : _app _options . AppOptions . get ( "renderer" ) ,
enableWebGL : _app _options . AppOptions . get ( "enableWebGL" ) ,
l10n : this . l10n ,
textLayerMode : _app _options . AppOptions . get ( "textLayerMode" ) ,
imageResourcesPath : _app _options . AppOptions . get ( "imageResourcesPath" ) ,
renderInteractiveForms : _app _options . AppOptions . get ( "renderInteractiveForms" ) ,
enablePrintAutoRotate : _app _options . AppOptions . get ( "enablePrintAutoRotate" ) ,
useOnlyCssZoom : _app _options . AppOptions . get ( "useOnlyCssZoom" ) ,
maxCanvasPixels : _app _options . AppOptions . get ( "maxCanvasPixels" )
} ) ;
pdfRenderingQueue . setViewer ( this . pdfViewer ) ;
pdfLinkService . setViewer ( this . pdfViewer ) ;
this . pdfThumbnailViewer = new _pdf _thumbnail _viewer . PDFThumbnailViewer ( {
container : appConfig . sidebar . thumbnailView ,
eventBus ,
renderingQueue : pdfRenderingQueue ,
linkService : pdfLinkService ,
l10n : this . l10n
} ) ;
pdfRenderingQueue . setThumbnailViewer ( this . pdfThumbnailViewer ) ;
this . pdfHistory = new _pdf _history . PDFHistory ( {
linkService : pdfLinkService ,
eventBus
} ) ;
pdfLinkService . setHistory ( this . pdfHistory ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . supportsIntegratedFind ) {
this . findBar = new _pdf _find _bar . PDFFindBar ( appConfig . findBar , eventBus , this . l10n ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . pdfDocumentProperties = new _pdf _document _properties . PDFDocumentProperties ( appConfig . documentProperties , this . overlayManager , eventBus , this . l10n ) ;
this . pdfCursorTools = new _pdf _cursor _tools . PDFCursorTools ( {
container ,
eventBus ,
cursorToolOnLoad : _app _options . AppOptions . get ( "cursorToolOnLoad" )
} ) ;
this . toolbar = new _toolbar . Toolbar ( appConfig . toolbar , eventBus , this . l10n ) ;
this . secondaryToolbar = new _secondary _toolbar . SecondaryToolbar ( appConfig . secondaryToolbar , container , eventBus ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . supportsFullscreen ) {
this . pdfPresentationMode = new _pdf _presentation _mode . PDFPresentationMode ( {
container ,
pdfViewer : this . pdfViewer ,
eventBus ,
contextMenuItems : appConfig . fullscreen
} ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . passwordPrompt = new _password _prompt . PasswordPrompt ( appConfig . passwordOverlay , this . overlayManager , this . l10n ) ;
this . pdfOutlineViewer = new _pdf _outline _viewer . PDFOutlineViewer ( {
container : appConfig . sidebar . outlineView ,
eventBus ,
linkService : pdfLinkService
} ) ;
this . pdfAttachmentViewer = new _pdf _attachment _viewer . PDFAttachmentViewer ( {
container : appConfig . sidebar . attachmentsView ,
eventBus ,
downloadManager
} ) ;
this . pdfLayerViewer = new _pdf _layer _viewer . PDFLayerViewer ( {
container : appConfig . sidebar . layersView ,
eventBus ,
l10n : this . l10n
} ) ;
this . pdfSidebar = new _pdf _sidebar . PDFSidebar ( {
elements : appConfig . sidebar ,
pdfViewer : this . pdfViewer ,
pdfThumbnailViewer : this . pdfThumbnailViewer ,
eventBus ,
l10n : this . l10n
} ) ;
this . pdfSidebar . onToggled = this . forceRendering . bind ( this ) ;
this . pdfSidebarResizer = new _pdf _sidebar _resizer . PDFSidebarResizer ( appConfig . sidebarResizer , eventBus , this . l10n ) ;
} ,
run ( config ) {
2019-04-13 13:02:01 +00:00
this . initialize ( config ) . then ( webViewerInitialized ) ;
} ,
2021-03-25 17:57:40 +00:00
get initialized ( ) {
return this . _initializedCapability . settled ;
} ,
get initializedPromise ( ) {
return this . _initializedCapability . promise ;
} ,
zoomIn ( ticks ) {
if ( this . pdfViewer . isInPresentationMode ) {
return ;
}
let newScale = this . pdfViewer . currentScale ;
2019-04-13 13:02:01 +00:00
do {
newScale = ( newScale * DEFAULT _SCALE _DELTA ) . toFixed ( 2 ) ;
newScale = Math . ceil ( newScale * 10 ) / 10 ;
newScale = Math . min ( _ui _utils . MAX _SCALE , newScale ) ;
} while ( -- ticks > 0 && newScale < _ui _utils . MAX _SCALE ) ;
this . pdfViewer . currentScaleValue = newScale ;
} ,
2021-03-25 17:57:40 +00:00
zoomOut ( ticks ) {
if ( this . pdfViewer . isInPresentationMode ) {
return ;
}
let newScale = this . pdfViewer . currentScale ;
2019-04-13 13:02:01 +00:00
do {
newScale = ( newScale / DEFAULT _SCALE _DELTA ) . toFixed ( 2 ) ;
newScale = Math . floor ( newScale * 10 ) / 10 ;
newScale = Math . max ( _ui _utils . MIN _SCALE , newScale ) ;
} while ( -- ticks > 0 && newScale > _ui _utils . MIN _SCALE ) ;
this . pdfViewer . currentScaleValue = newScale ;
} ,
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
zoomReset ( ) {
2020-02-09 16:02:47 +00:00
if ( this . pdfViewer . isInPresentationMode ) {
return ;
}
this . pdfViewer . currentScaleValue = _ui _utils . DEFAULT _SCALE _VALUE ;
} ,
2019-04-13 13:02:01 +00:00
get pagesCount ( ) {
return this . pdfDocument ? this . pdfDocument . numPages : 0 ;
} ,
get page ( ) {
return this . pdfViewer . currentPageNumber ;
} ,
2021-03-25 17:57:40 +00:00
set page ( val ) {
this . pdfViewer . currentPageNumber = val ;
} ,
2019-04-13 13:02:01 +00:00
get printing ( ) {
return ! ! this . printService ;
} ,
get supportsPrinting ( ) {
return PDFPrintServiceFactory . instance . supportsPrinting ;
} ,
get supportsFullscreen ( ) {
2021-03-25 17:57:40 +00:00
let support ;
const doc = document . documentElement ;
2019-04-13 13:02:01 +00:00
support = ! ! ( doc . requestFullscreen || doc . mozRequestFullScreen || doc . webkitRequestFullScreen || doc . msRequestFullscreen ) ;
if ( document . fullscreenEnabled === false || document . mozFullScreenEnabled === false || document . webkitFullscreenEnabled === false || document . msFullscreenEnabled === false ) {
support = false ;
}
2021-03-25 17:57:40 +00:00
return ( 0 , _pdfjsLib . shadow ) ( this , "supportsFullscreen" , support ) ;
2019-04-13 13:02:01 +00:00
} ,
get supportsIntegratedFind ( ) {
return this . externalServices . supportsIntegratedFind ;
} ,
get supportsDocumentFonts ( ) {
return this . externalServices . supportsDocumentFonts ;
} ,
get loadingBar ( ) {
2021-03-25 17:57:40 +00:00
const bar = new _ui _utils . ProgressBar ( "#loadingBar" ) ;
return ( 0 , _pdfjsLib . shadow ) ( this , "loadingBar" , bar ) ;
2019-04-13 13:02:01 +00:00
} ,
get supportedMouseWheelZoomModifierKeys ( ) {
return this . externalServices . supportedMouseWheelZoomModifierKeys ;
} ,
2021-03-25 17:57:40 +00:00
initPassiveLoading ( ) {
throw new Error ( "Not implemented: initPassiveLoading" ) ;
2019-04-13 13:02:01 +00:00
} ,
2021-03-25 17:57:40 +00:00
setTitleUsingUrl ( url = "" ) {
2019-04-13 13:02:01 +00:00
this . url = url ;
2021-03-25 17:57:40 +00:00
this . baseUrl = url . split ( "#" ) [ 0 ] ;
let title = ( 0 , _ui _utils . getPDFFileNameFromURL ) ( url , "" ) ;
2019-04-13 13:02:01 +00:00
if ( ! title ) {
try {
title = decodeURIComponent ( ( 0 , _pdfjsLib . getFilenameFromUrl ) ( url ) ) || url ;
} catch ( ex ) {
title = url ;
}
}
this . setTitle ( title ) ;
} ,
2021-03-25 17:57:40 +00:00
setTitle ( title ) {
2019-04-13 13:02:01 +00:00
if ( this . isViewerEmbedded ) {
return ;
}
document . title = title ;
} ,
2021-03-25 17:57:40 +00:00
async close ( ) {
const errorWrapper = this . appConfig . errorWrapper . container ;
errorWrapper . setAttribute ( "hidden" , "true" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . pdfLoadingTask ) {
return undefined ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const promise = this . pdfLoadingTask . destroy ( ) ;
this . pdfLoadingTask = null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . pdfDocument ) {
this . pdfDocument = null ;
this . pdfThumbnailViewer . setDocument ( null ) ;
this . pdfViewer . setDocument ( null ) ;
this . pdfLinkService . setDocument ( null ) ;
this . pdfDocumentProperties . setDocument ( null ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
webViewerResetPermissions ( ) ;
this . store = null ;
this . isInitialViewSet = false ;
this . downloadComplete = false ;
this . url = "" ;
this . baseUrl = "" ;
this . contentDispositionFilename = null ;
this . triggerDelayedFallback = null ;
this . _saveInProgress = false ;
this . pdfSidebar . reset ( ) ;
this . pdfOutlineViewer . reset ( ) ;
this . pdfAttachmentViewer . reset ( ) ;
this . pdfLayerViewer . reset ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . pdfHistory ) {
this . pdfHistory . reset ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . findBar ) {
this . findBar . reset ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . toolbar . reset ( ) ;
this . secondaryToolbar . reset ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( typeof PDFBug !== "undefined" ) {
PDFBug . cleanup ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return promise ;
} ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async open ( file , args ) {
if ( this . pdfLoadingTask ) {
await this . close ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const workerParameters = _app _options . AppOptions . getAll ( _app _options . OptionKind . WORKER ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( const key in workerParameters ) {
_pdfjsLib . GlobalWorkerOptions [ key ] = workerParameters [ key ] ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const parameters = Object . create ( null ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( typeof file === "string" ) {
this . setTitleUsingUrl ( file ) ;
parameters . url = file ;
} else if ( file && "byteLength" in file ) {
parameters . data = file ;
} else if ( file . url && file . originalUrl ) {
this . setTitleUsingUrl ( file . originalUrl ) ;
parameters . url = file . url ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const apiParameters = _app _options . AppOptions . getAll ( _app _options . OptionKind . API ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( const key in apiParameters ) {
let value = apiParameters [ key ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( key === "docBaseUrl" && ! value ) { }
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
parameters [ key ] = value ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( args ) {
for ( const key in args ) {
const value = args [ key ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( key === "length" ) {
this . pdfDocumentProperties . setFileSize ( value ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
parameters [ key ] = value ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const loadingTask = ( 0 , _pdfjsLib . getDocument ) ( parameters ) ;
this . pdfLoadingTask = loadingTask ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
loadingTask . onPassword = ( updateCallback , reason ) => {
this . pdfLinkService . externalLinkEnabled = false ;
this . passwordPrompt . setUpdateCallback ( updateCallback , reason ) ;
this . passwordPrompt . open ( ) ;
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
loadingTask . onProgress = ( {
loaded ,
total
} ) => {
this . progress ( loaded / total ) ;
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
loadingTask . onUnsupportedFeature = this . fallback . bind ( this ) ;
return loadingTask . promise . then ( pdfDocument => {
this . load ( pdfDocument ) ;
} , exception => {
if ( loadingTask !== this . pdfLoadingTask ) {
return undefined ;
}
const message = exception && exception . message ;
let loadingErrorMessage ;
if ( exception instanceof _pdfjsLib . InvalidPDFException ) {
loadingErrorMessage = this . l10n . get ( "invalid_file_error" , null , "Invalid or corrupted PDF file." ) ;
} else if ( exception instanceof _pdfjsLib . MissingPDFException ) {
loadingErrorMessage = this . l10n . get ( "missing_file_error" , null , "Missing PDF file." ) ;
} else if ( exception instanceof _pdfjsLib . UnexpectedResponseException ) {
loadingErrorMessage = this . l10n . get ( "unexpected_response_error" , null , "Unexpected server response." ) ;
} else {
loadingErrorMessage = this . l10n . get ( "loading_error" , null , "An error occurred while loading the PDF." ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return loadingErrorMessage . then ( msg => {
this . error ( msg , {
message
} ) ;
throw exception ;
} ) ;
} ) ;
} ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
download ( {
sourceEventType = "download"
} = { } ) {
2019-04-13 13:02:01 +00:00
function downloadByUrl ( ) {
downloadManager . downloadUrl ( url , filename ) ;
}
2021-03-25 17:57:40 +00:00
const url = this . baseUrl ;
const filename = this . contentDispositionFilename || ( 0 , _ui _utils . getPDFFileNameFromURL ) ( this . url ) ;
const downloadManager = this . downloadManager ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
downloadManager . onerror = err => {
this . error ( ` PDF failed to download: ${ err } ` ) ;
2019-04-13 13:02:01 +00:00
} ;
if ( ! this . pdfDocument || ! this . downloadComplete ) {
downloadByUrl ( ) ;
return ;
}
this . pdfDocument . getData ( ) . then ( function ( data ) {
2021-03-25 17:57:40 +00:00
const blob = new Blob ( [ data ] , {
type : "application/pdf"
} ) ;
downloadManager . download ( blob , url , filename , sourceEventType ) ;
} ) . catch ( downloadByUrl ) ;
} ,
save ( {
sourceEventType = "download"
} = { } ) {
if ( this . _saveInProgress ) {
return ;
}
const url = this . baseUrl ;
const filename = this . contentDispositionFilename || ( 0 , _ui _utils . getPDFFileNameFromURL ) ( this . url ) ;
const downloadManager = this . downloadManager ;
downloadManager . onerror = err => {
this . error ( ` PDF failed to be saved: ${ err } ` ) ;
} ;
if ( ! this . pdfDocument || ! this . downloadComplete ) {
this . download ( {
sourceEventType
} ) ;
return ;
}
this . _saveInProgress = true ;
this . pdfDocument . saveDocument ( this . pdfDocument . annotationStorage ) . then ( data => {
const blob = new Blob ( [ data ] , {
type : "application/pdf"
} ) ;
downloadManager . download ( blob , url , filename , sourceEventType ) ;
} ) . catch ( ( ) => {
this . download ( {
sourceEventType
} ) ;
} ) . finally ( ( ) => {
this . _saveInProgress = false ;
} ) ;
} ,
_delayedFallback ( featureId ) {
this . externalServices . reportTelemetry ( {
type : "unsupportedFeature" ,
featureId
} ) ;
if ( ! this . triggerDelayedFallback ) {
this . triggerDelayedFallback = ( ) => {
this . fallback ( featureId ) ;
this . triggerDelayedFallback = null ;
} ;
}
} ,
fallback ( featureId ) {
this . externalServices . reportTelemetry ( {
type : "unsupportedFeature" ,
featureId
} ) ;
if ( this . fellback ) {
return ;
}
this . fellback = true ;
this . externalServices . fallback ( {
featureId ,
url : this . baseUrl
} , function response ( download ) {
if ( ! download ) {
return ;
}
PDFViewerApplication . download ( {
sourceEventType : "download"
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
} ) ;
2019-04-13 13:02:01 +00:00
} ,
2021-03-25 17:57:40 +00:00
error ( message , moreInfo ) {
const moreInfoText = [ this . l10n . get ( "error_version_info" , {
version : _pdfjsLib . version || "?" ,
build : _pdfjsLib . build || "?"
} , "PDF.js v{{version}} (build: {{build}})" ) ] ;
2019-04-13 13:02:01 +00:00
if ( moreInfo ) {
2021-03-25 17:57:40 +00:00
moreInfoText . push ( this . l10n . get ( "error_message" , {
2019-04-13 13:02:01 +00:00
message : moreInfo . message
2021-03-25 17:57:40 +00:00
} , "Message: {{message}}" ) ) ;
2019-04-13 13:02:01 +00:00
if ( moreInfo . stack ) {
2021-03-25 17:57:40 +00:00
moreInfoText . push ( this . l10n . get ( "error_stack" , {
2019-04-13 13:02:01 +00:00
stack : moreInfo . stack
2021-03-25 17:57:40 +00:00
} , "Stack: {{stack}}" ) ) ;
2019-04-13 13:02:01 +00:00
} else {
if ( moreInfo . filename ) {
2021-03-25 17:57:40 +00:00
moreInfoText . push ( this . l10n . get ( "error_file" , {
2019-04-13 13:02:01 +00:00
file : moreInfo . filename
2021-03-25 17:57:40 +00:00
} , "File: {{file}}" ) ) ;
2019-04-13 13:02:01 +00:00
}
if ( moreInfo . lineNumber ) {
2021-03-25 17:57:40 +00:00
moreInfoText . push ( this . l10n . get ( "error_line" , {
2019-04-13 13:02:01 +00:00
line : moreInfo . lineNumber
2021-03-25 17:57:40 +00:00
} , "Line: {{line}}" ) ) ;
2019-04-13 13:02:01 +00:00
}
}
}
2021-03-25 17:57:40 +00:00
const errorWrapperConfig = this . appConfig . errorWrapper ;
const errorWrapper = errorWrapperConfig . container ;
errorWrapper . removeAttribute ( "hidden" ) ;
const errorMessage = errorWrapperConfig . errorMessage ;
2019-04-13 13:02:01 +00:00
errorMessage . textContent = message ;
2021-03-25 17:57:40 +00:00
const closeButton = errorWrapperConfig . closeButton ;
2019-04-13 13:02:01 +00:00
closeButton . onclick = function ( ) {
2021-03-25 17:57:40 +00:00
errorWrapper . setAttribute ( "hidden" , "true" ) ;
2019-04-13 13:02:01 +00:00
} ;
2021-03-25 17:57:40 +00:00
const errorMoreInfo = errorWrapperConfig . errorMoreInfo ;
const moreInfoButton = errorWrapperConfig . moreInfoButton ;
const lessInfoButton = errorWrapperConfig . lessInfoButton ;
2019-04-13 13:02:01 +00:00
moreInfoButton . onclick = function ( ) {
2021-03-25 17:57:40 +00:00
errorMoreInfo . removeAttribute ( "hidden" ) ;
moreInfoButton . setAttribute ( "hidden" , "true" ) ;
lessInfoButton . removeAttribute ( "hidden" ) ;
errorMoreInfo . style . height = errorMoreInfo . scrollHeight + "px" ;
2019-04-13 13:02:01 +00:00
} ;
lessInfoButton . onclick = function ( ) {
2021-03-25 17:57:40 +00:00
errorMoreInfo . setAttribute ( "hidden" , "true" ) ;
moreInfoButton . removeAttribute ( "hidden" ) ;
lessInfoButton . setAttribute ( "hidden" , "true" ) ;
2019-04-13 13:02:01 +00:00
} ;
moreInfoButton . oncontextmenu = _ui _utils . noContextMenuHandler ;
lessInfoButton . oncontextmenu = _ui _utils . noContextMenuHandler ;
closeButton . oncontextmenu = _ui _utils . noContextMenuHandler ;
2021-03-25 17:57:40 +00:00
moreInfoButton . removeAttribute ( "hidden" ) ;
lessInfoButton . setAttribute ( "hidden" , "true" ) ;
Promise . all ( moreInfoText ) . then ( parts => {
errorMoreInfo . value = parts . join ( "\n" ) ;
2019-04-13 13:02:01 +00:00
} ) ;
} ,
2021-03-25 17:57:40 +00:00
progress ( level ) {
2019-04-13 13:02:01 +00:00
if ( this . downloadComplete ) {
return ;
}
2021-03-25 17:57:40 +00:00
const percent = Math . round ( level * 100 ) ;
2019-04-13 13:02:01 +00:00
if ( percent > this . loadingBar . percent || isNaN ( percent ) ) {
this . loadingBar . percent = percent ;
2021-03-25 17:57:40 +00:00
const disableAutoFetch = this . pdfDocument ? this . pdfDocument . loadingParams . disableAutoFetch : _app _options . AppOptions . get ( "disableAutoFetch" ) ;
2019-04-13 13:02:01 +00:00
if ( disableAutoFetch && percent ) {
if ( this . disableAutoFetchLoadingBarTimeout ) {
clearTimeout ( this . disableAutoFetchLoadingBarTimeout ) ;
this . disableAutoFetchLoadingBarTimeout = null ;
}
this . loadingBar . show ( ) ;
2021-03-25 17:57:40 +00:00
this . disableAutoFetchLoadingBarTimeout = setTimeout ( ( ) => {
this . loadingBar . hide ( ) ;
this . disableAutoFetchLoadingBarTimeout = null ;
2019-04-13 13:02:01 +00:00
} , DISABLE _AUTO _FETCH _LOADING _BAR _TIMEOUT ) ;
}
}
} ,
2021-03-25 17:57:40 +00:00
load ( pdfDocument ) {
2019-04-13 13:02:01 +00:00
this . pdfDocument = pdfDocument ;
2021-03-25 17:57:40 +00:00
pdfDocument . getDownloadInfo ( ) . then ( ( ) => {
this . downloadComplete = true ;
this . loadingBar . hide ( ) ;
firstPagePromise . then ( ( ) => {
this . eventBus . dispatch ( "documentloaded" , {
source : this
2019-04-13 13:02:01 +00:00
} ) ;
} ) ;
} ) ;
2021-03-25 17:57:40 +00:00
const pageLayoutPromise = pdfDocument . getPageLayout ( ) . catch ( function ( ) { } ) ;
const pageModePromise = pdfDocument . getPageMode ( ) . catch ( function ( ) { } ) ;
const openActionPromise = pdfDocument . getOpenAction ( ) . catch ( function ( ) { } ) ;
2019-04-13 13:02:01 +00:00
this . toolbar . setPagesCount ( pdfDocument . numPages , false ) ;
this . secondaryToolbar . setPagesCount ( pdfDocument . numPages ) ;
2021-03-25 17:57:40 +00:00
let baseDocumentUrl ;
2019-04-13 13:02:01 +00:00
baseDocumentUrl = null ;
this . pdfLinkService . setDocument ( pdfDocument , baseDocumentUrl ) ;
this . pdfDocumentProperties . setDocument ( pdfDocument , this . url ) ;
2021-03-25 17:57:40 +00:00
const annotationStorage = pdfDocument . annotationStorage ;
annotationStorage . onSetModified = function ( ) {
window . addEventListener ( "beforeunload" , beforeUnload ) ;
} ;
annotationStorage . onResetModified = function ( ) {
window . removeEventListener ( "beforeunload" , beforeUnload ) ;
} ;
const pdfViewer = this . pdfViewer ;
2019-04-13 13:02:01 +00:00
pdfViewer . setDocument ( pdfDocument ) ;
2021-03-25 17:57:40 +00:00
const {
firstPagePromise ,
onePageRendered ,
pagesPromise
} = pdfViewer ;
const pdfThumbnailViewer = this . pdfThumbnailViewer ;
2019-04-13 13:02:01 +00:00
pdfThumbnailViewer . setDocument ( pdfDocument ) ;
2021-03-25 17:57:40 +00:00
const storedPromise = ( this . store = new _view _history . ViewHistory ( pdfDocument . fingerprint ) ) . getMultiple ( {
page : null ,
zoom : _ui _utils . DEFAULT _SCALE _VALUE ,
scrollLeft : "0" ,
scrollTop : "0" ,
rotation : null ,
sidebarView : _pdf _sidebar . SidebarView . UNKNOWN ,
scrollMode : _ui _utils . ScrollMode . UNKNOWN ,
spreadMode : _ui _utils . SpreadMode . UNKNOWN
} ) . catch ( ( ) => {
return Object . create ( null ) ;
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
firstPagePromise . then ( pdfPage => {
this . loadingBar . setWidth ( this . appConfig . viewerContainer ) ;
Promise . all ( [ _ui _utils . animationStarted , storedPromise , pageLayoutPromise , pageModePromise , openActionPromise ] ) . then ( async ( [ timeStamp , stored , pageLayout , pageMode , openAction ] ) => {
const viewOnLoad = _app _options . AppOptions . get ( "viewOnLoad" ) ;
this . _initializePdfHistory ( {
fingerprint : pdfDocument . fingerprint ,
viewOnLoad ,
initialDest : openAction && openAction . dest
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const initialBookmark = this . initialBookmark ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const zoom = _app _options . AppOptions . get ( "defaultZoomValue" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let hash = zoom ? ` zoom= ${ zoom } ` : null ;
let rotation = null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let sidebarView = _app _options . AppOptions . get ( "sidebarViewOnLoad" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let scrollMode = _app _options . AppOptions . get ( "scrollModeOnLoad" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let spreadMode = _app _options . AppOptions . get ( "spreadModeOnLoad" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( stored . page && viewOnLoad !== ViewOnLoad . INITIAL ) {
hash = ` page= ${ stored . page } &zoom= ${ zoom || stored . zoom } , ` + ` ${ stored . scrollLeft } , ${ stored . scrollTop } ` ;
rotation = parseInt ( stored . rotation , 10 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( sidebarView === _pdf _sidebar . SidebarView . UNKNOWN ) {
sidebarView = stored . sidebarView | 0 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( scrollMode === _ui _utils . ScrollMode . UNKNOWN ) {
scrollMode = stored . scrollMode | 0 ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( spreadMode === _ui _utils . SpreadMode . UNKNOWN ) {
spreadMode = stored . spreadMode | 0 ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( pageMode && sidebarView === _pdf _sidebar . SidebarView . UNKNOWN ) {
sidebarView = apiPageModeToSidebarView ( pageMode ) ;
}
if ( pageLayout && spreadMode === _ui _utils . SpreadMode . UNKNOWN ) {
spreadMode = apiPageLayoutToSpreadMode ( pageLayout ) ;
}
this . setInitialView ( hash , {
rotation ,
sidebarView ,
scrollMode ,
spreadMode
} ) ;
this . eventBus . dispatch ( "documentinit" , {
source : this
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
if ( ! this . isViewerEmbedded ) {
pdfViewer . focus ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _initializePermissions ( pdfDocument ) ;
await Promise . race ( [ pagesPromise , new Promise ( resolve => {
setTimeout ( resolve , FORCE _PAGES _LOADED _TIMEOUT ) ;
} ) ] ) ;
if ( ! initialBookmark && ! hash ) {
return ;
}
if ( pdfViewer . hasEqualPageSizes ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . initialBookmark = initialBookmark ;
pdfViewer . currentScaleValue = pdfViewer . currentScaleValue ;
this . setInitialView ( hash ) ;
} ) . catch ( ( ) => {
this . setInitialView ( ) ;
} ) . then ( function ( ) {
pdfViewer . update ( ) ;
2019-04-13 13:02:01 +00:00
} ) ;
} ) ;
2021-03-25 17:57:40 +00:00
pagesPromise . then ( ( ) => {
this . _initializeAutoPrint ( pdfDocument , openActionPromise ) ;
} ) ;
onePageRendered . then ( ( ) => {
pdfDocument . getOutline ( ) . then ( outline => {
this . pdfOutlineViewer . render ( {
outline
} ) ;
} ) ;
pdfDocument . getAttachments ( ) . then ( attachments => {
this . pdfAttachmentViewer . render ( {
attachments
2019-04-13 13:02:01 +00:00
} ) ;
} ) ;
2021-03-25 17:57:40 +00:00
pdfViewer . optionalContentConfigPromise . then ( optionalContentConfig => {
this . pdfLayerViewer . render ( {
optionalContentConfig ,
pdfDocument
2019-04-13 13:02:01 +00:00
} ) ;
} ) ;
} ) ;
2021-03-25 17:57:40 +00:00
this . _initializePageLabels ( pdfDocument ) ;
this . _initializeMetadata ( pdfDocument ) ;
} ,
async _initializeAutoPrint ( pdfDocument , openActionPromise ) {
const [ openAction , javaScript ] = await Promise . all ( [ openActionPromise , pdfDocument . getJavaScript ( ) ] ) ;
if ( pdfDocument !== this . pdfDocument ) {
return ;
}
let triggerAutoPrint = false ;
if ( openAction && openAction . action === "Print" ) {
triggerAutoPrint = true ;
}
if ( javaScript ) {
javaScript . some ( js => {
if ( ! js ) {
return false ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
console . warn ( "Warning: JavaScript is not supported" ) ;
this . _delayedFallback ( _pdfjsLib . UNSUPPORTED _FEATURES . javaScript ) ;
return true ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! triggerAutoPrint ) {
for ( const js of javaScript ) {
if ( js && _ui _utils . AutoPrintRegExp . test ( js ) ) {
triggerAutoPrint = true ;
break ;
}
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
if ( ! this . supportsPrinting ) {
return ;
}
if ( triggerAutoPrint ) {
setTimeout ( function ( ) {
window . print ( ) ;
} ) ;
}
} ,
async _initializeMetadata ( pdfDocument ) {
const {
info ,
metadata ,
contentDispositionFilename
} = await pdfDocument . getMetadata ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( pdfDocument !== this . pdfDocument ) {
return ;
}
this . documentInfo = info ;
this . metadata = metadata ;
this . contentDispositionFilename = contentDispositionFilename ;
console . log ( ` PDF ${ pdfDocument . fingerprint } [ ${ info . PDFFormatVersion } ` + ` ${ ( info . Producer || "-" ) . trim ( ) } / ${ ( info . Creator || "-" ) . trim ( ) } ] ` + ` (PDF.js: ${ _pdfjsLib . version || "-" } ` + ` ${ this . pdfViewer . enableWebGL ? " [WebGL]" : "" } ) ` ) ;
let pdfTitle ;
const infoTitle = info && info . Title ;
if ( infoTitle ) {
pdfTitle = infoTitle ;
}
const metadataTitle = metadata && metadata . get ( "dc:title" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( metadataTitle ) {
if ( metadataTitle !== "Untitled" && ! /[\uFFF0-\uFFFF]/g . test ( metadataTitle ) ) {
pdfTitle = metadataTitle ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
if ( pdfTitle ) {
this . setTitle ( ` ${ pdfTitle } - ${ contentDispositionFilename || document . title } ` ) ;
} else if ( contentDispositionFilename ) {
this . setTitle ( contentDispositionFilename ) ;
}
if ( info . IsXFAPresent && ! info . IsAcroFormPresent ) {
console . warn ( "Warning: XFA is not supported" ) ;
this . _delayedFallback ( _pdfjsLib . UNSUPPORTED _FEATURES . forms ) ;
} else if ( ( info . IsAcroFormPresent || info . IsXFAPresent ) && ! this . pdfViewer . renderInteractiveForms ) {
console . warn ( "Warning: Interactive form support is not enabled" ) ;
this . _delayedFallback ( _pdfjsLib . UNSUPPORTED _FEATURES . forms ) ;
}
let versionId = "other" ;
if ( KNOWN _VERSIONS . includes ( info . PDFFormatVersion ) ) {
versionId = ` v ${ info . PDFFormatVersion . replace ( "." , "_" ) } ` ;
}
let generatorId = "other" ;
if ( info . Producer ) {
const producer = info . Producer . toLowerCase ( ) ;
KNOWN _GENERATORS . some ( function ( generator ) {
if ( ! producer . includes ( generator ) ) {
return false ;
}
generatorId = generator . replace ( /[ .\-]/g , "_" ) ;
return true ;
} ) ;
}
let formType = null ;
if ( info . IsXFAPresent ) {
formType = "xfa" ;
} else if ( info . IsAcroFormPresent ) {
formType = "acroform" ;
}
this . externalServices . reportTelemetry ( {
type : "documentInfo" ,
version : versionId ,
generator : generatorId ,
formType
2019-04-13 13:02:01 +00:00
} ) ;
} ,
2021-03-25 17:57:40 +00:00
async _initializePageLabels ( pdfDocument ) {
const labels = await pdfDocument . getPageLabels ( ) ;
if ( pdfDocument !== this . pdfDocument ) {
return ;
}
if ( ! labels || _app _options . AppOptions . get ( "disablePageLabels" ) ) {
return ;
}
const numLabels = labels . length ;
if ( numLabels !== this . pagesCount ) {
console . error ( "The number of Page Labels does not match the number of pages in the document." ) ;
return ;
}
let i = 0 ;
while ( i < numLabels && labels [ i ] === ( i + 1 ) . toString ( ) ) {
i ++ ;
}
if ( i === numLabels ) {
return ;
}
const {
pdfViewer ,
pdfThumbnailViewer ,
toolbar
} = this ;
pdfViewer . setPageLabels ( labels ) ;
pdfThumbnailViewer . setPageLabels ( labels ) ;
toolbar . setPagesCount ( numLabels , true ) ;
toolbar . setPageNumber ( pdfViewer . currentPageNumber , pdfViewer . currentPageLabel ) ;
} ,
_initializePdfHistory ( {
fingerprint ,
viewOnLoad ,
initialDest = null
} ) {
if ( this . isViewerEmbedded || _app _options . AppOptions . get ( "disableHistory" ) ) {
2019-04-13 13:02:01 +00:00
return ;
}
this . pdfHistory . initialize ( {
2021-03-25 17:57:40 +00:00
fingerprint ,
2019-04-13 13:02:01 +00:00
resetHistory : viewOnLoad === ViewOnLoad . INITIAL ,
2021-03-25 17:57:40 +00:00
updateUrl : _app _options . AppOptions . get ( "historyUpdateUrl" )
2019-04-13 13:02:01 +00:00
} ) ;
if ( this . pdfHistory . initialBookmark ) {
this . initialBookmark = this . pdfHistory . initialBookmark ;
this . initialRotation = this . pdfHistory . initialRotation ;
}
if ( initialDest && ! this . initialBookmark && viewOnLoad === ViewOnLoad . UNKNOWN ) {
this . initialBookmark = JSON . stringify ( initialDest ) ;
this . pdfHistory . push ( {
explicitDest : initialDest ,
pageNumber : null
} ) ;
}
} ,
2021-03-25 17:57:40 +00:00
async _initializePermissions ( pdfDocument ) {
const permissions = await pdfDocument . getPermissions ( ) ;
if ( pdfDocument !== this . pdfDocument ) {
return ;
}
if ( ! permissions || ! _app _options . AppOptions . get ( "enablePermissions" ) ) {
return ;
}
if ( ! permissions . includes ( _pdfjsLib . PermissionFlag . COPY ) ) {
this . appConfig . viewerContainer . classList . add ( ENABLE _PERMISSIONS _CLASS ) ;
}
} ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setInitialView ( storedHash , {
rotation ,
sidebarView ,
scrollMode ,
spreadMode
} = { } ) {
const setRotation = angle => {
2019-04-13 13:02:01 +00:00
if ( ( 0 , _ui _utils . isValidRotation ) ( angle ) ) {
2021-03-25 17:57:40 +00:00
this . pdfViewer . pagesRotation = angle ;
2019-04-13 13:02:01 +00:00
}
} ;
2021-03-25 17:57:40 +00:00
const setViewerModes = ( scroll , spread ) => {
2019-04-13 13:02:01 +00:00
if ( ( 0 , _ui _utils . isValidScrollMode ) ( scroll ) ) {
2021-03-25 17:57:40 +00:00
this . pdfViewer . scrollMode = scroll ;
2019-04-13 13:02:01 +00:00
}
if ( ( 0 , _ui _utils . isValidSpreadMode ) ( spread ) ) {
2021-03-25 17:57:40 +00:00
this . pdfViewer . spreadMode = spread ;
2019-04-13 13:02:01 +00:00
}
} ;
this . isInitialViewSet = true ;
this . pdfSidebar . setInitialView ( sidebarView ) ;
setViewerModes ( scrollMode , spreadMode ) ;
if ( this . initialBookmark ) {
setRotation ( this . initialRotation ) ;
delete this . initialRotation ;
this . pdfLinkService . setHash ( this . initialBookmark ) ;
this . initialBookmark = null ;
} else if ( storedHash ) {
setRotation ( rotation ) ;
this . pdfLinkService . setHash ( storedHash ) ;
}
this . toolbar . setPageNumber ( this . pdfViewer . currentPageNumber , this . pdfViewer . currentPageLabel ) ;
this . secondaryToolbar . setPageNumber ( this . pdfViewer . currentPageNumber ) ;
if ( ! this . pdfViewer . currentScaleValue ) {
this . pdfViewer . currentScaleValue = _ui _utils . DEFAULT _SCALE _VALUE ;
}
} ,
2021-03-25 17:57:40 +00:00
cleanup ( ) {
2019-04-13 13:02:01 +00:00
if ( ! this . pdfDocument ) {
return ;
}
this . pdfViewer . cleanup ( ) ;
this . pdfThumbnailViewer . cleanup ( ) ;
if ( this . pdfViewer . renderer !== _ui _utils . RendererType . SVG ) {
this . pdfDocument . cleanup ( ) ;
}
} ,
2021-03-25 17:57:40 +00:00
forceRendering ( ) {
2019-04-13 13:02:01 +00:00
this . pdfRenderingQueue . printing = this . printing ;
this . pdfRenderingQueue . isThumbnailViewEnabled = this . pdfSidebar . isThumbnailViewVisible ;
this . pdfRenderingQueue . renderHighestPriority ( ) ;
} ,
2021-03-25 17:57:40 +00:00
beforePrint ( ) {
2019-04-13 13:02:01 +00:00
if ( this . printService ) {
return ;
}
if ( ! this . supportsPrinting ) {
2021-03-25 17:57:40 +00:00
this . l10n . get ( "printing_not_supported" , null , "Warning: Printing is not fully supported by this browser." ) . then ( printMessage => {
this . error ( printMessage ) ;
2019-04-13 13:02:01 +00:00
} ) ;
return ;
}
if ( ! this . pdfViewer . pageViewsReady ) {
2021-03-25 17:57:40 +00:00
this . l10n . get ( "printing_not_ready" , null , "Warning: The PDF is not fully loaded for printing." ) . then ( notReadyMessage => {
2019-04-13 13:02:01 +00:00
window . alert ( notReadyMessage ) ;
} ) ;
return ;
}
2021-03-25 17:57:40 +00:00
const pagesOverview = this . pdfViewer . getPagesOverview ( ) ;
const printContainer = this . appConfig . printContainer ;
const printResolution = _app _options . AppOptions . get ( "printResolution" ) ;
const optionalContentConfigPromise = this . pdfViewer . optionalContentConfigPromise ;
const printService = PDFPrintServiceFactory . instance . createPrintService ( this . pdfDocument , pagesOverview , printContainer , printResolution , optionalContentConfigPromise , this . l10n ) ;
2019-04-13 13:02:01 +00:00
this . printService = printService ;
this . forceRendering ( ) ;
printService . layout ( ) ;
2021-03-25 17:57:40 +00:00
this . externalServices . reportTelemetry ( {
type : "print"
} ) ;
2019-04-13 13:02:01 +00:00
} ,
2021-03-25 17:57:40 +00:00
afterPrint ( ) {
2019-04-13 13:02:01 +00:00
if ( this . printService ) {
this . printService . destroy ( ) ;
this . printService = null ;
2021-03-25 17:57:40 +00:00
if ( this . pdfDocument ) {
this . pdfDocument . annotationStorage . resetModified ( ) ;
}
2019-04-13 13:02:01 +00:00
}
this . forceRendering ( ) ;
} ,
2021-03-25 17:57:40 +00:00
rotatePages ( delta ) {
2019-04-13 13:02:01 +00:00
if ( ! this . pdfDocument ) {
return ;
}
2021-03-25 17:57:40 +00:00
const newRotation = ( this . pdfViewer . pagesRotation + 360 + delta ) % 360 ;
2019-04-13 13:02:01 +00:00
this . pdfViewer . pagesRotation = newRotation ;
} ,
2021-03-25 17:57:40 +00:00
requestPresentationMode ( ) {
2019-04-13 13:02:01 +00:00
if ( ! this . pdfPresentationMode ) {
return ;
}
this . pdfPresentationMode . request ( ) ;
} ,
2021-03-25 17:57:40 +00:00
bindEvents ( ) {
const {
eventBus ,
_boundEvents
} = this ;
2019-04-13 13:02:01 +00:00
_boundEvents . beforePrint = this . beforePrint . bind ( this ) ;
_boundEvents . afterPrint = this . afterPrint . bind ( this ) ;
2021-03-25 17:57:40 +00:00
eventBus . _on ( "resize" , webViewerResize ) ;
eventBus . _on ( "hashchange" , webViewerHashchange ) ;
eventBus . _on ( "beforeprint" , _boundEvents . beforePrint ) ;
eventBus . _on ( "afterprint" , _boundEvents . afterPrint ) ;
eventBus . _on ( "pagerendered" , webViewerPageRendered ) ;
eventBus . _on ( "updateviewarea" , webViewerUpdateViewarea ) ;
eventBus . _on ( "pagechanging" , webViewerPageChanging ) ;
eventBus . _on ( "scalechanging" , webViewerScaleChanging ) ;
eventBus . _on ( "rotationchanging" , webViewerRotationChanging ) ;
eventBus . _on ( "sidebarviewchanged" , webViewerSidebarViewChanged ) ;
eventBus . _on ( "pagemode" , webViewerPageMode ) ;
eventBus . _on ( "namedaction" , webViewerNamedAction ) ;
eventBus . _on ( "presentationmodechanged" , webViewerPresentationModeChanged ) ;
eventBus . _on ( "presentationmode" , webViewerPresentationMode ) ;
eventBus . _on ( "print" , webViewerPrint ) ;
eventBus . _on ( "download" , webViewerDownload ) ;
eventBus . _on ( "save" , webViewerSave ) ;
eventBus . _on ( "firstpage" , webViewerFirstPage ) ;
eventBus . _on ( "lastpage" , webViewerLastPage ) ;
eventBus . _on ( "nextpage" , webViewerNextPage ) ;
eventBus . _on ( "previouspage" , webViewerPreviousPage ) ;
eventBus . _on ( "zoomin" , webViewerZoomIn ) ;
eventBus . _on ( "zoomout" , webViewerZoomOut ) ;
eventBus . _on ( "zoomreset" , webViewerZoomReset ) ;
eventBus . _on ( "pagenumberchanged" , webViewerPageNumberChanged ) ;
eventBus . _on ( "scalechanged" , webViewerScaleChanged ) ;
eventBus . _on ( "rotatecw" , webViewerRotateCw ) ;
eventBus . _on ( "rotateccw" , webViewerRotateCcw ) ;
eventBus . _on ( "optionalcontentconfig" , webViewerOptionalContentConfig ) ;
eventBus . _on ( "switchscrollmode" , webViewerSwitchScrollMode ) ;
eventBus . _on ( "scrollmodechanged" , webViewerScrollModeChanged ) ;
eventBus . _on ( "switchspreadmode" , webViewerSwitchSpreadMode ) ;
eventBus . _on ( "spreadmodechanged" , webViewerSpreadModeChanged ) ;
eventBus . _on ( "documentproperties" , webViewerDocumentProperties ) ;
eventBus . _on ( "find" , webViewerFind ) ;
eventBus . _on ( "findfromurlhash" , webViewerFindFromUrlHash ) ;
eventBus . _on ( "updatefindmatchescount" , webViewerUpdateFindMatchesCount ) ;
eventBus . _on ( "updatefindcontrolstate" , webViewerUpdateFindControlState ) ;
eventBus . _on ( "fileinputchange" , webViewerFileInputChange ) ;
eventBus . _on ( "openfile" , webViewerOpenFile ) ;
2019-04-13 13:02:01 +00:00
} ,
2021-03-25 17:57:40 +00:00
bindWindowEvents ( ) {
const {
eventBus ,
_boundEvents
} = this ;
_boundEvents . windowResize = ( ) => {
eventBus . dispatch ( "resize" , {
2019-04-13 13:02:01 +00:00
source : window
} ) ;
} ;
2021-03-25 17:57:40 +00:00
_boundEvents . windowHashChange = ( ) => {
eventBus . dispatch ( "hashchange" , {
2019-04-13 13:02:01 +00:00
source : window ,
hash : document . location . hash . substring ( 1 )
} ) ;
} ;
2021-03-25 17:57:40 +00:00
_boundEvents . windowBeforePrint = ( ) => {
eventBus . dispatch ( "beforeprint" , {
2019-04-13 13:02:01 +00:00
source : window
} ) ;
} ;
2021-03-25 17:57:40 +00:00
_boundEvents . windowAfterPrint = ( ) => {
eventBus . dispatch ( "afterprint" , {
2019-04-13 13:02:01 +00:00
source : window
} ) ;
} ;
2021-03-25 17:57:40 +00:00
window . addEventListener ( "visibilitychange" , webViewerVisibilityChange ) ;
window . addEventListener ( "wheel" , webViewerWheel , {
passive : false
} ) ;
window . addEventListener ( "touchstart" , webViewerTouchStart , {
2020-02-09 16:02:47 +00:00
passive : false
} ) ;
2021-03-25 17:57:40 +00:00
window . addEventListener ( "click" , webViewerClick ) ;
window . addEventListener ( "keydown" , webViewerKeyDown ) ;
window . addEventListener ( "keyup" , webViewerKeyUp ) ;
window . addEventListener ( "resize" , _boundEvents . windowResize ) ;
window . addEventListener ( "hashchange" , _boundEvents . windowHashChange ) ;
window . addEventListener ( "beforeprint" , _boundEvents . windowBeforePrint ) ;
window . addEventListener ( "afterprint" , _boundEvents . windowAfterPrint ) ;
2019-04-13 13:02:01 +00:00
} ,
2021-03-25 17:57:40 +00:00
unbindEvents ( ) {
const {
eventBus ,
_boundEvents
} = this ;
eventBus . _off ( "resize" , webViewerResize ) ;
eventBus . _off ( "hashchange" , webViewerHashchange ) ;
eventBus . _off ( "beforeprint" , _boundEvents . beforePrint ) ;
eventBus . _off ( "afterprint" , _boundEvents . afterPrint ) ;
eventBus . _off ( "pagerendered" , webViewerPageRendered ) ;
eventBus . _off ( "updateviewarea" , webViewerUpdateViewarea ) ;
eventBus . _off ( "pagechanging" , webViewerPageChanging ) ;
eventBus . _off ( "scalechanging" , webViewerScaleChanging ) ;
eventBus . _off ( "rotationchanging" , webViewerRotationChanging ) ;
eventBus . _off ( "sidebarviewchanged" , webViewerSidebarViewChanged ) ;
eventBus . _off ( "pagemode" , webViewerPageMode ) ;
eventBus . _off ( "namedaction" , webViewerNamedAction ) ;
eventBus . _off ( "presentationmodechanged" , webViewerPresentationModeChanged ) ;
eventBus . _off ( "presentationmode" , webViewerPresentationMode ) ;
eventBus . _off ( "print" , webViewerPrint ) ;
eventBus . _off ( "download" , webViewerDownload ) ;
eventBus . _off ( "save" , webViewerSave ) ;
eventBus . _off ( "firstpage" , webViewerFirstPage ) ;
eventBus . _off ( "lastpage" , webViewerLastPage ) ;
eventBus . _off ( "nextpage" , webViewerNextPage ) ;
eventBus . _off ( "previouspage" , webViewerPreviousPage ) ;
eventBus . _off ( "zoomin" , webViewerZoomIn ) ;
eventBus . _off ( "zoomout" , webViewerZoomOut ) ;
eventBus . _off ( "zoomreset" , webViewerZoomReset ) ;
eventBus . _off ( "pagenumberchanged" , webViewerPageNumberChanged ) ;
eventBus . _off ( "scalechanged" , webViewerScaleChanged ) ;
eventBus . _off ( "rotatecw" , webViewerRotateCw ) ;
eventBus . _off ( "rotateccw" , webViewerRotateCcw ) ;
eventBus . _off ( "optionalcontentconfig" , webViewerOptionalContentConfig ) ;
eventBus . _off ( "switchscrollmode" , webViewerSwitchScrollMode ) ;
eventBus . _off ( "scrollmodechanged" , webViewerScrollModeChanged ) ;
eventBus . _off ( "switchspreadmode" , webViewerSwitchSpreadMode ) ;
eventBus . _off ( "spreadmodechanged" , webViewerSpreadModeChanged ) ;
eventBus . _off ( "documentproperties" , webViewerDocumentProperties ) ;
eventBus . _off ( "find" , webViewerFind ) ;
eventBus . _off ( "findfromurlhash" , webViewerFindFromUrlHash ) ;
eventBus . _off ( "updatefindmatchescount" , webViewerUpdateFindMatchesCount ) ;
eventBus . _off ( "updatefindcontrolstate" , webViewerUpdateFindControlState ) ;
eventBus . _off ( "fileinputchange" , webViewerFileInputChange ) ;
eventBus . _off ( "openfile" , webViewerOpenFile ) ;
2019-04-13 13:02:01 +00:00
_boundEvents . beforePrint = null ;
_boundEvents . afterPrint = null ;
} ,
2021-03-25 17:57:40 +00:00
unbindWindowEvents ( ) {
const {
_boundEvents
} = this ;
window . removeEventListener ( "visibilitychange" , webViewerVisibilityChange ) ;
window . removeEventListener ( "wheel" , webViewerWheel , {
passive : false
} ) ;
window . removeEventListener ( "touchstart" , webViewerTouchStart , {
passive : false
} ) ;
window . removeEventListener ( "click" , webViewerClick ) ;
window . removeEventListener ( "keydown" , webViewerKeyDown ) ;
window . removeEventListener ( "keyup" , webViewerKeyUp ) ;
window . removeEventListener ( "resize" , _boundEvents . windowResize ) ;
window . removeEventListener ( "hashchange" , _boundEvents . windowHashChange ) ;
window . removeEventListener ( "beforeprint" , _boundEvents . windowBeforePrint ) ;
window . removeEventListener ( "afterprint" , _boundEvents . windowAfterPrint ) ;
2019-04-13 13:02:01 +00:00
_boundEvents . windowResize = null ;
_boundEvents . windowHashChange = null ;
_boundEvents . windowBeforePrint = null ;
_boundEvents . windowAfterPrint = null ;
2021-03-25 17:57:40 +00:00
} ,
accumulateWheelTicks ( ticks ) {
if ( this . _wheelUnusedTicks > 0 && ticks < 0 || this . _wheelUnusedTicks < 0 && ticks > 0 ) {
this . _wheelUnusedTicks = 0 ;
}
this . _wheelUnusedTicks += ticks ;
const wholeTicks = Math . sign ( this . _wheelUnusedTicks ) * Math . floor ( Math . abs ( this . _wheelUnusedTicks ) ) ;
this . _wheelUnusedTicks -= wholeTicks ;
return wholeTicks ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
2019-04-13 13:02:01 +00:00
} ;
exports . PDFViewerApplication = PDFViewerApplication ;
2021-03-25 17:57:40 +00:00
let validateFileURL ;
2019-04-13 13:02:01 +00:00
{
2021-03-25 17:57:40 +00:00
const HOSTED _VIEWER _ORIGINS = [ "null" , "http://mozilla.github.io" , "https://mozilla.github.io" ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
validateFileURL = function ( file ) {
2019-04-13 13:02:01 +00:00
if ( file === undefined ) {
return ;
}
try {
2021-03-25 17:57:40 +00:00
const viewerOrigin = new URL ( window . location . href ) . origin || "null" ;
2019-04-13 13:02:01 +00:00
if ( HOSTED _VIEWER _ORIGINS . includes ( viewerOrigin ) ) {
return ;
}
2021-03-25 17:57:40 +00:00
const {
origin ,
protocol
} = new URL ( file , window . location . href ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( origin !== viewerOrigin && protocol !== "blob:" ) {
throw new Error ( "file origin does not match viewer's" ) ;
2019-04-13 13:02:01 +00:00
}
} catch ( ex ) {
2021-03-25 17:57:40 +00:00
const message = ex && ex . message ;
PDFViewerApplication . l10n . get ( "loading_error" , null , "An error occurred while loading the PDF." ) . then ( loadingErrorMessage => {
2019-04-13 13:02:01 +00:00
PDFViewerApplication . error ( loadingErrorMessage , {
2021-03-25 17:57:40 +00:00
message
2019-04-13 13:02:01 +00:00
} ) ;
} ) ;
throw ex ;
}
} ;
}
2021-03-25 17:57:40 +00:00
async function loadFakeWorker ( ) {
2019-04-13 13:02:01 +00:00
if ( ! _pdfjsLib . GlobalWorkerOptions . workerSrc ) {
2021-03-25 17:57:40 +00:00
_pdfjsLib . GlobalWorkerOptions . workerSrc = _app _options . AppOptions . get ( "workerSrc" ) ;
2019-04-13 13:02:01 +00:00
}
return ( 0 , _pdfjsLib . loadScript ) ( _pdfjsLib . PDFWorker . getWorkerSrc ( ) ) ;
}
function loadAndEnablePDFBug ( enabledTabs ) {
2021-03-25 17:57:40 +00:00
const appConfig = PDFViewerApplication . appConfig ;
2019-04-13 13:02:01 +00:00
return ( 0 , _pdfjsLib . loadScript ) ( appConfig . debuggerScriptPath ) . then ( function ( ) {
PDFBug . enable ( enabledTabs ) ;
PDFBug . init ( {
2021-03-25 17:57:40 +00:00
OPS : _pdfjsLib . OPS
2019-04-13 13:02:01 +00:00
} , appConfig . mainContainer ) ;
} ) ;
}
function webViewerInitialized ( ) {
2021-03-25 17:57:40 +00:00
const appConfig = PDFViewerApplication . appConfig ;
let file ;
const queryString = document . location . search . substring ( 1 ) ;
const params = ( 0 , _ui _utils . parseQueryString ) ( queryString ) ;
file = "file" in params ? params . file : _app _options . AppOptions . get ( "defaultUrl" ) ;
2019-04-13 13:02:01 +00:00
validateFileURL ( file ) ;
2021-03-25 17:57:40 +00:00
const fileInput = document . createElement ( "input" ) ;
2019-04-13 13:02:01 +00:00
fileInput . id = appConfig . openFileInputName ;
2021-03-25 17:57:40 +00:00
fileInput . className = "fileInput" ;
fileInput . setAttribute ( "type" , "file" ) ;
2019-04-13 13:02:01 +00:00
fileInput . oncontextmenu = _ui _utils . noContextMenuHandler ;
document . body . appendChild ( fileInput ) ;
if ( ! window . File || ! window . FileReader || ! window . FileList || ! window . Blob ) {
2021-03-25 17:57:40 +00:00
appConfig . toolbar . openFile . setAttribute ( "hidden" , "true" ) ;
appConfig . secondaryToolbar . openFileButton . setAttribute ( "hidden" , "true" ) ;
2019-04-13 13:02:01 +00:00
} else {
fileInput . value = null ;
}
2021-03-25 17:57:40 +00:00
fileInput . addEventListener ( "change" , function ( evt ) {
const files = evt . target . files ;
2019-04-13 13:02:01 +00:00
if ( ! files || files . length === 0 ) {
return ;
}
2021-03-25 17:57:40 +00:00
PDFViewerApplication . eventBus . dispatch ( "fileinputchange" , {
2019-04-13 13:02:01 +00:00
source : this ,
fileInput : evt . target
} ) ;
} ) ;
2021-03-25 17:57:40 +00:00
appConfig . mainContainer . addEventListener ( "dragover" , function ( evt ) {
2019-04-13 13:02:01 +00:00
evt . preventDefault ( ) ;
2021-03-25 17:57:40 +00:00
evt . dataTransfer . dropEffect = "move" ;
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
appConfig . mainContainer . addEventListener ( "drop" , function ( evt ) {
2019-04-13 13:02:01 +00:00
evt . preventDefault ( ) ;
2021-03-25 17:57:40 +00:00
const files = evt . dataTransfer . files ;
2019-04-13 13:02:01 +00:00
if ( ! files || files . length === 0 ) {
return ;
}
2021-03-25 17:57:40 +00:00
PDFViewerApplication . eventBus . dispatch ( "fileinputchange" , {
2019-04-13 13:02:01 +00:00
source : this ,
fileInput : evt . dataTransfer
} ) ;
} ) ;
2021-03-25 17:57:40 +00:00
if ( ! PDFViewerApplication . supportsDocumentFonts ) {
_app _options . AppOptions . set ( "disableFontFace" , true ) ;
PDFViewerApplication . l10n . get ( "web_fonts_disabled" , null , "Web fonts are disabled: unable to use embedded PDF fonts." ) . then ( msg => {
console . warn ( msg ) ;
} ) ;
}
2019-04-13 13:02:01 +00:00
if ( ! PDFViewerApplication . supportsPrinting ) {
2021-03-25 17:57:40 +00:00
appConfig . toolbar . print . classList . add ( "hidden" ) ;
appConfig . secondaryToolbar . printButton . classList . add ( "hidden" ) ;
2019-04-13 13:02:01 +00:00
}
if ( ! PDFViewerApplication . supportsFullscreen ) {
2021-03-25 17:57:40 +00:00
appConfig . toolbar . presentationModeButton . classList . add ( "hidden" ) ;
appConfig . secondaryToolbar . presentationModeButton . classList . add ( "hidden" ) ;
2019-04-13 13:02:01 +00:00
}
if ( PDFViewerApplication . supportsIntegratedFind ) {
2021-03-25 17:57:40 +00:00
appConfig . toolbar . viewFind . classList . add ( "hidden" ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
appConfig . mainContainer . addEventListener ( "transitionend" , function ( evt ) {
2019-04-13 13:02:01 +00:00
if ( evt . target === this ) {
2021-03-25 17:57:40 +00:00
PDFViewerApplication . eventBus . dispatch ( "resize" , {
2019-04-13 13:02:01 +00:00
source : this
} ) ;
}
} , true ) ;
try {
webViewerOpenFileViaURL ( file ) ;
} catch ( reason ) {
2021-03-25 17:57:40 +00:00
PDFViewerApplication . l10n . get ( "loading_error" , null , "An error occurred while loading the PDF." ) . then ( msg => {
2019-04-13 13:02:01 +00:00
PDFViewerApplication . error ( msg , reason ) ;
} ) ;
}
}
2021-03-25 17:57:40 +00:00
let webViewerOpenFileViaURL ;
2019-04-13 13:02:01 +00:00
{
2021-03-25 17:57:40 +00:00
webViewerOpenFileViaURL = function ( file ) {
if ( file && file . lastIndexOf ( "file:" , 0 ) === 0 ) {
2019-04-13 13:02:01 +00:00
PDFViewerApplication . setTitleUsingUrl ( file ) ;
2021-03-25 17:57:40 +00:00
const xhr = new XMLHttpRequest ( ) ;
2019-04-13 13:02:01 +00:00
xhr . onload = function ( ) {
PDFViewerApplication . open ( new Uint8Array ( xhr . response ) ) ;
} ;
2021-03-25 17:57:40 +00:00
xhr . open ( "GET" , file ) ;
xhr . responseType = "arraybuffer" ;
2019-04-13 13:02:01 +00:00
xhr . send ( ) ;
return ;
}
if ( file ) {
PDFViewerApplication . open ( file ) ;
}
} ;
}
2021-03-25 17:57:40 +00:00
function webViewerResetPermissions ( ) {
const {
appConfig
} = PDFViewerApplication ;
if ( ! appConfig ) {
return ;
}
appConfig . viewerContainer . classList . remove ( ENABLE _PERMISSIONS _CLASS ) ;
}
2019-04-13 13:02:01 +00:00
function webViewerPageRendered ( evt ) {
2021-03-25 17:57:40 +00:00
const pageNumber = evt . pageNumber ;
const pageIndex = pageNumber - 1 ;
const pageView = PDFViewerApplication . pdfViewer . getPageView ( pageIndex ) ;
2019-04-13 13:02:01 +00:00
if ( pageNumber === PDFViewerApplication . page ) {
PDFViewerApplication . toolbar . updateLoadingIndicatorState ( false ) ;
}
if ( ! pageView ) {
return ;
}
if ( PDFViewerApplication . pdfSidebar . isThumbnailViewVisible ) {
2021-03-25 17:57:40 +00:00
const thumbnailView = PDFViewerApplication . pdfThumbnailViewer . getThumbnail ( pageIndex ) ;
2019-04-13 13:02:01 +00:00
thumbnailView . setImage ( pageView ) ;
}
2021-03-25 17:57:40 +00:00
if ( typeof Stats !== "undefined" && Stats . enabled && pageView . stats ) {
2019-04-13 13:02:01 +00:00
Stats . add ( pageNumber , pageView . stats ) ;
}
if ( pageView . error ) {
2021-03-25 17:57:40 +00:00
PDFViewerApplication . l10n . get ( "rendering_error" , null , "An error occurred while rendering the page." ) . then ( msg => {
2019-04-13 13:02:01 +00:00
PDFViewerApplication . error ( msg , pageView . error ) ;
} ) ;
}
2021-03-25 17:57:40 +00:00
PDFViewerApplication . externalServices . reportTelemetry ( {
type : "pageInfo" ,
timestamp : evt . timestamp
} ) ;
PDFViewerApplication . pdfDocument . getStats ( ) . then ( function ( stats ) {
PDFViewerApplication . externalServices . reportTelemetry ( {
type : "documentStats" ,
stats
} ) ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
function webViewerPageMode ( {
mode
} ) {
let view ;
2019-04-13 13:02:01 +00:00
switch ( mode ) {
2021-03-25 17:57:40 +00:00
case "thumbs" :
2019-04-13 13:02:01 +00:00
view = _pdf _sidebar . SidebarView . THUMBS ;
break ;
2021-03-25 17:57:40 +00:00
case "bookmarks" :
case "outline" :
2019-04-13 13:02:01 +00:00
view = _pdf _sidebar . SidebarView . OUTLINE ;
break ;
2021-03-25 17:57:40 +00:00
case "attachments" :
2019-04-13 13:02:01 +00:00
view = _pdf _sidebar . SidebarView . ATTACHMENTS ;
break ;
2021-03-25 17:57:40 +00:00
case "layers" :
view = _pdf _sidebar . SidebarView . LAYERS ;
break ;
case "none" :
2019-04-13 13:02:01 +00:00
view = _pdf _sidebar . SidebarView . NONE ;
break ;
default :
console . error ( 'Invalid "pagemode" hash parameter: ' + mode ) ;
return ;
}
PDFViewerApplication . pdfSidebar . switchView ( view , true ) ;
}
function webViewerNamedAction ( evt ) {
2021-03-25 17:57:40 +00:00
switch ( evt . action ) {
case "GoToPage" :
2019-04-13 13:02:01 +00:00
PDFViewerApplication . appConfig . toolbar . pageNumber . select ( ) ;
break ;
2021-03-25 17:57:40 +00:00
case "Find" :
2019-04-13 13:02:01 +00:00
if ( ! PDFViewerApplication . supportsIntegratedFind ) {
PDFViewerApplication . findBar . toggle ( ) ;
}
break ;
2021-03-25 17:57:40 +00:00
case "Print" :
if ( PDFViewerApplication . supportsPrinting ) {
webViewerPrint ( ) ;
}
break ;
case "SaveAs" :
webViewerSave ( ) ;
break ;
2019-04-13 13:02:01 +00:00
}
}
2021-03-25 17:57:40 +00:00
function webViewerPresentationModeChanged ( {
active ,
switchInProgress
} ) {
let state = _ui _utils . PresentationModeState . NORMAL ;
if ( switchInProgress ) {
state = _ui _utils . PresentationModeState . CHANGING ;
} else if ( active ) {
state = _ui _utils . PresentationModeState . FULLSCREEN ;
}
PDFViewerApplication . pdfViewer . presentationModeState = state ;
2019-04-13 13:02:01 +00:00
}
function webViewerSidebarViewChanged ( evt ) {
PDFViewerApplication . pdfRenderingQueue . isThumbnailViewEnabled = PDFViewerApplication . pdfSidebar . isThumbnailViewVisible ;
2021-03-25 17:57:40 +00:00
const store = PDFViewerApplication . store ;
2019-04-13 13:02:01 +00:00
if ( store && PDFViewerApplication . isInitialViewSet ) {
2021-03-25 17:57:40 +00:00
store . set ( "sidebarView" , evt . view ) . catch ( function ( ) { } ) ;
2019-04-13 13:02:01 +00:00
}
}
function webViewerUpdateViewarea ( evt ) {
2021-03-25 17:57:40 +00:00
const location = evt . location ,
store = PDFViewerApplication . store ;
2019-04-13 13:02:01 +00:00
if ( store && PDFViewerApplication . isInitialViewSet ) {
store . setMultiple ( {
2021-03-25 17:57:40 +00:00
page : location . pageNumber ,
zoom : location . scale ,
scrollLeft : location . left ,
scrollTop : location . top ,
rotation : location . rotation
} ) . catch ( function ( ) { } ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const href = PDFViewerApplication . pdfLinkService . getAnchorUrl ( location . pdfOpenParams ) ;
2019-04-13 13:02:01 +00:00
PDFViewerApplication . appConfig . toolbar . viewBookmark . href = href ;
PDFViewerApplication . appConfig . secondaryToolbar . viewBookmarkButton . href = href ;
2021-03-25 17:57:40 +00:00
const currentPage = PDFViewerApplication . pdfViewer . getPageView ( PDFViewerApplication . page - 1 ) ;
const loading = currentPage . renderingState !== _pdf _rendering _queue . RenderingStates . FINISHED ;
2019-04-13 13:02:01 +00:00
PDFViewerApplication . toolbar . updateLoadingIndicatorState ( loading ) ;
}
function webViewerScrollModeChanged ( evt ) {
2021-03-25 17:57:40 +00:00
const store = PDFViewerApplication . store ;
2019-04-13 13:02:01 +00:00
if ( store && PDFViewerApplication . isInitialViewSet ) {
2021-03-25 17:57:40 +00:00
store . set ( "scrollMode" , evt . mode ) . catch ( function ( ) { } ) ;
2019-04-13 13:02:01 +00:00
}
}
function webViewerSpreadModeChanged ( evt ) {
2021-03-25 17:57:40 +00:00
const store = PDFViewerApplication . store ;
2019-04-13 13:02:01 +00:00
if ( store && PDFViewerApplication . isInitialViewSet ) {
2021-03-25 17:57:40 +00:00
store . set ( "spreadMode" , evt . mode ) . catch ( function ( ) { } ) ;
2019-04-13 13:02:01 +00:00
}
}
function webViewerResize ( ) {
2021-03-25 17:57:40 +00:00
const {
pdfDocument ,
pdfViewer
} = PDFViewerApplication ;
2019-04-13 13:02:01 +00:00
if ( ! pdfDocument ) {
return ;
}
2021-03-25 17:57:40 +00:00
const currentScaleValue = pdfViewer . currentScaleValue ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( currentScaleValue === "auto" || currentScaleValue === "page-fit" || currentScaleValue === "page-width" ) {
2019-04-13 13:02:01 +00:00
pdfViewer . currentScaleValue = currentScaleValue ;
}
pdfViewer . update ( ) ;
}
function webViewerHashchange ( evt ) {
2021-03-25 17:57:40 +00:00
const hash = evt . hash ;
2019-04-13 13:02:01 +00:00
if ( ! hash ) {
return ;
}
if ( ! PDFViewerApplication . isInitialViewSet ) {
PDFViewerApplication . initialBookmark = hash ;
} else if ( ! PDFViewerApplication . pdfHistory . popStateInProgress ) {
PDFViewerApplication . pdfLinkService . setHash ( hash ) ;
}
}
2021-03-25 17:57:40 +00:00
let webViewerFileInputChange , webViewerOpenFile ;
2019-04-13 13:02:01 +00:00
{
2021-03-25 17:57:40 +00:00
webViewerFileInputChange = function ( evt ) {
2019-04-13 13:02:01 +00:00
if ( PDFViewerApplication . pdfViewer && PDFViewerApplication . pdfViewer . isInPresentationMode ) {
return ;
}
2021-03-25 17:57:40 +00:00
const file = evt . fileInput . files [ 0 ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! _viewer _compatibility . viewerCompatibilityParams . disableCreateObjectURL ) {
let url = URL . createObjectURL ( file ) ;
2019-04-13 13:02:01 +00:00
if ( file . name ) {
url = {
2021-03-25 17:57:40 +00:00
url ,
2019-04-13 13:02:01 +00:00
originalUrl : file . name
} ;
}
PDFViewerApplication . open ( url ) ;
} else {
PDFViewerApplication . setTitleUsingUrl ( file . name ) ;
2021-03-25 17:57:40 +00:00
const fileReader = new FileReader ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
fileReader . onload = function webViewerChangeFileReaderOnload ( event ) {
const buffer = event . target . result ;
2019-04-13 13:02:01 +00:00
PDFViewerApplication . open ( new Uint8Array ( buffer ) ) ;
} ;
fileReader . readAsArrayBuffer ( file ) ;
}
2021-03-25 17:57:40 +00:00
const appConfig = PDFViewerApplication . appConfig ;
appConfig . toolbar . viewBookmark . setAttribute ( "hidden" , "true" ) ;
appConfig . secondaryToolbar . viewBookmarkButton . setAttribute ( "hidden" , "true" ) ;
appConfig . toolbar . download . setAttribute ( "hidden" , "true" ) ;
appConfig . secondaryToolbar . downloadButton . setAttribute ( "hidden" , "true" ) ;
} ;
webViewerOpenFile = function ( evt ) {
const openFileInputName = PDFViewerApplication . appConfig . openFileInputName ;
document . getElementById ( openFileInputName ) . click ( ) ;
2019-04-13 13:02:01 +00:00
} ;
}
function webViewerPresentationMode ( ) {
PDFViewerApplication . requestPresentationMode ( ) ;
}
function webViewerPrint ( ) {
window . print ( ) ;
}
2021-03-25 17:57:40 +00:00
function webViewerDownloadOrSave ( sourceEventType ) {
if ( PDFViewerApplication . pdfDocument && PDFViewerApplication . pdfDocument . annotationStorage . size > 0 ) {
PDFViewerApplication . save ( {
sourceEventType
} ) ;
} else {
PDFViewerApplication . download ( {
sourceEventType
} ) ;
}
}
function webViewerDownload ( ) {
webViewerDownloadOrSave ( "download" ) ;
}
function webViewerSave ( ) {
webViewerDownloadOrSave ( "save" ) ;
2019-04-13 13:02:01 +00:00
}
function webViewerFirstPage ( ) {
if ( PDFViewerApplication . pdfDocument ) {
PDFViewerApplication . page = 1 ;
}
}
function webViewerLastPage ( ) {
if ( PDFViewerApplication . pdfDocument ) {
PDFViewerApplication . page = PDFViewerApplication . pagesCount ;
}
}
function webViewerNextPage ( ) {
PDFViewerApplication . page ++ ;
}
function webViewerPreviousPage ( ) {
PDFViewerApplication . page -- ;
}
function webViewerZoomIn ( ) {
PDFViewerApplication . zoomIn ( ) ;
}
function webViewerZoomOut ( ) {
PDFViewerApplication . zoomOut ( ) ;
}
2021-03-25 17:57:40 +00:00
function webViewerZoomReset ( ) {
PDFViewerApplication . zoomReset ( ) ;
2020-02-09 16:02:47 +00:00
}
2019-04-13 13:02:01 +00:00
function webViewerPageNumberChanged ( evt ) {
2021-03-25 17:57:40 +00:00
const pdfViewer = PDFViewerApplication . pdfViewer ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( evt . value !== "" ) {
2019-04-13 13:02:01 +00:00
pdfViewer . currentPageLabel = evt . value ;
}
if ( evt . value !== pdfViewer . currentPageNumber . toString ( ) && evt . value !== pdfViewer . currentPageLabel ) {
PDFViewerApplication . toolbar . setPageNumber ( pdfViewer . currentPageNumber , pdfViewer . currentPageLabel ) ;
}
}
function webViewerScaleChanged ( evt ) {
PDFViewerApplication . pdfViewer . currentScaleValue = evt . value ;
}
function webViewerRotateCw ( ) {
PDFViewerApplication . rotatePages ( 90 ) ;
}
function webViewerRotateCcw ( ) {
PDFViewerApplication . rotatePages ( - 90 ) ;
}
2021-03-25 17:57:40 +00:00
function webViewerOptionalContentConfig ( evt ) {
PDFViewerApplication . pdfViewer . optionalContentConfigPromise = evt . promise ;
}
2019-04-13 13:02:01 +00:00
function webViewerSwitchScrollMode ( evt ) {
PDFViewerApplication . pdfViewer . scrollMode = evt . mode ;
}
function webViewerSwitchSpreadMode ( evt ) {
PDFViewerApplication . pdfViewer . spreadMode = evt . mode ;
}
function webViewerDocumentProperties ( ) {
PDFViewerApplication . pdfDocumentProperties . open ( ) ;
}
function webViewerFind ( evt ) {
2021-03-25 17:57:40 +00:00
PDFViewerApplication . findController . executeCommand ( "find" + evt . type , {
2019-04-13 13:02:01 +00:00
query : evt . query ,
phraseSearch : evt . phraseSearch ,
caseSensitive : evt . caseSensitive ,
entireWord : evt . entireWord ,
highlightAll : evt . highlightAll ,
findPrevious : evt . findPrevious
} ) ;
}
function webViewerFindFromUrlHash ( evt ) {
2021-03-25 17:57:40 +00:00
PDFViewerApplication . findController . executeCommand ( "find" , {
2019-04-13 13:02:01 +00:00
query : evt . query ,
phraseSearch : evt . phraseSearch ,
caseSensitive : false ,
entireWord : false ,
highlightAll : true ,
findPrevious : false
} ) ;
}
2021-03-25 17:57:40 +00:00
function webViewerUpdateFindMatchesCount ( {
matchesCount
} ) {
2019-04-13 13:02:01 +00:00
if ( PDFViewerApplication . supportsIntegratedFind ) {
PDFViewerApplication . externalServices . updateFindMatchesCount ( matchesCount ) ;
} else {
PDFViewerApplication . findBar . updateResultsCount ( matchesCount ) ;
}
}
2021-03-25 17:57:40 +00:00
function webViewerUpdateFindControlState ( {
state ,
previous ,
matchesCount ,
rawQuery
} ) {
2019-04-13 13:02:01 +00:00
if ( PDFViewerApplication . supportsIntegratedFind ) {
PDFViewerApplication . externalServices . updateFindControlState ( {
result : state ,
findPrevious : previous ,
2021-03-25 17:57:40 +00:00
matchesCount ,
rawQuery
2019-04-13 13:02:01 +00:00
} ) ;
} else {
PDFViewerApplication . findBar . updateUIState ( state , previous , matchesCount ) ;
}
}
function webViewerScaleChanging ( evt ) {
PDFViewerApplication . toolbar . setPageScale ( evt . presetValue , evt . scale ) ;
PDFViewerApplication . pdfViewer . update ( ) ;
}
function webViewerRotationChanging ( evt ) {
PDFViewerApplication . pdfThumbnailViewer . pagesRotation = evt . pagesRotation ;
PDFViewerApplication . forceRendering ( ) ;
PDFViewerApplication . pdfViewer . currentPageNumber = evt . pageNumber ;
}
function webViewerPageChanging ( evt ) {
2021-03-25 17:57:40 +00:00
const page = evt . pageNumber ;
2019-04-13 13:02:01 +00:00
PDFViewerApplication . toolbar . setPageNumber ( page , evt . pageLabel || null ) ;
PDFViewerApplication . secondaryToolbar . setPageNumber ( page ) ;
if ( PDFViewerApplication . pdfSidebar . isThumbnailViewVisible ) {
PDFViewerApplication . pdfThumbnailViewer . scrollThumbnailIntoView ( page ) ;
}
2021-03-25 17:57:40 +00:00
if ( typeof Stats !== "undefined" && Stats . enabled ) {
const pageView = PDFViewerApplication . pdfViewer . getPageView ( page - 1 ) ;
2019-04-13 13:02:01 +00:00
if ( pageView && pageView . stats ) {
Stats . add ( page , pageView . stats ) ;
}
}
}
function webViewerVisibilityChange ( evt ) {
2021-03-25 17:57:40 +00:00
if ( document . visibilityState === "visible" ) {
2019-04-13 13:02:01 +00:00
setZoomDisabledTimeout ( ) ;
}
}
2021-03-25 17:57:40 +00:00
let zoomDisabledTimeout = null ;
2019-04-13 13:02:01 +00:00
function setZoomDisabledTimeout ( ) {
if ( zoomDisabledTimeout ) {
clearTimeout ( zoomDisabledTimeout ) ;
}
zoomDisabledTimeout = setTimeout ( function ( ) {
zoomDisabledTimeout = null ;
} , WHEEL _ZOOM _DISABLED _TIMEOUT ) ;
}
function webViewerWheel ( evt ) {
2021-03-25 17:57:40 +00:00
const {
pdfViewer ,
supportedMouseWheelZoomModifierKeys
} = PDFViewerApplication ;
2019-04-13 13:02:01 +00:00
if ( pdfViewer . isInPresentationMode ) {
return ;
}
2021-03-25 17:57:40 +00:00
if ( evt . ctrlKey && supportedMouseWheelZoomModifierKeys . ctrlKey || evt . metaKey && supportedMouseWheelZoomModifierKeys . metaKey ) {
evt . preventDefault ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( zoomDisabledTimeout || document . visibilityState === "hidden" ) {
2019-04-13 13:02:01 +00:00
return ;
}
2021-03-25 17:57:40 +00:00
const previousScale = pdfViewer . currentScale ;
const delta = ( 0 , _ui _utils . normalizeWheelEventDirection ) ( evt ) ;
let ticks = 0 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( evt . deltaMode === WheelEvent . DOM _DELTA _LINE || evt . deltaMode === WheelEvent . DOM _DELTA _PAGE ) {
if ( Math . abs ( delta ) >= 1 ) {
ticks = Math . sign ( delta ) ;
} else {
ticks = PDFViewerApplication . accumulateWheelTicks ( delta ) ;
}
} else {
const PIXELS _PER _LINE _SCALE = 30 ;
ticks = PDFViewerApplication . accumulateWheelTicks ( delta / PIXELS _PER _LINE _SCALE ) ;
2019-04-13 13:02:01 +00:00
}
if ( ticks < 0 ) {
PDFViewerApplication . zoomOut ( - ticks ) ;
2021-03-25 17:57:40 +00:00
} else if ( ticks > 0 ) {
2019-04-13 13:02:01 +00:00
PDFViewerApplication . zoomIn ( ticks ) ;
}
2021-03-25 17:57:40 +00:00
const currentScale = pdfViewer . currentScale ;
2019-04-13 13:02:01 +00:00
if ( previousScale !== currentScale ) {
2021-03-25 17:57:40 +00:00
const scaleCorrectionFactor = currentScale / previousScale - 1 ;
const rect = pdfViewer . container . getBoundingClientRect ( ) ;
const dx = evt . clientX - rect . left ;
const dy = evt . clientY - rect . top ;
2019-04-13 13:02:01 +00:00
pdfViewer . container . scrollLeft += dx * scaleCorrectionFactor ;
pdfViewer . container . scrollTop += dy * scaleCorrectionFactor ;
}
} else {
setZoomDisabledTimeout ( ) ;
}
}
2021-03-25 17:57:40 +00:00
function webViewerTouchStart ( evt ) {
if ( evt . touches . length > 1 ) {
evt . preventDefault ( ) ;
}
}
2019-04-13 13:02:01 +00:00
function webViewerClick ( evt ) {
2021-03-25 17:57:40 +00:00
if ( PDFViewerApplication . triggerDelayedFallback && PDFViewerApplication . pdfViewer . containsElement ( evt . target ) ) {
PDFViewerApplication . triggerDelayedFallback ( ) ;
}
2019-04-13 13:02:01 +00:00
if ( ! PDFViewerApplication . secondaryToolbar . isOpen ) {
return ;
}
2021-03-25 17:57:40 +00:00
const appConfig = PDFViewerApplication . appConfig ;
2019-04-13 13:02:01 +00:00
if ( PDFViewerApplication . pdfViewer . containsElement ( evt . target ) || appConfig . toolbar . container . contains ( evt . target ) && evt . target !== appConfig . secondaryToolbar . toggleButton ) {
PDFViewerApplication . secondaryToolbar . close ( ) ;
}
}
2021-03-25 17:57:40 +00:00
function webViewerKeyUp ( evt ) {
if ( evt . keyCode === 9 ) {
if ( PDFViewerApplication . triggerDelayedFallback ) {
PDFViewerApplication . triggerDelayedFallback ( ) ;
}
}
}
2019-04-13 13:02:01 +00:00
function webViewerKeyDown ( evt ) {
if ( PDFViewerApplication . overlayManager . active ) {
return ;
}
2021-03-25 17:57:40 +00:00
let handled = false ,
2019-04-13 13:02:01 +00:00
ensureViewerFocused = false ;
2021-03-25 17:57:40 +00:00
const cmd = ( evt . ctrlKey ? 1 : 0 ) | ( evt . altKey ? 2 : 0 ) | ( evt . shiftKey ? 4 : 0 ) | ( evt . metaKey ? 8 : 0 ) ;
const pdfViewer = PDFViewerApplication . pdfViewer ;
const isViewerInPresentationMode = pdfViewer && pdfViewer . isInPresentationMode ;
2019-04-13 13:02:01 +00:00
if ( cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12 ) {
switch ( evt . keyCode ) {
case 70 :
if ( ! PDFViewerApplication . supportsIntegratedFind ) {
PDFViewerApplication . findBar . open ( ) ;
handled = true ;
}
break ;
case 71 :
if ( ! PDFViewerApplication . supportsIntegratedFind ) {
2021-03-25 17:57:40 +00:00
const findState = PDFViewerApplication . findController . state ;
2019-04-13 13:02:01 +00:00
if ( findState ) {
2021-03-25 17:57:40 +00:00
PDFViewerApplication . findController . executeCommand ( "findagain" , {
2019-04-13 13:02:01 +00:00
query : findState . query ,
phraseSearch : findState . phraseSearch ,
caseSensitive : findState . caseSensitive ,
entireWord : findState . entireWord ,
highlightAll : findState . highlightAll ,
findPrevious : cmd === 5 || cmd === 12
} ) ;
}
handled = true ;
}
break ;
case 61 :
case 107 :
case 187 :
case 171 :
if ( ! isViewerInPresentationMode ) {
PDFViewerApplication . zoomIn ( ) ;
}
handled = true ;
break ;
case 173 :
case 109 :
case 189 :
if ( ! isViewerInPresentationMode ) {
PDFViewerApplication . zoomOut ( ) ;
}
handled = true ;
break ;
case 48 :
case 96 :
if ( ! isViewerInPresentationMode ) {
setTimeout ( function ( ) {
2020-02-09 16:02:47 +00:00
PDFViewerApplication . zoomReset ( ) ;
2019-04-13 13:02:01 +00:00
} ) ;
handled = false ;
}
break ;
case 38 :
if ( isViewerInPresentationMode || PDFViewerApplication . page > 1 ) {
PDFViewerApplication . page = 1 ;
handled = true ;
ensureViewerFocused = true ;
}
break ;
case 40 :
if ( isViewerInPresentationMode || PDFViewerApplication . page < PDFViewerApplication . pagesCount ) {
PDFViewerApplication . page = PDFViewerApplication . pagesCount ;
handled = true ;
ensureViewerFocused = true ;
}
break ;
}
}
2021-03-25 17:57:40 +00:00
const {
eventBus
} = PDFViewerApplication ;
2019-04-13 13:02:01 +00:00
if ( cmd === 1 || cmd === 8 ) {
switch ( evt . keyCode ) {
case 83 :
2021-03-25 17:57:40 +00:00
eventBus . dispatch ( "download" , {
source : window
} ) ;
2019-04-13 13:02:01 +00:00
handled = true ;
break ;
2021-03-25 17:57:40 +00:00
case 79 :
{
eventBus . dispatch ( "openfile" , {
source : window
} ) ;
handled = true ;
}
break ;
2019-04-13 13:02:01 +00:00
}
}
if ( cmd === 3 || cmd === 10 ) {
switch ( evt . keyCode ) {
case 80 :
PDFViewerApplication . requestPresentationMode ( ) ;
handled = true ;
break ;
case 71 :
PDFViewerApplication . appConfig . toolbar . pageNumber . select ( ) ;
handled = true ;
break ;
}
}
if ( handled ) {
if ( ensureViewerFocused && ! isViewerInPresentationMode ) {
pdfViewer . focus ( ) ;
}
evt . preventDefault ( ) ;
return ;
}
2021-03-25 17:57:40 +00:00
const curElement = document . activeElement || document . querySelector ( ":focus" ) ;
const curElementTagName = curElement && curElement . tagName . toUpperCase ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( curElementTagName === "INPUT" || curElementTagName === "TEXTAREA" || curElementTagName === "SELECT" || curElement && curElement . isContentEditable ) {
2019-04-13 13:02:01 +00:00
if ( evt . keyCode !== 27 ) {
return ;
}
}
if ( cmd === 0 ) {
2021-03-25 17:57:40 +00:00
let turnPage = 0 ,
2019-04-13 13:02:01 +00:00
turnOnlyIfPageFit = false ;
switch ( evt . keyCode ) {
case 38 :
case 33 :
if ( pdfViewer . isVerticalScrollbarEnabled ) {
turnOnlyIfPageFit = true ;
}
turnPage = - 1 ;
break ;
case 8 :
if ( ! isViewerInPresentationMode ) {
turnOnlyIfPageFit = true ;
}
turnPage = - 1 ;
break ;
case 37 :
if ( pdfViewer . isHorizontalScrollbarEnabled ) {
turnOnlyIfPageFit = true ;
}
case 75 :
case 80 :
turnPage = - 1 ;
break ;
case 27 :
if ( PDFViewerApplication . secondaryToolbar . isOpen ) {
PDFViewerApplication . secondaryToolbar . close ( ) ;
handled = true ;
}
if ( ! PDFViewerApplication . supportsIntegratedFind && PDFViewerApplication . findBar . opened ) {
PDFViewerApplication . findBar . close ( ) ;
handled = true ;
}
break ;
case 40 :
case 34 :
if ( pdfViewer . isVerticalScrollbarEnabled ) {
turnOnlyIfPageFit = true ;
}
turnPage = 1 ;
break ;
case 13 :
case 32 :
if ( ! isViewerInPresentationMode ) {
turnOnlyIfPageFit = true ;
}
turnPage = 1 ;
break ;
case 39 :
if ( pdfViewer . isHorizontalScrollbarEnabled ) {
turnOnlyIfPageFit = true ;
}
case 74 :
case 78 :
turnPage = 1 ;
break ;
case 36 :
if ( isViewerInPresentationMode || PDFViewerApplication . page > 1 ) {
PDFViewerApplication . page = 1 ;
handled = true ;
ensureViewerFocused = true ;
}
break ;
case 35 :
if ( isViewerInPresentationMode || PDFViewerApplication . page < PDFViewerApplication . pagesCount ) {
PDFViewerApplication . page = PDFViewerApplication . pagesCount ;
handled = true ;
ensureViewerFocused = true ;
}
break ;
case 83 :
PDFViewerApplication . pdfCursorTools . switchTool ( _pdf _cursor _tools . CursorTool . SELECT ) ;
break ;
case 72 :
PDFViewerApplication . pdfCursorTools . switchTool ( _pdf _cursor _tools . CursorTool . HAND ) ;
break ;
case 82 :
PDFViewerApplication . rotatePages ( 90 ) ;
break ;
case 115 :
PDFViewerApplication . pdfSidebar . toggle ( ) ;
break ;
}
2021-03-25 17:57:40 +00:00
if ( turnPage !== 0 && ( ! turnOnlyIfPageFit || pdfViewer . currentScaleValue === "page-fit" ) ) {
2019-04-13 13:02:01 +00:00
if ( turnPage > 0 ) {
if ( PDFViewerApplication . page < PDFViewerApplication . pagesCount ) {
PDFViewerApplication . page ++ ;
}
} else {
if ( PDFViewerApplication . page > 1 ) {
PDFViewerApplication . page -- ;
}
}
handled = true ;
}
}
if ( cmd === 4 ) {
switch ( evt . keyCode ) {
case 13 :
case 32 :
2021-03-25 17:57:40 +00:00
if ( ! isViewerInPresentationMode && pdfViewer . currentScaleValue !== "page-fit" ) {
2019-04-13 13:02:01 +00:00
break ;
}
if ( PDFViewerApplication . page > 1 ) {
PDFViewerApplication . page -- ;
}
handled = true ;
break ;
case 82 :
PDFViewerApplication . rotatePages ( - 90 ) ;
break ;
}
}
if ( ! handled && ! isViewerInPresentationMode ) {
2021-03-25 17:57:40 +00:00
if ( evt . keyCode >= 33 && evt . keyCode <= 40 || evt . keyCode === 32 && curElementTagName !== "BUTTON" ) {
2019-04-13 13:02:01 +00:00
ensureViewerFocused = true ;
}
}
if ( ensureViewerFocused && ! pdfViewer . containsElement ( curElement ) ) {
pdfViewer . focus ( ) ;
}
if ( handled ) {
evt . preventDefault ( ) ;
}
}
2021-03-25 17:57:40 +00:00
function beforeUnload ( evt ) {
evt . preventDefault ( ) ;
evt . returnValue = "" ;
return false ;
}
2020-02-09 16:02:47 +00:00
function apiPageLayoutToSpreadMode ( layout ) {
switch ( layout ) {
2021-03-25 17:57:40 +00:00
case "SinglePage" :
case "OneColumn" :
2020-02-09 16:02:47 +00:00
return _ui _utils . SpreadMode . NONE ;
2021-03-25 17:57:40 +00:00
case "TwoColumnLeft" :
case "TwoPageLeft" :
2020-02-09 16:02:47 +00:00
return _ui _utils . SpreadMode . ODD ;
2021-03-25 17:57:40 +00:00
case "TwoColumnRight" :
case "TwoPageRight" :
2020-02-09 16:02:47 +00:00
return _ui _utils . SpreadMode . EVEN ;
}
return _ui _utils . SpreadMode . NONE ;
}
2019-04-13 13:02:01 +00:00
function apiPageModeToSidebarView ( mode ) {
switch ( mode ) {
2021-03-25 17:57:40 +00:00
case "UseNone" :
2019-04-13 13:02:01 +00:00
return _pdf _sidebar . SidebarView . NONE ;
2021-03-25 17:57:40 +00:00
case "UseThumbs" :
2019-04-13 13:02:01 +00:00
return _pdf _sidebar . SidebarView . THUMBS ;
2021-03-25 17:57:40 +00:00
case "UseOutlines" :
2019-04-13 13:02:01 +00:00
return _pdf _sidebar . SidebarView . OUTLINE ;
2021-03-25 17:57:40 +00:00
case "UseAttachments" :
2019-04-13 13:02:01 +00:00
return _pdf _sidebar . SidebarView . ATTACHMENTS ;
2021-03-25 17:57:40 +00:00
case "UseOC" :
return _pdf _sidebar . SidebarView . LAYERS ;
2019-04-13 13:02:01 +00:00
}
return _pdf _sidebar . SidebarView . NONE ;
}
2021-03-25 17:57:40 +00:00
const PDFPrintServiceFactory = {
2019-04-13 13:02:01 +00:00
instance : {
supportsPrinting : false ,
2021-03-25 17:57:40 +00:00
createPrintService ( ) {
throw new Error ( "Not implemented: createPrintService" ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
2019-04-13 13:02:01 +00:00
}
} ;
exports . PDFPrintServiceFactory = PDFPrintServiceFactory ;
/***/ } ) ,
/* 2 */
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
2021-03-25 17:57:40 +00:00
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . isValidRotation = isValidRotation ;
exports . isValidScrollMode = isValidScrollMode ;
exports . isValidSpreadMode = isValidSpreadMode ;
exports . isPortraitOrientation = isPortraitOrientation ;
exports . clamp = clamp ;
exports . getPDFFileNameFromURL = getPDFFileNameFromURL ;
exports . noContextMenuHandler = noContextMenuHandler ;
exports . parseQueryString = parseQueryString ;
exports . backtrackBeforeAllVisibleElements = backtrackBeforeAllVisibleElements ;
exports . getVisibleElements = getVisibleElements ;
exports . roundToDivide = roundToDivide ;
exports . getPageSizeInches = getPageSizeInches ;
exports . approximateFraction = approximateFraction ;
exports . getOutputScale = getOutputScale ;
exports . scrollIntoView = scrollIntoView ;
exports . watchScroll = watchScroll ;
exports . binarySearchFirstItem = binarySearchFirstItem ;
exports . normalizeWheelEventDirection = normalizeWheelEventDirection ;
exports . normalizeWheelEventDelta = normalizeWheelEventDelta ;
exports . waitOnEventOrTimeout = waitOnEventOrTimeout ;
exports . moveToEndOfArray = moveToEndOfArray ;
exports . WaitOnType = exports . animationStarted = exports . ProgressBar = exports . EventBus = exports . NullL10n = exports . SpreadMode = exports . ScrollMode = exports . TextLayerMode = exports . RendererType = exports . PresentationModeState = exports . VERTICAL _PADDING = exports . SCROLLBAR _PADDING = exports . MAX _AUTO _SCALE = exports . UNKNOWN _SCALE = exports . MAX _SCALE = exports . MIN _SCALE = exports . DEFAULT _SCALE = exports . DEFAULT _SCALE _VALUE = exports . CSS _UNITS = exports . AutoPrintRegExp = 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 PresentationModeState = {
UNKNOWN : 0 ,
NORMAL : 1 ,
CHANGING : 2 ,
FULLSCREEN : 3
} ;
exports . PresentationModeState = PresentationModeState ;
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 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
function formatL10nValue ( text , args ) {
if ( ! args ) {
return text ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return text . replace ( /\{\{\s*(\w+)\s*\}\}/g , ( all , name ) => {
return name in args ? args [ name ] : "{{" + name + "}}" ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const NullL10n = {
async getLanguage ( ) {
return "en-us" ;
} ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async getDirection ( ) {
return "ltr" ;
} ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async get ( property , args , fallback ) {
return formatL10nValue ( fallback , args ) ;
} ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async translate ( element ) { }
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
} ;
exports . NullL10n = NullL10n ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
function getOutputScale ( ctx ) {
const devicePixelRatio = window . devicePixelRatio || 1 ;
const backingStoreRatio = ctx . webkitBackingStorePixelRatio || ctx . mozBackingStorePixelRatio || ctx . msBackingStorePixelRatio || ctx . oBackingStorePixelRatio || ctx . backingStorePixelRatio || 1 ;
const pixelRatio = devicePixelRatio / backingStoreRatio ;
return {
sx : pixelRatio ,
sy : pixelRatio ,
scaled : pixelRatio !== 1
2019-04-13 13:02:01 +00:00
} ;
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
function scrollIntoView ( element , spot , skipOverflowHiddenElements = false ) {
let parent = element . offsetParent ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! parent ) {
console . error ( "offsetParent is not set -- cannot scroll" ) ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
let offsetY = element . offsetTop + element . clientTop ;
let offsetX = element . offsetLeft + element . clientLeft ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
offsetY += parent . offsetTop ;
offsetX += parent . offsetLeft ;
parent = parent . offsetParent ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! parent ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( spot ) {
if ( spot . top !== undefined ) {
offsetY += spot . top ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( spot . left !== undefined ) {
offsetX += spot . left ;
parent . scrollLeft = offsetX ;
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
parent . scrollTop = offsetY ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
function watchScroll ( viewAreaElement , callback ) {
const debounceScroll = function ( evt ) {
if ( rAF ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
rAF = window . requestAnimationFrame ( function viewAreaElementScrolled ( ) {
rAF = null ;
const currentX = viewAreaElement . scrollLeft ;
const lastX = state . lastX ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( currentX !== lastX ) {
state . right = currentX > lastX ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
state . lastX = currentX ;
const currentY = viewAreaElement . scrollTop ;
const lastY = state . lastY ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( currentY !== lastY ) {
state . down = currentY > lastY ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
state . lastY = currentY ;
callback ( state ) ;
} ) ;
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const state = {
right : true ,
down : true ,
lastX : viewAreaElement . scrollLeft ,
lastY : viewAreaElement . scrollTop ,
_eventHandler : debounceScroll
} ;
let rAF = null ;
viewAreaElement . addEventListener ( "scroll" , debounceScroll , true ) ;
return state ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
function parseQueryString ( query ) {
const parts = query . split ( "&" ) ;
const params = Object . create ( null ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return params ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
function binarySearchFirstItem ( items , condition ) {
let minIndex = 0 ;
let maxIndex = items . length - 1 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( maxIndex < 0 || ! condition ( items [ maxIndex ] ) ) {
return items . length ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( condition ( items [ minIndex ] ) ) {
return minIndex ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
while ( minIndex < maxIndex ) {
const currentIndex = minIndex + maxIndex >> 1 ;
const currentItem = items [ currentIndex ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( condition ( currentItem ) ) {
maxIndex = currentIndex ;
} else {
minIndex = currentIndex + 1 ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return minIndex ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
function approximateFraction ( x ) {
if ( Math . floor ( x ) === x ) {
return [ x , 1 ] ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const xinv = 1 / x ;
const limit = 8 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( xinv > limit ) {
return [ 1 , limit ] ;
} else if ( Math . floor ( xinv ) === xinv ) {
return [ 1 , xinv ] ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const x _ = x > 1 ? xinv : x ;
let a = 0 ,
b = 1 ,
c = 1 ,
d = 1 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
while ( true ) {
const p = a + c ,
q = b + d ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( q > limit ) {
break ;
2019-04-13 13:02:01 +00:00
}
if ( x _ <= p / q ) {
c = p ;
d = q ;
} else {
a = p ;
b = q ;
}
}
2021-03-25 17:57:40 +00:00
let result ;
2019-04-13 13:02:01 +00:00
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 ) {
2021-03-25 17:57:40 +00:00
const r = x % div ;
2019-04-13 13:02:01 +00:00
return r === 0 ? x : Math . round ( x - r + div ) ;
}
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
return {
width : changeOrientation ? height : width ,
height : changeOrientation ? width : height
} ;
}
function backtrackBeforeAllVisibleElements ( index , views , top ) {
if ( index < 2 ) {
return index ;
}
2021-03-25 17:57:40 +00:00
let elt = views [ index ] . div ;
let pageTop = elt . offsetTop + elt . clientTop ;
2019-04-13 13:02:01 +00:00
if ( pageTop >= top ) {
elt = views [ index - 1 ] . div ;
pageTop = elt . offsetTop + elt . clientTop ;
}
2021-03-25 17:57:40 +00:00
for ( let i = index - 2 ; i >= 0 ; -- i ) {
2019-04-13 13:02:01 +00:00
elt = views [ i ] . div ;
if ( elt . offsetTop + elt . clientTop + elt . clientHeight <= pageTop ) {
break ;
}
index = i ;
}
return index ;
}
2021-03-25 17:57:40 +00:00
function getVisibleElements ( scrollEl , views , sortByVisibility = false , horizontal = false ) {
const top = scrollEl . scrollTop ,
bottom = top + scrollEl . clientHeight ;
const left = scrollEl . scrollLeft ,
right = left + scrollEl . clientWidth ;
2019-04-13 13:02:01 +00:00
function isElementBottomAfterViewTop ( view ) {
2021-03-25 17:57:40 +00:00
const element = view . div ;
const elementBottom = element . offsetTop + element . clientTop + element . clientHeight ;
2019-04-13 13:02:01 +00:00
return elementBottom > top ;
}
function isElementRightAfterViewLeft ( view ) {
2021-03-25 17:57:40 +00:00
const element = view . div ;
const elementRight = element . offsetLeft + element . clientLeft + element . clientWidth ;
2019-04-13 13:02:01 +00:00
return elementRight > left ;
}
2021-03-25 17:57:40 +00:00
const visible = [ ] ,
numViews = views . length ;
let firstVisibleElementInd = numViews === 0 ? 0 : binarySearchFirstItem ( views , horizontal ? isElementRightAfterViewLeft : isElementBottomAfterViewTop ) ;
2019-04-13 13:02:01 +00:00
if ( firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && ! horizontal ) {
firstVisibleElementInd = backtrackBeforeAllVisibleElements ( firstVisibleElementInd , views , top ) ;
}
2021-03-25 17:57:40 +00:00
let lastEdge = horizontal ? right : - 1 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
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 ;
}
2021-03-25 17:57:40 +00:00
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 percent = ( viewHeight - hiddenHeight ) * ( viewWidth - hiddenWidth ) * 100 / viewHeight / viewWidth | 0 ;
2019-04-13 13:02:01 +00:00
visible . push ( {
id : view . id ,
x : currentWidth ,
y : currentHeight ,
2021-03-25 17:57:40 +00:00
view ,
percent
2019-04-13 13:02:01 +00:00
} ) ;
}
2021-03-25 17:57:40 +00:00
const first = visible [ 0 ] ,
last = visible [ visible . length - 1 ] ;
2019-04-13 13:02:01 +00:00
if ( sortByVisibility ) {
visible . sort ( function ( a , b ) {
2021-03-25 17:57:40 +00:00
const pc = a . percent - b . percent ;
2019-04-13 13:02:01 +00:00
if ( Math . abs ( pc ) > 0.001 ) {
return - pc ;
}
return a . id - b . id ;
} ) ;
}
return {
2021-03-25 17:57:40 +00:00
first ,
last ,
2019-04-13 13:02:01 +00:00
views : visible
} ;
}
function noContextMenuHandler ( evt ) {
evt . preventDefault ( ) ;
}
function isDataSchema ( url ) {
2021-03-25 17:57:40 +00:00
let i = 0 ;
const ii = url . length ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
while ( i < ii && url [ i ] . trim ( ) === "" ) {
2019-04-13 13:02:01 +00:00
i ++ ;
}
2021-03-25 17:57:40 +00:00
return url . substring ( i , i + 5 ) . toLowerCase ( ) === "data:" ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
function getPDFFileNameFromURL ( url , defaultFilename = "document.pdf" ) {
if ( typeof url !== "string" ) {
2019-04-13 13:02:01 +00:00
return defaultFilename ;
}
if ( isDataSchema ( url ) ) {
2021-03-25 17:57:40 +00:00
console . warn ( "getPDFFileNameFromURL: " + 'ignoring "data:" URL for performance reasons.' ) ;
2019-04-13 13:02:01 +00:00
return defaultFilename ;
}
2021-03-25 17:57:40 +00:00
const reURI = /^(?:(?:[^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/ ;
const reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i ;
const splitURI = reURI . exec ( url ) ;
let suggestedFilename = reFilename . exec ( splitURI [ 1 ] ) || reFilename . exec ( splitURI [ 2 ] ) || reFilename . exec ( splitURI [ 3 ] ) ;
2019-04-13 13:02:01 +00:00
if ( suggestedFilename ) {
suggestedFilename = suggestedFilename [ 0 ] ;
2021-03-25 17:57:40 +00:00
if ( suggestedFilename . includes ( "%" ) ) {
2019-04-13 13:02:01 +00:00
try {
suggestedFilename = reFilename . exec ( decodeURIComponent ( suggestedFilename ) ) [ 0 ] ;
} catch ( ex ) { }
}
}
return suggestedFilename || defaultFilename ;
}
2021-03-25 17:57:40 +00:00
function normalizeWheelEventDirection ( evt ) {
let delta = Math . sqrt ( evt . deltaX * evt . deltaX + evt . deltaY * evt . deltaY ) ;
const angle = Math . atan2 ( evt . deltaY , evt . deltaX ) ;
2019-04-13 13:02:01 +00:00
if ( - 0.25 * Math . PI < angle && angle < 0.75 * Math . PI ) {
delta = - delta ;
}
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
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 ;
}
2021-03-25 17:57:40 +00:00
const WaitOnType = {
EVENT : "event" ,
TIMEOUT : "timeout"
2019-04-13 13:02:01 +00:00
} ;
exports . WaitOnType = WaitOnType ;
2021-03-25 17:57:40 +00:00
function waitOnEventOrTimeout ( {
target ,
name ,
delay = 0
} ) {
2019-04-13 13:02:01 +00:00
return new Promise ( function ( resolve , reject ) {
2021-03-25 17:57:40 +00:00
if ( typeof target !== "object" || ! ( name && typeof name === "string" ) || ! ( Number . isInteger ( delay ) && delay >= 0 ) ) {
throw new Error ( "waitOnEventOrTimeout - invalid parameters." ) ;
2019-04-13 13:02:01 +00:00
}
function handler ( type ) {
if ( target instanceof EventBus ) {
2021-03-25 17:57:40 +00:00
target . _off ( name , eventHandler ) ;
2019-04-13 13:02:01 +00:00
} else {
target . removeEventListener ( name , eventHandler ) ;
}
if ( timeout ) {
clearTimeout ( timeout ) ;
}
resolve ( type ) ;
}
2021-03-25 17:57:40 +00:00
const eventHandler = handler . bind ( null , WaitOnType . EVENT ) ;
2019-04-13 13:02:01 +00:00
if ( target instanceof EventBus ) {
2021-03-25 17:57:40 +00:00
target . _on ( name , eventHandler ) ;
2019-04-13 13:02:01 +00:00
} else {
target . addEventListener ( name , eventHandler ) ;
}
2021-03-25 17:57:40 +00:00
const timeoutHandler = handler . bind ( null , WaitOnType . TIMEOUT ) ;
const timeout = setTimeout ( timeoutHandler , delay ) ;
2019-04-13 13:02:01 +00:00
} ) ;
}
2021-03-25 17:57:40 +00:00
const animationStarted = new Promise ( function ( resolve ) {
2019-04-13 13:02:01 +00:00
window . requestAnimationFrame ( resolve ) ;
} ) ;
exports . animationStarted = animationStarted ;
2021-03-25 17:57:40 +00:00
function dispatchDOMEvent ( eventName , args = null ) {
throw new Error ( "Not implemented: dispatchDOMEvent" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class EventBus {
constructor ( options ) {
2019-04-13 13:02:01 +00:00
this . _listeners = Object . create ( null ) ;
}
2021-03-25 17:57:40 +00:00
on ( eventName , listener ) {
this . _on ( eventName , listener , {
external : true
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
off ( eventName , listener ) {
this . _off ( eventName , listener , {
external : true
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
dispatch ( eventName ) {
const eventListeners = this . _listeners [ eventName ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! eventListeners || eventListeners . length === 0 ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const args = Array . prototype . slice . call ( arguments , 1 ) ;
let externalListeners ;
eventListeners . slice ( 0 ) . forEach ( function ( {
listener ,
external
} ) {
if ( external ) {
if ( ! externalListeners ) {
externalListeners = [ ] ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
externalListeners . push ( listener ) ;
2019-04-13 13:02:01 +00:00
return ;
}
2021-03-25 17:57:40 +00:00
listener . apply ( null , args ) ;
} ) ;
if ( externalListeners ) {
externalListeners . forEach ( function ( listener ) {
2019-04-13 13:02:01 +00:00
listener . apply ( null , args ) ;
} ) ;
2021-03-25 17:57:40 +00:00
externalListeners = null ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_on ( eventName , listener , options = null ) {
let eventListeners = this . _listeners [ eventName ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! eventListeners ) {
this . _listeners [ eventName ] = eventListeners = [ ] ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
eventListeners . push ( {
listener ,
external : ( options && options . external ) === true
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_off ( eventName , listener , options = null ) {
const eventListeners = this . _listeners [ eventName ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! eventListeners ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let i = 0 , ii = eventListeners . length ; i < ii ; i ++ ) {
if ( eventListeners [ i ] . listener === listener ) {
eventListeners . splice ( i , 1 ) ;
return ;
}
}
2019-04-13 13:02:01 +00:00
}
}
2021-03-25 17:57:40 +00:00
exports . EventBus = EventBus ;
2019-04-13 13:02:01 +00:00
function clamp ( v , min , max ) {
return Math . min ( Math . max ( v , min ) , max ) ;
}
2021-03-25 17:57:40 +00:00
class ProgressBar {
constructor ( id , {
height ,
width ,
units
} = { } ) {
2019-04-13 13:02:01 +00:00
this . visible = true ;
2021-03-25 17:57:40 +00:00
this . div = document . querySelector ( id + " .progress" ) ;
2019-04-13 13:02:01 +00:00
this . bar = this . div . parentNode ;
this . height = height || 100 ;
this . width = width || 100 ;
2021-03-25 17:57:40 +00:00
this . units = units || "%" ;
2019-04-13 13:02:01 +00:00
this . div . style . height = this . height + this . units ;
this . percent = 0 ;
}
2021-03-25 17:57:40 +00:00
_updateBar ( ) {
if ( this . _indeterminate ) {
this . div . classList . add ( "indeterminate" ) ;
this . div . style . width = this . width + this . units ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . div . classList . remove ( "indeterminate" ) ;
const progressSize = this . width * this . _percent / 100 ;
this . div . style . width = progressSize + this . units ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const container = viewer . parentNode ;
const scrollbarWidth = container . offsetWidth - viewer . offsetWidth ;
if ( scrollbarWidth > 0 ) {
this . bar . style . width = ` calc(100% - ${ scrollbarWidth } px) ` ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
hide ( ) {
if ( ! this . visible ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . visible = false ;
this . bar . classList . add ( "hidden" ) ;
document . body . classList . remove ( "loadingInProgress" ) ;
}
show ( ) {
if ( this . visible ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . visible = true ;
document . body . classList . add ( "loadingInProgress" ) ;
this . bar . classList . remove ( "hidden" ) ;
}
}
2019-04-13 13:02:01 +00:00
exports . ProgressBar = ProgressBar ;
function moveToEndOfArray ( arr , condition ) {
2021-03-25 17:57:40 +00:00
const moved = [ ] ,
len = arr . length ;
let write = 0 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let read = 0 ; read < len ; ++ read ) {
2019-04-13 13:02:01 +00:00
if ( condition ( arr [ read ] ) ) {
moved . push ( arr [ read ] ) ;
} else {
arr [ write ] = arr [ read ] ;
++ write ;
}
}
2021-03-25 17:57:40 +00:00
for ( let read = 0 ; write < len ; ++ read , ++ write ) {
arr [ write ] = moved [ read ] ;
2019-04-13 13:02:01 +00:00
}
}
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 3 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
2020-02-09 16:02:47 +00:00
exports . OptionKind = exports . AppOptions = void 0 ;
2021-03-25 17:57:40 +00:00
var _viewer _compatibility = _ _webpack _require _ _ ( 4 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const OptionKind = {
2020-02-09 16:02:47 +00:00
VIEWER : 0x02 ,
API : 0x04 ,
WORKER : 0x08 ,
PREFERENCE : 0x80
2019-04-13 13:02:01 +00:00
} ;
2020-02-09 16:02:47 +00:00
exports . OptionKind = OptionKind ;
2021-03-25 17:57:40 +00:00
const defaultOptions = {
2020-02-09 16:02:47 +00:00
cursorToolOnLoad : {
value : 0 ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
defaultUrl : {
2021-03-25 17:57:40 +00:00
value : "compressed.tracemonkey-pldi-09.pdf" ,
2020-02-09 16:02:47 +00:00
kind : OptionKind . VIEWER
} ,
defaultZoomValue : {
2021-03-25 17:57:40 +00:00
value : "" ,
2020-02-09 16:02:47 +00:00
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
disableHistory : {
value : false ,
kind : OptionKind . VIEWER
} ,
disablePageLabels : {
value : false ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
2021-03-25 17:57:40 +00:00
enablePermissions : {
2020-02-09 16:02:47 +00:00
value : false ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
2021-03-25 17:57:40 +00:00
enablePrintAutoRotate : {
2020-02-09 16:02:47 +00:00
value : false ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
2021-03-25 17:57:40 +00:00
enableWebGL : {
2020-02-09 16:02:47 +00:00
value : false ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
externalLinkRel : {
2021-03-25 17:57:40 +00:00
value : "noopener noreferrer nofollow" ,
2020-02-09 16:02:47 +00:00
kind : OptionKind . VIEWER
} ,
externalLinkTarget : {
value : 0 ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
historyUpdateUrl : {
value : false ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
2021-03-25 17:57:40 +00:00
ignoreDestinationZoom : {
value : false ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
2020-02-09 16:02:47 +00:00
imageResourcesPath : {
2021-03-25 17:57:40 +00:00
value : "./images/" ,
2020-02-09 16:02:47 +00:00
kind : OptionKind . VIEWER
} ,
maxCanvasPixels : {
value : 16777216 ,
compatibility : _viewer _compatibility . viewerCompatibilityParams . maxCanvasPixels ,
kind : OptionKind . VIEWER
} ,
pdfBugEnabled : {
value : false ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
2021-03-25 17:57:40 +00:00
printResolution : {
value : 150 ,
kind : OptionKind . VIEWER
} ,
2020-02-09 16:02:47 +00:00
renderer : {
2021-03-25 17:57:40 +00:00
value : "canvas" ,
2020-02-09 16:02:47 +00:00
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
renderInteractiveForms : {
2021-03-25 17:57:40 +00:00
value : true ,
2020-02-09 16:02:47 +00:00
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
sidebarViewOnLoad : {
value : - 1 ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
scrollModeOnLoad : {
value : - 1 ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
spreadModeOnLoad : {
value : - 1 ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
textLayerMode : {
value : 1 ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
useOnlyCssZoom : {
value : false ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
viewOnLoad : {
value : 0 ,
kind : OptionKind . VIEWER + OptionKind . PREFERENCE
} ,
cMapPacked : {
value : true ,
kind : OptionKind . API
} ,
cMapUrl : {
2021-03-25 17:57:40 +00:00
value : "../web/cmaps/" ,
2020-02-09 16:02:47 +00:00
kind : OptionKind . API
} ,
disableAutoFetch : {
value : false ,
kind : OptionKind . API + OptionKind . PREFERENCE
} ,
disableFontFace : {
value : false ,
kind : OptionKind . API + OptionKind . PREFERENCE
} ,
disableRange : {
value : false ,
kind : OptionKind . API + OptionKind . PREFERENCE
} ,
disableStream : {
value : false ,
kind : OptionKind . API + OptionKind . PREFERENCE
} ,
2021-03-25 17:57:40 +00:00
docBaseUrl : {
value : "" ,
kind : OptionKind . API
} ,
fontExtraProperties : {
value : false ,
kind : OptionKind . API
} ,
2020-02-09 16:02:47 +00:00
isEvalSupported : {
value : true ,
kind : OptionKind . API
} ,
maxImageSize : {
value : - 1 ,
kind : OptionKind . API
} ,
pdfBug : {
value : false ,
kind : OptionKind . API
} ,
verbosity : {
value : 1 ,
kind : OptionKind . API
} ,
workerPort : {
value : null ,
kind : OptionKind . WORKER
} ,
workerSrc : {
2021-03-25 17:57:40 +00:00
value : "../build/pdf.worker.js" ,
2020-02-09 16:02:47 +00:00
kind : OptionKind . WORKER
}
} ;
{
defaultOptions . disablePreferences = {
value : false ,
kind : OptionKind . VIEWER
} ;
defaultOptions . locale = {
2021-03-25 17:57:40 +00:00
value : typeof navigator !== "undefined" ? navigator . language : "en-US" ,
2020-02-09 16:02:47 +00:00
kind : OptionKind . VIEWER
} ;
}
2021-03-25 17:57:40 +00:00
const userOptions = Object . create ( null ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class AppOptions {
constructor ( ) {
throw new Error ( "Cannot initialize AppOptions." ) ;
2020-02-09 16:02:47 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
static get ( name ) {
const userOption = userOptions [ name ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( userOption !== undefined ) {
return userOption ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const defaultOption = defaultOptions [ name ] ;
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
if ( defaultOption !== undefined ) {
return defaultOption . compatibility || defaultOption . value ;
2020-02-09 16:02:47 +00:00
}
2021-03-25 17:57:40 +00:00
return undefined ;
}
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
static getAll ( kind = null ) {
const options = Object . create ( null ) ;
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
for ( const name in defaultOptions ) {
const defaultOption = defaultOptions [ name ] ;
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
if ( kind ) {
if ( ( kind & defaultOption . kind ) === 0 ) {
continue ;
}
if ( kind === OptionKind . PREFERENCE ) {
const value = defaultOption . value ,
valueType = typeof value ;
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
if ( valueType === "boolean" || valueType === "string" || valueType === "number" && Number . isInteger ( value ) ) {
options [ name ] = value ;
continue ;
2020-02-09 16:02:47 +00:00
}
2021-03-25 17:57:40 +00:00
throw new Error ( ` Invalid type for preference: ${ name } ` ) ;
}
2020-02-09 16:02:47 +00:00
}
2021-03-25 17:57:40 +00:00
const userOption = userOptions [ name ] ;
options [ name ] = userOption !== undefined ? userOption : defaultOption . compatibility || defaultOption . value ;
2020-02-09 16:02:47 +00:00
}
2021-03-25 17:57:40 +00:00
return options ;
}
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
static set ( name , value ) {
userOptions [ name ] = value ;
}
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
static remove ( name ) {
delete userOptions [ name ] ;
}
2020-02-09 16:02:47 +00:00
}
2021-03-25 17:57:40 +00:00
exports . AppOptions = AppOptions ;
2020-02-09 16:02:47 +00:00
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 4 */
2020-02-09 16:02:47 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
2021-03-25 17:57:40 +00:00
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . viewerCompatibilityParams = void 0 ;
const compatibilityParams = Object . create ( null ) ;
2020-02-09 16:02:47 +00:00
{
2021-03-25 17:57:40 +00:00
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 isIE = /Trident/ . test ( userAgent ) ;
const isIOS = /\b(iPad|iPhone|iPod)(?=;)/ . test ( userAgent ) || platform === "MacIntel" && maxTouchPoints > 1 ;
const isIOSChrome = /CriOS/ . test ( userAgent ) ;
( function checkOnBlobSupport ( ) {
if ( isIE || isIOSChrome ) {
compatibilityParams . disableCreateObjectURL = true ;
}
} ) ( ) ;
2020-02-09 16:02:47 +00:00
( function checkCanvasSizeLimitation ( ) {
if ( isIOS || isAndroid ) {
compatibilityParams . maxCanvasPixels = 5242880 ;
}
} ) ( ) ;
}
2021-03-25 17:57:40 +00:00
const viewerCompatibilityParams = Object . freeze ( compatibilityParams ) ;
exports . viewerCompatibilityParams = viewerCompatibilityParams ;
2020-02-09 16:02:47 +00:00
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 5 */
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
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 ;
/***/ } ) ,
/* 6 */
2020-02-09 16:02:47 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFCursorTools = exports . CursorTool = void 0 ;
2021-03-25 17:57:40 +00:00
var _grab _to _pan = _ _webpack _require _ _ ( 7 ) ;
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
const CursorTool = {
2020-02-09 16:02:47 +00:00
SELECT : 0 ,
HAND : 1 ,
ZOOM : 2
} ;
exports . CursorTool = CursorTool ;
2021-03-25 17:57:40 +00:00
class PDFCursorTools {
constructor ( {
container ,
eventBus ,
cursorToolOnLoad = CursorTool . SELECT
} ) {
2020-02-09 16:02:47 +00:00
this . container = container ;
this . eventBus = eventBus ;
this . active = CursorTool . SELECT ;
this . activeBeforePresentationMode = null ;
this . handTool = new _grab _to _pan . GrabToPan ( {
element : this . container
} ) ;
this . _addEventListeners ( ) ;
2021-03-25 17:57:40 +00:00
Promise . resolve ( ) . then ( ( ) => {
this . switchTool ( cursorToolOnLoad ) ;
2020-02-09 16:02:47 +00:00
} ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
get activeTool ( ) {
return this . active ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
switchTool ( tool ) {
if ( this . activeBeforePresentationMode !== null ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( tool === this . active ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const disableActiveTool = ( ) => {
switch ( this . active ) {
2019-04-13 13:02:01 +00:00
case CursorTool . SELECT :
break ;
case CursorTool . HAND :
2021-03-25 17:57:40 +00:00
this . handTool . deactivate ( ) ;
2019-04-13 13:02:01 +00:00
break ;
case CursorTool . ZOOM :
}
2021-03-25 17:57:40 +00:00
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
switch ( tool ) {
case CursorTool . SELECT :
disableActiveTool ( ) ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case CursorTool . HAND :
disableActiveTool ( ) ;
this . handTool . activate ( ) ;
break ;
case CursorTool . ZOOM :
default :
console . error ( ` switchTool: " ${ tool } " is an unsupported value. ` ) ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . active = tool ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _dispatchEvent ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_dispatchEvent ( ) {
this . eventBus . dispatch ( "cursortoolchanged" , {
source : this ,
tool : this . active
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_addEventListeners ( ) {
this . eventBus . _on ( "switchcursortool" , evt => {
this . switchTool ( evt . tool ) ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "presentationmodechanged" , evt => {
if ( evt . switchInProgress ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let previouslyActive ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( evt . active ) {
previouslyActive = this . active ;
this . switchTool ( CursorTool . SELECT ) ;
this . activeBeforePresentationMode = previouslyActive ;
} else {
previouslyActive = this . activeBeforePresentationMode ;
this . activeBeforePresentationMode = null ;
this . switchTool ( previouslyActive ) ;
}
} ) ;
}
}
2019-04-13 13:02:01 +00:00
exports . PDFCursorTools = PDFCursorTools ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 7 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . GrabToPan = GrabToPan ;
function GrabToPan ( options ) {
this . element = options . element ;
this . document = options . element . ownerDocument ;
2021-03-25 17:57:40 +00:00
if ( typeof options . ignoreTarget === "function" ) {
2019-04-13 13:02:01 +00:00
this . ignoreTarget = options . ignoreTarget ;
}
this . onActiveChanged = options . onActiveChanged ;
this . activate = this . activate . bind ( this ) ;
this . deactivate = this . deactivate . bind ( this ) ;
this . toggle = this . toggle . bind ( this ) ;
this . _onmousedown = this . _onmousedown . bind ( this ) ;
this . _onmousemove = this . _onmousemove . bind ( this ) ;
this . _endPan = this . _endPan . bind ( this ) ;
2021-03-25 17:57:40 +00:00
const overlay = this . overlay = document . createElement ( "div" ) ;
overlay . className = "grab-to-pan-grabbing" ;
2019-04-13 13:02:01 +00:00
}
GrabToPan . prototype = {
2021-03-25 17:57:40 +00:00
CSS _CLASS _GRAB : "grab-to-pan-grab" ,
2019-04-13 13:02:01 +00:00
activate : function GrabToPan _activate ( ) {
if ( ! this . active ) {
this . active = true ;
2021-03-25 17:57:40 +00:00
this . element . addEventListener ( "mousedown" , this . _onmousedown , true ) ;
2019-04-13 13:02:01 +00:00
this . element . classList . add ( this . CSS _CLASS _GRAB ) ;
if ( this . onActiveChanged ) {
this . onActiveChanged ( true ) ;
}
}
} ,
deactivate : function GrabToPan _deactivate ( ) {
if ( this . active ) {
this . active = false ;
2021-03-25 17:57:40 +00:00
this . element . removeEventListener ( "mousedown" , this . _onmousedown , true ) ;
2019-04-13 13:02:01 +00:00
this . _endPan ( ) ;
this . element . classList . remove ( this . CSS _CLASS _GRAB ) ;
if ( this . onActiveChanged ) {
this . onActiveChanged ( false ) ;
}
}
} ,
toggle : function GrabToPan _toggle ( ) {
if ( this . active ) {
this . deactivate ( ) ;
} else {
this . activate ( ) ;
}
} ,
ignoreTarget : function GrabToPan _ignoreTarget ( node ) {
2021-03-25 17:57:40 +00:00
return node [ matchesSelector ] ( "a[href], a[href] *, input, textarea, button, button *, select, option" ) ;
2019-04-13 13:02:01 +00:00
} ,
_onmousedown : function GrabToPan _ _onmousedown ( event ) {
if ( event . button !== 0 || this . ignoreTarget ( event . target ) ) {
return ;
}
if ( event . originalTarget ) {
try {
event . originalTarget . tagName ;
} catch ( e ) {
return ;
}
}
this . scrollLeftStart = this . element . scrollLeft ;
this . scrollTopStart = this . element . scrollTop ;
this . clientXStart = event . clientX ;
this . clientYStart = event . clientY ;
2021-03-25 17:57:40 +00:00
this . document . addEventListener ( "mousemove" , this . _onmousemove , true ) ;
this . document . addEventListener ( "mouseup" , this . _endPan , true ) ;
this . element . addEventListener ( "scroll" , this . _endPan , true ) ;
2019-04-13 13:02:01 +00:00
event . preventDefault ( ) ;
event . stopPropagation ( ) ;
2021-03-25 17:57:40 +00:00
const focusedElement = document . activeElement ;
2019-04-13 13:02:01 +00:00
if ( focusedElement && ! focusedElement . contains ( event . target ) ) {
focusedElement . blur ( ) ;
}
} ,
_onmousemove : function GrabToPan _ _onmousemove ( event ) {
2021-03-25 17:57:40 +00:00
this . element . removeEventListener ( "scroll" , this . _endPan , true ) ;
2019-04-13 13:02:01 +00:00
if ( isLeftMouseReleased ( event ) ) {
this . _endPan ( ) ;
return ;
}
2021-03-25 17:57:40 +00:00
const xDiff = event . clientX - this . clientXStart ;
const yDiff = event . clientY - this . clientYStart ;
const scrollTop = this . scrollTopStart - yDiff ;
const scrollLeft = this . scrollLeftStart - xDiff ;
2019-04-13 13:02:01 +00:00
if ( this . element . scrollTo ) {
this . element . scrollTo ( {
top : scrollTop ,
left : scrollLeft ,
2021-03-25 17:57:40 +00:00
behavior : "instant"
2019-04-13 13:02:01 +00:00
} ) ;
} else {
this . element . scrollTop = scrollTop ;
this . element . scrollLeft = scrollLeft ;
}
if ( ! this . overlay . parentNode ) {
document . body . appendChild ( this . overlay ) ;
}
} ,
_endPan : function GrabToPan _ _endPan ( ) {
2021-03-25 17:57:40 +00:00
this . element . removeEventListener ( "scroll" , this . _endPan , true ) ;
this . document . removeEventListener ( "mousemove" , this . _onmousemove , true ) ;
this . document . removeEventListener ( "mouseup" , this . _endPan , true ) ;
2019-04-13 13:02:01 +00:00
this . overlay . remove ( ) ;
}
} ;
2021-03-25 17:57:40 +00:00
let matchesSelector ;
[ "webkitM" , "mozM" , "msM" , "oM" , "m" ] . some ( function ( prefix ) {
let name = prefix + "atches" ;
2019-04-13 13:02:01 +00:00
if ( name in document . documentElement ) {
matchesSelector = name ;
}
2021-03-25 17:57:40 +00:00
name += "Selector" ;
2019-04-13 13:02:01 +00:00
if ( name in document . documentElement ) {
matchesSelector = name ;
}
return matchesSelector ;
} ) ;
2021-03-25 17:57:40 +00:00
const isNotIEorIsIE10plus = ! document . documentMode || document . documentMode > 9 ;
const chrome = window . chrome ;
const isChrome15OrOpera15plus = chrome && ( chrome . webstore || chrome . app ) ;
const isSafari6plus = /Apple/ . test ( navigator . vendor ) && /Version\/([6-9]\d*|[1-5]\d+)/ . test ( navigator . userAgent ) ;
2019-04-13 13:02:01 +00:00
function isLeftMouseReleased ( event ) {
2021-03-25 17:57:40 +00:00
if ( "buttons" in event && isNotIEorIsIE10plus ) {
2019-04-13 13:02:01 +00:00
return ! ( event . buttons & 1 ) ;
}
if ( isChrome15OrOpera15plus || isSafari6plus ) {
return event . which === 0 ;
}
2020-02-09 16:02:47 +00:00
return false ;
2019-04-13 13:02:01 +00:00
}
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 8 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFRenderingQueue = exports . RenderingStates = void 0 ;
2021-03-25 17:57:40 +00:00
const CLEANUP _TIMEOUT = 30000 ;
const RenderingStates = {
2019-04-13 13:02:01 +00:00
INITIAL : 0 ,
RUNNING : 1 ,
PAUSED : 2 ,
FINISHED : 3
} ;
exports . RenderingStates = RenderingStates ;
2021-03-25 17:57:40 +00:00
class PDFRenderingQueue {
constructor ( ) {
2019-04-13 13:02:01 +00:00
this . pdfViewer = null ;
this . pdfThumbnailViewer = null ;
this . onIdle = null ;
this . highestPriorityPage = null ;
this . idleTimeout = null ;
this . printing = false ;
this . isThumbnailViewEnabled = false ;
}
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( this . pdfViewer . forceRendering ( currentlyVisiblePages ) ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( this . pdfThumbnailViewer && this . isThumbnailViewEnabled ) {
if ( this . pdfThumbnailViewer . forceRendering ( ) ) {
2019-04-13 13:02:01 +00:00
return ;
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . printing ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . onIdle ) {
this . idleTimeout = setTimeout ( this . onIdle . bind ( this ) , CLEANUP _TIMEOUT ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
getHighestPriority ( visible , views , scrolledDown ) {
const visibleViews = visible . views ;
const numVisible = visibleViews . length ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( numVisible === 0 ) {
return null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let i = 0 ; i < numVisible ; ++ i ) {
const view = visibleViews [ i ] . view ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . isViewFinished ( view ) ) {
return view ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( scrolledDown ) {
const nextPageIndex = visible . last . id ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( views [ nextPageIndex ] && ! this . isViewFinished ( views [ nextPageIndex ] ) ) {
return views [ nextPageIndex ] ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
} else {
const previousPageIndex = visible . first . id - 2 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( views [ previousPageIndex ] && ! this . isViewFinished ( views [ previousPageIndex ] ) ) {
return views [ previousPageIndex ] ;
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
isViewFinished ( view ) {
return view . renderingState === RenderingStates . FINISHED ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
renderView ( view ) {
switch ( view . renderingState ) {
case RenderingStates . FINISHED :
return false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case RenderingStates . PAUSED :
this . highestPriorityPage = view . renderingId ;
view . resume ( ) ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case RenderingStates . RUNNING :
this . highestPriorityPage = view . renderingId ;
break ;
case RenderingStates . INITIAL :
this . highestPriorityPage = view . renderingId ;
view . draw ( ) . finally ( ( ) => {
this . renderHighestPriority ( ) ;
} ) . catch ( reason => {
console . error ( ` renderView: " ${ reason } " ` ) ;
} ) ;
break ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return true ;
}
}
2019-04-13 13:02:01 +00:00
exports . PDFRenderingQueue = PDFRenderingQueue ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 9 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFSidebar = exports . SidebarView = void 0 ;
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _rendering _queue = _ _webpack _require _ _ ( 8 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const UI _NOTIFICATION _CLASS = "pdfSidebarNotification" ;
const SidebarView = {
2019-04-13 13:02:01 +00:00
UNKNOWN : - 1 ,
NONE : 0 ,
THUMBS : 1 ,
OUTLINE : 2 ,
ATTACHMENTS : 3 ,
LAYERS : 4
} ;
exports . SidebarView = SidebarView ;
2021-03-25 17:57:40 +00:00
class PDFSidebar {
constructor ( {
elements ,
pdfViewer ,
pdfThumbnailViewer ,
eventBus ,
l10n = _ui _utils . NullL10n ,
disableNotification = false
} ) {
2019-04-13 13:02:01 +00:00
this . isOpen = false ;
this . active = SidebarView . THUMBS ;
this . isInitialViewSet = false ;
this . onToggled = null ;
2020-02-09 16:02:47 +00:00
this . pdfViewer = pdfViewer ;
this . pdfThumbnailViewer = pdfThumbnailViewer ;
this . outerContainer = elements . outerContainer ;
this . viewerContainer = elements . viewerContainer ;
this . toggleButton = elements . toggleButton ;
this . thumbnailButton = elements . thumbnailButton ;
this . outlineButton = elements . outlineButton ;
this . attachmentsButton = elements . attachmentsButton ;
2021-03-25 17:57:40 +00:00
this . layersButton = elements . layersButton ;
2020-02-09 16:02:47 +00:00
this . thumbnailView = elements . thumbnailView ;
this . outlineView = elements . outlineView ;
this . attachmentsView = elements . attachmentsView ;
2021-03-25 17:57:40 +00:00
this . layersView = elements . layersView ;
2019-04-13 13:02:01 +00:00
this . eventBus = eventBus ;
this . l10n = l10n ;
2020-02-09 16:02:47 +00:00
this . _disableNotification = disableNotification ;
2019-04-13 13:02:01 +00:00
this . _addEventListeners ( ) ;
}
2021-03-25 17:57:40 +00:00
reset ( ) {
this . isInitialViewSet = false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _hideUINotification ( null ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . switchView ( SidebarView . THUMBS ) ;
this . outlineButton . disabled = false ;
this . attachmentsButton . disabled = false ;
this . layersButton . disabled = false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get visibleView ( ) {
return this . isOpen ? this . active : SidebarView . NONE ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get isThumbnailViewVisible ( ) {
return this . isOpen && this . active === SidebarView . THUMBS ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get isOutlineViewVisible ( ) {
return this . isOpen && this . active === SidebarView . OUTLINE ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get isAttachmentsViewVisible ( ) {
return this . isOpen && this . active === SidebarView . ATTACHMENTS ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get isLayersViewVisible ( ) {
return this . isOpen && this . active === SidebarView . LAYERS ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setInitialView ( view = SidebarView . NONE ) {
if ( this . isInitialViewSet ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . isInitialViewSet = true ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( view === SidebarView . NONE || view === SidebarView . UNKNOWN ) {
this . _dispatchEvent ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . _switchView ( view , true ) ) {
this . _dispatchEvent ( ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
switchView ( view , forceOpen = false ) {
this . _switchView ( view , forceOpen ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_switchView ( view , forceOpen = false ) {
const isViewChanged = view !== this . active ;
let shouldForceRendering = false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
switch ( view ) {
case SidebarView . NONE :
if ( this . isOpen ) {
this . close ( ) ;
return true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case SidebarView . THUMBS :
if ( this . isOpen && isViewChanged ) {
shouldForceRendering = true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case SidebarView . OUTLINE :
if ( this . outlineButton . disabled ) {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case SidebarView . ATTACHMENTS :
if ( this . attachmentsButton . disabled ) {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case SidebarView . LAYERS :
if ( this . layersButton . disabled ) {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
default :
console . error ( ` PDFSidebar._switchView: " ${ view } " is not a valid view. ` ) ;
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . active = view ;
this . thumbnailButton . classList . toggle ( "toggled" , view === SidebarView . THUMBS ) ;
this . outlineButton . classList . toggle ( "toggled" , view === SidebarView . OUTLINE ) ;
this . attachmentsButton . classList . toggle ( "toggled" , view === SidebarView . ATTACHMENTS ) ;
this . layersButton . classList . toggle ( "toggled" , view === SidebarView . LAYERS ) ;
this . thumbnailView . classList . toggle ( "hidden" , view !== SidebarView . THUMBS ) ;
this . outlineView . classList . toggle ( "hidden" , view !== SidebarView . OUTLINE ) ;
this . attachmentsView . classList . toggle ( "hidden" , view !== SidebarView . ATTACHMENTS ) ;
this . layersView . classList . toggle ( "hidden" , view !== SidebarView . LAYERS ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( forceOpen && ! this . isOpen ) {
this . open ( ) ;
return true ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( shouldForceRendering ) {
this . _updateThumbnailViewer ( ) ;
2019-04-13 13:02:01 +00:00
this . _forceRendering ( ) ;
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( isViewChanged ) {
2019-04-13 13:02:01 +00:00
this . _dispatchEvent ( ) ;
}
2021-03-25 17:57:40 +00:00
this . _hideUINotification ( this . active ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return isViewChanged ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
open ( ) {
if ( this . isOpen ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . isOpen = true ;
this . toggleButton . classList . add ( "toggled" ) ;
this . outerContainer . classList . add ( "sidebarMoving" , "sidebarOpen" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . active === SidebarView . THUMBS ) {
this . _updateThumbnailViewer ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _forceRendering ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _dispatchEvent ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _hideUINotification ( this . active ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
close ( ) {
if ( ! this . isOpen ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . isOpen = false ;
this . toggleButton . classList . remove ( "toggled" ) ;
this . outerContainer . classList . add ( "sidebarMoving" ) ;
this . outerContainer . classList . remove ( "sidebarOpen" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _forceRendering ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _dispatchEvent ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
toggle ( ) {
if ( this . isOpen ) {
this . close ( ) ;
} else {
this . open ( ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_dispatchEvent ( ) {
this . eventBus . dispatch ( "sidebarviewchanged" , {
source : this ,
view : this . visibleView
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_forceRendering ( ) {
if ( this . onToggled ) {
this . onToggled ( ) ;
} else {
this . pdfViewer . forceRendering ( ) ;
this . pdfThumbnailViewer . forceRendering ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updateThumbnailViewer ( ) {
const {
pdfViewer ,
pdfThumbnailViewer
} = this ;
const pagesCount = pdfViewer . pagesCount ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let pageIndex = 0 ; pageIndex < pagesCount ; pageIndex ++ ) {
const pageView = pdfViewer . getPageView ( pageIndex ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( pageView && pageView . renderingState === _pdf _rendering _queue . RenderingStates . FINISHED ) {
const thumbnailView = pdfThumbnailViewer . getThumbnail ( pageIndex ) ;
thumbnailView . setImage ( pageView ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
pdfThumbnailViewer . scrollThumbnailIntoView ( pdfViewer . currentPageNumber ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_showUINotification ( view ) {
if ( this . _disableNotification ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . l10n . get ( "toggle_sidebar_notification2.title" , null , "Toggle Sidebar (document contains outline/attachments/layers)" ) . then ( msg => {
this . toggleButton . title = msg ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . isOpen ) {
this . toggleButton . classList . add ( UI _NOTIFICATION _CLASS ) ;
} else if ( view === this . active ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
switch ( view ) {
case SidebarView . OUTLINE :
this . outlineButton . classList . add ( UI _NOTIFICATION _CLASS ) ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case SidebarView . ATTACHMENTS :
this . attachmentsButton . classList . add ( UI _NOTIFICATION _CLASS ) ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case SidebarView . LAYERS :
this . layersButton . classList . add ( UI _NOTIFICATION _CLASS ) ;
break ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_hideUINotification ( view ) {
if ( this . _disableNotification ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const removeNotification = sidebarView => {
switch ( sidebarView ) {
case SidebarView . OUTLINE :
this . outlineButton . classList . remove ( UI _NOTIFICATION _CLASS ) ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case SidebarView . ATTACHMENTS :
this . attachmentsButton . classList . remove ( UI _NOTIFICATION _CLASS ) ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case SidebarView . LAYERS :
this . layersButton . classList . remove ( UI _NOTIFICATION _CLASS ) ;
break ;
}
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . isOpen && view !== null ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . toggleButton . classList . remove ( UI _NOTIFICATION _CLASS ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( view !== null ) {
removeNotification ( view ) ;
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( view in SidebarView ) {
removeNotification ( SidebarView [ view ] ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . l10n . get ( "toggle_sidebar.title" , null , "Toggle Sidebar" ) . then ( msg => {
this . toggleButton . title = msg ;
} ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
_addEventListeners ( ) {
this . viewerContainer . addEventListener ( "transitionend" , evt => {
if ( evt . target === this . viewerContainer ) {
this . outerContainer . classList . remove ( "sidebarMoving" ) ;
}
} ) ;
this . toggleButton . addEventListener ( "click" , ( ) => {
this . toggle ( ) ;
} ) ;
this . thumbnailButton . addEventListener ( "click" , ( ) => {
this . switchView ( SidebarView . THUMBS ) ;
} ) ;
this . outlineButton . addEventListener ( "click" , ( ) => {
this . switchView ( SidebarView . OUTLINE ) ;
} ) ;
this . outlineButton . addEventListener ( "dblclick" , ( ) => {
this . eventBus . dispatch ( "toggleoutlinetree" , {
source : this
} ) ;
} ) ;
this . attachmentsButton . addEventListener ( "click" , ( ) => {
this . switchView ( SidebarView . ATTACHMENTS ) ;
} ) ;
this . layersButton . addEventListener ( "click" , ( ) => {
this . switchView ( SidebarView . LAYERS ) ;
} ) ;
this . layersButton . addEventListener ( "dblclick" , ( ) => {
this . eventBus . dispatch ( "resetlayers" , {
source : this
} ) ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const onTreeLoaded = ( count , button , view ) => {
button . disabled = ! count ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( count ) {
this . _showUINotification ( view ) ;
} else if ( this . active === view ) {
this . switchView ( SidebarView . THUMBS ) ;
}
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "outlineloaded" , evt => {
onTreeLoaded ( evt . outlineCount , this . outlineButton , SidebarView . OUTLINE ) ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "attachmentsloaded" , evt => {
onTreeLoaded ( evt . attachmentsCount , this . attachmentsButton , SidebarView . ATTACHMENTS ) ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "layersloaded" , evt => {
onTreeLoaded ( evt . layersCount , this . layersButton , SidebarView . LAYERS ) ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "presentationmodechanged" , evt => {
if ( ! evt . active && ! evt . switchInProgress && this . isThumbnailViewVisible ) {
this . _updateThumbnailViewer ( ) ;
}
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
exports . PDFSidebar = PDFSidebar ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
/***/ } ) ,
/* 10 */
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
"use strict" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . OverlayManager = void 0 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class OverlayManager {
constructor ( ) {
this . _overlays = { } ;
this . _active = null ;
this . _keyDownBound = this . _keyDown . bind ( this ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get active ( ) {
return this . _active ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async register ( name , element , callerCloseMethod = null , canForceClose = false ) {
let container ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! name || ! element || ! ( container = element . parentNode ) ) {
throw new Error ( "Not enough parameters." ) ;
} else if ( this . _overlays [ name ] ) {
throw new Error ( "The overlay is already registered." ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _overlays [ name ] = {
element ,
container ,
callerCloseMethod ,
canForceClose
} ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async unregister ( name ) {
if ( ! this . _overlays [ name ] ) {
throw new Error ( "The overlay does not exist." ) ;
} else if ( this . _active === name ) {
throw new Error ( "The overlay cannot be removed while it is active." ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
delete this . _overlays [ name ] ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async open ( name ) {
if ( ! this . _overlays [ name ] ) {
throw new Error ( "The overlay does not exist." ) ;
} else if ( this . _active ) {
if ( this . _overlays [ name ] . canForceClose ) {
this . _closeThroughCaller ( ) ;
} else if ( this . _active === name ) {
throw new Error ( "The overlay is already active." ) ;
} else {
throw new Error ( "Another overlay is currently active." ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _active = name ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _overlays [ this . _active ] . element . classList . remove ( "hidden" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _overlays [ this . _active ] . container . classList . remove ( "hidden" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
window . addEventListener ( "keydown" , this . _keyDownBound ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async close ( name ) {
if ( ! this . _overlays [ name ] ) {
throw new Error ( "The overlay does not exist." ) ;
} else if ( ! this . _active ) {
throw new Error ( "The overlay is currently not active." ) ;
} else if ( this . _active !== name ) {
throw new Error ( "Another overlay is currently active." ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _overlays [ this . _active ] . container . classList . add ( "hidden" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _overlays [ this . _active ] . element . classList . add ( "hidden" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _active = null ;
window . removeEventListener ( "keydown" , this . _keyDownBound ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_keyDown ( evt ) {
if ( this . _active && evt . keyCode === 27 ) {
this . _closeThroughCaller ( ) ;
evt . preventDefault ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_closeThroughCaller ( ) {
if ( this . _overlays [ this . _active ] . callerCloseMethod ) {
this . _overlays [ this . _active ] . callerCloseMethod ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( this . _active ) {
this . close ( this . _active ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . OverlayManager = OverlayManager ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 11 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PasswordPrompt = void 0 ;
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class PasswordPrompt {
constructor ( options , overlayManager , l10n = _ui _utils . NullL10n ) {
2019-04-13 13:02:01 +00:00
this . overlayName = options . overlayName ;
this . container = options . container ;
this . label = options . label ;
this . input = options . input ;
this . submitButton = options . submitButton ;
this . cancelButton = options . cancelButton ;
this . overlayManager = overlayManager ;
this . l10n = l10n ;
this . updateCallback = null ;
this . reason = null ;
2021-03-25 17:57:40 +00:00
this . submitButton . addEventListener ( "click" , this . verify . bind ( this ) ) ;
this . cancelButton . addEventListener ( "click" , this . close . bind ( this ) ) ;
this . input . addEventListener ( "keydown" , e => {
2019-04-13 13:02:01 +00:00
if ( e . keyCode === 13 ) {
2021-03-25 17:57:40 +00:00
this . verify ( ) ;
2019-04-13 13:02:01 +00:00
}
} ) ;
this . overlayManager . register ( this . overlayName , this . container , this . close . bind ( this ) , true ) ;
}
2021-03-25 17:57:40 +00:00
open ( ) {
this . overlayManager . open ( this . overlayName ) . then ( ( ) => {
this . input . focus ( ) ;
let promptString ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . reason === _pdfjsLib . PasswordResponses . INCORRECT _PASSWORD ) {
promptString = this . l10n . get ( "password_invalid" , null , "Invalid password. Please try again." ) ;
} else {
promptString = this . l10n . get ( "password_label" , null , "Enter the password to open this PDF file." ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
promptString . then ( msg => {
this . label . textContent = msg ;
} ) ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
close ( ) {
this . overlayManager . close ( this . overlayName ) . then ( ( ) => {
this . input . value = "" ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
verify ( ) {
const password = this . input . value ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( password && password . length > 0 ) {
this . close ( ) ;
this . updateCallback ( password ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setUpdateCallback ( updateCallback , reason ) {
this . updateCallback = updateCallback ;
this . reason = reason ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . PasswordPrompt = PasswordPrompt ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 12 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFAttachmentViewer = void 0 ;
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
var _base _tree _viewer = _ _webpack _require _ _ ( 13 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _viewer _compatibility = _ _webpack _require _ _ ( 4 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const PdfFileRegExp = /\.pdf$/i ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class PDFAttachmentViewer extends _base _tree _viewer . BaseTreeViewer {
constructor ( options ) {
super ( options ) ;
this . downloadManager = options . downloadManager ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "fileattachmentannotation" , this . _appendAttachment . bind ( this ) ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
reset ( keepRenderedCapability = false ) {
super . reset ( ) ;
this . _attachments = null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! keepRenderedCapability ) {
this . _renderedCapability = ( 0 , _pdfjsLib . createPromiseCapability ) ( ) ;
}
if ( this . _pendingDispatchEvent ) {
clearTimeout ( this . _pendingDispatchEvent ) ;
}
this . _pendingDispatchEvent = null ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
_dispatchEvent ( attachmentsCount ) {
this . _renderedCapability . resolve ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _pendingDispatchEvent ) {
clearTimeout ( this . _pendingDispatchEvent ) ;
this . _pendingDispatchEvent = null ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( attachmentsCount === 0 ) {
this . _pendingDispatchEvent = setTimeout ( ( ) => {
this . eventBus . dispatch ( "attachmentsloaded" , {
source : this ,
attachmentsCount : 0
} ) ;
this . _pendingDispatchEvent = null ;
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . eventBus . dispatch ( "attachmentsloaded" , {
source : this ,
attachmentsCount
} ) ;
}
_bindPdfLink ( element , {
content ,
filename
} ) {
let blobUrl ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
element . onclick = ( ) => {
if ( ! blobUrl ) {
blobUrl = URL . createObjectURL ( new Blob ( [ content ] , {
type : "application/pdf"
} ) ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let viewerUrl ;
viewerUrl = "?file=" + encodeURIComponent ( blobUrl + "#" + filename ) ;
try {
2019-04-13 13:02:01 +00:00
window . open ( viewerUrl ) ;
2021-03-25 17:57:40 +00:00
} catch ( ex ) {
console . error ( ` _bindPdfLink: ${ ex } ` ) ;
URL . revokeObjectURL ( blobUrl ) ;
blobUrl = null ;
this . downloadManager . downloadData ( content , filename , "application/pdf" ) ;
}
return false ;
} ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_bindLink ( element , {
content ,
filename
} ) {
element . onclick = ( ) => {
const contentType = PdfFileRegExp . test ( filename ) ? "application/pdf" : "" ;
this . downloadManager . downloadData ( content , filename , contentType ) ;
return false ;
} ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
render ( {
attachments ,
keepRenderedCapability = false
} ) {
if ( this . _attachments ) {
this . reset ( keepRenderedCapability ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _attachments = attachments || null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! attachments ) {
this . _dispatchEvent ( 0 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const names = Object . keys ( attachments ) . sort ( function ( a , b ) {
return a . toLowerCase ( ) . localeCompare ( b . toLowerCase ( ) ) ;
} ) ;
const fragment = document . createDocumentFragment ( ) ;
let attachmentsCount = 0 ;
for ( const name of names ) {
const item = attachments [ name ] ;
const filename = ( 0 , _pdfjsLib . getFilenameFromUrl ) ( item . filename ) ;
const div = document . createElement ( "div" ) ;
div . className = "treeItem" ;
const element = document . createElement ( "a" ) ;
if ( PdfFileRegExp . test ( filename ) && ! _viewer _compatibility . viewerCompatibilityParams . disableCreateObjectURL ) {
this . _bindPdfLink ( element , {
content : item . content ,
filename
} ) ;
} else {
this . _bindLink ( element , {
content : item . content ,
filename
} ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
element . textContent = this . _normalizeTextContent ( filename ) ;
div . appendChild ( element ) ;
fragment . appendChild ( div ) ;
attachmentsCount ++ ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . container . appendChild ( fragment ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _dispatchEvent ( attachmentsCount ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_appendAttachment ( {
id ,
filename ,
content
} ) {
const renderedPromise = this . _renderedCapability . promise ;
renderedPromise . then ( ( ) => {
if ( renderedPromise !== this . _renderedCapability . promise ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let attachments = this . _attachments ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! attachments ) {
attachments = Object . create ( null ) ;
} else {
for ( const name in attachments ) {
if ( id === name ) {
return ;
2019-04-13 13:02:01 +00:00
}
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
attachments [ id ] = {
filename ,
content
} ;
this . render ( {
attachments ,
keepRenderedCapability : true
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . PDFAttachmentViewer = PDFAttachmentViewer ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 13 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
2021-03-25 17:57:40 +00:00
exports . BaseTreeViewer = void 0 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
class BaseTreeViewer {
constructor ( options ) {
if ( this . constructor === BaseTreeViewer ) {
throw new Error ( "Cannot initialize BaseTreeViewer." ) ;
}
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
this . container = options . container ;
this . eventBus = options . eventBus ;
this . reset ( ) ;
}
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
reset ( ) {
this . _lastToggleIsShow = true ;
this . container . textContent = "" ;
this . container . classList . remove ( "treeWithDeepNesting" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_dispatchEvent ( count ) {
throw new Error ( "Not implemented: _dispatchEvent" ) ;
}
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
_bindLink ( element , params ) {
throw new Error ( "Not implemented: _bindLink" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_normalizeTextContent ( str ) {
return ( 0 , _pdfjsLib . removeNullCharacters ) ( str ) || "\u2013" ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_addToggleButton ( div , hidden = false ) {
const toggler = document . createElement ( "div" ) ;
toggler . className = "treeItemToggler" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( hidden ) {
toggler . classList . add ( "treeItemsHidden" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
toggler . onclick = evt => {
evt . stopPropagation ( ) ;
toggler . classList . toggle ( "treeItemsHidden" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( evt . shiftKey ) {
const shouldShowAll = ! toggler . classList . contains ( "treeItemsHidden" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _toggleTreeItem ( div , shouldShowAll ) ;
}
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
div . insertBefore ( toggler , div . firstChild ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_toggleTreeItem ( root , show = false ) {
this . _lastToggleIsShow = show ;
for ( const toggler of root . querySelectorAll ( ".treeItemToggler" ) ) {
toggler . classList . toggle ( "treeItemsHidden" , ! show ) ;
}
}
_toggleAllTreeItems ( ) {
this . _toggleTreeItem ( this . container , ! this . _lastToggleIsShow ) ;
}
render ( params ) {
throw new Error ( "Not implemented: render" ) ;
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
exports . BaseTreeViewer = BaseTreeViewer ;
/***/ } ) ,
/* 14 */
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFDocumentProperties = void 0 ;
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
const DEFAULT _FIELD _CONTENT = "-" ;
const NON _METRIC _LOCALES = [ "en-us" , "en-lr" , "my" ] ;
const US _PAGE _NAMES = {
"8.5x11" : "Letter" ,
"8.5x14" : "Legal"
} ;
const METRIC _PAGE _NAMES = {
"297x420" : "A3" ,
"210x297" : "A4"
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
function getPageName ( size , isPortrait , pageNames ) {
const width = isPortrait ? size . width : size . height ;
const height = isPortrait ? size . height : size . width ;
return pageNames [ ` ${ width } x ${ height } ` ] ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class PDFDocumentProperties {
constructor ( {
overlayName ,
fields ,
container ,
closeButton
} , overlayManager , eventBus , l10n = _ui _utils . NullL10n ) {
2019-04-13 13:02:01 +00:00
this . overlayName = overlayName ;
this . fields = fields ;
this . container = container ;
this . overlayManager = overlayManager ;
this . l10n = l10n ;
this . _reset ( ) ;
2021-03-25 17:57:40 +00:00
closeButton . addEventListener ( "click" , this . close . bind ( this ) ) ;
2019-04-13 13:02:01 +00:00
this . overlayManager . register ( this . overlayName , this . container , this . close . bind ( this ) ) ;
2021-03-25 17:57:40 +00:00
eventBus . _on ( "pagechanging" , evt => {
this . _currentPageNumber = evt . pageNumber ;
} ) ;
eventBus . _on ( "rotationchanging" , evt => {
this . _pagesRotation = evt . pagesRotation ;
} ) ;
2019-04-13 13:02:01 +00:00
this . _isNonMetricLocale = true ;
2021-03-25 17:57:40 +00:00
l10n . getLanguage ( ) . then ( locale => {
this . _isNonMetricLocale = NON _METRIC _LOCALES . includes ( locale ) ;
2019-04-13 13:02:01 +00:00
} ) ;
}
2021-03-25 17:57:40 +00:00
open ( ) {
const freezeFieldData = data => {
Object . defineProperty ( this , "fieldData" , {
value : Object . freeze ( data ) ,
writable : false ,
enumerable : true ,
configurable : true
} ) ;
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
Promise . all ( [ this . overlayManager . open ( this . overlayName ) , this . _dataAvailableCapability . promise ] ) . then ( ( ) => {
const currentPageNumber = this . _currentPageNumber ;
const pagesRotation = this . _pagesRotation ;
if ( this . fieldData && currentPageNumber === this . fieldData . _currentPageNumber && pagesRotation === this . fieldData . _pagesRotation ) {
this . _updateUI ( ) ;
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . pdfDocument . getMetadata ( ) . then ( ( {
info ,
metadata ,
contentDispositionFilename
} ) => {
return Promise . all ( [ info , metadata , contentDispositionFilename || ( 0 , _ui _utils . getPDFFileNameFromURL ) ( this . url ) , this . _parseFileSize ( this . maybeFileSize ) , this . _parseDate ( info . CreationDate ) , this . _parseDate ( info . ModDate ) , this . pdfDocument . getPage ( currentPageNumber ) . then ( pdfPage => {
return this . _parsePageSize ( ( 0 , _ui _utils . getPageSizeInches ) ( pdfPage ) , pagesRotation ) ;
} ) , this . _parseLinearization ( info . IsLinearized ) ] ) ;
} ) . then ( ( [ info , metadata , fileName , fileSize , creationDate , modDate , pageSize , isLinearized ] ) => {
freezeFieldData ( {
fileName ,
fileSize ,
title : info . Title ,
author : info . Author ,
subject : info . Subject ,
keywords : info . Keywords ,
creationDate ,
modificationDate : modDate ,
creator : info . Creator ,
producer : info . Producer ,
version : info . PDFFormatVersion ,
pageCount : this . pdfDocument . numPages ,
pageSize ,
linearized : isLinearized ,
_currentPageNumber : currentPageNumber ,
_pagesRotation : pagesRotation
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateUI ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return this . pdfDocument . getDownloadInfo ( ) ;
} ) . then ( ( {
length
} ) => {
this . maybeFileSize = length ;
return this . _parseFileSize ( length ) ;
} ) . then ( fileSize => {
if ( fileSize === this . fieldData . fileSize ) {
2019-04-13 13:02:01 +00:00
return ;
}
2021-03-25 17:57:40 +00:00
const data = Object . assign ( Object . create ( null ) , this . fieldData ) ;
data . fileSize = fileSize ;
freezeFieldData ( data ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateUI ( ) ;
} ) ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
close ( ) {
this . overlayManager . close ( this . overlayName ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setDocument ( pdfDocument , url = null ) {
if ( this . pdfDocument ) {
this . _reset ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateUI ( true ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( ! pdfDocument ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . pdfDocument = pdfDocument ;
this . url = url ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _dataAvailableCapability . resolve ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setFileSize ( fileSize ) {
if ( Number . isInteger ( fileSize ) && fileSize > 0 ) {
this . maybeFileSize = fileSize ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_reset ( ) {
this . pdfDocument = null ;
this . url = null ;
this . maybeFileSize = 0 ;
delete this . fieldData ;
this . _dataAvailableCapability = ( 0 , _pdfjsLib . createPromiseCapability ) ( ) ;
this . _currentPageNumber = 1 ;
this . _pagesRotation = 0 ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updateUI ( reset = false ) {
if ( reset || ! this . fieldData ) {
for ( const id in this . fields ) {
this . fields [ id ] . textContent = DEFAULT _FIELD _CONTENT ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . overlayManager . active !== this . overlayName ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( const id in this . fields ) {
const content = this . fieldData [ id ] ;
this . fields [ id ] . textContent = content || content === 0 ? content : DEFAULT _FIELD _CONTENT ;
}
}
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
async _parseFileSize ( fileSize = 0 ) {
const kb = fileSize / 1024 ;
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
if ( ! kb ) {
return undefined ;
} else if ( kb < 1024 ) {
return this . l10n . get ( "document_properties_kb" , {
size _kb : ( + kb . toPrecision ( 3 ) ) . toLocaleString ( ) ,
size _b : fileSize . toLocaleString ( )
} , "{{size_kb}} KB ({{size_b}} bytes)" ) ;
}
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
return this . l10n . get ( "document_properties_mb" , {
size _mb : ( + ( kb / 1024 ) . toPrecision ( 3 ) ) . toLocaleString ( ) ,
size _b : fileSize . toLocaleString ( )
} , "{{size_mb}} MB ({{size_b}} bytes)" ) ;
}
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
async _parsePageSize ( pageSizeInches , pagesRotation ) {
if ( ! pageSizeInches ) {
return undefined ;
}
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
if ( pagesRotation % 180 !== 0 ) {
pageSizeInches = {
width : pageSizeInches . height ,
height : pageSizeInches . width
} ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const isPortrait = ( 0 , _ui _utils . isPortraitOrientation ) ( pageSizeInches ) ;
let sizeInches = {
width : Math . round ( pageSizeInches . width * 100 ) / 100 ,
height : Math . round ( pageSizeInches . height * 100 ) / 100
} ;
let sizeMillimeters = {
width : Math . round ( pageSizeInches . width * 25.4 * 10 ) / 10 ,
height : Math . round ( pageSizeInches . height * 25.4 * 10 ) / 10
} ;
let pageName = null ;
let rawName = getPageName ( sizeInches , isPortrait , US _PAGE _NAMES ) || getPageName ( sizeMillimeters , isPortrait , METRIC _PAGE _NAMES ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! rawName && ! ( Number . isInteger ( sizeMillimeters . width ) && Number . isInteger ( sizeMillimeters . height ) ) ) {
const exactMillimeters = {
width : pageSizeInches . width * 25.4 ,
height : pageSizeInches . height * 25.4
} ;
const intMillimeters = {
width : Math . round ( sizeMillimeters . width ) ,
height : Math . round ( sizeMillimeters . height )
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( Math . abs ( exactMillimeters . width - intMillimeters . width ) < 0.1 && Math . abs ( exactMillimeters . height - intMillimeters . height ) < 0.1 ) {
rawName = getPageName ( intMillimeters , isPortrait , METRIC _PAGE _NAMES ) ;
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
if ( rawName ) {
sizeInches = {
width : Math . round ( intMillimeters . width / 25.4 * 100 ) / 100 ,
height : Math . round ( intMillimeters . height / 25.4 * 100 ) / 100
} ;
sizeMillimeters = intMillimeters ;
}
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( rawName ) {
pageName = this . l10n . get ( "document_properties_page_size_name_" + rawName . toLowerCase ( ) , null , rawName ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return Promise . all ( [ this . _isNonMetricLocale ? sizeInches : sizeMillimeters , this . l10n . get ( "document_properties_page_size_unit_" + ( this . _isNonMetricLocale ? "inches" : "millimeters" ) , null , this . _isNonMetricLocale ? "in" : "mm" ) , pageName , this . l10n . get ( "document_properties_page_size_orientation_" + ( isPortrait ? "portrait" : "landscape" ) , null , isPortrait ? "portrait" : "landscape" ) ] ) . then ( ( [ {
width ,
height
} , unit , name , orientation ] ) => {
return this . l10n . get ( "document_properties_page_size_dimension_" + ( name ? "name_" : "" ) + "string" , {
width : width . toLocaleString ( ) ,
height : height . toLocaleString ( ) ,
unit ,
name ,
orientation
} , "{{width}} × {{height}} {{unit}} (" + ( name ? "{{name}}, " : "" ) + "{{orientation}})" ) ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async _parseDate ( inputDate ) {
const dateObject = _pdfjsLib . PDFDateString . toDateObject ( inputDate ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! dateObject ) {
return undefined ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return this . l10n . get ( "document_properties_date_string" , {
date : dateObject . toLocaleDateString ( ) ,
time : dateObject . toLocaleTimeString ( )
} , "{{date}}, {{time}}" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_parseLinearization ( isLinearized ) {
return this . l10n . get ( "document_properties_linearized_" + ( isLinearized ? "yes" : "no" ) , null , isLinearized ? "Yes" : "No" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . PDFDocumentProperties = PDFDocumentProperties ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 15 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFFindBar = void 0 ;
2021-03-25 17:57:40 +00:00
var _pdf _find _controller = _ _webpack _require _ _ ( 16 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const MATCHES _COUNT _LIMIT = 1000 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class PDFFindBar {
constructor ( options , eventBus , l10n = _ui _utils . NullL10n ) {
2019-04-13 13:02:01 +00:00
this . opened = false ;
this . bar = options . bar || null ;
this . toggleButton = options . toggleButton || null ;
this . findField = options . findField || null ;
this . highlightAll = options . highlightAllCheckbox || null ;
this . caseSensitive = options . caseSensitiveCheckbox || null ;
this . entireWord = options . entireWordCheckbox || null ;
this . findMsg = options . findMsg || null ;
this . findResultsCount = options . findResultsCount || null ;
this . findPreviousButton = options . findPreviousButton || null ;
this . findNextButton = options . findNextButton || null ;
this . eventBus = eventBus ;
this . l10n = l10n ;
2021-03-25 17:57:40 +00:00
this . toggleButton . addEventListener ( "click" , ( ) => {
this . toggle ( ) ;
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
this . findField . addEventListener ( "input" , ( ) => {
this . dispatchEvent ( "" ) ;
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
this . bar . addEventListener ( "keydown" , e => {
2019-04-13 13:02:01 +00:00
switch ( e . keyCode ) {
case 13 :
2021-03-25 17:57:40 +00:00
if ( e . target === this . findField ) {
this . dispatchEvent ( "again" , e . shiftKey ) ;
2019-04-13 13:02:01 +00:00
}
break ;
case 27 :
2021-03-25 17:57:40 +00:00
this . close ( ) ;
2019-04-13 13:02:01 +00:00
break ;
}
} ) ;
2021-03-25 17:57:40 +00:00
this . findPreviousButton . addEventListener ( "click" , ( ) => {
this . dispatchEvent ( "again" , true ) ;
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
this . findNextButton . addEventListener ( "click" , ( ) => {
this . dispatchEvent ( "again" , false ) ;
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
this . highlightAll . addEventListener ( "click" , ( ) => {
this . dispatchEvent ( "highlightallchange" ) ;
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
this . caseSensitive . addEventListener ( "click" , ( ) => {
this . dispatchEvent ( "casesensitivitychange" ) ;
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
this . entireWord . addEventListener ( "click" , ( ) => {
this . dispatchEvent ( "entirewordchange" ) ;
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "resize" , this . _adjustWidth . bind ( this ) ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
reset ( ) {
this . updateUIState ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
dispatchEvent ( type , findPrev ) {
this . eventBus . dispatch ( "find" , {
source : this ,
type ,
query : this . findField . value ,
phraseSearch : true ,
caseSensitive : this . caseSensitive . checked ,
entireWord : this . entireWord . checked ,
highlightAll : this . highlightAll . checked ,
findPrevious : findPrev
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
updateUIState ( state , previous , matchesCount ) {
let notFound = false ;
let findMsg = "" ;
let status = "" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
switch ( state ) {
case _pdf _find _controller . FindState . FOUND :
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case _pdf _find _controller . FindState . PENDING :
status = "pending" ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case _pdf _find _controller . FindState . NOT _FOUND :
findMsg = this . l10n . get ( "find_not_found" , null , "Phrase not found" ) ;
notFound = true ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case _pdf _find _controller . FindState . WRAPPED :
if ( previous ) {
findMsg = this . l10n . get ( "find_reached_top" , null , "Reached top of document, continued from bottom" ) ;
} else {
findMsg = this . l10n . get ( "find_reached_bottom" , null , "Reached end of document, continued from top" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
break ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . findField . classList . toggle ( "notFound" , notFound ) ;
this . findField . setAttribute ( "data-status" , status ) ;
Promise . resolve ( findMsg ) . then ( msg => {
this . findMsg . textContent = msg ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _adjustWidth ( ) ;
} ) ;
this . updateResultsCount ( matchesCount ) ;
}
updateResultsCount ( {
current = 0 ,
total = 0
} = { } ) {
if ( ! this . findResultsCount ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const limit = MATCHES _COUNT _LIMIT ;
let matchesCountMsg = "" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( total > 0 ) {
if ( total > limit ) {
matchesCountMsg = this . l10n . get ( "find_match_count_limit" , {
limit
} , "More than {{limit}} match" + ( limit !== 1 ? "es" : "" ) ) ;
} else {
matchesCountMsg = this . l10n . get ( "find_match_count" , {
current ,
total
} , "{{current}} of {{total}} match" + ( total !== 1 ? "es" : "" ) ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
Promise . resolve ( matchesCountMsg ) . then ( msg => {
this . findResultsCount . textContent = msg ;
this . findResultsCount . classList . toggle ( "hidden" , ! total ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _adjustWidth ( ) ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
open ( ) {
if ( ! this . opened ) {
this . opened = true ;
this . toggleButton . classList . add ( "toggled" ) ;
this . bar . classList . remove ( "hidden" ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . findField . select ( ) ;
this . findField . focus ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _adjustWidth ( ) ;
}
close ( ) {
if ( ! this . opened ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . opened = false ;
this . toggleButton . classList . remove ( "toggled" ) ;
this . bar . classList . add ( "hidden" ) ;
this . eventBus . dispatch ( "findbarclose" , {
source : this
} ) ;
}
toggle ( ) {
if ( this . opened ) {
this . close ( ) ;
} else {
this . open ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
_adjustWidth ( ) {
if ( ! this . opened ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . bar . classList . remove ( "wrapContainers" ) ;
const findbarHeight = this . bar . clientHeight ;
const inputContainerHeight = this . bar . firstElementChild . clientHeight ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( findbarHeight > inputContainerHeight ) {
this . bar . classList . add ( "wrapContainers" ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . PDFFindBar = PDFFindBar ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 16 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFFindController = exports . FindState = void 0 ;
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _find _utils = _ _webpack _require _ _ ( 17 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const FindState = {
2019-04-13 13:02:01 +00:00
FOUND : 0 ,
NOT _FOUND : 1 ,
WRAPPED : 2 ,
PENDING : 3
} ;
exports . FindState = FindState ;
2021-03-25 17:57:40 +00:00
const FIND _TIMEOUT = 250 ;
const MATCH _SCROLL _OFFSET _TOP = - 50 ;
const MATCH _SCROLL _OFFSET _LEFT = - 400 ;
const CHARACTERS _TO _NORMALIZE = {
"\u2018" : "'" ,
"\u2019" : "'" ,
"\u201A" : "'" ,
"\u201B" : "'" ,
2019-04-13 13:02:01 +00:00
"\u201C" : '"' ,
"\u201D" : '"' ,
"\u201E" : '"' ,
"\u201F" : '"' ,
2021-03-25 17:57:40 +00:00
"\u00BC" : "1/4" ,
"\u00BD" : "1/2" ,
"\u00BE" : "3/4"
2019-04-13 13:02:01 +00:00
} ;
2021-03-25 17:57:40 +00:00
let normalizationRegex = null ;
2019-04-13 13:02:01 +00:00
function normalize ( text ) {
if ( ! normalizationRegex ) {
2021-03-25 17:57:40 +00:00
const replace = Object . keys ( CHARACTERS _TO _NORMALIZE ) . join ( "" ) ;
normalizationRegex = new RegExp ( ` [ ${ replace } ] ` , "g" ) ;
2019-04-13 13:02:01 +00:00
}
return text . replace ( normalizationRegex , function ( ch ) {
return CHARACTERS _TO _NORMALIZE [ ch ] ;
} ) ;
}
2021-03-25 17:57:40 +00:00
class PDFFindController {
constructor ( {
linkService ,
eventBus
} ) {
2019-04-13 13:02:01 +00:00
this . _linkService = linkService ;
this . _eventBus = eventBus ;
this . _reset ( ) ;
2021-03-25 17:57:40 +00:00
eventBus . _on ( "findbarclose" , this . _onFindBarClose . bind ( this ) ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
get highlightMatches ( ) {
return this . _highlightMatches ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get pageMatches ( ) {
return this . _pageMatches ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get pageMatchesLength ( ) {
return this . _pageMatchesLength ;
}
get selected ( ) {
return this . _selected ;
}
get state ( ) {
return this . _state ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setDocument ( pdfDocument ) {
if ( this . _pdfDocument ) {
this . _reset ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( ! pdfDocument ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _pdfDocument = pdfDocument ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _firstPageCapability . resolve ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
executeCommand ( cmd , state ) {
if ( ! state ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const pdfDocument = this . _pdfDocument ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _state === null || this . _shouldDirtyMatch ( cmd , state ) ) {
this . _dirtyMatch = true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _state = state ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( cmd !== "findhighlightallchange" ) {
this . _updateUIState ( FindState . PENDING ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _firstPageCapability . promise . then ( ( ) => {
if ( ! this . _pdfDocument || pdfDocument && this . _pdfDocument !== pdfDocument ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _extractText ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const findbarClosed = ! this . _highlightMatches ;
const pendingTimeout = ! ! this . _findTimeout ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( findbarClosed && this . _state . highlightAll ) {
this . _updateAllPages ( ) ;
}
} else if ( cmd === "findhighlightallchange" ) {
if ( pendingTimeout ) {
this . _nextMatch ( ) ;
2019-04-13 13:02:01 +00:00
} else {
2021-03-25 17:57:40 +00:00
this . _highlightMatches = true ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _updateAllPages ( ) ;
} else {
this . _nextMatch ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 . _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 ) ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get _query ( ) {
if ( this . _state . query !== this . _rawQuery ) {
this . _rawQuery = this . _state . query ;
this . _normalizedQuery = normalize ( this . _state . query ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return this . _normalizedQuery ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_shouldDirtyMatch ( cmd , state ) {
if ( state . query !== this . _state . query ) {
2019-04-13 13:02:01 +00:00
return true ;
}
2021-03-25 17:57:40 +00:00
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 ) ) {
2019-04-13 13:02:01 +00:00
return true ;
}
2021-03-25 17:57:40 +00:00
return false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case "findhighlightallchange" :
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_prepareMatches ( matchesWithLength , matches , matchesLength ) {
function isSubTerm ( currentIndex ) {
const currentElem = matchesWithLength [ currentIndex ] ;
const nextElem = matchesWithLength [ currentIndex + 1 ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( currentIndex < matchesWithLength . length - 1 && currentElem . match === nextElem . match ) {
currentElem . skipped = true ;
return true ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
for ( let i = currentIndex - 1 ; i >= 0 ; i -- ) {
const prevElem = matchesWithLength [ i ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( prevElem . skipped ) {
2019-04-13 13:02:01 +00:00
continue ;
}
2021-03-25 17:57:40 +00:00
if ( prevElem . match + prevElem . matchLength < currentElem . match ) {
break ;
}
if ( prevElem . match + prevElem . matchLength >= currentElem . match + currentElem . matchLength ) {
currentElem . skipped = true ;
return true ;
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return false ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
matches . push ( matchesWithLength [ i ] . match ) ;
matchesLength . push ( matchesWithLength [ i ] . matchLength ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_isEntireWord ( content , startIdx , length ) {
if ( startIdx > 0 ) {
const first = content . charCodeAt ( startIdx ) ;
const limit = content . charCodeAt ( startIdx - 1 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ( 0 , _pdf _find _utils . getCharacterType ) ( first ) === ( 0 , _pdf _find _utils . getCharacterType ) ( limit ) ) {
return false ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return true ;
}
_calculatePhraseMatch ( query , pageIndex , pageContent , entireWord ) {
const matches = [ ] ;
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 ;
}
matches . push ( matchIdx ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _pageMatches [ pageIndex ] = matches ;
}
_calculateWordMatch ( query , pageIndex , pageContent , 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 ;
2019-04-13 13:02:01 +00:00
while ( true ) {
2021-03-25 17:57:40 +00:00
matchIdx = pageContent . indexOf ( subquery , matchIdx + subqueryLen ) ;
2019-04-13 13:02:01 +00:00
if ( matchIdx === - 1 ) {
break ;
}
2021-03-25 17:57:40 +00:00
if ( entireWord && ! this . _isEntireWord ( pageContent , matchIdx , subqueryLen ) ) {
2019-04-13 13:02:01 +00:00
continue ;
}
2021-03-25 17:57:40 +00:00
matchesWithLength . push ( {
match : matchIdx ,
matchLength : subqueryLen ,
skipped : false
} ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
this . _pageMatchesLength [ pageIndex ] = [ ] ;
this . _pageMatches [ pageIndex ] = [ ] ;
this . _prepareMatches ( matchesWithLength , this . _pageMatches [ pageIndex ] , this . _pageMatchesLength [ pageIndex ] ) ;
}
_calculateMatch ( pageIndex ) {
let pageContent = this . _pageContents [ pageIndex ] ;
let query = this . _query ;
const {
caseSensitive ,
entireWord ,
phraseSearch
} = this . _state ;
if ( query . length === 0 ) {
return ;
}
if ( ! caseSensitive ) {
pageContent = pageContent . toLowerCase ( ) ;
query = query . toLowerCase ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( phraseSearch ) {
this . _calculatePhraseMatch ( query , pageIndex , pageContent , entireWord ) ;
} else {
this . _calculateWordMatch ( query , pageIndex , pageContent , entireWord ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( this . _state . highlightAll ) {
this . _updatePage ( pageIndex ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _resumePageIdx === pageIndex ) {
this . _resumePageIdx = null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _nextPageMatch ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const pageMatchesCount = this . _pageMatches [ pageIndex ] . length ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( pageMatchesCount > 0 ) {
this . _matchesCountTotal += pageMatchesCount ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateUIResultsCount ( ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_extractText ( ) {
if ( this . _extractTextPromises . length > 0 ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
let promise = Promise . resolve ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 = [ ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let j = 0 , jj = textItems . length ; j < jj ; j ++ ) {
strBuf . push ( textItems [ j ] . str ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _pageContents [ i ] = normalize ( strBuf . join ( "" ) ) ;
extractTextCapability . resolve ( i ) ;
} , reason => {
console . error ( ` Unable to get text content for page ${ i + 1 } ` , reason ) ;
this . _pageContents [ i ] = "" ;
extractTextCapability . resolve ( i ) ;
} ) ;
} ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updatePage ( index ) {
if ( this . _scrollMatches && this . _selected . pageIdx === index ) {
this . _linkService . page = index + 1 ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _eventBus . dispatch ( "updatetextlayermatches" , {
source : this ,
pageIndex : index
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updateAllPages ( ) {
this . _eventBus . dispatch ( "updatetextlayermatches" , {
source : this ,
pageIndex : - 1
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_nextMatch ( ) {
const previous = this . _state . findPrevious ;
const currentPageIndex = this . _linkService . page - 1 ;
const numPages = this . _linkService . pagesCount ;
this . _highlightMatches = true ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateAllPages ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let i = 0 ; i < numPages ; i ++ ) {
if ( this . _pendingFindMatches [ i ] === true ) {
continue ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _pendingFindMatches [ i ] = true ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _extractTextPromises [ i ] . then ( pageIdx => {
delete this . _pendingFindMatches [ pageIdx ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _calculateMatch ( pageIdx ) ;
2019-04-13 13:02:01 +00:00
} ) ;
}
}
2021-03-25 17:57:40 +00:00
if ( this . _query === "" ) {
this . _updateUIState ( FindState . FOUND ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _resumePageIdx ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const offset = this . _offset ;
this . _pagesToSearch = numPages ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( offset . matchIdx !== null ) {
const numPageMatches = this . _pageMatches [ offset . pageIdx ] . length ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! previous && offset . matchIdx + 1 < numPageMatches || previous && offset . matchIdx > 0 ) {
offset . matchIdx = previous ? offset . matchIdx - 1 : offset . matchIdx + 1 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateMatch ( true ) ;
2019-04-13 13:02:01 +00:00
return ;
}
2021-03-25 17:57:40 +00:00
this . _advanceOffsetPage ( previous ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _nextPageMatch ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_matchesReady ( matches ) {
const offset = this . _offset ;
const numMatches = matches . length ;
const previous = this . _state . findPrevious ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( numMatches ) {
offset . matchIdx = previous ? numMatches - 1 : 0 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateMatch ( true ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return true ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _advanceOffsetPage ( previous ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( offset . wrapped ) {
offset . matchIdx = null ;
if ( this . _pagesToSearch < 0 ) {
this . _updateMatch ( false ) ;
2019-04-13 13:02:01 +00:00
return true ;
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_nextPageMatch ( ) {
if ( this . _resumePageIdx !== null ) {
console . error ( "There can only be one pending page." ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let matches = null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
do {
const pageIdx = this . _offset . pageIdx ;
matches = this . _pageMatches [ pageIdx ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! matches ) {
this . _resumePageIdx = pageIdx ;
break ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
} while ( ! this . _matchesReady ( matches ) ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_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 -- ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( offset . pageIdx >= numPages || offset . pageIdx < 0 ) {
offset . pageIdx = previous ? numPages - 1 : 0 ;
offset . wrapped = true ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updateMatch ( found = false ) {
let state = FindState . NOT _FOUND ;
const wrapped = this . _offset . wrapped ;
this . _offset . wrapped = false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateUIState ( state , this . _state . findPrevious ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _selected . pageIdx !== - 1 ) {
this . _scrollMatches = true ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updatePage ( this . _selected . pageIdx ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_onFindBarClose ( evt ) {
const pdfDocument = this . _pdfDocument ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _firstPageCapability . promise . then ( ( ) => {
if ( ! this . _pdfDocument || pdfDocument && this . _pdfDocument !== pdfDocument ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _findTimeout ) {
clearTimeout ( this . _findTimeout ) ;
this . _findTimeout = null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _resumePageIdx ) {
this . _resumePageIdx = null ;
this . _dirtyMatch = true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateUIState ( FindState . FOUND ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _highlightMatches = false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateAllPages ( ) ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_requestMatchesCount ( ) {
const {
pageIdx ,
matchIdx
} = this . _selected ;
let current = 0 ,
total = this . _matchesCountTotal ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( matchIdx !== - 1 ) {
for ( let i = 0 ; i < pageIdx ; i ++ ) {
current += this . _pageMatches [ i ] && this . _pageMatches [ i ] . length || 0 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
current += matchIdx + 1 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( current < 1 || current > total ) {
current = total = 0 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
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 ? this . _state . query : null
} ) ;
}
}
2019-04-13 13:02:01 +00:00
exports . PDFFindController = PDFFindController ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 17 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . getCharacterType = getCharacterType ;
exports . CharacterType = void 0 ;
2021-03-25 17:57:40 +00:00
const CharacterType = {
2019-04-13 13:02:01 +00:00
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 ) {
2021-03-25 17:57:40 +00:00
return charCode < 0x2e80 ;
2019-04-13 13:02:01 +00:00
}
function isAscii ( charCode ) {
2021-03-25 17:57:40 +00:00
return ( charCode & 0xff80 ) === 0 ;
2019-04-13 13:02:01 +00:00
}
function isAsciiAlpha ( charCode ) {
2021-03-25 17:57:40 +00:00
return charCode >= 0x61 && charCode <= 0x7a || charCode >= 0x41 && charCode <= 0x5a ;
2019-04-13 13:02:01 +00:00
}
function isAsciiDigit ( charCode ) {
return charCode >= 0x30 && charCode <= 0x39 ;
}
function isAsciiSpace ( charCode ) {
2021-03-25 17:57:40 +00:00
return charCode === 0x20 || charCode === 0x09 || charCode === 0x0d || charCode === 0x0a ;
2019-04-13 13:02:01 +00:00
}
function isHan ( charCode ) {
2021-03-25 17:57:40 +00:00
return charCode >= 0x3400 && charCode <= 0x9fff || charCode >= 0xf900 && charCode <= 0xfaff ;
2019-04-13 13:02:01 +00:00
}
function isKatakana ( charCode ) {
2021-03-25 17:57:40 +00:00
return charCode >= 0x30a0 && charCode <= 0x30ff ;
2019-04-13 13:02:01 +00:00
}
function isHiragana ( charCode ) {
2021-03-25 17:57:40 +00:00
return charCode >= 0x3040 && charCode <= 0x309f ;
2019-04-13 13:02:01 +00:00
}
function isHalfwidthKatakana ( charCode ) {
2021-03-25 17:57:40 +00:00
return charCode >= 0xff60 && charCode <= 0xff9f ;
2019-04-13 13:02:01 +00:00
}
function isThai ( charCode ) {
2021-03-25 17:57:40 +00:00
return ( charCode & 0xff80 ) === 0x0e00 ;
2019-04-13 13:02:01 +00:00
}
function getCharacterType ( charCode ) {
if ( isAlphabeticalScript ( charCode ) ) {
if ( isAscii ( charCode ) ) {
if ( isAsciiSpace ( charCode ) ) {
return CharacterType . SPACE ;
2021-03-25 17:57:40 +00:00
} else if ( isAsciiAlpha ( charCode ) || isAsciiDigit ( charCode ) || charCode === 0x5f ) {
2019-04-13 13:02:01 +00:00
return CharacterType . ALPHA _LETTER ;
}
return CharacterType . PUNCT ;
} else if ( isThai ( charCode ) ) {
return CharacterType . THAI _LETTER ;
2021-03-25 17:57:40 +00:00
} else if ( charCode === 0xa0 ) {
2019-04-13 13:02:01 +00:00
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 ;
}
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 18 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . isDestHashesEqual = isDestHashesEqual ;
exports . isDestArraysEqual = isDestArraysEqual ;
exports . PDFHistory = void 0 ;
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
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 . active || evt . switchInProgress ;
} ) ;
this . eventBus . _on ( "pagesinit" , ( ) => {
this . _isPagesLoaded = false ;
const onPagesLoaded = evt => {
this . eventBus . _off ( "pagesloaded" , onPagesLoaded ) ;
this . _isPagesLoaded = ! ! evt . pagesCount ;
} ;
this . eventBus . _on ( "pagesloaded" , onPagesLoaded ) ;
} ) ;
}
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 ( this . _uid > this . _maxUid ) {
this . _maxUid = this . _uid ;
}
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 ( ! ( Number . isInteger ( pageNumber ) && pageNumber > 0 && pageNumber <= this . linkService . pagesCount ) ) {
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 ;
} ) ;
}
}
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 ( ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
forward ( ) {
if ( ! this . _initialized || this . _popStateInProgress ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const state = window . history . state ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _isValidState ( state ) && state . uid < this . _maxUid ) {
window . history . forward ( ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get popStateInProgress ( ) {
return this . _initialized && ( this . _popStateInProgress || this . _blockHashChange > 0 ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get initialBookmark ( ) {
return this . _initialized ? this . _initialBookmark : null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get initialRotation ( ) {
return this . _initialized ? this . _initialRotation : null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_pushOrReplaceState ( destination , forceReplace = false ) {
const shouldReplace = forceReplace || ! this . _destination ;
const newState = {
fingerprint : this . _fingerprint ,
uid : shouldReplace ? this . _uid : this . _uid + 1 ,
destination
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateInternalState ( destination , newState . uid ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let newUrl ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _updateUrl && destination && destination . hash ) {
const baseUrl = document . location . href . split ( "#" ) [ 0 ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! baseUrl . startsWith ( "file://" ) ) {
newUrl = ` ${ baseUrl } # ${ destination . hash } ` ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( shouldReplace ) {
window . history . replaceState ( newState , "" , newUrl ) ;
} else {
this . _maxUid = this . _uid ;
window . history . pushState ( newState , "" , newUrl ) ;
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
_tryPushCurrentPosition ( temporary = false ) {
if ( ! this . _position ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let position = this . _position ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( temporary ) {
position = Object . assign ( Object . create ( null ) , this . _position ) ;
position . temporary = true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . _destination ) {
this . _pushOrReplaceState ( position ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let forceReplace = false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _destination . page >= position . first && this . _destination . page <= position . page ) {
if ( this . _destination . dest || ! this . _destination . first ) {
2019-04-13 13:02:01 +00:00
return ;
}
2021-03-25 17:57:40 +00:00
forceReplace = true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _pushOrReplaceState ( position , forceReplace ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_isValidState ( state , checkReload = false ) {
if ( ! state ) {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( state . fingerprint !== this . _fingerprint ) {
if ( checkReload ) {
if ( typeof state . fingerprint !== "string" || state . fingerprint . length !== this . _fingerprint . length ) {
return false ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const [ perfEntry ] = performance . getEntriesByType ( "navigation" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! perfEntry || perfEntry . type !== "reload" ) {
return false ;
}
} else {
return false ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! Number . isInteger ( state . uid ) || state . uid < 0 ) {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( state . destination === null || typeof state . destination !== "object" ) {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updateInternalState ( destination , uid , removeTemporary = false ) {
if ( this . _updateViewareaTimeout ) {
clearTimeout ( this . _updateViewareaTimeout ) ;
this . _updateViewareaTimeout = null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( removeTemporary && destination && destination . temporary ) {
delete destination . temporary ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _destination = destination ;
this . _uid = uid ;
this . _numPositionUpdates = 0 ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_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 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! ( Number . isInteger ( page ) && page > 0 && page <= this . linkService . pagesCount ) || checkNameddest && nameddest . length > 0 ) {
page = null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return {
hash ,
page ,
rotation : this . linkService . rotation
} ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updateViewarea ( {
location
} ) {
if ( this . _updateViewareaTimeout ) {
clearTimeout ( this . _updateViewareaTimeout ) ;
this . _updateViewareaTimeout = null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _position = {
hash : this . _isViewerInPresentationMode ? ` page= ${ location . pageNumber } ` : location . pdfOpenParams . substring ( 1 ) ,
page : this . linkService . page ,
first : location . pageNumber ,
rotation : location . rotation
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _updateViewareaTimeout = null ;
} , UPDATE _VIEWAREA _TIMEOUT ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_popState ( {
state
} ) {
const newHash = getCurrentHash ( ) ,
hashChanged = this . _currentHash !== newHash ;
this . _currentHash = newHash ;
if ( ! state ) {
this . _uid ++ ;
const {
hash ,
page ,
rotation
} = this . _parseCurrentHash ( ) ;
2019-04-13 13:02:01 +00:00
this . _pushOrReplaceState ( {
2021-03-25 17:57:40 +00:00
hash ,
page ,
rotation
} , true ) ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( ! this . _isValidState ( state ) ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _popStateInProgress = true ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( hashChanged ) {
this . _blockHashChange ++ ;
( 0 , _ui _utils . waitOnEventOrTimeout ) ( {
target : window ,
name : "hashchange" ,
delay : HASH _CHANGE _TIMEOUT
} ) . then ( ( ) => {
this . _blockHashChange -- ;
} ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const destination = state . destination ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateInternalState ( destination , state . uid , true ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _uid > this . _maxUid ) {
this . _maxUid = this . _uid ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ( 0 , _ui _utils . isValidRotation ) ( destination . rotation ) ) {
this . linkService . rotation = destination . rotation ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( destination . dest ) {
this . linkService . navigateTo ( destination . dest ) ;
} else if ( destination . hash ) {
this . linkService . setHash ( destination . hash ) ;
} else if ( destination . page ) {
this . linkService . page = destination . page ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
Promise . resolve ( ) . then ( ( ) => {
this . _popStateInProgress = false ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_pageHide ( ) {
if ( ! this . _destination || this . _destination . temporary ) {
this . _tryPushCurrentPosition ( ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_bindEvents ( ) {
if ( this . _boundEvents ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _boundEvents = {
updateViewarea : this . _updateViewarea . bind ( this ) ,
popState : this . _popState . bind ( this ) ,
pageHide : this . _pageHide . bind ( this )
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "updateviewarea" , this . _boundEvents . updateViewarea ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
window . addEventListener ( "popstate" , this . _boundEvents . popState ) ;
window . addEventListener ( "pagehide" , this . _boundEvents . pageHide ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_unbindEvents ( ) {
if ( ! this . _boundEvents ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _off ( "updateviewarea" , this . _boundEvents . updateViewarea ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
window . removeEventListener ( "popstate" , this . _boundEvents . popState ) ;
window . removeEventListener ( "pagehide" , this . _boundEvents . pageHide ) ;
this . _boundEvents = null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
exports . PDFHistory = PDFHistory ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
function isDestHashesEqual ( destHash , pushHash ) {
if ( typeof destHash !== "string" || typeof pushHash !== "string" ) {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( destHash === pushHash ) {
return true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const {
nameddest
} = ( 0 , _ui _utils . parseQueryString ) ( destHash ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( nameddest === pushHash ) {
return true ;
}
return false ;
}
function isDestArraysEqual ( firstDest , secondDest ) {
function isEntryEqual ( first , second ) {
if ( typeof first !== typeof second ) {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( Array . isArray ( first ) || Array . isArray ( second ) ) {
return false ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( first !== null && typeof first === "object" && second !== null ) {
if ( Object . keys ( first ) . length !== Object . keys ( second ) . length ) {
2019-04-13 13:02:01 +00:00
return false ;
}
2021-03-25 17:57:40 +00:00
for ( const key in first ) {
if ( ! isEntryEqual ( first [ key ] , second [ key ] ) ) {
2019-04-13 13:02:01 +00:00
return false ;
}
}
return true ;
}
2021-03-25 17:57:40 +00:00
return first === second || Number . isNaN ( first ) && Number . isNaN ( second ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! ( Array . isArray ( firstDest ) && Array . isArray ( secondDest ) ) ) {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( firstDest . length !== secondDest . length ) {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let i = 0 , ii = firstDest . length ; i < ii ; i ++ ) {
if ( ! isEntryEqual ( firstDest [ i ] , secondDest [ i ] ) ) {
return false ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
/***/ } ) ,
/* 19 */
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
"use strict" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFLayerViewer = void 0 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _base _tree _viewer = _ _webpack _require _ _ ( 13 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class PDFLayerViewer extends _base _tree _viewer . BaseTreeViewer {
constructor ( options ) {
super ( options ) ;
this . l10n = options . l10n ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "resetlayers" , this . _resetLayers . bind ( this ) ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "togglelayerstree" , this . _toggleAllTreeItems . bind ( this ) ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
reset ( ) {
super . reset ( ) ;
this . _optionalContentConfig = null ;
this . _pdfDocument = null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_dispatchEvent ( layersCount ) {
this . eventBus . dispatch ( "layersloaded" , {
source : this ,
layersCount
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_bindLink ( element , {
groupId ,
input
} ) {
const setVisibility = ( ) => {
this . _optionalContentConfig . setVisibility ( groupId , input . checked ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . dispatch ( "optionalcontentconfig" , {
source : this ,
promise : Promise . resolve ( this . _optionalContentConfig )
} ) ;
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
element . onclick = evt => {
if ( evt . target === input ) {
setVisibility ( ) ;
return true ;
} else if ( evt . target !== element ) {
return true ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
input . checked = ! input . checked ;
setVisibility ( ) ;
return false ;
} ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async _setNestedName ( element , {
name = null
} ) {
if ( typeof name === "string" ) {
element . textContent = this . _normalizeTextContent ( name ) ;
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
element . textContent = await this . l10n . get ( "additional_layers" , null , "Additional Layers" ) ;
element . style . fontStyle = "italic" ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_addToggleButton ( div , {
name = null
} ) {
super . _addToggleButton ( div , name === null ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_toggleAllTreeItems ( ) {
if ( ! this . _optionalContentConfig ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
super . _toggleAllTreeItems ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
render ( {
optionalContentConfig ,
pdfDocument
} ) {
if ( this . _optionalContentConfig ) {
this . reset ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _optionalContentConfig = optionalContentConfig || null ;
this . _pdfDocument = pdfDocument || null ;
const groups = optionalContentConfig && optionalContentConfig . getOrder ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! groups ) {
this . _dispatchEvent ( 0 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const fragment = document . createDocumentFragment ( ) ,
queue = [ {
parent : fragment ,
groups
} ] ;
let layersCount = 0 ,
hasAnyNesting = false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
while ( queue . length > 0 ) {
const levelData = queue . shift ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( const groupId of levelData . groups ) {
const div = document . createElement ( "div" ) ;
div . className = "treeItem" ;
const element = document . createElement ( "a" ) ;
div . appendChild ( element ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( typeof groupId === "object" ) {
hasAnyNesting = true ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _addToggleButton ( div , groupId ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _setNestedName ( element , groupId ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const itemsDiv = document . createElement ( "div" ) ;
itemsDiv . className = "treeItems" ;
div . appendChild ( itemsDiv ) ;
queue . push ( {
parent : itemsDiv ,
groups : groupId . order
} ) ;
} else {
const group = optionalContentConfig . getGroup ( groupId ) ;
const input = document . createElement ( "input" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _bindLink ( element , {
groupId ,
input
} ) ;
input . type = "checkbox" ;
input . id = groupId ;
input . checked = group . visible ;
const label = document . createElement ( "label" ) ;
label . setAttribute ( "for" , groupId ) ;
label . textContent = this . _normalizeTextContent ( group . name ) ;
element . appendChild ( input ) ;
element . appendChild ( label ) ;
layersCount ++ ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
levelData . parent . appendChild ( div ) ;
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( hasAnyNesting ) {
this . container . classList . add ( "treeWithDeepNesting" ) ;
this . _lastToggleIsShow = fragment . querySelectorAll ( ".treeItemsHidden" ) . length === 0 ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . container . appendChild ( fragment ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _dispatchEvent ( layersCount ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
async _resetLayers ( ) {
if ( ! this . _optionalContentConfig ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const optionalContentConfig = await this . _pdfDocument . getOptionalContentConfig ( ) ;
this . eventBus . dispatch ( "optionalcontentconfig" , {
source : this ,
promise : Promise . resolve ( optionalContentConfig )
} ) ;
this . render ( {
optionalContentConfig ,
pdfDocument : this . _pdfDocument
} ) ;
2019-04-13 13:02:01 +00:00
}
}
2021-03-25 17:57:40 +00:00
exports . PDFLayerViewer = PDFLayerViewer ;
2019-04-13 13:02:01 +00:00
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 20 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . SimpleLinkService = exports . PDFLinkService = void 0 ;
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class PDFLinkService {
constructor ( {
eventBus ,
externalLinkTarget = null ,
externalLinkRel = null ,
externalLinkEnabled = true ,
ignoreDestinationZoom = false
} = { } ) {
this . eventBus = eventBus ;
2019-04-13 13:02:01 +00:00
this . externalLinkTarget = externalLinkTarget ;
this . externalLinkRel = externalLinkRel ;
2021-03-25 17:57:40 +00:00
this . externalLinkEnabled = externalLinkEnabled ;
this . _ignoreDestinationZoom = ignoreDestinationZoom ;
2019-04-13 13:02:01 +00:00
this . baseUrl = null ;
this . pdfDocument = null ;
this . pdfViewer = null ;
this . pdfHistory = null ;
this . _pagesRefCache = null ;
}
2021-03-25 17:57:40 +00:00
setDocument ( pdfDocument , baseUrl = null ) {
this . baseUrl = baseUrl ;
this . pdfDocument = pdfDocument ;
this . _pagesRefCache = Object . create ( null ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setViewer ( pdfViewer ) {
this . pdfViewer = pdfViewer ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setHistory ( pdfHistory ) {
this . pdfHistory = pdfHistory ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get pagesCount ( ) {
return this . pdfDocument ? this . pdfDocument . numPages : 0 ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get page ( ) {
return this . pdfViewer . currentPageNumber ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
set page ( value ) {
this . pdfViewer . currentPageNumber = value ;
}
get rotation ( ) {
return this . pdfViewer . pagesRotation ;
}
set rotation ( value ) {
this . pdfViewer . pagesRotation = value ;
}
navigateTo ( dest ) {
const goToDestination = ( {
namedDest ,
explicitDest
} ) => {
const destRef = explicitDest [ 0 ] ;
let pageNumber ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( destRef instanceof Object ) {
pageNumber = this . _cachedPageNumber ( destRef ) ;
if ( pageNumber === null ) {
this . pdfDocument . getPageIndex ( destRef ) . then ( pageIndex => {
this . cachePageRef ( pageIndex + 1 , destRef ) ;
goToDestination ( {
namedDest ,
explicitDest
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
} ) . catch ( ( ) => {
console . error ( ` PDFLinkService.navigateTo: " ${ destRef } " is not ` + ` a valid page reference, for dest=" ${ dest } ". ` ) ;
2019-04-13 13:02:01 +00:00
} ) ;
return ;
}
2021-03-25 17:57:40 +00:00
} else if ( Number . isInteger ( destRef ) ) {
pageNumber = destRef + 1 ;
} else {
console . error ( ` PDFLinkService.navigateTo: " ${ destRef } " is not ` + ` a valid destination reference, for dest=" ${ dest } ". ` ) ;
return ;
}
if ( ! pageNumber || pageNumber < 1 || pageNumber > this . pagesCount ) {
console . error ( ` PDFLinkService.navigateTo: " ${ pageNumber } " is not ` + ` a valid page number, for dest=" ${ dest } ". ` ) ;
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . pdfHistory ) {
this . pdfHistory . pushCurrentPosition ( ) ;
this . pdfHistory . push ( {
namedDest ,
explicitDest ,
pageNumber
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . pdfViewer . scrollPageIntoView ( {
pageNumber ,
destArray : explicitDest ,
ignoreDestinationZoom : this . _ignoreDestinationZoom
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
} ;
new Promise ( ( resolve , reject ) => {
if ( typeof dest === "string" ) {
this . pdfDocument . getDestination ( dest ) . then ( destArray => {
resolve ( {
namedDest : dest ,
explicitDest : destArray
} ) ;
} ) ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
resolve ( {
namedDest : "" ,
explicitDest : dest
} ) ;
} ) . then ( data => {
if ( ! Array . isArray ( data . explicitDest ) ) {
console . error ( ` PDFLinkService.navigateTo: " ${ data . explicitDest } " is ` + ` not a valid destination array, for dest=" ${ dest } ". ` ) ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
goToDestination ( data ) ;
} ) ;
}
getDestinationHash ( dest ) {
if ( typeof dest === "string" ) {
return this . getAnchorUrl ( "#" + escape ( dest ) ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( Array . isArray ( dest ) ) {
const str = JSON . stringify ( dest ) ;
return this . getAnchorUrl ( "#" + escape ( str ) ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return this . getAnchorUrl ( "" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
getAnchorUrl ( anchor ) {
return ( this . baseUrl || "" ) + anchor ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setHash ( hash ) {
let pageNumber , dest ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( hash . includes ( "=" ) ) {
const params = ( 0 , _ui _utils . parseQueryString ) ( hash ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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" ) {
2019-04-13 13:02:01 +00:00
dest = [ null , {
2021-03-25 17:57:40 +00:00
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 {
2019-04-13 13:02:01 +00:00
dest = [ null , {
name : zoomArg
2021-03-25 17:57:40 +00:00
} , zoomArgs [ 1 ] | 0 , zoomArgs [ 2 ] | 0 , zoomArgs [ 3 ] | 0 , zoomArgs [ 4 ] | 0 ] ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
} else {
console . error ( ` PDFLinkService.setHash: " ${ zoomArg } " is not ` + "a valid zoom value." ) ;
2019-04-13 13:02:01 +00:00
}
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( dest ) {
this . pdfViewer . scrollPageIntoView ( {
pageNumber : pageNumber || this . page ,
destArray : dest ,
allowNegativeOffset : true
} ) ;
} else if ( pageNumber ) {
this . page = pageNumber ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "pagemode" in params ) {
this . eventBus . dispatch ( "pagemode" , {
source : this ,
mode : params . pagemode
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "nameddest" in params ) {
this . navigateTo ( params . nameddest ) ;
}
} else {
dest = unescape ( hash ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
try {
dest = JSON . parse ( dest ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! Array . isArray ( dest ) ) {
dest = dest . toString ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
} catch ( ex ) { }
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( typeof dest === "string" || isValidExplicitDestination ( dest ) ) {
this . navigateTo ( dest ) ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
console . error ( ` PDFLinkService.setHash: " ${ unescape ( hash ) } " is not ` + "a valid destination." ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
executeNamedAction ( action ) {
switch ( action ) {
case "GoBack" :
if ( this . pdfHistory ) {
this . pdfHistory . back ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case "GoForward" :
if ( this . pdfHistory ) {
this . pdfHistory . forward ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case "NextPage" :
if ( this . page < this . pagesCount ) {
this . page ++ ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case "PrevPage" :
if ( this . page > 1 ) {
this . page -- ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case "LastPage" :
this . page = this . pagesCount ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case "FirstPage" :
this . page = 1 ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
default :
break ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . eventBus . dispatch ( "namedaction" , {
source : this ,
action
} ) ;
}
cachePageRef ( pageNum , pageRef ) {
if ( ! pageRef ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
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 && this . _pagesRefCache [ refStr ] || null ;
}
isPageVisible ( pageNumber ) {
return this . pdfViewer . isPageVisible ( pageNumber ) ;
}
}
2019-04-13 13:02:01 +00:00
exports . PDFLinkService = PDFLinkService ;
function isValidExplicitDestination ( dest ) {
if ( ! Array . isArray ( dest ) ) {
return false ;
}
2021-03-25 17:57:40 +00:00
const destLength = dest . length ;
2019-04-13 13:02:01 +00:00
if ( destLength < 2 ) {
return false ;
}
2021-03-25 17:57:40 +00:00
const page = dest [ 0 ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! ( typeof page === "object" && Number . isInteger ( page . num ) && Number . isInteger ( page . gen ) ) && ! ( Number . isInteger ( page ) && page >= 0 ) ) {
2019-04-13 13:02:01 +00:00
return false ;
}
2021-03-25 17:57:40 +00:00
const zoom = dest [ 1 ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! ( typeof zoom === "object" && typeof zoom . name === "string" ) ) {
2019-04-13 13:02:01 +00:00
return false ;
}
2021-03-25 17:57:40 +00:00
let allowNull = true ;
2019-04-13 13:02:01 +00:00
switch ( zoom . name ) {
2021-03-25 17:57:40 +00:00
case "XYZ" :
2019-04-13 13:02:01 +00:00
if ( destLength !== 5 ) {
return false ;
}
break ;
2021-03-25 17:57:40 +00:00
case "Fit" :
case "FitB" :
2019-04-13 13:02:01 +00:00
return destLength === 2 ;
2021-03-25 17:57:40 +00:00
case "FitH" :
case "FitBH" :
case "FitV" :
case "FitBV" :
2019-04-13 13:02:01 +00:00
if ( destLength !== 3 ) {
return false ;
}
break ;
2021-03-25 17:57:40 +00:00
case "FitR" :
2019-04-13 13:02:01 +00:00
if ( destLength !== 6 ) {
return false ;
}
allowNull = false ;
break ;
default :
return false ;
}
2021-03-25 17:57:40 +00:00
for ( let i = 2 ; i < destLength ; i ++ ) {
const param = dest [ i ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! ( typeof param === "number" || allowNull && param === null ) ) {
2019-04-13 13:02:01 +00:00
return false ;
}
}
return true ;
}
2021-03-25 17:57:40 +00:00
class SimpleLinkService {
constructor ( ) {
2019-04-13 13:02:01 +00:00
this . externalLinkTarget = null ;
this . externalLinkRel = null ;
2021-03-25 17:57:40 +00:00
this . externalLinkEnabled = true ;
this . _ignoreDestinationZoom = false ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
get pagesCount ( ) {
return 0 ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get page ( ) {
return 0 ;
}
set page ( value ) { }
get rotation ( ) {
return 0 ;
}
set rotation ( value ) { }
navigateTo ( dest ) { }
getDestinationHash ( dest ) {
return "#" ;
}
getAnchorUrl ( hash ) {
return "#" ;
}
setHash ( hash ) { }
executeNamedAction ( action ) { }
cachePageRef ( pageNum , pageRef ) { }
isPageVisible ( pageNumber ) {
return true ;
}
}
2019-04-13 13:02:01 +00:00
exports . SimpleLinkService = SimpleLinkService ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 21 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFOutlineViewer = void 0 ;
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _base _tree _viewer = _ _webpack _require _ _ ( 13 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class PDFOutlineViewer extends _base _tree _viewer . BaseTreeViewer {
constructor ( options ) {
super ( options ) ;
this . linkService = options . linkService ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "toggleoutlinetree" , this . _toggleAllTreeItems . bind ( this ) ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
reset ( ) {
super . reset ( ) ;
this . _outline = null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_dispatchEvent ( outlineCount ) {
this . eventBus . dispatch ( "outlineloaded" , {
source : this ,
outlineCount
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_bindLink ( element , {
url ,
newWindow ,
dest
} ) {
const {
linkService
} = this ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( url ) {
( 0 , _pdfjsLib . addLinkAttributes ) ( element , {
url ,
target : newWindow ? _pdfjsLib . LinkTarget . BLANK : linkService . externalLinkTarget ,
rel : linkService . externalLinkRel ,
enabled : linkService . externalLinkEnabled
} ) ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
element . href = linkService . getDestinationHash ( dest ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
element . onclick = ( ) => {
if ( dest ) {
linkService . navigateTo ( dest ) ;
2020-02-09 16:02:47 +00:00
}
2021-03-25 17:57:40 +00:00
return false ;
} ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_setStyles ( element , {
bold ,
italic
} ) {
if ( bold ) {
element . style . fontWeight = "bold" ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( italic ) {
element . style . fontStyle = "italic" ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
_addToggleButton ( div , {
count ,
items
} ) {
const hidden = count < 0 && Math . abs ( count ) === items . length ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
super . _addToggleButton ( div , hidden ) ;
}
_toggleAllTreeItems ( ) {
if ( ! this . _outline ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
super . _toggleAllTreeItems ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
render ( {
outline
} ) {
if ( this . _outline ) {
this . reset ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _outline = outline || null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! outline ) {
this . _dispatchEvent ( 0 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const fragment = document . createDocumentFragment ( ) ;
const queue = [ {
parent : fragment ,
items : outline
} ] ;
let outlineCount = 0 ,
hasAnyNesting = false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
while ( queue . length > 0 ) {
const levelData = queue . shift ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( const item of levelData . items ) {
const div = document . createElement ( "div" ) ;
div . className = "treeItem" ;
const element = document . createElement ( "a" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _bindLink ( element , item ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _setStyles ( element , item ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
element . textContent = this . _normalizeTextContent ( item . title ) ;
div . appendChild ( element ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( item . items . length > 0 ) {
hasAnyNesting = true ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _addToggleButton ( div , item ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const itemsDiv = document . createElement ( "div" ) ;
itemsDiv . className = "treeItems" ;
div . appendChild ( itemsDiv ) ;
queue . push ( {
parent : itemsDiv ,
items : item . items
} ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
levelData . parent . appendChild ( div ) ;
outlineCount ++ ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( hasAnyNesting ) {
this . container . classList . add ( "treeWithDeepNesting" ) ;
this . _lastToggleIsShow = fragment . querySelectorAll ( ".treeItemsHidden" ) . length === 0 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . container . appendChild ( fragment ) ;
this . _dispatchEvent ( outlineCount ) ;
}
}
2019-04-13 13:02:01 +00:00
exports . PDFOutlineViewer = PDFOutlineViewer ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 22 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFPresentationMode = void 0 ;
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
const DELAY _BEFORE _RESETTING _SWITCH _IN _PROGRESS = 1500 ;
const DELAY _BEFORE _HIDING _CONTROLS = 3000 ;
const ACTIVE _SELECTOR = "pdfPresentationMode" ;
const CONTROLS _SELECTOR = "pdfPresentationModeControls" ;
const MOUSE _SCROLL _COOLDOWN _TIME = 50 ;
const PAGE _SWITCH _THRESHOLD = 0.1 ;
const SWIPE _MIN _DISTANCE _THRESHOLD = 50 ;
const SWIPE _ANGLE _THRESHOLD = Math . PI / 6 ;
class PDFPresentationMode {
constructor ( {
container ,
pdfViewer ,
eventBus ,
contextMenuItems = null
} ) {
2019-04-13 13:02:01 +00:00
this . container = container ;
this . pdfViewer = pdfViewer ;
this . eventBus = eventBus ;
this . active = false ;
this . args = null ;
this . contextMenuOpen = false ;
this . mouseScrollTimeStamp = 0 ;
this . mouseScrollDelta = 0 ;
this . touchSwipeState = null ;
if ( contextMenuItems ) {
2021-03-25 17:57:40 +00:00
contextMenuItems . contextFirstPage . addEventListener ( "click" , ( ) => {
this . contextMenuOpen = false ;
this . eventBus . dispatch ( "firstpage" , {
source : this
2019-04-13 13:02:01 +00:00
} ) ;
} ) ;
2021-03-25 17:57:40 +00:00
contextMenuItems . contextLastPage . addEventListener ( "click" , ( ) => {
this . contextMenuOpen = false ;
this . eventBus . dispatch ( "lastpage" , {
source : this
2019-04-13 13:02:01 +00:00
} ) ;
} ) ;
2021-03-25 17:57:40 +00:00
contextMenuItems . contextPageRotateCw . addEventListener ( "click" , ( ) => {
this . contextMenuOpen = false ;
this . eventBus . dispatch ( "rotatecw" , {
source : this
2019-04-13 13:02:01 +00:00
} ) ;
} ) ;
2021-03-25 17:57:40 +00:00
contextMenuItems . contextPageRotateCcw . addEventListener ( "click" , ( ) => {
this . contextMenuOpen = false ;
this . eventBus . dispatch ( "rotateccw" , {
source : this
2019-04-13 13:02:01 +00:00
} ) ;
} ) ;
}
}
2021-03-25 17:57:40 +00:00
request ( ) {
if ( this . switchInProgress || this . active || ! this . pdfViewer . pagesCount ) {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _addFullscreenChangeListeners ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _setSwitchInProgress ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _notifyStateChange ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . container . requestFullscreen ) {
this . container . requestFullscreen ( ) ;
} else if ( this . container . mozRequestFullScreen ) {
this . container . mozRequestFullScreen ( ) ;
} else if ( this . container . webkitRequestFullscreen ) {
this . container . webkitRequestFullscreen ( Element . ALLOW _KEYBOARD _INPUT ) ;
} else if ( this . container . msRequestFullscreen ) {
this . container . msRequestFullscreen ( ) ;
} else {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . args = {
page : this . pdfViewer . currentPageNumber ,
previousScale : this . pdfViewer . currentScaleValue
} ;
return true ;
}
_mouseWheel ( evt ) {
if ( ! this . active ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
evt . preventDefault ( ) ;
const delta = ( 0 , _ui _utils . normalizeWheelEventDelta ) ( evt ) ;
const currentTime = new Date ( ) . getTime ( ) ;
const storedTime = this . mouseScrollTimeStamp ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( currentTime > storedTime && currentTime - storedTime < MOUSE _SCROLL _COOLDOWN _TIME ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . mouseScrollDelta > 0 && delta < 0 || this . mouseScrollDelta < 0 && delta > 0 ) {
this . _resetMouseScrollState ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . mouseScrollDelta += delta ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( Math . abs ( this . mouseScrollDelta ) >= PAGE _SWITCH _THRESHOLD ) {
const totalDelta = this . mouseScrollDelta ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _resetMouseScrollState ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const success = totalDelta > 0 ? this . _goToPreviousPage ( ) : this . _goToNextPage ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( success ) {
this . mouseScrollTimeStamp = currentTime ;
2019-04-13 13:02:01 +00:00
}
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get isFullscreen ( ) {
return ! ! ( document . fullscreenElement || document . mozFullScreen || document . webkitIsFullScreen || document . msFullscreenElement ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_goToPreviousPage ( ) {
const page = this . pdfViewer . currentPageNumber ;
if ( page <= 1 ) {
return false ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . pdfViewer . currentPageNumber = page - 1 ;
return true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_goToNextPage ( ) {
const page = this . pdfViewer . currentPageNumber ;
if ( page >= this . pdfViewer . pagesCount ) {
return false ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . pdfViewer . currentPageNumber = page + 1 ;
return true ;
}
_notifyStateChange ( ) {
this . eventBus . dispatch ( "presentationmodechanged" , {
source : this ,
active : this . active ,
switchInProgress : ! ! this . switchInProgress
} ) ;
}
_setSwitchInProgress ( ) {
if ( this . switchInProgress ) {
clearTimeout ( this . switchInProgress ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . switchInProgress = setTimeout ( ( ) => {
this . _removeFullscreenChangeListeners ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
delete this . switchInProgress ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _notifyStateChange ( ) ;
} , DELAY _BEFORE _RESETTING _SWITCH _IN _PROGRESS ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_resetSwitchInProgress ( ) {
if ( this . switchInProgress ) {
clearTimeout ( this . switchInProgress ) ;
delete this . switchInProgress ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_enter ( ) {
this . active = true ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _resetSwitchInProgress ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _notifyStateChange ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . container . classList . add ( ACTIVE _SELECTOR ) ;
setTimeout ( ( ) => {
this . pdfViewer . currentPageNumber = this . args . page ;
this . pdfViewer . currentScaleValue = "page-fit" ;
} , 0 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _addWindowListeners ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _showControls ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . contextMenuOpen = false ;
this . container . setAttribute ( "contextmenu" , "viewerContextMenu" ) ;
window . getSelection ( ) . removeAllRanges ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_exit ( ) {
const page = this . pdfViewer . currentPageNumber ;
this . container . classList . remove ( ACTIVE _SELECTOR ) ;
setTimeout ( ( ) => {
this . active = false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _removeFullscreenChangeListeners ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _notifyStateChange ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . pdfViewer . currentScaleValue = this . args . previousScale ;
this . pdfViewer . currentPageNumber = page ;
this . args = null ;
} , 0 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _removeWindowListeners ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _hideControls ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _resetMouseScrollState ( ) ;
this . container . removeAttribute ( "contextmenu" ) ;
this . contextMenuOpen = false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_mouseDown ( evt ) {
if ( this . contextMenuOpen ) {
2019-04-13 13:02:01 +00:00
this . contextMenuOpen = false ;
2021-03-25 17:57:40 +00:00
evt . preventDefault ( ) ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( evt . button === 0 ) {
const isInternalLink = evt . target . href && evt . target . classList . contains ( "internalLink" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! isInternalLink ) {
evt . preventDefault ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( evt . shiftKey ) {
this . _goToPreviousPage ( ) ;
} else {
this . _goToNextPage ( ) ;
2019-04-13 13:02:01 +00:00
}
}
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_contextMenu ( ) {
this . contextMenuOpen = true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_showControls ( ) {
if ( this . controlsTimeout ) {
clearTimeout ( this . controlsTimeout ) ;
} else {
this . container . classList . add ( CONTROLS _SELECTOR ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . controlsTimeout = setTimeout ( ( ) => {
2019-04-13 13:02:01 +00:00
this . container . classList . remove ( CONTROLS _SELECTOR ) ;
delete this . controlsTimeout ;
2021-03-25 17:57:40 +00:00
} , DELAY _BEFORE _HIDING _CONTROLS ) ;
}
_hideControls ( ) {
if ( ! this . controlsTimeout ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
clearTimeout ( this . controlsTimeout ) ;
this . container . classList . remove ( CONTROLS _SELECTOR ) ;
delete this . controlsTimeout ;
}
_resetMouseScrollState ( ) {
this . mouseScrollTimeStamp = 0 ;
this . mouseScrollDelta = 0 ;
}
_touchSwipe ( evt ) {
if ( ! this . active ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( evt . touches . length > 1 ) {
this . touchSwipeState = null ;
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
switch ( evt . type ) {
case "touchstart" :
this . touchSwipeState = {
startX : evt . touches [ 0 ] . pageX ,
startY : evt . touches [ 0 ] . pageY ,
endX : evt . touches [ 0 ] . pageX ,
endY : evt . touches [ 0 ] . pageY
} ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case "touchmove" :
if ( this . touchSwipeState === null ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . touchSwipeState . endX = evt . touches [ 0 ] . pageX ;
this . touchSwipeState . endY = evt . touches [ 0 ] . pageY ;
evt . preventDefault ( ) ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case "touchend" :
if ( this . touchSwipeState === null ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let delta = 0 ;
const dx = this . touchSwipeState . endX - this . touchSwipeState . startX ;
const dy = this . touchSwipeState . endY - this . touchSwipeState . startY ;
const absAngle = Math . abs ( Math . atan2 ( dy , dx ) ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( Math . abs ( dx ) > SWIPE _MIN _DISTANCE _THRESHOLD && ( absAngle <= SWIPE _ANGLE _THRESHOLD || absAngle >= Math . PI - SWIPE _ANGLE _THRESHOLD ) ) {
delta = dx ;
} else if ( Math . abs ( dy ) > SWIPE _MIN _DISTANCE _THRESHOLD && Math . abs ( absAngle - Math . PI / 2 ) <= SWIPE _ANGLE _THRESHOLD ) {
delta = dy ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( delta > 0 ) {
this . _goToPreviousPage ( ) ;
} else if ( delta < 0 ) {
this . _goToNextPage ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
break ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
_addWindowListeners ( ) {
this . showControlsBind = this . _showControls . bind ( this ) ;
this . mouseDownBind = this . _mouseDown . bind ( this ) ;
this . mouseWheelBind = this . _mouseWheel . bind ( this ) ;
this . resetMouseScrollStateBind = this . _resetMouseScrollState . bind ( this ) ;
this . contextMenuBind = this . _contextMenu . bind ( this ) ;
this . touchSwipeBind = this . _touchSwipe . bind ( this ) ;
window . addEventListener ( "mousemove" , this . showControlsBind ) ;
window . addEventListener ( "mousedown" , this . mouseDownBind ) ;
window . addEventListener ( "wheel" , this . mouseWheelBind , {
passive : false
} ) ;
window . addEventListener ( "keydown" , this . resetMouseScrollStateBind ) ;
window . addEventListener ( "contextmenu" , this . contextMenuBind ) ;
window . addEventListener ( "touchstart" , this . touchSwipeBind ) ;
window . addEventListener ( "touchmove" , this . touchSwipeBind ) ;
window . addEventListener ( "touchend" , this . touchSwipeBind ) ;
}
_removeWindowListeners ( ) {
window . removeEventListener ( "mousemove" , this . showControlsBind ) ;
window . removeEventListener ( "mousedown" , this . mouseDownBind ) ;
window . removeEventListener ( "wheel" , this . mouseWheelBind , {
passive : false
} ) ;
window . removeEventListener ( "keydown" , this . resetMouseScrollStateBind ) ;
window . removeEventListener ( "contextmenu" , this . contextMenuBind ) ;
window . removeEventListener ( "touchstart" , this . touchSwipeBind ) ;
window . removeEventListener ( "touchmove" , this . touchSwipeBind ) ;
window . removeEventListener ( "touchend" , this . touchSwipeBind ) ;
delete this . showControlsBind ;
delete this . mouseDownBind ;
delete this . mouseWheelBind ;
delete this . resetMouseScrollStateBind ;
delete this . contextMenuBind ;
delete this . touchSwipeBind ;
}
_fullscreenChange ( ) {
if ( this . isFullscreen ) {
this . _enter ( ) ;
} else {
this . _exit ( ) ;
}
}
_addFullscreenChangeListeners ( ) {
this . fullscreenChangeBind = this . _fullscreenChange . bind ( this ) ;
window . addEventListener ( "fullscreenchange" , this . fullscreenChangeBind ) ;
window . addEventListener ( "mozfullscreenchange" , this . fullscreenChangeBind ) ;
window . addEventListener ( "webkitfullscreenchange" , this . fullscreenChangeBind ) ;
window . addEventListener ( "MSFullscreenChange" , this . fullscreenChangeBind ) ;
}
_removeFullscreenChangeListeners ( ) {
window . removeEventListener ( "fullscreenchange" , this . fullscreenChangeBind ) ;
window . removeEventListener ( "mozfullscreenchange" , this . fullscreenChangeBind ) ;
window . removeEventListener ( "webkitfullscreenchange" , this . fullscreenChangeBind ) ;
window . removeEventListener ( "MSFullscreenChange" , this . fullscreenChangeBind ) ;
delete this . fullscreenChangeBind ;
}
}
2019-04-13 13:02:01 +00:00
exports . PDFPresentationMode = PDFPresentationMode ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 23 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFSidebarResizer = void 0 ;
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const SIDEBAR _WIDTH _VAR = "--sidebar-width" ;
const SIDEBAR _MIN _WIDTH = 200 ;
const SIDEBAR _RESIZING _CLASS = "sidebarResizing" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class PDFSidebarResizer {
constructor ( options , eventBus , l10n = _ui _utils . NullL10n ) {
2019-04-13 13:02:01 +00:00
this . enabled = false ;
this . isRTL = false ;
this . sidebarOpen = false ;
this . doc = document . documentElement ;
this . _width = null ;
this . _outerContainerWidth = null ;
this . _boundEvents = Object . create ( null ) ;
this . outerContainer = options . outerContainer ;
this . resizer = options . resizer ;
this . eventBus = eventBus ;
this . l10n = l10n ;
2021-03-25 17:57:40 +00:00
if ( typeof CSS === "undefined" || typeof CSS . supports !== "function" || ! CSS . supports ( SIDEBAR _WIDTH _VAR , ` calc(-1 * ${ SIDEBAR _MIN _WIDTH } px) ` ) ) {
console . warn ( "PDFSidebarResizer: " + "The browser does not support resizing of the sidebar." ) ;
return ;
}
this . enabled = true ;
this . resizer . classList . remove ( "hidden" ) ;
this . l10n . getDirection ( ) . then ( dir => {
this . isRTL = dir === "rtl" ;
} ) ;
this . _addEventListeners ( ) ;
}
get outerContainerWidth ( ) {
if ( ! this . _outerContainerWidth ) {
this . _outerContainerWidth = this . outerContainer . clientWidth ;
}
return this . _outerContainerWidth ;
}
_updateWidth ( width = 0 ) {
if ( ! this . enabled ) {
return false ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const newWidth = ( 0 , _ui _utils . clamp ) ( width , SIDEBAR _MIN _WIDTH , Math . floor ( this . outerContainerWidth / 2 ) ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( newWidth === this . _width ) {
return false ;
}
this . _width = newWidth ;
this . doc . style . setProperty ( SIDEBAR _WIDTH _VAR , ` ${ newWidth } px ` ) ;
return true ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
_mouseMove ( evt ) {
let width = evt . clientX ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . isRTL ) {
width = this . outerContainerWidth - width ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateWidth ( width ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_mouseUp ( evt ) {
this . outerContainer . classList . remove ( SIDEBAR _RESIZING _CLASS ) ;
this . eventBus . dispatch ( "resize" , {
source : this
} ) ;
const _boundEvents = this . _boundEvents ;
window . removeEventListener ( "mousemove" , _boundEvents . mouseMove ) ;
window . removeEventListener ( "mouseup" , _boundEvents . mouseUp ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_addEventListeners ( ) {
if ( ! this . enabled ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const _boundEvents = this . _boundEvents ;
_boundEvents . mouseMove = this . _mouseMove . bind ( this ) ;
_boundEvents . mouseUp = this . _mouseUp . bind ( this ) ;
this . resizer . addEventListener ( "mousedown" , evt => {
if ( evt . button !== 0 ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . outerContainer . classList . add ( SIDEBAR _RESIZING _CLASS ) ;
window . addEventListener ( "mousemove" , _boundEvents . mouseMove ) ;
window . addEventListener ( "mouseup" , _boundEvents . mouseUp ) ;
} ) ;
this . eventBus . _on ( "sidebarviewchanged" , evt => {
this . sidebarOpen = ! ! ( evt && evt . view ) ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "resize" , evt => {
if ( ! evt || evt . source !== window ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _outerContainerWidth = null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . _width ) {
2019-04-13 13:02:01 +00:00
return ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . sidebarOpen ) {
this . _updateWidth ( this . _width ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . outerContainer . classList . add ( SIDEBAR _RESIZING _CLASS ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const updated = this . _updateWidth ( this . _width ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
Promise . resolve ( ) . then ( ( ) => {
this . outerContainer . classList . remove ( SIDEBAR _RESIZING _CLASS ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( updated ) {
this . eventBus . dispatch ( "resize" , {
source : this
} ) ;
2019-04-13 13:02:01 +00:00
}
} ) ;
2021-03-25 17:57:40 +00:00
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . PDFSidebarResizer = PDFSidebarResizer ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 24 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFThumbnailViewer = void 0 ;
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _thumbnail _view = _ _webpack _require _ _ ( 25 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const THUMBNAIL _SCROLL _MARGIN = - 19 ;
const THUMBNAIL _SELECTED _CLASS = "selected" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class PDFThumbnailViewer {
constructor ( {
container ,
eventBus ,
linkService ,
renderingQueue ,
l10n = _ui _utils . NullL10n
} ) {
2019-04-13 13:02:01 +00:00
this . container = container ;
this . linkService = linkService ;
this . renderingQueue = renderingQueue ;
this . l10n = l10n ;
this . scroll = ( 0 , _ui _utils . watchScroll ) ( this . container , this . _scrollUpdated . bind ( this ) ) ;
this . _resetView ( ) ;
2021-03-25 17:57:40 +00:00
eventBus . _on ( "optionalcontentconfigchanged" , ( ) => {
this . _setImageDisabled = true ;
} ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
_scrollUpdated ( ) {
this . renderingQueue . renderHighestPriority ( ) ;
}
getThumbnail ( index ) {
return this . _thumbnails [ index ] ;
}
_getVisibleThumbs ( ) {
return ( 0 , _ui _utils . getVisibleElements ) ( this . container , this . _thumbnails ) ;
}
scrollThumbnailIntoView ( pageNumber ) {
if ( ! this . pdfDocument ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const thumbnailView = this . _thumbnails [ pageNumber - 1 ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! thumbnailView ) {
console . error ( 'scrollThumbnailIntoView: Invalid "pageNumber" parameter.' ) ;
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( pageNumber !== this . _currentPageNumber ) {
const prevThumbnailView = this . _thumbnails [ this . _currentPageNumber - 1 ] ;
prevThumbnailView . div . classList . remove ( THUMBNAIL _SELECTED _CLASS ) ;
thumbnailView . div . classList . add ( THUMBNAIL _SELECTED _CLASS ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const visibleThumbs = this . _getVisibleThumbs ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const numVisibleThumbs = visibleThumbs . views . length ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( numVisibleThumbs > 0 ) {
const first = visibleThumbs . first . id ;
const last = numVisibleThumbs > 1 ? visibleThumbs . last . id : first ;
let shouldScroll = false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( pageNumber <= first || pageNumber >= last ) {
shouldScroll = true ;
} else {
visibleThumbs . views . some ( function ( view ) {
if ( view . id !== pageNumber ) {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
shouldScroll = view . percent < 100 ;
return true ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( shouldScroll ) {
( 0 , _ui _utils . scrollIntoView ) ( thumbnailView . div , {
top : THUMBNAIL _SCROLL _MARGIN
} ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
this . _currentPageNumber = pageNumber ;
}
get pagesRotation ( ) {
return this . _pagesRotation ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
set pagesRotation ( rotation ) {
if ( ! ( 0 , _ui _utils . isValidRotation ) ( rotation ) ) {
throw new Error ( "Invalid thumbnails rotation angle." ) ;
2017-05-13 12:01:52 +00:00
}
2021-03-25 17:57:40 +00:00
if ( ! this . pdfDocument ) {
return ;
2017-05-13 12:01:52 +00:00
}
2021-03-25 17:57:40 +00:00
if ( this . _pagesRotation === rotation ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _pagesRotation = rotation ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let i = 0 , ii = this . _thumbnails . length ; i < ii ; i ++ ) {
this . _thumbnails [ i ] . update ( rotation ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
cleanup ( ) {
_pdf _thumbnail _view . PDFThumbnailView . cleanup ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_resetView ( ) {
this . _thumbnails = [ ] ;
this . _currentPageNumber = 1 ;
this . _pageLabels = null ;
this . _pagesRotation = 0 ;
this . _optionalContentConfigPromise = null ;
this . _pagesRequests = new WeakMap ( ) ;
this . _setImageDisabled = false ;
this . container . textContent = "" ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setDocument ( pdfDocument ) {
if ( this . pdfDocument ) {
this . _cancelRendering ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _resetView ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . pdfDocument = pdfDocument ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! pdfDocument ) {
return ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const firstPagePromise = pdfDocument . getPage ( 1 ) ;
const optionalContentConfigPromise = pdfDocument . getOptionalContentConfig ( ) ;
firstPagePromise . then ( firstPdfPage => {
this . _optionalContentConfigPromise = optionalContentConfigPromise ;
const pagesCount = pdfDocument . numPages ;
const viewport = firstPdfPage . getViewport ( {
scale : 1
} ) ;
const checkSetImageDisabled = ( ) => {
return this . _setImageDisabled ;
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let pageNum = 1 ; pageNum <= pagesCount ; ++ pageNum ) {
const thumbnail = new _pdf _thumbnail _view . PDFThumbnailView ( {
container : this . container ,
id : pageNum ,
defaultViewport : viewport . clone ( ) ,
optionalContentConfigPromise ,
linkService : this . linkService ,
renderingQueue : this . renderingQueue ,
checkSetImageDisabled ,
disableCanvasToImageConversion : false ,
l10n : this . l10n
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _thumbnails . push ( thumbnail ) ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const firstThumbnailView = this . _thumbnails [ 0 ] ;
if ( firstThumbnailView ) {
firstThumbnailView . setPdfPage ( firstPdfPage ) ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const thumbnailView = this . _thumbnails [ this . _currentPageNumber - 1 ] ;
thumbnailView . div . classList . add ( THUMBNAIL _SELECTED _CLASS ) ;
} ) . catch ( reason => {
console . error ( "Unable to initialize thumbnail viewer" , reason ) ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_cancelRendering ( ) {
for ( let i = 0 , ii = this . _thumbnails . length ; i < ii ; i ++ ) {
if ( this . _thumbnails [ i ] ) {
this . _thumbnails [ i ] . cancelRendering ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setPageLabels ( labels ) {
if ( ! this . pdfDocument ) {
return ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! labels ) {
this . _pageLabels = null ;
} else if ( ! ( Array . isArray ( labels ) && this . pdfDocument . numPages === labels . length ) ) {
this . _pageLabels = null ;
console . error ( "PDFThumbnailViewer_setPageLabels: Invalid page labels." ) ;
} else {
this . _pageLabels = labels ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let i = 0 , ii = this . _thumbnails . length ; i < ii ; i ++ ) {
const label = this . _pageLabels && this . _pageLabels [ i ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _thumbnails [ i ] . setPageLabel ( label ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_ensurePdfPageLoaded ( thumbView ) {
if ( thumbView . pdfPage ) {
return Promise . resolve ( thumbView . pdfPage ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _pagesRequests . has ( thumbView ) ) {
return this . _pagesRequests . get ( thumbView ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const promise = this . pdfDocument . getPage ( thumbView . id ) . then ( pdfPage => {
if ( ! thumbView . pdfPage ) {
thumbView . setPdfPage ( pdfPage ) ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _pagesRequests . delete ( thumbView ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return pdfPage ;
} ) . catch ( reason => {
console . error ( "Unable to get page for thumb view" , reason ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _pagesRequests . delete ( thumbView ) ;
} ) ;
this . _pagesRequests . set ( thumbView , promise ) ;
return promise ;
}
forceRendering ( ) {
const visibleThumbs = this . _getVisibleThumbs ( ) ;
const thumbView = this . renderingQueue . getHighestPriority ( visibleThumbs , this . _thumbnails , this . scroll . down ) ;
if ( thumbView ) {
this . _ensurePdfPageLoaded ( thumbView ) . then ( ( ) => {
this . renderingQueue . renderView ( thumbView ) ;
} ) ;
return true ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return false ;
}
}
2019-04-13 13:02:01 +00:00
exports . PDFThumbnailViewer = PDFThumbnailViewer ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 25 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFThumbnailView = void 0 ;
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _rendering _queue = _ _webpack _require _ _ ( 8 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const MAX _NUM _SCALING _STEPS = 3 ;
const THUMBNAIL _CANVAS _BORDER _WIDTH = 1 ;
const THUMBNAIL _WIDTH = 98 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const TempImageFactory = function TempImageFactoryClosure ( ) {
let tempCanvasCache = null ;
2019-04-13 13:02:01 +00:00
return {
2021-03-25 17:57:40 +00:00
getCanvas ( width , height ) {
let tempCanvas = tempCanvasCache ;
2019-04-13 13:02:01 +00:00
if ( ! tempCanvas ) {
2021-03-25 17:57:40 +00:00
tempCanvas = document . createElement ( "canvas" ) ;
2019-04-13 13:02:01 +00:00
tempCanvasCache = tempCanvas ;
}
tempCanvas . width = width ;
tempCanvas . height = height ;
tempCanvas . mozOpaque = true ;
2021-03-25 17:57:40 +00:00
const ctx = tempCanvas . getContext ( "2d" , {
2019-04-13 13:02:01 +00:00
alpha : false
2017-05-13 12:01:52 +00:00
} ) ;
2019-04-13 13:02:01 +00:00
ctx . save ( ) ;
2021-03-25 17:57:40 +00:00
ctx . fillStyle = "rgb(255, 255, 255)" ;
2019-04-13 13:02:01 +00:00
ctx . fillRect ( 0 , 0 , width , height ) ;
ctx . restore ( ) ;
return tempCanvas ;
} ,
2021-03-25 17:57:40 +00:00
destroyCanvas ( ) {
const tempCanvas = tempCanvasCache ;
2019-04-13 13:02:01 +00:00
if ( tempCanvas ) {
tempCanvas . width = 0 ;
tempCanvas . height = 0 ;
}
tempCanvasCache = null ;
}
2021-03-25 17:57:40 +00:00
2019-04-13 13:02:01 +00:00
} ;
} ( ) ;
2021-03-25 17:57:40 +00:00
class PDFThumbnailView {
constructor ( {
container ,
id ,
defaultViewport ,
optionalContentConfigPromise ,
linkService ,
renderingQueue ,
checkSetImageDisabled ,
disableCanvasToImageConversion = false ,
l10n = _ui _utils . NullL10n
} ) {
2019-04-13 13:02:01 +00:00
this . id = id ;
2021-03-25 17:57:40 +00:00
this . renderingId = "thumbnail" + id ;
2019-04-13 13:02:01 +00:00
this . pageLabel = null ;
this . pdfPage = null ;
this . rotation = 0 ;
this . viewport = defaultViewport ;
this . pdfPageRotate = defaultViewport . rotation ;
2021-03-25 17:57:40 +00:00
this . _optionalContentConfigPromise = optionalContentConfigPromise || null ;
2019-04-13 13:02:01 +00:00
this . linkService = linkService ;
this . renderingQueue = renderingQueue ;
this . renderTask = null ;
this . renderingState = _pdf _rendering _queue . RenderingStates . INITIAL ;
this . resume = null ;
2021-03-25 17:57:40 +00:00
this . _checkSetImageDisabled = checkSetImageDisabled || function ( ) {
return false ;
} ;
2019-04-13 13:02:01 +00:00
this . disableCanvasToImageConversion = disableCanvasToImageConversion ;
this . pageWidth = this . viewport . width ;
this . pageHeight = this . viewport . height ;
this . pageRatio = this . pageWidth / this . pageHeight ;
this . canvasWidth = THUMBNAIL _WIDTH ;
this . canvasHeight = this . canvasWidth / this . pageRatio | 0 ;
this . scale = this . canvasWidth / this . pageWidth ;
this . l10n = l10n ;
2021-03-25 17:57:40 +00:00
const anchor = document . createElement ( "a" ) ;
anchor . href = linkService . getAnchorUrl ( "#page=" + id ) ;
this . _thumbPageTitle . then ( msg => {
2019-04-13 13:02:01 +00:00
anchor . title = msg ;
} ) ;
anchor . onclick = function ( ) {
linkService . page = id ;
return false ;
2017-05-13 12:01:52 +00:00
} ;
2019-04-13 13:02:01 +00:00
this . anchor = anchor ;
2021-03-25 17:57:40 +00:00
const div = document . createElement ( "div" ) ;
div . className = "thumbnail" ;
div . setAttribute ( "data-page-number" , this . id ) ;
2019-04-13 13:02:01 +00:00
this . div = div ;
2021-03-25 17:57:40 +00:00
const ring = document . createElement ( "div" ) ;
ring . className = "thumbnailSelectionRing" ;
const borderAdjustment = 2 * THUMBNAIL _CANVAS _BORDER _WIDTH ;
ring . style . width = this . canvasWidth + borderAdjustment + "px" ;
ring . style . height = this . canvasHeight + borderAdjustment + "px" ;
2019-04-13 13:02:01 +00:00
this . ring = ring ;
div . appendChild ( ring ) ;
anchor . appendChild ( div ) ;
container . appendChild ( anchor ) ;
}
2021-03-25 17:57:40 +00:00
setPdfPage ( pdfPage ) {
this . pdfPage = pdfPage ;
this . pdfPageRotate = pdfPage . rotate ;
const totalRotation = ( this . rotation + this . pdfPageRotate ) % 360 ;
this . viewport = pdfPage . getViewport ( {
scale : 1 ,
rotation : totalRotation
} ) ;
this . reset ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
reset ( ) {
this . cancelRendering ( ) ;
this . renderingState = _pdf _rendering _queue . RenderingStates . INITIAL ;
this . pageWidth = this . viewport . width ;
this . pageHeight = this . viewport . height ;
this . pageRatio = this . pageWidth / this . pageHeight ;
this . canvasHeight = this . canvasWidth / this . pageRatio | 0 ;
this . scale = this . canvasWidth / this . pageWidth ;
this . div . removeAttribute ( "data-loaded" ) ;
const ring = this . ring ;
const childNodes = ring . childNodes ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let i = childNodes . length - 1 ; i >= 0 ; i -- ) {
ring . removeChild ( childNodes [ i ] ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const borderAdjustment = 2 * THUMBNAIL _CANVAS _BORDER _WIDTH ;
ring . style . width = this . canvasWidth + borderAdjustment + "px" ;
ring . style . height = this . canvasHeight + borderAdjustment + "px" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . canvas ) {
this . canvas . width = 0 ;
this . canvas . height = 0 ;
delete this . canvas ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( this . image ) {
this . image . removeAttribute ( "src" ) ;
delete this . image ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
update ( rotation ) {
if ( typeof rotation !== "undefined" ) {
this . rotation = rotation ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const totalRotation = ( this . rotation + this . pdfPageRotate ) % 360 ;
this . viewport = this . viewport . clone ( {
scale : 1 ,
rotation : totalRotation
} ) ;
this . reset ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
cancelRendering ( ) {
if ( this . renderTask ) {
this . renderTask . cancel ( ) ;
this . renderTask = null ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . resume = null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_getPageDrawContext ( noCtxScale = false ) {
const canvas = document . createElement ( "canvas" ) ;
this . canvas = canvas ;
canvas . mozOpaque = true ;
const ctx = canvas . getContext ( "2d" , {
alpha : false
} ) ;
const outputScale = ( 0 , _ui _utils . getOutputScale ) ( ctx ) ;
canvas . width = this . canvasWidth * outputScale . sx | 0 ;
canvas . height = this . canvasHeight * outputScale . sy | 0 ;
canvas . style . width = this . canvasWidth + "px" ;
canvas . style . height = this . canvasHeight + "px" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! noCtxScale && outputScale . scaled ) {
ctx . scale ( outputScale . sx , outputScale . sy ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return ctx ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_convertCanvasToImage ( ) {
if ( ! this . canvas ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . renderingState !== _pdf _rendering _queue . RenderingStates . FINISHED ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const className = "thumbnailImage" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . disableCanvasToImageConversion ) {
this . canvas . className = className ;
this . _thumbPageCanvas . then ( msg => {
this . canvas . setAttribute ( "aria-label" , msg ) ;
2016-07-09 08:54:13 +00:00
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . div . setAttribute ( "data-loaded" , true ) ;
this . ring . appendChild ( this . canvas ) ;
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const image = document . createElement ( "img" ) ;
image . className = className ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _thumbPageCanvas . then ( msg => {
image . setAttribute ( "aria-label" , msg ) ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
image . style . width = this . canvasWidth + "px" ;
image . style . height = this . canvasHeight + "px" ;
image . src = this . canvas . toDataURL ( ) ;
this . image = image ;
this . div . setAttribute ( "data-loaded" , true ) ;
this . ring . appendChild ( image ) ;
this . canvas . width = 0 ;
this . canvas . height = 0 ;
delete this . canvas ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
draw ( ) {
if ( this . renderingState !== _pdf _rendering _queue . RenderingStates . INITIAL ) {
console . error ( "Must be in new state before drawing" ) ;
return Promise . resolve ( undefined ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const {
pdfPage
} = this ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! pdfPage ) {
this . renderingState = _pdf _rendering _queue . RenderingStates . FINISHED ;
return Promise . reject ( new Error ( "pdfPage is not loaded" ) ) ;
}
this . renderingState = _pdf _rendering _queue . RenderingStates . RUNNING ;
const renderCapability = ( 0 , _pdfjsLib . createPromiseCapability ) ( ) ;
const finishRenderTask = error => {
if ( renderTask === this . renderTask ) {
this . renderTask = null ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( error instanceof _pdfjsLib . RenderingCancelledException ) {
renderCapability . resolve ( undefined ) ;
return ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
this . renderingState = _pdf _rendering _queue . RenderingStates . FINISHED ;
2021-03-25 17:57:40 +00:00
this . _convertCanvasToImage ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! error ) {
renderCapability . resolve ( undefined ) ;
} else {
renderCapability . reject ( error ) ;
}
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const ctx = this . _getPageDrawContext ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const drawViewport = this . viewport . clone ( {
scale : this . scale
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const renderContinueCallback = cont => {
if ( ! this . renderingQueue . isHighestPriority ( this ) ) {
this . renderingState = _pdf _rendering _queue . RenderingStates . PAUSED ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . resume = ( ) => {
this . renderingState = _pdf _rendering _queue . RenderingStates . RUNNING ;
cont ( ) ;
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
cont ( ) ;
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const renderContext = {
canvasContext : ctx ,
viewport : drawViewport ,
optionalContentConfigPromise : this . _optionalContentConfigPromise
} ;
const renderTask = this . renderTask = pdfPage . render ( renderContext ) ;
renderTask . onContinue = renderContinueCallback ;
renderTask . promise . then ( function ( ) {
finishRenderTask ( null ) ;
} , function ( error ) {
finishRenderTask ( error ) ;
} ) ;
return renderCapability . promise ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setImage ( pageView ) {
if ( this . _checkSetImageDisabled ( ) ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . renderingState !== _pdf _rendering _queue . RenderingStates . INITIAL ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const img = pageView . canvas ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! img ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . pdfPage ) {
this . setPdfPage ( pageView . pdfPage ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . renderingState = _pdf _rendering _queue . RenderingStates . FINISHED ;
const ctx = this . _getPageDrawContext ( true ) ;
const canvas = ctx . canvas ;
if ( img . width <= 2 * canvas . width ) {
ctx . drawImage ( img , 0 , 0 , img . width , img . height , 0 , 0 , canvas . width , canvas . height ) ;
this . _convertCanvasToImage ( ) ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
let reducedWidth = canvas . width << MAX _NUM _SCALING _STEPS ;
let reducedHeight = canvas . height << MAX _NUM _SCALING _STEPS ;
const reducedImage = TempImageFactory . getCanvas ( reducedWidth , reducedHeight ) ;
const reducedImageCtx = reducedImage . getContext ( "2d" ) ;
while ( reducedWidth > img . width || reducedHeight > img . height ) {
reducedWidth >>= 1 ;
reducedHeight >>= 1 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
reducedImageCtx . drawImage ( img , 0 , 0 , img . width , img . height , 0 , 0 , reducedWidth , reducedHeight ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
while ( reducedWidth > 2 * canvas . width ) {
reducedImageCtx . drawImage ( reducedImage , 0 , 0 , reducedWidth , reducedHeight , 0 , 0 , reducedWidth >> 1 , reducedHeight >> 1 ) ;
reducedWidth >>= 1 ;
reducedHeight >>= 1 ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
ctx . drawImage ( reducedImage , 0 , 0 , reducedWidth , reducedHeight , 0 , 0 , canvas . width , canvas . height ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _convertCanvasToImage ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get _thumbPageTitle ( ) {
var _this$pageLabel ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return this . l10n . get ( "thumb_page_title" , {
page : ( _this$pageLabel = this . pageLabel ) != null ? _this$pageLabel : this . id
} , "Page {{page}}" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get _thumbPageCanvas ( ) {
var _this$pageLabel2 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return this . l10n . get ( "thumb_page_canvas" , {
page : ( _this$pageLabel2 = this . pageLabel ) != null ? _this$pageLabel2 : this . id
} , "Thumbnail of Page {{page}}" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setPageLabel ( label ) {
this . pageLabel = typeof label === "string" ? label : null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _thumbPageTitle . then ( msg => {
this . anchor . title = msg ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . renderingState !== _pdf _rendering _queue . RenderingStates . FINISHED ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _thumbPageCanvas . then ( msg => {
if ( this . image ) {
this . image . setAttribute ( "aria-label" , msg ) ;
} else if ( this . disableCanvasToImageConversion && this . canvas ) {
this . canvas . setAttribute ( "aria-label" , msg ) ;
}
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
static cleanup ( ) {
TempImageFactory . destroyCanvas ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
exports . PDFThumbnailView = PDFThumbnailView ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
/***/ } ) ,
/* 26 */
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
"use strict" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFViewer = void 0 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _base _viewer = _ _webpack _require _ _ ( 27 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class PDFViewer extends _base _viewer . BaseViewer {
get _viewerElement ( ) {
return ( 0 , _pdfjsLib . shadow ) ( this , "_viewerElement" , this . viewer ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
_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 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _isScrollModeHorizontal || left < scrollLeft || right > scrollLeft + clientWidth ) {
pageSpot = {
left : 0 ,
top : 0
} ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
super . _scrollIntoView ( {
pageDiv ,
pageSpot ,
pageNumber
} ) ;
}
_getVisiblePages ( ) {
if ( this . isInPresentationMode ) {
return this . _getCurrentVisiblePage ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return super . _getVisiblePages ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updateHelper ( visiblePages ) {
if ( this . isInPresentationMode ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let currentId = this . _currentPageNumber ;
let stillFullyVisible = false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( const page of visiblePages ) {
if ( page . percent < 100 ) {
break ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( page . id === currentId ) {
stillFullyVisible = true ;
break ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( ! stillFullyVisible ) {
currentId = visiblePages [ 0 ] . id ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _setCurrentPageNumber ( currentId ) ;
}
}
2019-04-13 13:02:01 +00:00
exports . PDFViewer = PDFViewer ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 27 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . BaseViewer = void 0 ;
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _rendering _queue = _ _webpack _require _ _ ( 8 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _annotation _layer _builder = _ _webpack _require _ _ ( 28 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _page _view = _ _webpack _require _ _ ( 29 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _link _service = _ _webpack _require _ _ ( 20 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _text _layer _builder = _ _webpack _require _ _ ( 30 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const DEFAULT _CACHE _SIZE = 10 ;
2019-04-13 13:02:01 +00:00
function PDFPageViewBuffer ( size ) {
2021-03-25 17:57:40 +00:00
const data = [ ] ;
2019-04-13 13:02:01 +00:00
this . push = function ( view ) {
2021-03-25 17:57:40 +00:00
const i = data . indexOf ( view ) ;
2019-04-13 13:02:01 +00:00
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 ) {
2021-03-25 17:57:40 +00:00
const pageIdsToKeep = new Set ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let i = 0 , iMax = pagesToKeep . length ; i < iMax ; ++ i ) {
2019-04-13 13:02:01 +00:00
pageIdsToKeep . add ( pagesToKeep [ i ] . id ) ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
( 0 , _ui _utils . moveToEndOfArray ) ( data , function ( page ) {
return pageIdsToKeep . has ( page . id ) ;
2016-07-09 08:54:13 +00:00
} ) ;
2019-04-13 13:02:01 +00:00
}
while ( data . length > size ) {
data . shift ( ) . destroy ( ) ;
}
} ;
}
function isSameScale ( oldScale , newScale ) {
if ( newScale === oldScale ) {
return true ;
}
if ( Math . abs ( newScale - oldScale ) < 1e-15 ) {
return true ;
}
return false ;
}
2021-03-25 17:57:40 +00:00
class BaseViewer {
constructor ( options ) {
2019-04-13 13:02:01 +00:00
if ( this . constructor === BaseViewer ) {
2021-03-25 17:57:40 +00:00
throw new Error ( "Cannot initialize BaseViewer." ) ;
2019-04-13 13:02:01 +00:00
}
this . _name = this . constructor . name ;
this . container = options . container ;
this . viewer = options . viewer || options . container . firstElementChild ;
2021-03-25 17:57:40 +00:00
if ( ! ( this . container instanceof HTMLDivElement && this . viewer instanceof HTMLDivElement ) ) {
throw new Error ( "Invalid `container` and/or `viewer` option." ) ;
}
this . eventBus = options . eventBus ;
2019-04-13 13:02:01 +00:00
this . linkService = options . linkService || new _pdf _link _service . SimpleLinkService ( ) ;
this . downloadManager = options . downloadManager || null ;
this . findController = options . findController || null ;
this . removePageBorders = options . removePageBorders || false ;
this . textLayerMode = Number . isInteger ( options . textLayerMode ) ? options . textLayerMode : _ui _utils . TextLayerMode . ENABLE ;
2021-03-25 17:57:40 +00:00
this . imageResourcesPath = options . imageResourcesPath || "" ;
this . renderInteractiveForms = typeof options . renderInteractiveForms === "boolean" ? options . renderInteractiveForms : true ;
2019-04-13 13:02:01 +00:00
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 || _ui _utils . NullL10n ;
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 ;
2021-03-25 17:57:40 +00:00
this . _onBeforeDraw = this . _onAfterDraw = null ;
2019-04-13 13:02:01 +00:00
this . _resetView ( ) ;
if ( this . removePageBorders ) {
2021-03-25 17:57:40 +00:00
this . viewer . classList . add ( "removePageBorders" ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
Promise . resolve ( ) . then ( ( ) => {
this . eventBus . dispatch ( "baseviewerinit" , {
source : this
2019-04-13 13:02:01 +00:00
} ) ;
} ) ;
}
2021-03-25 17:57:40 +00:00
get pagesCount ( ) {
return this . _pages . length ;
}
getPageView ( index ) {
return this . _pages [ index ] ;
}
get pageViewsReady ( ) {
if ( ! this . _pagesCapability . settled ) {
return false ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return this . _pages . every ( function ( pageView ) {
return pageView && pageView . pdfPage ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get currentPageNumber ( ) {
return this . _currentPageNumber ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
set currentPageNumber ( val ) {
if ( ! Number . isInteger ( val ) ) {
throw new Error ( "Invalid page number." ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . pdfDocument ) {
return ;
}
if ( ! this . _setCurrentPageNumber ( val , true ) ) {
console . error ( ` ${ this . _name } .currentPageNumber: " ${ val } " is not a valid page. ` ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_setCurrentPageNumber ( val , resetCurrentPageView = false ) {
if ( this . _currentPageNumber === val ) {
2019-04-13 13:02:01 +00:00
if ( resetCurrentPageView ) {
this . _resetCurrentPageView ( ) ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
return true ;
}
2021-03-25 17:57:40 +00:00
if ( ! ( 0 < val && val <= this . pagesCount ) ) {
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _currentPageNumber = val ;
this . eventBus . dispatch ( "pagechanging" , {
source : this ,
pageNumber : val ,
pageLabel : this . _pageLabels && this . _pageLabels [ val - 1 ]
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( resetCurrentPageView ) {
this . _resetCurrentPageView ( ) ;
}
return true ;
}
get currentPageLabel ( ) {
return this . _pageLabels && this . _pageLabels [ this . _currentPageNumber - 1 ] ;
}
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 ;
}
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 . _cancelRendering ( ) ;
this . _resetView ( ) ;
if ( this . findController ) {
this . findController . setDocument ( null ) ;
}
}
this . pdfDocument = pdfDocument ;
if ( ! pdfDocument ) {
return ;
}
const pagesCount = pdfDocument . numPages ;
const firstPagePromise = pdfDocument . getPage ( 1 ) ;
const annotationStorage = pdfDocument . annotationStorage ;
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 ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _buffer . push ( pageView ) ;
} ;
this . eventBus . _on ( "pagerender" , this . _onBeforeDraw ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _onAfterDraw = evt => {
if ( evt . cssTransform || this . _onePageRenderedCapability . settled ) {
2017-05-13 12:01:52 +00:00
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _onePageRenderedCapability . resolve ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _off ( "pagerendered" , this . _onAfterDraw ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _onAfterDraw = null ;
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
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 ( ) ,
annotationStorage ,
optionalContentConfigPromise ,
renderingQueue : this . renderingQueue ,
textLayerFactory ,
textLayerMode : this . textLayerMode ,
annotationLayerFactory : this ,
imageResourcesPath : this . imageResourcesPath ,
renderInteractiveForms : this . renderInteractiveForms ,
renderer : this . renderer ,
enableWebGL : this . enableWebGL ,
useOnlyCssZoom : this . useOnlyCssZoom ,
maxCanvasPixels : this . maxCanvasPixels ,
l10n : this . l10n
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
this . _pages . push ( pageView ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const firstPageView = this . _pages [ 0 ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( firstPageView ) {
firstPageView . setPdfPage ( firstPdfPage ) ;
this . linkService . cachePageRef ( 1 , firstPdfPage . ref ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _spreadMode !== _ui _utils . SpreadMode . NONE ) {
this . _updateSpreadMode ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _onePageRenderedOrForceFetch ( ) . then ( ( ) => {
if ( this . findController ) {
this . findController . setDocument ( pdfDocument ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( pdfDocument . loadingParams . disableAutoFetch || pagesCount > 7500 ) {
this . _pagesCapability . resolve ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let getPagesLeft = pagesCount - 1 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( getPagesLeft <= 0 ) {
this . _pagesCapability . resolve ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let pageNum = 2 ; pageNum <= pagesCount ; ++ pageNum ) {
pdfDocument . getPage ( pageNum ) . then ( pdfPage => {
const pageView = this . _pages [ pageNum - 1 ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! pageView . pdfPage ) {
pageView . setPdfPage ( pdfPage ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . linkService . cachePageRef ( pageNum , pdfPage . ref ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( -- getPagesLeft === 0 ) {
this . _pagesCapability . resolve ( ) ;
}
} , reason => {
console . error ( ` Unable to get page ${ pageNum } to initialize viewer ` , reason ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( -- getPagesLeft === 0 ) {
this . _pagesCapability . resolve ( ) ;
}
} ) ;
2019-04-13 13:02:01 +00:00
}
} ) ;
2021-03-25 17:57:40 +00:00
this . eventBus . dispatch ( "pagesinit" , {
source : this
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . defaultRenderingQueue ) {
this . update ( ) ;
2016-07-09 08:54:13 +00:00
}
2021-03-25 17:57:40 +00:00
} ) . catch ( reason => {
console . error ( "Unable to initialize viewer" , reason ) ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setPageLabels ( labels ) {
if ( ! this . pdfDocument ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
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 ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let i = 0 , ii = this . _pages . length ; i < ii ; i ++ ) {
const pageView = this . _pages [ i ] ;
const label = this . _pageLabels && this . _pageLabels [ i ] ;
pageView . setPageLabel ( label ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_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 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _onBeforeDraw ) {
this . eventBus . _off ( "pagerender" , this . _onBeforeDraw ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _onBeforeDraw = null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _onAfterDraw ) {
this . eventBus . _off ( "pagerendered" , this . _onAfterDraw ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _onAfterDraw = null ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . viewer . textContent = "" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateScrollMode ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_scrollUpdate ( ) {
if ( this . pagesCount === 0 ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . update ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_scrollIntoView ( {
pageDiv ,
pageSpot = null ,
pageNumber = null
} ) {
( 0 , _ui _utils . scrollIntoView ) ( pageDiv , pageSpot ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_setScaleUpdatePages ( newScale , newValue , noScroll = false , preset = false ) {
this . _currentScaleValue = newValue . toString ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( isSameScale ( this . _currentScale , newScale ) ) {
if ( preset ) {
this . eventBus . dispatch ( "scalechanging" , {
source : this ,
scale : newScale ,
presetValue : newValue
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let i = 0 , ii = this . _pages . length ; i < ii ; i ++ ) {
this . _pages [ i ] . update ( newScale ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _currentScale = newScale ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! noScroll ) {
let page = this . _currentPageNumber ,
dest ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _location && ! ( this . isInPresentationMode || this . isChangingPresentationMode ) ) {
page = this . _location . pageNumber ;
dest = [ null , {
name : "XYZ"
} , this . _location . left , this . _location . top , null ] ;
2016-07-09 08:54:13 +00:00
}
2021-03-25 17:57:40 +00:00
this . scrollPageIntoView ( {
pageNumber : page ,
destArray : dest ,
allowNegativeOffset : true
} ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . eventBus . dispatch ( "scalechanging" , {
source : this ,
scale : newScale ,
presetValue : preset ? newValue : undefined
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . defaultRenderingQueue ) {
this . update ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_setScale ( value , noScroll = false ) {
let scale = parseFloat ( value ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( scale > 0 ) {
this . _setScaleUpdatePages ( scale , value , noScroll , false ) ;
} else {
const currentPage = this . _pages [ this . _currentPageNumber - 1 ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! currentPage ) {
2017-05-13 12:01:52 +00:00
return ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const noPadding = this . isInPresentationMode || this . removePageBorders ;
let hPadding = noPadding ? 0 : _ui _utils . SCROLLBAR _PADDING ;
let vPadding = noPadding ? 0 : _ui _utils . VERTICAL _PADDING ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! noPadding && this . _isScrollModeHorizontal ) {
[ hPadding , vPadding ] = [ vPadding , hPadding ] ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const pageWidthScale = ( this . container . clientWidth - hPadding ) / currentPage . width * currentPage . scale ;
const pageHeightScale = ( this . container . clientHeight - vPadding ) / currentPage . height * currentPage . scale ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
switch ( value ) {
case "page-actual" :
scale = 1 ;
2019-04-13 13:02:01 +00:00
break ;
2021-03-25 17:57:40 +00:00
case "page-width" :
scale = pageWidthScale ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case "page-height" :
scale = pageHeightScale ;
2019-04-13 13:02:01 +00:00
break ;
2021-03-25 17:57:40 +00:00
case "page-fit" :
scale = Math . min ( pageWidthScale , pageHeightScale ) ;
2019-04-13 13:02:01 +00:00
break ;
2021-03-25 17:57:40 +00:00
case "auto" :
const horizontalScale = ( 0 , _ui _utils . isPortraitOrientation ) ( currentPage ) ? pageWidthScale : Math . min ( pageHeightScale , pageWidthScale ) ;
scale = Math . min ( _ui _utils . MAX _AUTO _SCALE , horizontalScale ) ;
2019-04-13 13:02:01 +00:00
break ;
default :
2021-03-25 17:57:40 +00:00
console . error ( ` ${ this . _name } ._setScale: " ${ value } " is an unknown zoom value. ` ) ;
2019-04-13 13:02:01 +00:00
return ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _setScaleUpdatePages ( scale , value , noScroll , true ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_resetCurrentPageView ( ) {
if ( this . isInPresentationMode ) {
this . _setScale ( this . _currentScaleValue , true ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const pageView = this . _pages [ this . _currentPageNumber - 1 ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _scrollIntoView ( {
pageDiv : pageView . div
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
scrollPageIntoView ( {
pageNumber ,
destArray = null ,
allowNegativeOffset = false ,
ignoreDestinationZoom = false
} ) {
if ( ! this . pdfDocument ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const pageView = Number . isInteger ( pageNumber ) && this . _pages [ pageNumber - 1 ] ;
if ( ! pageView ) {
console . error ( ` ${ this . _name } .scrollPageIntoView: ` + ` " ${ pageNumber } " is not a valid pageNumber parameter. ` ) ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( this . isInPresentationMode || ! destArray ) {
this . _setCurrentPageNumber ( pageNumber , true ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case "Fit" :
case "FitB" :
scale = "page-fit" ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case "FitH" :
case "FitBH" :
y = destArray [ 2 ] ;
scale = "page-width" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( y === null && this . _location ) {
x = this . _location . left ;
y = this . _location . top ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case "FitV" :
case "FitBV" :
x = destArray [ 2 ] ;
width = pageWidth ;
height = pageHeight ;
scale = "page-height" ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
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 ;
2016-07-09 08:54:13 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( scale === "page-fit" && ! destArray [ 4 ] ) {
this . _scrollIntoView ( {
pageDiv : pageView . div ,
pageNumber
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
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 ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _scrollIntoView ( {
pageDiv : pageView . div ,
pageSpot : {
left ,
top
} ,
pageNumber
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_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
} ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updateHelper ( visiblePages ) {
throw new Error ( "Not implemented: _updateHelper" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
update ( ) {
const visible = this . _getVisiblePages ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const visiblePages = visible . views ,
numVisiblePages = visiblePages . length ;
if ( numVisiblePages === 0 ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const newCacheSize = Math . max ( DEFAULT _CACHE _SIZE , 2 * numVisiblePages + 1 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _buffer . resize ( newCacheSize , visiblePages ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . renderingQueue . renderHighestPriority ( visible ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateHelper ( visiblePages ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 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 : [ ]
} ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
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 ]
} ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_getVisiblePages ( ) {
return ( 0 , _ui _utils . getVisibleElements ) ( this . container , this . _pages , true , this . _isScrollModeHorizontal ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
isPageVisible ( pageNumber ) {
if ( ! this . pdfDocument ) {
return false ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( pageNumber < 1 || pageNumber > this . pagesCount ) {
console . error ( ` ${ this . _name } .isPageVisible: " ${ pageNumber } " is out of bounds. ` ) ;
return false ;
}
return this . _getVisiblePages ( ) . views . some ( function ( view ) {
return view . id === pageNumber ;
} ) ;
}
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 ( ) ;
2017-05-13 12:01:52 +00:00
}
2021-03-25 17:57:40 +00:00
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_cancelRendering ( ) {
for ( let i = 0 , ii = this . _pages . length ; i < ii ; i ++ ) {
if ( this . _pages [ i ] ) {
this . _pages [ i ] . cancelRendering ( ) ;
2017-05-13 12:01:52 +00:00
}
2021-03-25 17:57:40 +00:00
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_ensurePdfPageLoaded ( pageView ) {
if ( pageView . pdfPage ) {
return Promise . resolve ( pageView . pdfPage ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . _pagesRequests . has ( pageView ) ) {
return this . _pagesRequests . get ( pageView ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const promise = this . pdfDocument . getPage ( pageView . id ) . then ( pdfPage => {
if ( ! pageView . pdfPage ) {
pageView . setPdfPage ( pdfPage ) ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _pagesRequests . delete ( pageView ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return pdfPage ;
} ) . catch ( reason => {
console . error ( "Unable to get page for page view" , reason ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _pagesRequests . delete ( pageView ) ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _pagesRequests . set ( pageView , promise ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return promise ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
forceRendering ( currentlyVisiblePages ) {
const visiblePages = currentlyVisiblePages || this . _getVisiblePages ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const scrollAhead = this . _isScrollModeHorizontal ? this . scroll . right : this . scroll . down ;
const pageView = this . renderingQueue . getHighestPriority ( visiblePages , this . _pages , scrollAhead ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( pageView ) {
this . _ensurePdfPageLoaded ( pageView ) . then ( ( ) => {
this . renderingQueue . renderView ( pageView ) ;
} ) ;
return true ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return false ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
createAnnotationLayerBuilder ( pageDiv , pdfPage , annotationStorage = null , imageResourcesPath = "" , renderInteractiveForms = false , l10n = _ui _utils . NullL10n ) {
return new _annotation _layer _builder . AnnotationLayerBuilder ( {
pageDiv ,
pdfPage ,
annotationStorage ,
imageResourcesPath ,
renderInteractiveForms ,
linkService : this . linkService ,
downloadManager : this . downloadManager ,
l10n
} ) ;
}
get hasEqualPageSizes ( ) {
const firstPageView = this . _pages [ 0 ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
getPagesOverview ( ) {
const pagesOverview = this . _pages . map ( function ( pageView ) {
const viewport = pageView . pdfPage . getViewport ( {
scale : 1
} ) ;
return {
width : viewport . width ,
height : viewport . height ,
rotation : viewport . rotation
} ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . enablePrintAutoRotate ) {
return pagesOverview ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return pagesOverview . map ( function ( size ) {
if ( ( 0 , _ui _utils . isPortraitOrientation ) ( size ) ) {
return size ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return {
width : size . height ,
height : size . width ,
rotation : ( size . rotation + 90 ) % 360
} ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get optionalContentConfigPromise ( ) {
if ( ! this . pdfDocument ) {
return Promise . resolve ( null ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . _optionalContentConfigPromise ) {
return this . pdfDocument . getOptionalContentConfig ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return this . _optionalContentConfigPromise ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
set optionalContentConfigPromise ( promise ) {
if ( ! ( promise instanceof Promise ) ) {
throw new Error ( ` Invalid optionalContentConfigPromise: ${ promise } ` ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . pdfDocument ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( ! this . _optionalContentConfigPromise ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _optionalContentConfigPromise = promise ;
for ( const pageView of this . _pages ) {
pageView . update ( pageView . scale , pageView . rotation , promise ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . update ( ) ;
this . eventBus . dispatch ( "optionalcontentconfigchanged" , {
source : this ,
promise
} ) ;
}
get scrollMode ( ) {
return this . _scrollMode ;
}
set scrollMode ( mode ) {
if ( this . _scrollMode === mode ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( ! ( 0 , _ui _utils . isValidScrollMode ) ( mode ) ) {
throw new Error ( ` Invalid scroll mode: ${ mode } ` ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( this . _currentScaleValue && isNaN ( this . _currentScaleValue ) ) {
this . _setScale ( this . _currentScaleValue , true ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . _setCurrentPageNumber ( pageNumber , true ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . update ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get spreadMode ( ) {
return this . _spreadMode ;
}
set spreadMode ( mode ) {
if ( this . _spreadMode === mode ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( ! ( 0 , _ui _utils . isValidSpreadMode ) ( mode ) ) {
throw new Error ( ` Invalid spread mode: ${ mode } ` ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _spreadMode = mode ;
this . eventBus . dispatch ( "spreadmodechanged" , {
source : this ,
mode
} ) ;
this . _updateSpreadMode ( this . _currentPageNumber ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updateSpreadMode ( pageNumber = null ) {
if ( ! this . pdfDocument ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
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 ) ;
2017-05-13 12:01:52 +00:00
}
2021-03-25 17:57:40 +00:00
} else {
const parity = this . _spreadMode - 1 ;
let spread = null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
spread . appendChild ( pages [ i ] . div ) ;
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( ! pageNumber ) {
return ;
}
this . _setCurrentPageNumber ( pageNumber , true ) ;
this . update ( ) ;
}
}
2019-04-13 13:02:01 +00:00
exports . BaseViewer = BaseViewer ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 28 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . DefaultAnnotationLayerFactory = exports . AnnotationLayerBuilder = void 0 ;
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _link _service = _ _webpack _require _ _ ( 20 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class AnnotationLayerBuilder {
constructor ( {
pageDiv ,
pdfPage ,
linkService ,
downloadManager ,
annotationStorage = null ,
imageResourcesPath = "" ,
renderInteractiveForms = true ,
l10n = _ui _utils . NullL10n
} ) {
2019-04-13 13:02:01 +00:00
this . pageDiv = pageDiv ;
this . pdfPage = pdfPage ;
this . linkService = linkService ;
this . downloadManager = downloadManager ;
this . imageResourcesPath = imageResourcesPath ;
this . renderInteractiveForms = renderInteractiveForms ;
this . l10n = l10n ;
2021-03-25 17:57:40 +00:00
this . annotationStorage = annotationStorage ;
2019-04-13 13:02:01 +00:00
this . div = null ;
this . _cancelled = false ;
}
2021-03-25 17:57:40 +00:00
render ( viewport , intent = "display" ) {
return this . pdfPage . getAnnotations ( {
intent
} ) . then ( annotations => {
if ( this . _cancelled ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( annotations . length === 0 ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_pdfjsLib . AnnotationLayer . render ( parameters ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . l10n . translate ( this . div ) ;
}
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
cancel ( ) {
this . _cancelled = true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
hide ( ) {
if ( ! this . div ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . div . setAttribute ( "hidden" , "true" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . AnnotationLayerBuilder = AnnotationLayerBuilder ;
2021-03-25 17:57:40 +00:00
class DefaultAnnotationLayerFactory {
createAnnotationLayerBuilder ( pageDiv , pdfPage , annotationStorage = null , imageResourcesPath = "" , renderInteractiveForms = true , l10n = _ui _utils . NullL10n ) {
return new AnnotationLayerBuilder ( {
pageDiv ,
pdfPage ,
imageResourcesPath ,
renderInteractiveForms ,
linkService : new _pdf _link _service . SimpleLinkService ( ) ,
l10n ,
annotationStorage
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 29 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFPageView = void 0 ;
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _rendering _queue = _ _webpack _require _ _ ( 8 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _viewer _compatibility = _ _webpack _require _ _ ( 4 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const MAX _CANVAS _PIXELS = _viewer _compatibility . viewerCompatibilityParams . maxCanvasPixels || 16777216 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class PDFPageView {
constructor ( options ) {
const container = options . container ;
const defaultViewport = options . defaultViewport ;
2019-04-13 13:02:01 +00:00
this . id = options . id ;
2021-03-25 17:57:40 +00:00
this . renderingId = "page" + this . id ;
2019-04-13 13:02:01 +00:00
this . pdfPage = null ;
this . pageLabel = null ;
this . rotation = 0 ;
this . scale = options . scale || _ui _utils . DEFAULT _SCALE ;
this . viewport = defaultViewport ;
this . pdfPageRotate = defaultViewport . rotation ;
2021-03-25 17:57:40 +00:00
this . _annotationStorage = options . annotationStorage || null ;
this . _optionalContentConfigPromise = options . optionalContentConfigPromise || null ;
2019-04-13 13:02:01 +00:00
this . hasRestrictedScaling = false ;
this . textLayerMode = Number . isInteger ( options . textLayerMode ) ? options . textLayerMode : _ui _utils . TextLayerMode . ENABLE ;
2021-03-25 17:57:40 +00:00
this . imageResourcesPath = options . imageResourcesPath || "" ;
this . renderInteractiveForms = typeof options . renderInteractiveForms === "boolean" ? options . renderInteractiveForms : true ;
2019-04-13 13:02:01 +00:00
this . useOnlyCssZoom = options . useOnlyCssZoom || false ;
this . maxCanvasPixels = options . maxCanvasPixels || MAX _CANVAS _PIXELS ;
2021-03-25 17:57:40 +00:00
this . eventBus = options . eventBus ;
2019-04-13 13:02:01 +00:00
this . renderingQueue = options . renderingQueue ;
this . textLayerFactory = options . textLayerFactory ;
this . annotationLayerFactory = options . annotationLayerFactory ;
this . renderer = options . renderer || _ui _utils . RendererType . CANVAS ;
this . enableWebGL = options . enableWebGL || false ;
this . l10n = options . l10n || _ui _utils . NullL10n ;
this . paintTask = null ;
this . paintedViewportMap = new WeakMap ( ) ;
this . renderingState = _pdf _rendering _queue . RenderingStates . INITIAL ;
this . resume = null ;
this . error = null ;
this . annotationLayer = null ;
this . textLayer = null ;
this . zoomLayer = null ;
2021-03-25 17:57:40 +00:00
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 ) ;
2019-04-13 13:02:01 +00:00
this . div = div ;
container . appendChild ( div ) ;
}
2021-03-25 17:57:40 +00:00
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 . stats = pdfPage . stats ;
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
2019-04-13 13:02:01 +00:00
} ) ;
}
2021-03-25 17:57:40 +00:00
}
_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 && this . annotationLayer . div || null ;
for ( let i = childNodes . length - 1 ; i >= 0 ; i -- ) {
const node = childNodes [ i ] ;
if ( currentZoomLayerNode === node || currentAnnotationNode === 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" ;
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 ( )
} ) ;
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
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 ( )
} ) ;
2019-04-13 13:02:01 +00:00
return ;
}
2021-03-25 17:57:40 +00:00
if ( ! this . zoomLayer && ! this . canvas . hasAttribute ( "hidden" ) ) {
this . zoomLayer = this . canvas . parentNode ;
this . zoomLayer . style . position = "absolute" ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . zoomLayer ) {
this . cssTransform ( this . zoomLayer . firstChild ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . reset ( true , true ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
cancelRendering ( keepAnnotations = false ) {
if ( this . paintTask ) {
this . paintTask . cancel ( ) ;
this . paintTask = null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . resume = null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . textLayer ) {
this . textLayer . cancel ( ) ;
this . textLayer = null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! keepAnnotations && this . annotationLayer ) {
this . annotationLayer . cancel ( ) ;
this . annotationLayer = null ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( absRotation === 90 || absRotation === 270 ) {
scaleX = height / width ;
scaleY = width / height ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const cssTransform = "rotate(" + relativeRotation + "deg) " + "scale(" + scaleX + "," + scaleY + ")" ;
target . style . transform = cssTransform ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( textAbsRotation === 90 || textAbsRotation === 270 ) {
scale = width / textLayerViewport . height ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const textLayerDiv = this . textLayer . textLayerDiv ;
let transX , transY ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
switch ( textAbsRotation ) {
case 0 :
transX = transY = 0 ;
break ;
case 90 :
transX = 0 ;
transY = "-" + textLayerDiv . style . height ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case 180 :
transX = "-" + textLayerDiv . style . width ;
transY = "-" + textLayerDiv . style . height ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case 270 :
transX = "-" + textLayerDiv . style . width ;
transY = 0 ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
default :
console . error ( "Bad rotation value." ) ;
break ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
textLayerDiv . style . transform = "rotate(" + textAbsRotation + "deg) " + "scale(" + scale + ", " + scale + ") " + "translate(" + transX + ", " + transY + ")" ;
textLayerDiv . style . transformOrigin = "0% 0%" ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( redrawAnnotations && this . annotationLayer ) {
this . _renderAnnotationLayer ( ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get width ( ) {
return this . viewport . width ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const {
div ,
pdfPage
} = this ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! pdfPage ) {
this . renderingState = _pdf _rendering _queue . RenderingStates . FINISHED ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . loadingIconDiv ) {
div . removeChild ( this . loadingIconDiv ) ;
delete this . loadingIconDiv ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return Promise . reject ( new Error ( "pdfPage is not loaded" ) ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
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" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . annotationLayer && this . annotationLayer . div ) {
div . insertBefore ( canvasWrapper , this . annotationLayer . div ) ;
} else {
div . appendChild ( canvasWrapper ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let textLayer = null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . annotationLayer && this . annotationLayer . div ) {
div . insertBefore ( textLayerDiv , this . annotationLayer . div ) ;
} else {
div . appendChild ( textLayerDiv ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
textLayer = this . textLayerFactory . createTextLayerBuilder ( textLayerDiv , this . id - 1 , this . viewport , this . textLayerMode === _ui _utils . TextLayerMode . ENABLE _ENHANCE , this . eventBus ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . textLayer = textLayer ;
let renderContinueCallback = null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . renderingQueue ) {
renderContinueCallback = cont => {
if ( ! this . renderingQueue . isHighestPriority ( this ) ) {
this . renderingState = _pdf _rendering _queue . RenderingStates . PAUSED ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . resume = ( ) => {
this . renderingState = _pdf _rendering _queue . RenderingStates . RUNNING ;
cont ( ) ;
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
cont ( ) ;
} ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const finishPaintTask = async error => {
if ( paintTask === this . paintTask ) {
this . paintTask = null ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( error instanceof _pdfjsLib . RenderingCancelledException ) {
this . error = null ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . renderingState = _pdf _rendering _queue . RenderingStates . FINISHED ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . loadingIconDiv ) {
div . removeChild ( this . loadingIconDiv ) ;
delete this . loadingIconDiv ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _resetZoomLayer ( true ) ;
this . error = error ;
this . stats = pdfPage . stats ;
this . eventBus . dispatch ( "pagerendered" , {
source : this ,
pageNumber : this . id ,
cssTransform : false ,
timestamp : performance . now ( )
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( error ) {
throw error ;
}
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
} ) ;
} , function ( reason ) {
return finishPaintTask ( reason ) ;
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . annotationLayerFactory ) {
if ( ! this . annotationLayer ) {
this . annotationLayer = this . annotationLayerFactory . createAnnotationLayerBuilder ( div , pdfPage , this . _annotationStorage , this . imageResourcesPath , this . renderInteractiveForms , this . l10n ) ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _renderAnnotationLayer ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
div . setAttribute ( "data-loaded" , true ) ;
this . eventBus . dispatch ( "pagerender" , {
source : this ,
pageNumber : this . id
} ) ;
return resultPromise ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
paintOnCanvas ( canvasWrapper ) {
const renderCapability = ( 0 , _pdfjsLib . createPromiseCapability ) ( ) ;
const result = {
promise : renderCapability . promise ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
onRenderContinue ( cont ) {
cont ( ) ;
} ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
cancel ( ) {
renderTask . cancel ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
} ;
const viewport = this . viewport ;
const canvas = document . createElement ( "canvas" ) ;
this . l10n . get ( "page_canvas" , {
page : this . id
} , "Page {{page}}" ) . then ( msg => {
canvas . setAttribute ( "aria-label" , msg ) ;
} ) ;
canvas . setAttribute ( "hidden" , "hidden" ) ;
let isCanvasHidden = true ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const showCanvas = function ( ) {
if ( isCanvasHidden ) {
canvas . removeAttribute ( "hidden" ) ;
isCanvasHidden = false ;
2017-05-13 12:01:52 +00:00
}
2021-03-25 17:57:40 +00:00
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( this . maxCanvasPixels > 0 ) {
const pixelsInViewport = viewport . width * viewport . height ;
const maxScale = Math . sqrt ( this . maxCanvasPixels / pixelsInViewport ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( outputScale . sx > maxScale || outputScale . sy > maxScale ) {
outputScale . sx = maxScale ;
outputScale . sy = maxScale ;
2017-05-13 12:01:52 +00:00
outputScale . scaled = true ;
2021-03-25 17:57:40 +00:00
this . hasRestrictedScaling = true ;
} else {
this . hasRestrictedScaling = false ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
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
} ;
const renderTask = this . pdfPage . render ( renderContext ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
renderTask . onContinue = function ( cont ) {
showCanvas ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( result . onRenderContinue ) {
result . onRenderContinue ( cont ) ;
} else {
cont ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
renderTask . promise . then ( function ( ) {
showCanvas ( ) ;
renderCapability . resolve ( undefined ) ;
} , function ( error ) {
showCanvas ( ) ;
renderCapability . reject ( error ) ;
} ) ;
return result ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
paintOnSvg ( wrapper ) {
let cancelled = false ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const ensureNotCancelled = ( ) => {
if ( cancelled ) {
throw new _pdfjsLib . RenderingCancelledException ( ` Rendering cancelled, page ${ this . id } ` , "svg" ) ;
}
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ) ;
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 ) ;
2017-05-13 12:01:52 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
} ) ;
return {
promise ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
onRenderContinue ( cont ) {
cont ( ) ;
} ,
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
cancel ( ) {
cancelled = true ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
} ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setPageLabel ( label ) {
this . pageLabel = typeof label === "string" ? label : null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . pageLabel !== null ) {
this . div . setAttribute ( "data-page-label" , this . pageLabel ) ;
} else {
this . div . removeAttribute ( "data-page-label" ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . PDFPageView = PDFPageView ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 30 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . DefaultTextLayerFactory = exports . TextLayerBuilder = void 0 ;
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const EXPAND _DIVS _TIMEOUT = 300 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class TextLayerBuilder {
constructor ( {
textLayerDiv ,
eventBus ,
pageIndex ,
viewport ,
findController = null ,
enhanceTextSelection = false
} ) {
2019-04-13 13:02:01 +00:00
this . textLayerDiv = textLayerDiv ;
2021-03-25 17:57:40 +00:00
this . eventBus = eventBus ;
2019-04-13 13:02:01 +00:00
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 ;
2020-02-09 16:02:47 +00:00
this . _onUpdateTextLayerMatches = null ;
2019-04-13 13:02:01 +00:00
this . _bindMouse ( ) ;
}
2021-03-25 17:57:40 +00:00
_finishRendering ( ) {
this . renderingDone = true ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . enhanceTextSelection ) {
const endOfContent = document . createElement ( "div" ) ;
endOfContent . className = "endOfContent" ;
this . textLayerDiv . appendChild ( endOfContent ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . eventBus . dispatch ( "textlayerrendered" , {
source : this ,
pageNumber : this . pageNumber ,
numTextDivs : this . textDivs . length
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
render ( timeout = 0 ) {
if ( ! ( this . textContent || this . textContentStream ) || this . renderingDone ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _finishRendering ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateMatches ( ) ;
} , function ( reason ) { } ) ;
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
if ( ! this . _onUpdateTextLayerMatches ) {
this . _onUpdateTextLayerMatches = evt => {
if ( evt . pageIndex === this . pageIdx || evt . pageIndex === - 1 ) {
this . _updateMatches ( ) ;
}
} ;
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "updatetextlayermatches" , this . _onUpdateTextLayerMatches ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2020-02-09 16:02:47 +00:00
2021-03-25 17:57:40 +00:00
cancel ( ) {
if ( this . textLayerRenderTask ) {
this . textLayerRenderTask . cancel ( ) ;
this . textLayerRenderTask = null ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( this . _onUpdateTextLayerMatches ) {
this . eventBus . _off ( "updatetextlayermatches" , this . _onUpdateTextLayerMatches ) ;
this . _onUpdateTextLayerMatches = null ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setTextContentStream ( readableStream ) {
this . cancel ( ) ;
this . textContentStream = readableStream ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setTextContent ( textContent ) {
this . cancel ( ) ;
this . textContent = textContent ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_convertMatches ( matches , matchesLength ) {
if ( ! matches ) {
return [ ] ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const {
findController ,
textContentItemsStr
} = this ;
let i = 0 ,
iIndex = 0 ;
const end = textContentItemsStr . length - 1 ;
const queryLen = findController . state . query . length ;
const result = [ ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let m = 0 , mm = matches . length ; m < mm ; m ++ ) {
let matchIdx = matches [ m ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
while ( i !== end && matchIdx >= iIndex + textContentItemsStr [ i ] . length ) {
iIndex += textContentItemsStr [ i ] . length ;
i ++ ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( i === textContentItemsStr . length ) {
console . error ( "Could not find a matching mapping" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const match = {
begin : {
2019-04-13 13:02:01 +00:00
divIdx : i ,
offset : matchIdx - iIndex
2021-03-25 17:57:40 +00:00
}
} ;
if ( matchesLength ) {
matchIdx += matchesLength [ m ] ;
} else {
matchIdx += queryLen ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
while ( i !== end && matchIdx > iIndex + textContentItemsStr [ i ] . length ) {
iIndex += textContentItemsStr [ i ] . length ;
i ++ ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
match . end = {
divIdx : i ,
offset : matchIdx - iIndex
2019-04-13 13:02:01 +00:00
} ;
2021-03-25 17:57:40 +00:00
result . push ( match ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return result ;
}
_renderMatches ( matches ) {
if ( matches . length === 0 ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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
} ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( className ) {
const span = document . createElement ( "span" ) ;
span . className = className ;
span . appendChild ( node ) ;
div . appendChild ( span ) ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
div . appendChild ( node ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let i0 = selectedMatchIdx ,
i1 = i0 + 1 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( highlightAll ) {
i0 = 0 ;
i1 = matches . length ;
} else if ( ! isSelectedPage ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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" : "" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( isSelected ) {
findController . scrollMatchIntoView ( {
element : textDivs [ begin . divIdx ] ,
pageIndex : pageIdx ,
matchIndex : selectedMatchIdx
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! prevEnd || begin . divIdx !== prevEnd . divIdx ) {
if ( prevEnd !== null ) {
appendTextToDiv ( prevEnd . divIdx , prevEnd . offset , infinity . offset ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
beginText ( begin ) ;
} else {
appendTextToDiv ( prevEnd . divIdx , prevEnd . offset , begin . offset ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
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 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let n0 = begin . divIdx + 1 , n1 = end . divIdx ; n0 < n1 ; n0 ++ ) {
textDivs [ n0 ] . className = "highlight middle" + highlightSuffix ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
beginText ( end , "highlight end" + highlightSuffix ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
prevEnd = end ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
if ( prevEnd ) {
appendTextToDiv ( prevEnd . divIdx , prevEnd . offset , infinity . offset ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updateMatches ( ) {
if ( ! this . renderingDone ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const {
findController ,
matches ,
pageIdx ,
textContentItemsStr ,
textDivs
} = this ;
let clearedUntilDivIdx = - 1 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let i = 0 , ii = matches . length ; i < ii ; i ++ ) {
const match = matches [ i ] ;
const begin = Math . max ( clearedUntilDivIdx , match . begin . divIdx ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( let n = begin , end = match . end . divIdx ; n <= end ; n ++ ) {
const div = textDivs [ n ] ;
div . textContent = textContentItemsStr [ n ] ;
div . className = "" ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
clearedUntilDivIdx = match . end . divIdx + 1 ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! findController || ! findController . highlightMatches ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const pageMatches = findController . pageMatches [ pageIdx ] || null ;
const pageMatchesLength = findController . pageMatchesLength [ pageIdx ] || null ;
this . matches = this . _convertMatches ( pageMatches , pageMatchesLength ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _renderMatches ( this . matches ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_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 ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
return ;
}
const end = div . querySelector ( ".endOfContent" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! end ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let adjustTop = evt . target !== div ;
adjustTop = adjustTop && window . getComputedStyle ( end ) . getPropertyValue ( "-moz-user-select" ) !== "none" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( adjustTop ) {
const divBounds = div . getBoundingClientRect ( ) ;
const r = Math . max ( 0 , ( evt . pageY - divBounds . top ) / divBounds . height ) ;
end . style . top = ( r * 100 ) . toFixed ( 2 ) + "%" ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
end . classList . add ( "active" ) ;
} ) ;
div . addEventListener ( "mouseup" , ( ) => {
if ( this . enhanceTextSelection && this . textLayerRenderTask ) {
expandDivsTimer = setTimeout ( ( ) => {
if ( this . textLayerRenderTask ) {
this . textLayerRenderTask . expandTextDivs ( false ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
expandDivsTimer = null ;
} , EXPAND _DIVS _TIMEOUT ) ;
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const end = div . querySelector ( ".endOfContent" ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! end ) {
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
end . style . top = "" ;
end . classList . remove ( "active" ) ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . TextLayerBuilder = TextLayerBuilder ;
2021-03-25 17:57:40 +00:00
class DefaultTextLayerFactory {
createTextLayerBuilder ( textLayerDiv , pageIndex , viewport , enhanceTextSelection = false , eventBus ) {
return new TextLayerBuilder ( {
textLayerDiv ,
pageIndex ,
viewport ,
enhanceTextSelection ,
eventBus
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . DefaultTextLayerFactory = DefaultTextLayerFactory ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 31 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . SecondaryToolbar = void 0 ;
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _cursor _tools = _ _webpack _require _ _ ( 6 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdf _single _page _viewer = _ _webpack _require _ _ ( 32 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class SecondaryToolbar {
constructor ( options , mainContainer , eventBus ) {
2019-04-13 13:02:01 +00:00
this . toolbar = options . toolbar ;
this . toggleButton = options . toggleButton ;
this . toolbarButtonContainer = options . toolbarButtonContainer ;
this . buttons = [ {
element : options . presentationModeButton ,
2021-03-25 17:57:40 +00:00
eventName : "presentationmode" ,
2019-04-13 13:02:01 +00:00
close : true
} , {
element : options . openFileButton ,
2021-03-25 17:57:40 +00:00
eventName : "openfile" ,
2019-04-13 13:02:01 +00:00
close : true
} , {
element : options . printButton ,
2021-03-25 17:57:40 +00:00
eventName : "print" ,
2019-04-13 13:02:01 +00:00
close : true
} , {
element : options . downloadButton ,
2021-03-25 17:57:40 +00:00
eventName : "download" ,
2019-04-13 13:02:01 +00:00
close : true
} , {
element : options . viewBookmarkButton ,
eventName : null ,
close : true
} , {
element : options . firstPageButton ,
2021-03-25 17:57:40 +00:00
eventName : "firstpage" ,
2019-04-13 13:02:01 +00:00
close : true
} , {
element : options . lastPageButton ,
2021-03-25 17:57:40 +00:00
eventName : "lastpage" ,
2019-04-13 13:02:01 +00:00
close : true
} , {
element : options . pageRotateCwButton ,
2021-03-25 17:57:40 +00:00
eventName : "rotatecw" ,
2019-04-13 13:02:01 +00:00
close : false
} , {
element : options . pageRotateCcwButton ,
2021-03-25 17:57:40 +00:00
eventName : "rotateccw" ,
2019-04-13 13:02:01 +00:00
close : false
} , {
element : options . cursorSelectToolButton ,
2021-03-25 17:57:40 +00:00
eventName : "switchcursortool" ,
2019-04-13 13:02:01 +00:00
eventDetails : {
tool : _pdf _cursor _tools . CursorTool . SELECT
} ,
close : true
} , {
element : options . cursorHandToolButton ,
2021-03-25 17:57:40 +00:00
eventName : "switchcursortool" ,
2019-04-13 13:02:01 +00:00
eventDetails : {
tool : _pdf _cursor _tools . CursorTool . HAND
} ,
close : true
} , {
element : options . scrollVerticalButton ,
2021-03-25 17:57:40 +00:00
eventName : "switchscrollmode" ,
2019-04-13 13:02:01 +00:00
eventDetails : {
mode : _ui _utils . ScrollMode . VERTICAL
} ,
close : true
} , {
element : options . scrollHorizontalButton ,
2021-03-25 17:57:40 +00:00
eventName : "switchscrollmode" ,
2019-04-13 13:02:01 +00:00
eventDetails : {
mode : _ui _utils . ScrollMode . HORIZONTAL
} ,
close : true
} , {
element : options . scrollWrappedButton ,
2021-03-25 17:57:40 +00:00
eventName : "switchscrollmode" ,
2019-04-13 13:02:01 +00:00
eventDetails : {
mode : _ui _utils . ScrollMode . WRAPPED
} ,
close : true
} , {
element : options . spreadNoneButton ,
2021-03-25 17:57:40 +00:00
eventName : "switchspreadmode" ,
2019-04-13 13:02:01 +00:00
eventDetails : {
mode : _ui _utils . SpreadMode . NONE
} ,
close : true
} , {
element : options . spreadOddButton ,
2021-03-25 17:57:40 +00:00
eventName : "switchspreadmode" ,
2019-04-13 13:02:01 +00:00
eventDetails : {
mode : _ui _utils . SpreadMode . ODD
} ,
close : true
} , {
element : options . spreadEvenButton ,
2021-03-25 17:57:40 +00:00
eventName : "switchspreadmode" ,
2019-04-13 13:02:01 +00:00
eventDetails : {
mode : _ui _utils . SpreadMode . EVEN
} ,
close : true
} , {
element : options . documentPropertiesButton ,
2021-03-25 17:57:40 +00:00
eventName : "documentproperties" ,
2019-04-13 13:02:01 +00:00
close : true
} ] ;
this . items = {
firstPage : options . firstPageButton ,
lastPage : options . lastPageButton ,
pageRotateCw : options . pageRotateCwButton ,
pageRotateCcw : options . pageRotateCcwButton
2017-05-13 12:01:52 +00:00
} ;
2019-04-13 13:02:01 +00:00
this . mainContainer = mainContainer ;
this . eventBus = eventBus ;
this . opened = false ;
this . containerHeight = null ;
this . previousContainerHeight = null ;
this . reset ( ) ;
this . _bindClickListeners ( ) ;
this . _bindCursorToolsListener ( options ) ;
this . _bindScrollModeListener ( options ) ;
this . _bindSpreadModeListener ( options ) ;
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "resize" , this . _setMaxHeight . bind ( this ) ) ;
this . eventBus . _on ( "baseviewerinit" , evt => {
2019-04-13 13:02:01 +00:00
if ( evt . source instanceof _pdf _single _page _viewer . PDFSinglePageViewer ) {
2021-03-25 17:57:40 +00:00
this . toolbarButtonContainer . classList . add ( "hiddenScrollModeButtons" , "hiddenSpreadModeButtons" ) ;
2017-05-13 12:01:52 +00:00
} else {
2021-03-25 17:57:40 +00:00
this . toolbarButtonContainer . classList . remove ( "hiddenScrollModeButtons" , "hiddenSpreadModeButtons" ) ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
} ) ;
}
2021-03-25 17:57:40 +00:00
get isOpen ( ) {
return this . opened ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setPageNumber ( pageNumber ) {
this . pageNumber = pageNumber ;
this . _updateUIState ( ) ;
}
setPagesCount ( pagesCount ) {
this . pagesCount = pagesCount ;
this . _updateUIState ( ) ;
}
reset ( ) {
this . pageNumber = 0 ;
this . pagesCount = 0 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateUIState ( ) ;
this . eventBus . dispatch ( "secondarytoolbarreset" , {
source : this
} ) ;
}
_updateUIState ( ) {
this . items . firstPage . disabled = this . pageNumber <= 1 ;
this . items . lastPage . disabled = this . pageNumber >= this . pagesCount ;
this . items . pageRotateCw . disabled = this . pagesCount === 0 ;
this . items . pageRotateCcw . disabled = this . pagesCount === 0 ;
}
_bindClickListeners ( ) {
this . toggleButton . addEventListener ( "click" , this . toggle . bind ( this ) ) ;
for ( const {
element ,
eventName ,
close ,
eventDetails
} of this . buttons ) {
if ( element ) {
element . addEventListener ( "click" , evt => {
if ( eventName !== null ) {
const details = {
source : this
} ;
for ( const property in eventDetails ) {
details [ property ] = eventDetails [ property ] ;
}
this . eventBus . dispatch ( eventName , details ) ;
}
if ( close ) {
this . close ( ) ;
}
} ) ;
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_bindCursorToolsListener ( buttons ) {
this . eventBus . _on ( "cursortoolchanged" , function ( {
tool
} ) {
buttons . cursorSelectToolButton . classList . toggle ( "toggled" , tool === _pdf _cursor _tools . CursorTool . SELECT ) ;
buttons . cursorHandToolButton . classList . toggle ( "toggled" , tool === _pdf _cursor _tools . CursorTool . HAND ) ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_bindScrollModeListener ( buttons ) {
function scrollModeChanged ( {
mode
} ) {
buttons . scrollVerticalButton . classList . toggle ( "toggled" , mode === _ui _utils . ScrollMode . VERTICAL ) ;
buttons . scrollHorizontalButton . classList . toggle ( "toggled" , mode === _ui _utils . ScrollMode . HORIZONTAL ) ;
buttons . scrollWrappedButton . classList . toggle ( "toggled" , mode === _ui _utils . ScrollMode . WRAPPED ) ;
const isScrollModeHorizontal = mode === _ui _utils . ScrollMode . HORIZONTAL ;
buttons . spreadNoneButton . disabled = isScrollModeHorizontal ;
buttons . spreadOddButton . disabled = isScrollModeHorizontal ;
buttons . spreadEvenButton . disabled = isScrollModeHorizontal ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "scrollmodechanged" , scrollModeChanged ) ;
this . eventBus . _on ( "secondarytoolbarreset" , evt => {
if ( evt . source === this ) {
scrollModeChanged ( {
mode : _ui _utils . ScrollMode . VERTICAL
} ) ;
2017-05-13 12:01:52 +00:00
}
2021-03-25 17:57:40 +00:00
} ) ;
}
_bindSpreadModeListener ( buttons ) {
function spreadModeChanged ( {
mode
} ) {
buttons . spreadNoneButton . classList . toggle ( "toggled" , mode === _ui _utils . SpreadMode . NONE ) ;
buttons . spreadOddButton . classList . toggle ( "toggled" , mode === _ui _utils . SpreadMode . ODD ) ;
buttons . spreadEvenButton . classList . toggle ( "toggled" , mode === _ui _utils . SpreadMode . EVEN ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "spreadmodechanged" , spreadModeChanged ) ;
this . eventBus . _on ( "secondarytoolbarreset" , evt => {
if ( evt . source === this ) {
spreadModeChanged ( {
mode : _ui _utils . SpreadMode . NONE
} ) ;
2017-05-13 12:01:52 +00:00
}
2021-03-25 17:57:40 +00:00
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
open ( ) {
if ( this . opened ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . opened = true ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _setMaxHeight ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . toggleButton . classList . add ( "toggled" ) ;
this . toolbar . classList . remove ( "hidden" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
close ( ) {
if ( ! this . opened ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . opened = false ;
this . toolbar . classList . add ( "hidden" ) ;
this . toggleButton . classList . remove ( "toggled" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
toggle ( ) {
if ( this . opened ) {
this . close ( ) ;
} else {
this . open ( ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_setMaxHeight ( ) {
if ( ! this . opened ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . containerHeight = this . mainContainer . clientHeight ;
if ( this . containerHeight === this . previousContainerHeight ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . toolbarButtonContainer . style . maxHeight = ` ${ this . containerHeight - _ui _utils . SCROLLBAR _PADDING } px ` ;
this . previousContainerHeight = this . containerHeight ;
}
}
2019-04-13 13:02:01 +00:00
exports . SecondaryToolbar = SecondaryToolbar ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 32 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFSinglePageViewer = void 0 ;
2021-03-25 17:57:40 +00:00
var _base _viewer = _ _webpack _require _ _ ( 27 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class PDFSinglePageViewer extends _base _viewer . BaseViewer {
constructor ( options ) {
super ( options ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . eventBus . _on ( "pagesinit" , evt => {
this . _ensurePageViewVisible ( ) ;
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get _viewerElement ( ) {
return ( 0 , _pdfjsLib . shadow ) ( this , "_viewerElement" , this . _shadowViewer ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_resetView ( ) {
super . _resetView ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _previousPageNumber = 1 ;
this . _shadowViewer = document . createDocumentFragment ( ) ;
this . _updateScrollDown = null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_ensurePageViewVisible ( ) {
const pageView = this . _pages [ this . _currentPageNumber - 1 ] ;
const previousPageView = this . _pages [ this . _previousPageNumber - 1 ] ;
const viewerNodes = this . viewer . childNodes ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
switch ( viewerNodes . length ) {
case 0 :
this . viewer . appendChild ( pageView . div ) ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
case 1 :
if ( viewerNodes [ 0 ] !== previousPageView . div ) {
throw new Error ( "_ensurePageViewVisible: Unexpected previously visible page." ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( pageView === previousPageView ) {
break ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _shadowViewer . appendChild ( previousPageView . div ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . viewer . appendChild ( pageView . div ) ;
this . container . scrollTop = 0 ;
break ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
default :
throw new Error ( "_ensurePageViewVisible: Only one page should be visible at a time." ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _previousPageNumber = this . _currentPageNumber ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
_scrollUpdate ( ) {
if ( this . _updateScrollDown ) {
this . _updateScrollDown ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
super . _scrollUpdate ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_scrollIntoView ( {
pageDiv ,
pageSpot = null ,
pageNumber = null
} ) {
if ( pageNumber ) {
this . _setCurrentPageNumber ( pageNumber ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const scrolledDown = this . _currentPageNumber >= this . _previousPageNumber ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _ensurePageViewVisible ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . update ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
super . _scrollIntoView ( {
pageDiv ,
pageSpot ,
pageNumber
} ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateScrollDown = ( ) => {
this . scroll . down = scrolledDown ;
this . _updateScrollDown = null ;
} ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_getVisiblePages ( ) {
return this . _getCurrentVisiblePage ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updateHelper ( visiblePages ) { }
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
get _isScrollModeHorizontal ( ) {
return ( 0 , _pdfjsLib . shadow ) ( this , "_isScrollModeHorizontal" , false ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updateScrollMode ( ) { }
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
_updateSpreadMode ( ) { }
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . PDFSinglePageViewer = PDFSinglePageViewer ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 33 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . Toolbar = void 0 ;
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const PAGE _NUMBER _LOADING _INDICATOR = "visiblePageIsLoading" ;
const SCALE _SELECT _CONTAINER _WIDTH = 140 ;
const SCALE _SELECT _WIDTH = 162 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class Toolbar {
constructor ( options , eventBus , l10n = _ui _utils . NullL10n ) {
2019-04-13 13:02:01 +00:00
this . toolbar = options . container ;
this . eventBus = eventBus ;
this . l10n = l10n ;
2021-03-25 17:57:40 +00:00
this . buttons = [ {
element : options . previous ,
eventName : "previouspage"
} , {
element : options . next ,
eventName : "nextpage"
} , {
element : options . zoomIn ,
eventName : "zoomin"
} , {
element : options . zoomOut ,
eventName : "zoomout"
} , {
element : options . openFile ,
eventName : "openfile"
} , {
element : options . print ,
eventName : "print"
} , {
element : options . presentationModeButton ,
eventName : "presentationmode"
} , {
element : options . download ,
eventName : "download"
} , {
element : options . viewBookmark ,
eventName : null
} ] ;
this . items = {
numPages : options . numPages ,
pageNumber : options . pageNumber ,
scaleSelectContainer : options . scaleSelectContainer ,
scaleSelect : options . scaleSelect ,
customScaleOption : options . customScaleOption ,
previous : options . previous ,
next : options . next ,
zoomIn : options . zoomIn ,
zoomOut : options . zoomOut
} ;
2019-04-13 13:02:01 +00:00
this . _wasLocalized = false ;
this . reset ( ) ;
this . _bindListeners ( ) ;
}
2021-03-25 17:57:40 +00:00
setPageNumber ( pageNumber , pageLabel ) {
this . pageNumber = pageNumber ;
this . pageLabel = pageLabel ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateUIState ( false ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setPagesCount ( pagesCount , hasPageLabels ) {
this . pagesCount = pagesCount ;
this . hasPageLabels = hasPageLabels ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . _updateUIState ( true ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
setPageScale ( pageScaleValue , pageScale ) {
this . pageScaleValue = ( pageScaleValue || pageScale ) . toString ( ) ;
this . pageScale = pageScale ;
this . _updateUIState ( false ) ;
}
reset ( ) {
this . pageNumber = 0 ;
this . pageLabel = null ;
this . hasPageLabels = false ;
this . pagesCount = 0 ;
this . pageScaleValue = _ui _utils . DEFAULT _SCALE _VALUE ;
this . pageScale = _ui _utils . DEFAULT _SCALE ;
this . _updateUIState ( true ) ;
this . updateLoadingIndicatorState ( ) ;
}
_bindListeners ( ) {
const {
pageNumber ,
scaleSelect
} = this . items ;
const self = this ;
for ( const {
element ,
eventName
} of this . buttons ) {
if ( element ) {
element . addEventListener ( "click" , evt => {
if ( eventName !== null ) {
this . eventBus . dispatch ( eventName , {
source : this
} ) ;
}
} ) ;
2017-05-13 12:01:52 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
pageNumber . addEventListener ( "click" , function ( ) {
this . select ( ) ;
} ) ;
pageNumber . addEventListener ( "change" , function ( ) {
self . eventBus . dispatch ( "pagenumberchanged" , {
source : self ,
value : this . value
2019-04-13 13:02:01 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
} ) ;
scaleSelect . addEventListener ( "change" , function ( ) {
if ( this . value === "custom" ) {
return ;
2020-02-09 16:02:47 +00:00
}
2021-03-25 17:57:40 +00:00
self . eventBus . dispatch ( "scalechanged" , {
source : self ,
value : this . value
2017-05-13 12:01:52 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
} ) ;
scaleSelect . oncontextmenu = _ui _utils . noContextMenuHandler ;
this . eventBus . _on ( "localized" , ( ) => {
2019-04-13 13:02:01 +00:00
this . _wasLocalized = true ;
this . _adjustScaleWidth ( ) ;
this . _updateUIState ( true ) ;
2021-03-25 17:57:40 +00:00
} ) ;
}
_updateUIState ( resetNumPages = false ) {
if ( ! this . _wasLocalized ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const {
pageNumber ,
pagesCount ,
pageScaleValue ,
pageScale ,
items
} = this ;
if ( resetNumPages ) {
if ( this . hasPageLabels ) {
items . pageNumber . type = "text" ;
} else {
items . pageNumber . type = "number" ;
this . l10n . get ( "of_pages" , {
pagesCount
} , "of {{pagesCount}}" ) . then ( msg => {
items . numPages . textContent = msg ;
} ) ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
items . pageNumber . max = pagesCount ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( this . hasPageLabels ) {
items . pageNumber . value = this . pageLabel ;
this . l10n . get ( "page_of_pages" , {
pageNumber ,
pagesCount
} , "({{pageNumber}} of {{pagesCount}})" ) . then ( msg => {
items . numPages . textContent = msg ;
} ) ;
} else {
items . pageNumber . value = pageNumber ;
}
items . previous . disabled = pageNumber <= 1 ;
items . next . disabled = pageNumber >= pagesCount ;
items . zoomOut . disabled = pageScale <= _ui _utils . MIN _SCALE ;
items . zoomIn . disabled = pageScale >= _ui _utils . MAX _SCALE ;
const customScale = Math . round ( pageScale * 10000 ) / 100 ;
this . l10n . get ( "page_scale_percent" , {
scale : customScale
} , "{{scale}}%" ) . then ( msg => {
let predefinedValueFound = false ;
for ( const option of items . scaleSelect . options ) {
if ( option . value !== pageScaleValue ) {
option . selected = false ;
continue ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
option . selected = true ;
predefinedValueFound = true ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! predefinedValueFound ) {
items . customScaleOption . textContent = msg ;
items . customScaleOption . selected = true ;
2017-05-13 12:01:52 +00:00
}
2021-03-25 17:57:40 +00:00
} ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
updateLoadingIndicatorState ( loading = false ) {
const pageNumberInput = this . items . pageNumber ;
pageNumberInput . classList . toggle ( PAGE _NUMBER _LOADING _INDICATOR , loading ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async _adjustScaleWidth ( ) {
const {
items ,
l10n
} = this ;
const predefinedValuesPromise = Promise . all ( [ l10n . get ( "page_scale_auto" , null , "Automatic Zoom" ) , l10n . get ( "page_scale_actual" , null , "Actual Size" ) , l10n . get ( "page_scale_fit" , null , "Page Fit" ) , l10n . get ( "page_scale_width" , null , "Page Width" ) ] ) ;
let canvas = document . createElement ( "canvas" ) ;
canvas . mozOpaque = true ;
let ctx = canvas . getContext ( "2d" , {
alpha : false
} ) ;
await _ui _utils . animationStarted ;
const {
fontSize ,
fontFamily
} = getComputedStyle ( items . scaleSelect ) ;
ctx . font = ` ${ fontSize } ${ fontFamily } ` ;
let maxWidth = 0 ;
for ( const predefinedValue of await predefinedValuesPromise ) {
const {
width
} = ctx . measureText ( predefinedValue ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( width > maxWidth ) {
maxWidth = width ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const overflow = SCALE _SELECT _WIDTH - SCALE _SELECT _CONTAINER _WIDTH ;
maxWidth += 2 * overflow ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( maxWidth > SCALE _SELECT _CONTAINER _WIDTH ) {
items . scaleSelect . style . width = ` ${ maxWidth + overflow } px ` ;
items . scaleSelectContainer . style . width = ` ${ maxWidth } px ` ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
canvas . width = 0 ;
canvas . height = 0 ;
canvas = ctx = null ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . Toolbar = Toolbar ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 34 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . ViewHistory = void 0 ;
2021-03-25 17:57:40 +00:00
const DEFAULT _VIEW _HISTORY _CACHE _SIZE = 20 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class ViewHistory {
constructor ( fingerprint , cacheSize = DEFAULT _VIEW _HISTORY _CACHE _SIZE ) {
2019-04-13 13:02:01 +00:00
this . fingerprint = fingerprint ;
this . cacheSize = cacheSize ;
2021-03-25 17:57:40 +00:00
this . _initializedPromise = this . _readFromStorage ( ) . then ( databaseStr => {
const database = JSON . parse ( databaseStr || "{}" ) ;
let index = - 1 ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ! Array . isArray ( database . files ) ) {
2019-04-13 13:02:01 +00:00
database . files = [ ] ;
} else {
2021-03-25 17:57:40 +00:00
while ( database . files . length >= this . cacheSize ) {
2019-04-13 13:02:01 +00:00
database . files . shift ( ) ;
}
2021-03-25 17:57:40 +00:00
for ( let i = 0 , ii = database . files . length ; i < ii ; i ++ ) {
const branch = database . files [ i ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( branch . fingerprint === this . fingerprint ) {
index = i ;
break ;
}
2019-04-13 13:02:01 +00:00
}
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
if ( index === - 1 ) {
index = database . files . push ( {
2021-03-25 17:57:40 +00:00
fingerprint : this . fingerprint
2019-04-13 13:02:01 +00:00
} ) - 1 ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . file = database . files [ index ] ;
this . database = database ;
2019-04-13 13:02:01 +00:00
} ) ;
}
2021-03-25 17:57:40 +00:00
async _writeToStorage ( ) {
const databaseStr = JSON . stringify ( this . database ) ;
localStorage . setItem ( "pdfjs.history" , databaseStr ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async _readFromStorage ( ) {
return localStorage . getItem ( "pdfjs.history" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async set ( name , val ) {
await this . _initializedPromise ;
this . file [ name ] = val ;
return this . _writeToStorage ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async setMultiple ( properties ) {
await this . _initializedPromise ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( const name in properties ) {
this . file [ name ] = properties [ name ] ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return this . _writeToStorage ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async get ( name , defaultValue ) {
await this . _initializedPromise ;
const val = this . file [ name ] ;
return val !== undefined ? val : defaultValue ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async getMultiple ( properties ) {
await this . _initializedPromise ;
const values = Object . create ( null ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( const name in properties ) {
const val = this . file [ name ] ;
values [ name ] = val !== undefined ? val : properties [ name ] ;
}
return values ;
}
}
2019-04-13 13:02:01 +00:00
exports . ViewHistory = ViewHistory ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 35 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . GenericCom = void 0 ;
var _app = _ _webpack _require _ _ ( 1 ) ;
2021-03-25 17:57:40 +00:00
var _preferences = _ _webpack _require _ _ ( 36 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _download _manager = _ _webpack _require _ _ ( 37 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _genericl10n = _ _webpack _require _ _ ( 38 ) ;
2019-04-13 13:02:01 +00:00
;
2021-03-25 17:57:40 +00:00
const GenericCom = { } ;
2019-04-13 13:02:01 +00:00
exports . GenericCom = GenericCom ;
2021-03-25 17:57:40 +00:00
class GenericPreferences extends _preferences . BasePreferences {
async _writeToStorage ( prefObj ) {
localStorage . setItem ( "pdfjs.preferences" , JSON . stringify ( prefObj ) ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
async _readFromStorage ( prefObj ) {
return JSON . parse ( localStorage . getItem ( "pdfjs.preferences" ) ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class GenericExternalServices extends _app . DefaultExternalServices {
static createDownloadManager ( options ) {
return new _download _manager . DownloadManager ( options ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
static createPreferences ( ) {
return new GenericPreferences ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
static createL10n ( {
locale = "en-US"
} ) {
return new _genericl10n . GenericL10n ( locale ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
_app . PDFViewerApplication . externalServices = GenericExternalServices ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 36 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . BasePreferences = void 0 ;
2021-03-25 17:57:40 +00:00
var _app _options = _ _webpack _require _ _ ( 3 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let defaultPreferences = null ;
2019-04-13 13:02:01 +00:00
function getDefaultPreferences ( ) {
if ( ! defaultPreferences ) {
defaultPreferences = Promise . resolve ( {
"cursorToolOnLoad" : 0 ,
2020-02-09 16:02:47 +00:00
"defaultZoomValue" : "" ,
"disablePageLabels" : false ,
2021-03-25 17:57:40 +00:00
"enablePermissions" : false ,
2020-02-09 16:02:47 +00:00
"enablePrintAutoRotate" : false ,
2019-04-13 13:02:01 +00:00
"enableWebGL" : false ,
"externalLinkTarget" : 0 ,
2020-02-09 16:02:47 +00:00
"historyUpdateUrl" : false ,
2021-03-25 17:57:40 +00:00
"ignoreDestinationZoom" : false ,
2020-02-09 16:02:47 +00:00
"pdfBugEnabled" : false ,
2019-04-13 13:02:01 +00:00
"renderer" : "canvas" ,
2021-03-25 17:57:40 +00:00
"renderInteractiveForms" : true ,
2020-02-09 16:02:47 +00:00
"sidebarViewOnLoad" : - 1 ,
2019-04-13 13:02:01 +00:00
"scrollModeOnLoad" : - 1 ,
2020-02-09 16:02:47 +00:00
"spreadModeOnLoad" : - 1 ,
"textLayerMode" : 1 ,
"useOnlyCssZoom" : false ,
"viewOnLoad" : 0 ,
"disableAutoFetch" : false ,
"disableFontFace" : false ,
"disableRange" : false ,
"disableStream" : false
2019-04-13 13:02:01 +00:00
} ) ;
}
return defaultPreferences ;
}
2021-03-25 17:57:40 +00:00
class BasePreferences {
constructor ( ) {
2019-04-13 13:02:01 +00:00
if ( this . constructor === BasePreferences ) {
2021-03-25 17:57:40 +00:00
throw new Error ( "Cannot initialize BasePreferences." ) ;
2019-04-13 13:02:01 +00:00
}
this . prefs = null ;
2021-03-25 17:57:40 +00:00
this . _initializedPromise = getDefaultPreferences ( ) . then ( defaults => {
Object . defineProperty ( this , "defaults" , {
2019-04-13 13:02:01 +00:00
value : Object . freeze ( defaults ) ,
writable : false ,
enumerable : true ,
configurable : false
2017-05-13 12:01:52 +00:00
} ) ;
2021-03-25 17:57:40 +00:00
this . prefs = Object . assign ( Object . create ( null ) , defaults ) ;
return this . _readFromStorage ( defaults ) ;
} ) . then ( prefs => {
2019-04-13 13:02:01 +00:00
if ( ! prefs ) {
return ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
for ( const name in prefs ) {
const defaultValue = this . defaults [ name ] ,
prefValue = prefs [ name ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( defaultValue === undefined || typeof prefValue !== typeof defaultValue ) {
2019-04-13 13:02:01 +00:00
continue ;
}
2021-03-25 17:57:40 +00:00
this . prefs [ name ] = prefValue ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
} ) ;
}
2021-03-25 17:57:40 +00:00
async _writeToStorage ( prefObj ) {
throw new Error ( "Not implemented: _writeToStorage" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async _readFromStorage ( prefObj ) {
throw new Error ( "Not implemented: _readFromStorage" ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async reset ( ) {
await this . _initializedPromise ;
this . prefs = Object . assign ( Object . create ( null ) , this . defaults ) ;
return this . _writeToStorage ( this . defaults ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async set ( name , value ) {
await this . _initializedPromise ;
const defaultValue = this . defaults [ name ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( defaultValue === undefined ) {
throw new Error ( ` Set preference: " ${ name } " is undefined. ` ) ;
} else if ( value === undefined ) {
throw new Error ( "Set preference: no value is specified." ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const valueType = typeof value ;
const defaultType = typeof defaultValue ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( valueType !== defaultType ) {
if ( valueType === "number" && defaultType === "string" ) {
value = value . toString ( ) ;
} else {
throw new Error ( ` Set preference: " ${ value } " is a ${ valueType } , ` + ` expected a ${ defaultType } . ` ) ;
}
} else {
if ( valueType === "number" && ! Number . isInteger ( value ) ) {
throw new Error ( ` Set preference: " ${ value } " must be an integer. ` ) ;
}
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
this . prefs [ name ] = value ;
return this . _writeToStorage ( this . prefs ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async get ( name ) {
await this . _initializedPromise ;
const defaultValue = this . defaults [ name ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( defaultValue === undefined ) {
throw new Error ( ` Get preference: " ${ name } " is undefined. ` ) ;
} else {
const prefValue = this . prefs [ name ] ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( prefValue !== undefined ) {
return prefValue ;
2016-07-09 08:54:13 +00:00
}
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return defaultValue ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async getAll ( ) {
await this . _initializedPromise ;
return Object . assign ( Object . create ( null ) , this . defaults , this . prefs ) ;
}
}
2019-04-13 13:02:01 +00:00
exports . BasePreferences = BasePreferences ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 37 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . DownloadManager = void 0 ;
2021-03-25 17:57:40 +00:00
var _pdfjsLib = _ _webpack _require _ _ ( 5 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
var _viewer _compatibility = _ _webpack _require _ _ ( 4 ) ;
2019-04-13 13:02:01 +00:00
;
2021-03-25 17:57:40 +00:00
function download ( blobUrl , filename ) {
const a = document . createElement ( "a" ) ;
2019-04-13 13:02:01 +00:00
if ( ! a . click ) {
throw new Error ( 'DownloadManager: "a.click()" is not supported.' ) ;
}
a . href = blobUrl ;
2021-03-25 17:57:40 +00:00
a . target = "_parent" ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "download" in a ) {
2019-04-13 13:02:01 +00:00
a . download = filename ;
}
( document . body || document . documentElement ) . appendChild ( a ) ;
a . click ( ) ;
a . remove ( ) ;
}
2021-03-25 17:57:40 +00:00
class DownloadManager {
downloadUrl ( url , filename ) {
if ( ! ( 0 , _pdfjsLib . createValidAbsoluteUrl ) ( url , "http://example.com" ) ) {
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
download ( url + "#pdfjs.action=download" , filename ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
downloadData ( data , filename , contentType ) {
if ( navigator . msSaveBlob ) {
navigator . msSaveBlob ( new Blob ( [ data ] , {
type : contentType
} ) , filename ) ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const blobUrl = ( 0 , _pdfjsLib . createObjectURL ) ( data , contentType , _viewer _compatibility . viewerCompatibilityParams . disableCreateObjectURL ) ;
download ( blobUrl , filename ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
download ( blob , url , filename , sourceEventType = "download" ) {
if ( navigator . msSaveBlob ) {
if ( ! navigator . msSaveBlob ( blob , filename ) ) {
2019-04-13 13:02:01 +00:00
this . downloadUrl ( url , filename ) ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
return ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( _viewer _compatibility . viewerCompatibilityParams . disableCreateObjectURL ) {
this . downloadUrl ( url , filename ) ;
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const blobUrl = URL . createObjectURL ( blob ) ;
download ( blobUrl , filename ) ;
}
}
2019-04-13 13:02:01 +00:00
exports . DownloadManager = DownloadManager ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 38 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . GenericL10n = void 0 ;
2021-03-25 17:57:40 +00:00
_ _webpack _require _ _ ( 39 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const webL10n = document . webL10n ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
class GenericL10n {
constructor ( lang ) {
2019-04-13 13:02:01 +00:00
this . _lang = lang ;
2021-03-25 17:57:40 +00:00
this . _ready = new Promise ( ( resolve , reject ) => {
webL10n . setLanguage ( lang , ( ) => {
2019-04-13 13:02:01 +00:00
resolve ( webL10n ) ;
} ) ;
} ) ;
}
2021-03-25 17:57:40 +00:00
async getLanguage ( ) {
const l10n = await this . _ready ;
return l10n . getLanguage ( ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async getDirection ( ) {
const l10n = await this . _ready ;
return l10n . getDirection ( ) ;
}
async get ( property , args , fallback ) {
const l10n = await this . _ready ;
return l10n . get ( property , args , fallback ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
async translate ( element ) {
const l10n = await this . _ready ;
return l10n . translate ( element ) ;
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
}
2019-04-13 13:02:01 +00:00
exports . GenericL10n = GenericL10n ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 39 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
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 ) ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
}
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 ( ) ;
}
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
} ;
xhr . onerror = onFailure ;
xhr . ontimeout = onFailure ;
2017-05-13 12:01:52 +00:00
try {
2019-04-13 13:02:01 +00:00
xhr . send ( null ) ;
2017-05-13 12:01:52 +00:00
} catch ( e ) {
2019-04-13 13:02:01 +00:00
onFailure ( ) ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
}
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' ;
2016-07-09 08:54:13 +00:00
return ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
var onResourceLoaded = null ;
var gResourceCount = 0 ;
2021-03-25 17:57:40 +00:00
onResourceLoaded = function ( ) {
2019-04-13 13:02:01 +00:00
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 = {
2021-03-25 17:57:40 +00:00
'0' : function ( n ) {
2019-04-13 13:02:01 +00:00
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'1' : function ( n ) {
2019-04-13 13:02:01 +00:00
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' ;
} ,
2021-03-25 17:57:40 +00:00
'2' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( n !== 0 && n % 10 === 0 ) return 'many' ;
if ( n == 2 ) return 'two' ;
if ( n == 1 ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'3' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( n == 1 ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'4' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( isBetween ( n , 0 , 1 ) ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'5' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( isBetween ( n , 0 , 2 ) && n != 2 ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'6' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( n === 0 ) return 'zero' ;
if ( n % 10 == 1 && n % 100 != 11 ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'7' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( n == 2 ) return 'two' ;
if ( n == 1 ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'8' : function ( n ) {
2019-04-13 13:02:01 +00:00
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' ;
} ,
2021-03-25 17:57:40 +00:00
'9' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( n === 0 || n != 1 && isBetween ( n % 100 , 1 , 19 ) ) return 'few' ;
if ( n == 1 ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'10' : function ( n ) {
2019-04-13 13:02:01 +00:00
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' ;
} ,
2021-03-25 17:57:40 +00:00
'11' : function ( n ) {
2019-04-13 13:02:01 +00:00
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' ;
} ,
2021-03-25 17:57:40 +00:00
'12' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( isBetween ( n , 2 , 4 ) ) return 'few' ;
if ( n == 1 ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'13' : function ( n ) {
2019-04-13 13:02:01 +00:00
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' ;
} ,
2021-03-25 17:57:40 +00:00
'14' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( isBetween ( n % 100 , 3 , 4 ) ) return 'few' ;
if ( n % 100 == 2 ) return 'two' ;
if ( n % 100 == 1 ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'15' : function ( n ) {
2019-04-13 13:02:01 +00:00
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' ;
} ,
2021-03-25 17:57:40 +00:00
'16' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( n % 10 == 1 && n != 11 ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'17' : function ( n ) {
2019-04-13 13:02:01 +00:00
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' ;
} ,
2021-03-25 17:57:40 +00:00
'18' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( n === 0 ) return 'zero' ;
if ( isBetween ( n , 0 , 2 ) && n !== 0 && n != 2 ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'19' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( isBetween ( n , 2 , 10 ) ) return 'few' ;
if ( isBetween ( n , 0 , 1 ) ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'20' : function ( n ) {
2019-04-13 13:02:01 +00:00
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' ;
} ,
2021-03-25 17:57:40 +00:00
'21' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( n === 0 ) return 'zero' ;
if ( n == 1 ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'22' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( isBetween ( n , 0 , 1 ) || isBetween ( n , 11 , 99 ) ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'23' : function ( n ) {
2019-04-13 13:02:01 +00:00
if ( isBetween ( n % 10 , 1 , 2 ) || n % 20 === 0 ) return 'one' ;
return 'other' ;
} ,
2021-03-25 17:57:40 +00:00
'24' : function ( n ) {
2019-04-13 13:02:01 +00:00
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 ) ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
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 ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
data = fallback ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
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 ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
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 ] ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
if ( macroName in gMacros ) {
var macro = gMacros [ macroName ] ;
str = macro ( str , param , key , prop ) ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
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 ] ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
if ( arg in gL10nData ) {
return gL10nData [ arg ] ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
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 ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
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 ) ;
}
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
delete data [ gTextProp ] ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
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 ] ) ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
translateElement ( element ) ;
}
return {
2021-03-25 17:57:40 +00:00
get : function ( key , args , fallbackString ) {
2019-04-13 13:02:01 +00:00
var index = key . lastIndexOf ( '.' ) ;
var prop = gTextProp ;
if ( index > 0 ) {
prop = key . substring ( index + 1 ) ;
key = key . substring ( 0 , index ) ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
var fallback ;
if ( fallbackString ) {
fallback = { } ;
fallback [ prop ] = fallbackString ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
var data = getL10nData ( key , args , fallback ) ;
if ( data && prop in data ) {
return data [ prop ] ;
}
return '{{' + key + '}}' ;
} ,
2021-03-25 17:57:40 +00:00
getData : function ( ) {
2019-04-13 13:02:01 +00:00
return gL10nData ;
} ,
2021-03-25 17:57:40 +00:00
getText : function ( ) {
2019-04-13 13:02:01 +00:00
return gTextData ;
} ,
2021-03-25 17:57:40 +00:00
getLanguage : function ( ) {
2019-04-13 13:02:01 +00:00
return gLanguage ;
} ,
2021-03-25 17:57:40 +00:00
setLanguage : function ( lang , callback ) {
2019-04-13 13:02:01 +00:00
loadLocale ( lang , function ( ) {
if ( callback ) callback ( ) ;
} ) ;
} ,
2021-03-25 17:57:40 +00:00
getDirection : function ( ) {
2019-04-13 13:02:01 +00:00
var rtlList = [ 'ar' , 'he' , 'fa' , 'ps' , 'ur' ] ;
var shortCode = gLanguage . split ( '-' , 1 ) [ 0 ] ;
return rtlList . indexOf ( shortCode ) >= 0 ? 'rtl' : 'ltr' ;
} ,
translate : translateFragment ,
2021-03-25 17:57:40 +00:00
getReadyState : function ( ) {
2019-04-13 13:02:01 +00:00
return gReadyState ;
} ,
2021-03-25 17:57:40 +00:00
ready : function ( callback ) {
2019-04-13 13:02:01 +00:00
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 ) ;
/***/ } ) ,
2021-03-25 17:57:40 +00:00
/* 40 */
2019-04-13 13:02:01 +00:00
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports . PDFPrintService = PDFPrintService ;
2021-03-25 17:57:40 +00:00
var _ui _utils = _ _webpack _require _ _ ( 2 ) ;
2019-04-13 13:02:01 +00:00
var _app = _ _webpack _require _ _ ( 1 ) ;
2021-03-25 17:57:40 +00:00
var _viewer _compatibility = _ _webpack _require _ _ ( 4 ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let activeService = null ;
let overlayManager = null ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
function renderPage ( activeServiceOnEntry , pdfDocument , pageNumber , size , printResolution , optionalContentConfigPromise ) {
const scratchCanvas = activeService . scratchCanvas ;
const PRINT _UNITS = printResolution / 72.0 ;
2019-04-13 13:02:01 +00:00
scratchCanvas . width = Math . floor ( size . width * PRINT _UNITS ) ;
scratchCanvas . height = Math . floor ( size . height * PRINT _UNITS ) ;
2021-03-25 17:57:40 +00:00
const width = Math . floor ( size . width * _ui _utils . CSS _UNITS ) + "px" ;
const height = Math . floor ( size . height * _ui _utils . CSS _UNITS ) + "px" ;
const ctx = scratchCanvas . getContext ( "2d" ) ;
2019-04-13 13:02:01 +00:00
ctx . save ( ) ;
2021-03-25 17:57:40 +00:00
ctx . fillStyle = "rgb(255, 255, 255)" ;
2019-04-13 13:02:01 +00:00
ctx . fillRect ( 0 , 0 , scratchCanvas . width , scratchCanvas . height ) ;
ctx . restore ( ) ;
return pdfDocument . getPage ( pageNumber ) . then ( function ( pdfPage ) {
2021-03-25 17:57:40 +00:00
const renderContext = {
2017-05-13 12:01:52 +00:00
canvasContext : ctx ,
2019-04-13 13:02:01 +00:00
transform : [ PRINT _UNITS , 0 , 0 , PRINT _UNITS , 0 , 0 ] ,
viewport : pdfPage . getViewport ( {
scale : 1 ,
rotation : size . rotation
} ) ,
2021-03-25 17:57:40 +00:00
intent : "print" ,
annotationStorage : pdfDocument . annotationStorage ,
optionalContentConfigPromise
2019-04-13 13:02:01 +00:00
} ;
return pdfPage . render ( renderContext ) . promise ;
} ) . then ( function ( ) {
return {
2021-03-25 17:57:40 +00:00
width ,
height
2019-04-13 13:02:01 +00:00
} ;
} ) ;
}
2021-03-25 17:57:40 +00:00
function PDFPrintService ( pdfDocument , pagesOverview , printContainer , printResolution , optionalContentConfigPromise = null , l10n ) {
2019-04-13 13:02:01 +00:00
this . pdfDocument = pdfDocument ;
this . pagesOverview = pagesOverview ;
this . printContainer = printContainer ;
2021-03-25 17:57:40 +00:00
this . _printResolution = printResolution || 150 ;
this . _optionalContentConfigPromise = optionalContentConfigPromise || pdfDocument . getOptionalContentConfig ( ) ;
2019-04-13 13:02:01 +00:00
this . l10n = l10n || _ui _utils . NullL10n ;
this . currentPage = - 1 ;
2021-03-25 17:57:40 +00:00
this . scratchCanvas = document . createElement ( "canvas" ) ;
2019-04-13 13:02:01 +00:00
}
PDFPrintService . prototype = {
2021-03-25 17:57:40 +00:00
layout ( ) {
2019-04-13 13:02:01 +00:00
this . throwIfInactive ( ) ;
2021-03-25 17:57:40 +00:00
const body = document . querySelector ( "body" ) ;
body . setAttribute ( "data-pdfjsprinting" , true ) ;
const hasEqualPageSizes = this . pagesOverview . every ( function ( size ) {
2017-05-13 12:01:52 +00:00
return size . width === this . pagesOverview [ 0 ] . width && size . height === this . pagesOverview [ 0 ] . height ;
2019-04-13 13:02:01 +00:00
} , this ) ;
if ( ! hasEqualPageSizes ) {
2021-03-25 17:57:40 +00:00
console . warn ( "Not all pages have the same size. The printed " + "result may be incorrect!" ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . pageStyleSheet = document . createElement ( "style" ) ;
const pageSize = this . pagesOverview [ 0 ] ;
this . pageStyleSheet . textContent = "@supports ((size:A4) and (size:1pt 1pt)) {" + "@page { size: " + pageSize . width + "pt " + pageSize . height + "pt;}" + "}" ;
2019-04-13 13:02:01 +00:00
body . appendChild ( this . pageStyleSheet ) ;
} ,
2021-03-25 17:57:40 +00:00
destroy ( ) {
2019-04-13 13:02:01 +00:00
if ( activeService !== this ) {
2017-05-13 12:01:52 +00:00
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
this . printContainer . textContent = "" ;
const body = document . querySelector ( "body" ) ;
body . removeAttribute ( "data-pdfjsprinting" ) ;
2019-04-13 13:02:01 +00:00
if ( this . pageStyleSheet ) {
this . pageStyleSheet . remove ( ) ;
2017-05-13 12:01:52 +00:00
this . pageStyleSheet = null ;
2019-04-13 13:02:01 +00:00
}
this . scratchCanvas . width = this . scratchCanvas . height = 0 ;
this . scratchCanvas = null ;
activeService = null ;
ensureOverlay ( ) . then ( function ( ) {
2021-03-25 17:57:40 +00:00
if ( overlayManager . active !== "printServiceOverlay" ) {
2019-04-13 13:02:01 +00:00
return ;
}
2021-03-25 17:57:40 +00:00
overlayManager . close ( "printServiceOverlay" ) ;
2019-04-13 13:02:01 +00:00
} ) ;
} ,
2021-03-25 17:57:40 +00:00
renderPages ( ) {
const pageCount = this . pagesOverview . length ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
const renderNextPage = ( resolve , reject ) => {
this . throwIfInactive ( ) ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( ++ this . currentPage >= pageCount ) {
renderProgress ( pageCount , pageCount , this . l10n ) ;
2019-04-13 13:02:01 +00:00
resolve ( ) ;
return ;
}
2021-03-25 17:57:40 +00:00
const index = this . currentPage ;
renderProgress ( index , pageCount , this . l10n ) ;
renderPage ( this , this . pdfDocument , index + 1 , this . pagesOverview [ index ] , this . _printResolution , this . _optionalContentConfigPromise ) . then ( this . useRenderedPage . bind ( this ) ) . then ( function ( ) {
2019-04-13 13:02:01 +00:00
renderNextPage ( resolve , reject ) ;
2017-05-13 12:01:52 +00:00
} , reject ) ;
2019-04-13 13:02:01 +00:00
} ;
return new Promise ( renderNextPage ) ;
} ,
2021-03-25 17:57:40 +00:00
useRenderedPage ( printItem ) {
2019-04-13 13:02:01 +00:00
this . throwIfInactive ( ) ;
2021-03-25 17:57:40 +00:00
const img = document . createElement ( "img" ) ;
2019-04-13 13:02:01 +00:00
img . style . width = printItem . width ;
img . style . height = printItem . height ;
2021-03-25 17:57:40 +00:00
const scratchCanvas = this . scratchCanvas ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
if ( "toBlob" in scratchCanvas && ! _viewer _compatibility . viewerCompatibilityParams . disableCreateObjectURL ) {
2017-05-13 12:01:52 +00:00
scratchCanvas . toBlob ( function ( blob ) {
2021-03-25 17:57:40 +00:00
img . src = URL . createObjectURL ( blob ) ;
2017-05-13 12:01:52 +00:00
} ) ;
2019-04-13 13:02:01 +00:00
} else {
2017-05-13 12:01:52 +00:00
img . src = scratchCanvas . toDataURL ( ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const wrapper = document . createElement ( "div" ) ;
2019-04-13 13:02:01 +00:00
wrapper . appendChild ( img ) ;
this . printContainer . appendChild ( wrapper ) ;
return new Promise ( function ( resolve , reject ) {
2017-05-13 12:01:52 +00:00
img . onload = resolve ;
img . onerror = reject ;
2019-04-13 13:02:01 +00:00
} ) ;
} ,
2021-03-25 17:57:40 +00:00
performPrint ( ) {
2019-04-13 13:02:01 +00:00
this . throwIfInactive ( ) ;
2021-03-25 17:57:40 +00:00
return new Promise ( resolve => {
setTimeout ( ( ) => {
if ( ! this . active ) {
2019-04-13 13:02:01 +00:00
resolve ( ) ;
return ;
}
print . call ( window ) ;
setTimeout ( resolve , 20 ) ;
} , 0 ) ;
} ) ;
} ,
get active ( ) {
return this === activeService ;
} ,
2021-03-25 17:57:40 +00:00
throwIfInactive ( ) {
2019-04-13 13:02:01 +00:00
if ( ! this . active ) {
2021-03-25 17:57:40 +00:00
throw new Error ( "This print request was cancelled or completed." ) ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
2019-04-13 13:02:01 +00:00
} ;
2021-03-25 17:57:40 +00:00
const print = window . print ;
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
window . print = function ( ) {
2019-04-13 13:02:01 +00:00
if ( activeService ) {
2021-03-25 17:57:40 +00:00
console . warn ( "Ignored window.print() because of a pending print job." ) ;
2019-04-13 13:02:01 +00:00
return ;
}
ensureOverlay ( ) . then ( function ( ) {
2017-05-13 12:01:52 +00:00
if ( activeService ) {
2021-03-25 17:57:40 +00:00
overlayManager . open ( "printServiceOverlay" ) ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
} ) ;
try {
2021-03-25 17:57:40 +00:00
dispatchEvent ( "beforeprint" ) ;
2019-04-13 13:02:01 +00:00
} finally {
if ( ! activeService ) {
2021-03-25 17:57:40 +00:00
console . error ( "Expected print service to be initialized." ) ;
2019-04-13 13:02:01 +00:00
ensureOverlay ( ) . then ( function ( ) {
2021-03-25 17:57:40 +00:00
if ( overlayManager . active === "printServiceOverlay" ) {
overlayManager . close ( "printServiceOverlay" ) ;
2019-04-13 13:02:01 +00:00
}
} ) ;
2017-05-13 12:01:52 +00:00
return ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
const activeServiceOnEntry = activeService ;
2019-04-13 13:02:01 +00:00
activeService . renderPages ( ) . then ( function ( ) {
2017-05-13 12:01:52 +00:00
return activeServiceOnEntry . performPrint ( ) ;
2021-03-25 17:57:40 +00:00
} ) . catch ( function ( ) { } ) . then ( function ( ) {
2017-05-13 12:01:52 +00:00
if ( activeServiceOnEntry . active ) {
2019-04-13 13:02:01 +00:00
abort ( ) ;
2017-05-13 12:01:52 +00:00
}
2019-04-13 13:02:01 +00:00
} ) ;
}
} ;
function dispatchEvent ( eventType ) {
2021-03-25 17:57:40 +00:00
const event = document . createEvent ( "CustomEvent" ) ;
event . initCustomEvent ( eventType , false , false , "custom" ) ;
2019-04-13 13:02:01 +00:00
window . dispatchEvent ( event ) ;
}
function abort ( ) {
if ( activeService ) {
activeService . destroy ( ) ;
2021-03-25 17:57:40 +00:00
dispatchEvent ( "afterprint" ) ;
2019-04-13 13:02:01 +00:00
}
}
function renderProgress ( index , total , l10n ) {
2021-03-25 17:57:40 +00:00
const progressContainer = document . getElementById ( "printServiceOverlay" ) ;
const progress = Math . round ( 100 * index / total ) ;
const progressBar = progressContainer . querySelector ( "progress" ) ;
const progressPerc = progressContainer . querySelector ( ".relative-progress" ) ;
2019-04-13 13:02:01 +00:00
progressBar . value = progress ;
2021-03-25 17:57:40 +00:00
l10n . get ( "print_progress_percent" , {
progress
} , progress + "%" ) . then ( msg => {
2019-04-13 13:02:01 +00:00
progressPerc . textContent = msg ;
} ) ;
}
2021-03-25 17:57:40 +00:00
window . addEventListener ( "keydown" , function ( event ) {
2019-04-13 13:02:01 +00:00
if ( event . keyCode === 80 && ( event . ctrlKey || event . metaKey ) && ! event . altKey && ( ! event . shiftKey || window . chrome || window . opera ) ) {
window . print ( ) ;
event . preventDefault ( ) ;
if ( event . stopImmediatePropagation ) {
2017-05-13 12:01:52 +00:00
event . stopImmediatePropagation ( ) ;
2019-04-13 13:02:01 +00:00
} else {
2017-05-13 12:01:52 +00:00
event . stopPropagation ( ) ;
2019-04-13 13:02:01 +00:00
}
}
} , true ) ;
2021-03-25 17:57:40 +00:00
if ( "onbeforeprint" in window ) {
const stopPropagationIfNeeded = function ( event ) {
if ( event . detail !== "custom" && event . stopImmediatePropagation ) {
2019-04-13 13:02:01 +00:00
event . stopImmediatePropagation ( ) ;
}
} ;
2021-03-25 17:57:40 +00:00
window . addEventListener ( "beforeprint" , stopPropagationIfNeeded ) ;
window . addEventListener ( "afterprint" , stopPropagationIfNeeded ) ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
2021-03-25 17:57:40 +00:00
let overlayPromise ;
2019-04-13 13:02:01 +00:00
function ensureOverlay ( ) {
if ( ! overlayPromise ) {
overlayManager = _app . PDFViewerApplication . overlayManager ;
if ( ! overlayManager ) {
2021-03-25 17:57:40 +00:00
throw new Error ( "The overlay manager has not yet been initialized." ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
overlayPromise = overlayManager . register ( "printServiceOverlay" , document . getElementById ( "printServiceOverlay" ) , abort , true ) ;
document . getElementById ( "printCancel" ) . onclick = abort ;
2019-04-13 13:02:01 +00:00
}
return overlayPromise ;
2016-07-09 08:54:13 +00:00
}
2019-04-13 13:02:01 +00:00
_app . PDFPrintServiceFactory . instance = {
supportsPrinting : true ,
2021-03-25 17:57:40 +00:00
createPrintService ( pdfDocument , pagesOverview , printContainer , printResolution , optionalContentConfigPromise , l10n ) {
2019-04-13 13:02:01 +00:00
if ( activeService ) {
2021-03-25 17:57:40 +00:00
throw new Error ( "The print service is created and active." ) ;
2019-04-13 13:02:01 +00:00
}
2021-03-25 17:57:40 +00:00
activeService = new PDFPrintService ( pdfDocument , pagesOverview , printContainer , printResolution , optionalContentConfigPromise , l10n ) ;
2019-04-13 13:02:01 +00:00
return activeService ;
}
2021-03-25 17:57:40 +00:00
2019-04-13 13:02:01 +00:00
} ;
/***/ } )
/******/ ] ) ;
//# sourceMappingURL=viewer.js.map