ngx-extended-pdf-viewer
Version:
Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.
819 lines (808 loc) • 942 kB
JavaScript
import { __awaiter } from 'tslib';
import * as i0 from '@angular/core';
import { Component, Injectable, ViewEncapsulation, Inject, Input, EventEmitter, ViewChild, Output, HostListener, Pipe, PLATFORM_ID, ChangeDetectionStrategy, NgModule } from '@angular/core';
import * as i2 from '@angular/common';
import { DOCUMENT, isPlatformBrowser, CommonModule, Location } from '@angular/common';
import { Subject } from 'rxjs';
import * as i2$1 from '@angular/forms';
import { FormsModule } from '@angular/forms';
import { take } from 'rxjs/operators';
const _isIE11 = typeof window === 'undefined' ? false : !!window.MSInputMethodContext && !!document.documentMode;
const isEdge = typeof navigator === 'undefined' || /Edge\/\d./i.test(navigator.userAgent);
const needsES5 = typeof ReadableStream === 'undefined' || typeof Promise['allSettled'] === 'undefined';
const pdfjsVersion = '2.12.557';
const pdfjsBleedingEdgeVersion = '2.13.408';
function getVersionSuffix(folder) {
if (folder && folder.includes('bleeding-edge')) {
return pdfjsBleedingEdgeVersion;
}
return pdfjsVersion;
}
let pdfDefaultOptions = {
needsES5: _isIE11 || isEdge || needsES5,
cursorToolOnLoad: 0,
defaultUrl: '',
defaultZoomValue: undefined,
disableHistory: false,
disablePageLabels: false,
enablePrintAutoRotate: false,
enableWebGL: false,
eventBusDispatchToDOM: false,
externalLinkRel: 'noopener noreferrer nofollow',
externalLinkTarget: 0,
historyUpdateUrl: false,
ignoreDestinationZoom: false,
imageResourcesPath: './images/',
maxCanvasPixels: 16777216,
pdfBugEnabled: false,
rangeChunkSize: 65536,
removePageBorders: false,
renderer: 'canvas',
renderInteractiveForms: true,
renderForms: true,
enableXfa: true,
sidebarViewOnLoad: -1,
scrollModeOnLoad: -1,
spreadModeOnLoad: -1,
textLayerMode: 2,
useOnlyCssZoom: false,
viewOnLoad: 0,
cMapPacked: true,
cMapUrl: () => `./${pdfDefaultOptions.assetsFolder}/cmaps/`,
disableAutoFetch: false,
disableCreateObjectURL: false,
disableFontFace: false,
disableRange: false,
disableStream: false,
isEvalSupported: true,
maxImageSize: -1,
pdfBug: false,
postMessageTransfers: true,
verbosity: 1,
workerPort: null,
assetsFolder: 'assets',
sandboxBundleSrc: () => pdfDefaultOptions.needsES5
? `./${pdfDefaultOptions.assetsFolder}/pdf.sandbox-${getVersionSuffix(pdfDefaultOptions.assetsFolder)}-es5.js`
: `./${pdfDefaultOptions.assetsFolder}/pdf.sandbox-${getVersionSuffix(pdfDefaultOptions.assetsFolder)}.js`,
workerSrc: () => pdfDefaultOptions.needsES5
? `./${pdfDefaultOptions.assetsFolder}/pdf.worker-${getVersionSuffix(pdfDefaultOptions.assetsFolder)}-es5.js`
: `./${pdfDefaultOptions.assetsFolder}/pdf.worker-${getVersionSuffix(pdfDefaultOptions.assetsFolder)}.js`,
// options specific to ngx-extended-pdf-viewer (as opposed to being used by pdf.js)
doubleTapZoomFactor: 'page-width',
enableScripting: true,
defaultCacheSize: 50,
passwordPrompt: undefined,
};
if (typeof window !== 'undefined') {
if (window.pdfDefaultOptions) {
pdfDefaultOptions = window.pdfDefaultOptions;
}
else {
window.pdfDefaultOptions = pdfDefaultOptions;
}
}
var VerbosityLevel;
(function (VerbosityLevel) {
VerbosityLevel[VerbosityLevel["ERRORS"] = 0] = "ERRORS";
VerbosityLevel[VerbosityLevel["WARNINGS"] = 1] = "WARNINGS";
VerbosityLevel[VerbosityLevel["INFOS"] = 5] = "INFOS";
})(VerbosityLevel || (VerbosityLevel = {}));
;
var FindState;
(function (FindState) {
FindState[FindState["FOUND"] = 0] = "FOUND";
FindState[FindState["NOT_FOUND"] = 1] = "NOT_FOUND";
FindState[FindState["WRAPPED"] = 2] = "WRAPPED";
FindState[FindState["PENDING"] = 3] = "PENDING";
})(FindState || (FindState = {}));
/** List of all field that can be customized */
const requiredIds = [
'toolbarViewer',
'numPages',
'pageNumber',
'scaleSelectContainer',
'customScaleOption',
'previous',
'next',
'zoomIn',
'zoomOut',
'viewFind',
'openFile',
'print',
'presentationMode',
'download',
'viewBookmark',
'secondaryToolbar',
'secondaryToolbarToggle',
'secondaryToolbarButtonContainer',
'secondaryPresentationMode',
'secondaryOpenFile',
'secondaryPrint',
'secondaryDownload',
'secondaryViewBookmark',
'firstPage',
'lastPage',
'pageRotateCw',
'pageRotateCcw',
'cursorSelectTool',
'cursorHandTool',
'scrollVertical',
'scrollHorizontal',
'scrollWrapped',
'spreadNone',
'spreadOdd',
'spreadEven',
'documentProperties',
'contextFirstPage',
'contextLastPage',
'contextPageRotateCw',
'contextPageRotateCcw',
'currentOutlineItem',
'outerContainer',
'viewerContainer',
'sidebarToggle',
'viewThumbnail',
'viewOutline',
'viewAttachments',
'thumbnailView',
'outlineView',
'attachmentsView',
'outerContainer',
'sidebarResizer',
'outlineOptionsContainer',
'findbar',
'viewFind',
'findInput',
'findInputMultiline',
'findHighlightAll',
'findCurrentPage',
'findRange',
'findMatchCase',
'findMatchDiacritics',
'findEntireWord',
'findMultipleSearchTexts',
'findIgnoreAccents',
'findMsg',
'findResultsCount',
'findPrevious',
'findNext',
'findFuzzy',
'passwordOverlay',
'passwordText',
'password',
'passwordSubmit',
'passwordCancel',
'documentPropertiesOverlay',
'documentPropertiesClose',
'fileNameField',
'fileSizeField',
'titleField',
'authorField',
'subjectField',
'keywordsField',
'creationDateField',
'modificationDateField',
'creatorField',
'producerField',
'versionField',
'pageCountField',
'pageSizeField',
'linearizedField',
'errorWrapper',
'errorMessage',
'errorClose',
'errorMoreInfo',
'errorShowMore',
'errorShowLess',
'scaleSelectContainer',
'viewAttachments',
'viewLayers',
'viewThumbnail',
'viewOutline',
];
class PdfDummyComponentsComponent {
addMissingStandardWidgets() {
this.dummyComponentsContainer = document.getElementsByClassName('dummy-pdf-viewer-components')[0];
const container = this.dummyComponentsContainer;
if (container) {
for (let i = 0; i < container.children.length; i++) {
const child = container.firstChild;
if (child) {
container.removeChild(child);
}
}
}
requiredIds.forEach(id => {
if (this.needsDummyWidget(id)) {
const dummy = document.createElement('span');
dummy.id = id;
dummy.className = 'invisible dummy-component';
this.dummyComponentsContainer.appendChild(dummy);
}
});
if (this.needsDummyWidget('scaleSelect')) {
const dummy = document.createElement('select');
dummy.id = 'scaleSelect';
dummy.className = 'invisible dummy-component';
this.dummyComponentsContainer.appendChild(dummy);
}
}
needsDummyWidget(id) {
const widget = document.getElementById(id);
if (!widget) {
return true;
}
return false;
}
}
PdfDummyComponentsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PdfDummyComponentsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
PdfDummyComponentsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: PdfDummyComponentsComponent, selector: "pdf-dummy-components", ngImport: i0, template: "<span class=\"invisible dummy-pdf-viewer-components\">\n</span>\n" });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PdfDummyComponentsComponent, decorators: [{
type: Component,
args: [{ selector: 'pdf-dummy-components', template: "<span class=\"invisible dummy-pdf-viewer-components\">\n</span>\n" }]
}] });
var PdfCursorTools;
(function (PdfCursorTools) {
PdfCursorTools[PdfCursorTools["SELECT"] = 0] = "SELECT";
PdfCursorTools[PdfCursorTools["HAND"] = 1] = "HAND";
PdfCursorTools[PdfCursorTools["ZOOM"] = 2] = "ZOOM";
})(PdfCursorTools || (PdfCursorTools = {}));
class PinchOnMobileSupport {
constructor(_zone) {
this._zone = _zone;
this.startX = 0;
this.startY = 0;
this.initialPinchDistance = 0;
this.pinchScale = 1;
this.boundOnViewerTouchStart = this.onViewerTouchStart.bind(this);
this.boundOnViewerTouchMove = this.onViewerTouchMove.bind(this);
this.boundOnViewerTouchEnd = this.onViewerTouchEnd.bind(this);
this.initializePinchZoom();
}
isMobile() {
return ('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0);
}
onViewerTouchStart(event) {
this.initialPinchDistance = 0;
if (event.touches.length === 2) {
const container = document.getElementById('viewerContainer');
const rect = container.getBoundingClientRect();
if (event.touches[0].pageX >= rect.left && event.touches[0].pageX <= rect.right) {
if (event.touches[0].pageY >= (rect.top + window.scrollY) && event.touches[0].pageY <= (rect.bottom + window.scrollY)) {
if (event.touches[1].pageX >= rect.left && event.touches[1].pageX <= rect.right) {
if (event.touches[1].pageY >= (rect.top + window.scrollY) && event.touches[1].pageY <= (rect.bottom + window.scrollY)) {
this.startX = (event.touches[0].pageX + event.touches[1].pageX) / 2;
this.startY = (event.touches[0].pageY + event.touches[1].pageY) / 2;
this.initialPinchDistance = Math.hypot(event.touches[1].pageX - event.touches[0].pageX, event.touches[1].pageY - event.touches[0].pageY);
if (event.cancelable) {
event.preventDefault();
}
event.stopPropagation();
}
}
}
}
}
}
onViewerTouchMove(event) {
const PDFViewerApplicationOptions = window.PDFViewerApplicationOptions;
const PDFViewerApplication = window.PDFViewerApplication;
if (this.initialPinchDistance <= 0 || event.touches.length !== 2) {
return;
}
const pinchDistance = Math.hypot(event.touches[1].pageX - event.touches[0].pageX, event.touches[1].pageY - event.touches[0].pageY);
const container = document.getElementById('viewerContainer');
const originX = this.startX + container.scrollLeft;
const originY = this.startY + container.scrollTop;
this.pinchScale = pinchDistance / this.initialPinchDistance;
let minZoom = Number(PDFViewerApplicationOptions.get('minZoom'));
if (!minZoom) {
minZoom = 0.1;
}
const currentZoom = PDFViewerApplication.pdfViewer._currentScale;
if (currentZoom * this.pinchScale < minZoom) {
this.pinchScale = minZoom / currentZoom;
}
let maxZoom = Number(PDFViewerApplicationOptions.get('maxZoom'));
if (!maxZoom) {
maxZoom = 10;
}
if (currentZoom * this.pinchScale > maxZoom) {
this.pinchScale = maxZoom / currentZoom;
}
this.viewer.style.transform = `scale(${this.pinchScale})`;
this.viewer.style.transformOrigin = `${originX}px ${originY}px`;
if (event.cancelable) {
event.preventDefault();
}
event.stopPropagation();
}
onViewerTouchEnd(event) {
const PDFViewerApplication = window.PDFViewerApplication;
if (this.initialPinchDistance <= 0) {
return;
}
this.viewer.style.transform = `none`;
this.viewer.style.transformOrigin = `unset`;
PDFViewerApplication.pdfViewer.currentScale *= this.pinchScale;
const container = document.getElementById('viewerContainer');
const rect = container.getBoundingClientRect();
const dx = this.startX - rect.left;
const dy = this.startY - rect.top;
container.scrollLeft += dx * (this.pinchScale - 1);
container.scrollTop += dy * (this.pinchScale - 1);
this.resetPinchZoomParams();
if (event.cancelable) {
event.preventDefault();
}
event.stopPropagation();
}
resetPinchZoomParams() {
this.startX = this.startY = this.initialPinchDistance = 0;
this.pinchScale = 1;
}
initializePinchZoom() {
if (!this.isMobile()) {
return;
}
this.viewer = document.getElementById('viewer');
this._zone.runOutsideAngular(() => {
document.addEventListener('touchstart', this.boundOnViewerTouchStart);
document.addEventListener('touchmove', this.boundOnViewerTouchMove, { passive: false });
document.addEventListener('touchend', this.boundOnViewerTouchEnd);
});
}
destroyPinchZoom() {
if (!this.isMobile()) {
return;
}
document.removeEventListener('touchstart', this.boundOnViewerTouchStart);
document.removeEventListener('touchmove', this.boundOnViewerTouchMove);
document.removeEventListener('touchend', this.boundOnViewerTouchEnd);
}
}
var ScrollModeType;
(function (ScrollModeType) {
ScrollModeType[ScrollModeType["vertical"] = 0] = "vertical";
ScrollModeType[ScrollModeType["horizontal"] = 1] = "horizontal";
ScrollModeType[ScrollModeType["wrapped"] = 2] = "wrapped";
ScrollModeType[ScrollModeType["page"] = 3] = "page";
})(ScrollModeType || (ScrollModeType = {}));
var SpreadModeType;
(function (SpreadModeType) {
SpreadModeType[SpreadModeType["UNKNOWN"] = -1] = "UNKNOWN";
SpreadModeType[SpreadModeType["NONE"] = 0] = "NONE";
SpreadModeType[SpreadModeType["ODD"] = 1] = "ODD";
SpreadModeType[SpreadModeType["EVEN"] = 2] = "EVEN";
})(SpreadModeType || (SpreadModeType = {}));
class UnitToPx {
static initElements() {
if (!document) {
return;
}
if (!this.con || !this.el) {
this.con = document.createElement('div');
this.el = document.createElement('div');
}
this.con.style.position = 'absolute';
this.con.style.width = '0';
this.con.style.height = '0';
this.con.style.visibility = 'hidden';
this.con.style.overflow = 'hidden';
this.con.appendChild(this.el);
}
static pxPerUnit(unit) {
if (!this.pxPerUnitCache[unit]) {
if (!this.con || !this.el) {
this.initElements();
}
if (!this.con || !this.el) {
// dummy implementation for server-side rendering
return 1;
}
this.el.style.width = this.sample + unit;
document.body.appendChild(this.con);
const dimension = this.el.getBoundingClientRect();
this.con.parentNode.removeChild(this.con);
this.pxPerUnitCache[unit] = dimension.width / this.sample;
}
return this.pxPerUnitCache[unit];
}
static toPx(length) {
const unitRe = /^\s*([+-]?[\d\.]*)\s*(.*)\s*$/i;
const match = unitRe.exec(length);
if (match != null && match.length > 2) {
const bare = match[1] === '';
const val = bare ? 1 : Number(match[1]);
const unit = match[2];
const valid = !isNaN(val) && unit;
if (valid) {
return unit === 'px' ? val : this.pxPerUnit(unit) * val;
}
}
throw new TypeError('Error parsing length');
}
}
// cache this.con, el for reused
UnitToPx.con = undefined;
UnitToPx.el = undefined;
// high sample will more accurate?
UnitToPx.sample = 100;
UnitToPx.pxPerUnitCache = {};
class PDFNotificationService {
constructor() {
// this event is fired when the pdf.js library has been loaded and objects like PDFApplication are available
this.onPDFJSInit = new Subject();
this.pdfjsVersion = getVersionSuffix(pdfDefaultOptions.assetsFolder);
}
}
PDFNotificationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PDFNotificationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
PDFNotificationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PDFNotificationService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PDFNotificationService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
class NgxExtendedPdfViewerService$1 {
constructor() {
this.recalculateSize$ = new Subject();
}
findMultiple(text, options = {}) {
options = Object.assign(Object.assign({}, options), { findMultipleSearchTexts: true });
const searchString = text.join('\n') + '\n';
return this.find(searchString, options);
}
find(text, options = {}) {
if (!NgxExtendedPdfViewerComponent.ngxExtendedPdfViewerInitialized) {
// tslint:disable-next-line:quotemark
console.error("The PDF viewer hasn't finished initializing. Please call find() later.");
return false;
}
else {
const highlightAllCheckbox = document.getElementById('findHighlightAll');
if (highlightAllCheckbox) {
highlightAllCheckbox.checked = options.highlightAll || false;
}
const findPageRange = document.getElementById('findRange');
if (findPageRange) {
findPageRange.value = options.pageRange || '';
}
const findCurrentPageCheckbox = document.getElementById('findCurrentPage');
if (findCurrentPageCheckbox) {
findCurrentPageCheckbox.checked = options.currentPage || false;
}
const matchCaseCheckbox = document.getElementById('findMatchCase');
if (matchCaseCheckbox) {
matchCaseCheckbox.checked = options.matchCase || false;
}
const entireWordCheckbox = document.getElementById('findEntireWord');
if (entireWordCheckbox) {
entireWordCheckbox.checked = options.wholeWords || false;
}
const findIgnoreAccentsCheckbox = document.getElementById('findIgnoreAccents');
if (findIgnoreAccentsCheckbox) {
findIgnoreAccentsCheckbox.checked = options.ignoreAccents || false;
}
const multipleSearchTerms = options.findMultipleSearchTexts || text.includes('\n') || false;
const findMultipleSearchTextsCheckbox = document.getElementById('findMultipleSearchTexts');
if (findMultipleSearchTextsCheckbox) {
findMultipleSearchTextsCheckbox.checked = multipleSearchTerms;
}
const individualWordsModeCheckbox = document.getElementById('individualWordsMode');
if (individualWordsModeCheckbox) {
individualWordsModeCheckbox.checked = false;
}
const fuzzySearchCheckbox = document.getElementById('findFuzzy');
if (fuzzySearchCheckbox) {
fuzzySearchCheckbox.checked = options.fuzzySearch || false;
}
const inputField = multipleSearchTerms ? document.getElementById('findInputMultiline') : document.getElementById('findInput');
if (inputField) {
if (inputField instanceof HTMLTextAreaElement) {
inputField.value = text;
// todo dirty hack!
inputField.classList.remove('hidden');
document.getElementById('findInput').classList.add('hidden');
document.getElementById('individualWordsModeLabel').classList.remove('hidden');
document.getElementById('individualWordsMode').classList.remove('hidden');
// end of the dirty hack
}
else if (inputField instanceof HTMLInputElement) {
inputField.value = text;
// todo dirty hack!
inputField.classList.remove('hidden');
document.getElementById('findInputMultiline').classList.add('hidden');
document.getElementById('individualWordsModeLabel').classList.add('hidden');
document.getElementById('individualWordsMode').classList.add('hidden');
// end of the dirty hack
}
inputField.dispatchEvent(new Event('input'));
return true;
}
else {
// tslint:disable-next-line:quotemark
console.error("Unexpected error: the input field used to search isn't part of the DOM.");
return false;
}
}
}
findNext() {
if (!NgxExtendedPdfViewerComponent.ngxExtendedPdfViewerInitialized) {
// tslint:disable-next-line:quotemark
console.error("The PDF viewer hasn't finished initializing. Please call findNext() later.");
return false;
}
else {
const button = document.getElementById('findNext');
if (button) {
button.click();
return true;
}
return false;
}
}
findPrevious() {
if (!NgxExtendedPdfViewerComponent.ngxExtendedPdfViewerInitialized) {
// tslint:disable-next-line:quotemark
console.error("The PDF viewer hasn't finished initializing. Please call findPrevious() later.");
return false;
}
else {
const button = document.getElementById('findPrevious');
if (button) {
button.click();
return true;
}
return false;
}
}
print(printRange) {
const PDFViewerApplication = window.PDFViewerApplication;
const alreadyThere = !!window['isInPDFPrintRange'] && !printRange;
if (!alreadyThere) {
if (!printRange) {
printRange = {};
}
this.setPrintRange(printRange);
}
window.printPDF();
if (!alreadyThere) {
PDFViewerApplication.eventBus.on('afterprint', () => {
this.removePrintRange();
});
}
}
removePrintRange() {
window['isInPDFPrintRange'] = undefined;
window['filteredPageCount'] = undefined;
}
setPrintRange(printRange) {
const PDFViewerApplication = window.PDFViewerApplication;
window['isInPDFPrintRange'] = (page) => this.isInPDFPrintRange(page, printRange);
window['filteredPageCount'] = this.filteredPageCount(PDFViewerApplication.pagesCount, printRange);
}
filteredPageCount(pageCount, range) {
let result = 0;
for (let page = 1; page <= pageCount; page++) {
if (this.isInPDFPrintRange(page, range)) {
result++;
}
}
return result;
}
isInPDFPrintRange(pageIndex, printRange) {
const page = pageIndex + 1;
if (printRange.from) {
if (page < printRange.from) {
return false;
}
}
if (printRange.to) {
if (page > printRange.to) {
return false;
}
}
if (printRange.excluded) {
let e = printRange.excluded;
if (e.some((p) => p === page)) {
return false;
}
}
if (printRange.included) {
if (!printRange.included.some((p) => p === page)) {
return false;
}
}
return true;
}
getPageAsText(pageNumber) {
const PDFViewerApplication = window.PDFViewerApplication;
const pdfDocument = PDFViewerApplication.pdfDocument;
const pagePromise = pdfDocument.getPage(pageNumber);
const extractTextSnippets = (pdfPage) => new Promise((resolve, reject) => {
const textSnippets = pdfPage.getTextContent();
resolve(textSnippets);
});
const combineTextSnippets = (textSnippets) => new Promise((resolve, reject) => {
const text = this.convertTextInfoToText(textSnippets);
resolve(text);
});
return pagePromise.then(extractTextSnippets).then(combineTextSnippets);
}
convertTextInfoToText(textInfo) {
if (!textInfo) {
return '';
}
return textInfo.items.map((info) => info.str).join('');
}
getPageAsImage(pageNumber, scale) {
const PDFViewerApplication = window.PDFViewerApplication;
const pdfDocument = PDFViewerApplication.pdfDocument;
const pagePromise = pdfDocument.getPage(pageNumber);
const imagePromise = (pdfPage) => new Promise((resolve, reject) => {
resolve(this.draw(pdfPage, scale));
});
return pagePromise.then(imagePromise);
}
draw(pdfPage, scale) {
let zoomFactor = 1;
if (scale.scale) {
zoomFactor = scale.scale;
}
else if (scale.width) {
zoomFactor = scale.width / pdfPage.getViewport({ scale: 1 }).width;
}
else if (scale.height) {
zoomFactor = scale.height / pdfPage.getViewport({ scale: 1 }).height;
}
const viewport = pdfPage.getViewport({
scale: zoomFactor,
});
const { ctx, canvas } = this.getPageDrawContext(viewport.width, viewport.height);
const drawViewport = viewport.clone();
const renderContext = {
canvasContext: ctx,
viewport: drawViewport,
// background: 'rgba(255, 0, 255, 0.3)',
};
const renderTask = pdfPage.render(renderContext);
const dataUrlPromise = () => new Promise((resolve, reject) => {
resolve(canvas.toDataURL());
});
return renderTask.promise.then(dataUrlPromise);
}
getPageDrawContext(width, height) {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d', { alpha: false });
if (!ctx) {
// tslint:disable-next-line: quotemark
throw new Error("Couldn't create the 2d context");
}
canvas.width = width;
canvas.height = height;
canvas.style.width = width + 'px';
canvas.style.height = height + 'px';
return { ctx, canvas };
}
getCurrentDocumentAsBlob() {
return __awaiter(this, void 0, void 0, function* () {
const PDFViewerApplication = window.PDFViewerApplication;
const data = yield PDFViewerApplication.pdfDocument.saveDocument(PDFViewerApplication.pdfDocument.annotationStorage);
return new Blob([data], { type: 'application/pdf' });
});
}
getFormData() {
return __awaiter(this, void 0, void 0, function* () {
const PDFViewerApplication = window.PDFViewerApplication;
const pdf /*: PDFDocumentProxy */ = PDFViewerApplication.pdfDocument;
// screen DPI / PDF DPI
const dpiRatio = 96 / 72;
const result = [];
for (let i = 1; i <= pdf.numPages; i++) {
// track the current page
const currentPage /* : PDFPageProxy */ = yield pdf.getPage(i);
const annotations = yield currentPage.getAnnotations();
annotations
.filter((a) => a.subtype === 'Widget') // get the form field annotations only
.forEach((a) => {
// get the rectangle that represent the single field
// and resize it according to the current DPI
const fieldRect = currentPage.getViewport({ scale: dpiRatio }).convertToViewportRectangle(a.rect);
// add the corresponding input
result.push({ fieldAnnotation: a, fieldRect, pageNumber: i });
});
}
return result;
});
}
/**
* Adds a page to the rendering queue
* @param {number} pageIndex Index of the page to render
* @returns {boolean} false, if the page has already been rendered
* or if it's out of range
*/
addPageToRenderQueue(pageIndex) {
const PDFViewerApplication = window.PDFViewerApplication;
return PDFViewerApplication.pdfViewer.addPageToRenderQueue(pageIndex);
}
isRenderQueueEmpty() {
const scrolledDown = true;
const renderExtra = false;
const PDFViewerApplication = window.PDFViewerApplication;
const nextPage = PDFViewerApplication.pdfViewer.renderingQueue.getHighestPriority(PDFViewerApplication.pdfViewer._getVisiblePages(), PDFViewerApplication.pdfViewer._pages, scrolledDown, renderExtra);
return !nextPage;
}
hasPageBeenRendered(pageIndex) {
const PDFViewerApplication = window.PDFViewerApplication;
const pages = PDFViewerApplication.pdfViewer._pages;
if (pages.length > pageIndex && pageIndex >= 0) {
const pageView = pages[pageIndex];
const isLoading = pageView.div.querySelector('.loadingIcon');
return !isLoading;
}
return false;
}
currentlyRenderedPages() {
const PDFViewerApplication = window.PDFViewerApplication;
const pages = PDFViewerApplication.pdfViewer._pages;
return pages.filter((page) => !page.div.querySelector('.loadingIcon')).map((page) => page.id);
}
numberOfPages() {
const PDFViewerApplication = window.PDFViewerApplication;
const pages = PDFViewerApplication.pdfViewer._pages;
return pages.length;
}
getCurrentlyVisiblePageNumbers() {
const app = window.PDFViewerApplication;
const pages = app.pdfViewer._getVisiblePages().views;
const pageNumbers = pages === null || pages === void 0 ? void 0 : pages.map((page) => page.id);
return pageNumbers;
}
recalculateSize() {
this.recalculateSize$.next();
}
listLayers() {
return __awaiter(this, void 0, void 0, function* () {
const PDFViewerApplication = window.PDFViewerApplication;
const optionalContentConfig = yield PDFViewerApplication.pdfViewer.optionalContentConfigPromise;
if (optionalContentConfig) {
const levelData = optionalContentConfig.getOrder();
console.log(levelData);
const layerIds = levelData.filter((groupId) => typeof groupId !== 'object');
return layerIds.map((layerId) => {
const config = optionalContentConfig.getGroup(layerId);
return {
layerId: layerId,
name: config.name,
visible: config.visible,
};
});
}
return undefined;
});
}
toggleLayer(layerId) {
return __awaiter(this, void 0, void 0, function* () {
const PDFViewerApplication = window.PDFViewerApplication;
const optionalContentConfig = yield PDFViewerApplication.pdfViewer.optionalContentConfigPromise;
if (optionalContentConfig) {
let isVisible = optionalContentConfig.isVisible(layerId);
const checkbox = document.querySelector(`input[id='${layerId}']`);
if (checkbox) {
isVisible = checkbox.checked;
checkbox.checked = !isVisible;
}
optionalContentConfig.setVisibility(layerId, !isVisible);
PDFViewerApplication.eventBus.dispatch('optionalcontentconfig', {
source: this,
promise: Promise.resolve(optionalContentConfig),
});
}
});
}
}
class PdfDarkThemeComponent {
}
PdfDarkThemeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PdfDarkThemeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
PdfDarkThemeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: PdfDarkThemeComponent, selector: "pdf-dark-theme", ngImport: i0, template: "", styles: ["ngx-extended-pdf-viewer .fancyDropdownToolbarButton:after{content:url(\"data:image/svg+xml; utf8, <svg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'><path fill='rgb(217, 217, 217)' d='M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z' /></svg>\")}ngx-extended-pdf-viewer :root{--annotation-unfocused-field-background: url(\"data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>\")}ngx-extended-pdf-viewer .annotationLayer section{position:absolute;text-align:initial}ngx-extended-pdf-viewer .annotationLayer .linkAnnotation>a,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.pushButton>a{position:absolute;font-size:1em;top:0;left:0;width:100%;height:100%}ngx-extended-pdf-viewer .annotationLayer .linkAnnotation>a:hover,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.pushButton>a:hover{opacity:.2;background:yellow;box-shadow:0 2px 10px #ff0}ngx-extended-pdf-viewer .annotationLayer .textAnnotation img{position:absolute;cursor:pointer}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation input,ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation textarea,ngx-extended-pdf-viewer .annotationLayer .choiceWidgetAnnotation select,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input{background-image:url(\"data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>\");border:1px solid transparent;box-sizing:border-box;font-size:9px;height:100%;margin:0;padding:0 3px;vertical-align:top;width:100%}ngx-extended-pdf-viewer .annotationLayer .choiceWidgetAnnotation select option{padding:0}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input{border-radius:50%}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation textarea{font:message-box;font-size:9px;resize:none}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation input[disabled],ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation textarea[disabled],ngx-extended-pdf-viewer .annotationLayer .choiceWidgetAnnotation select[disabled],ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input[disabled],ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input[disabled]{background:none;border:1px solid transparent;cursor:not-allowed}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation input:hover,ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation textarea:hover,ngx-extended-pdf-viewer .annotationLayer .choiceWidgetAnnotation select:hover,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:hover,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input:hover{border:1px solid black}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation input:focus,ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation textarea:focus,ngx-extended-pdf-viewer .annotationLayer .choiceWidgetAnnotation select:focus{background:none;border:1px solid transparent}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation input :focus,ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation textarea :focus,ngx-extended-pdf-viewer .annotationLayer .choiceWidgetAnnotation select :focus,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox :focus,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton :focus{background-image:none;background-color:transparent;outline:auto}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before{background-color:#000;content:\"\";display:block;position:absolute}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after{height:80%;left:45%;width:1px}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before{transform:rotate(45deg)}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after{transform:rotate(-45deg)}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before{border-radius:50%;height:50%;left:30%;top:20%;width:50%}ngx-extended-pdf-viewer .annotationLayer .textWidgetAnnotation input.comb{font-family:monospace;padding-left:2px;padding-right:0}ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.checkBox input,ngx-extended-pdf-viewer .annotationLayer .buttonWidgetAnnotation.radioButton input{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0}ngx-extended-pdf-viewer .annotationLayer .popupWrapper{position:absolute;width:20em}ngx-extended-pdf-viewer .annotationLayer .popup{position:absolute;z-index:200;max-width:20em;background-color:#ff9;box-shadow:0 2px 5px #888;border-radius:2px;padding:6px;margin-left:5px;cursor:pointer;font:message-box;font-size:9px;white-space:normal;word-wrap:break-word}ngx-extended-pdf-viewer .annotationLayer .popup>*{font-size:9px}ngx-extended-pdf-viewer .annotationLayer .popup h1{display:inline-block}ngx-extended-pdf-viewer .annotationLayer .popup span{display:inline-block;margin-left:5px}ngx-extended-pdf-viewer .annotationLayer .popup p{border-top:1px solid #333333;margin-top:2px;padding-top:2px}ngx-extended-pdf-viewer .annotationLayer .highlightAnnotation,ngx-extended-pdf-viewer .annotationLayer .underlineAnnotation,ngx-extended-pdf-viewer .annotationLayer .squigglyAnnotation,ngx-extended-pdf-viewer .annotationLayer .strikeoutAnnotation,ngx-extended-pdf-viewer .annotationLayer .freeTextAnnotation,ngx-extended-pdf-viewer .annotationLayer .lineAnnotation svg line,ngx-extended-pdf-viewer .annotationLayer .squareAnnotation svg rect,ngx-extended-pdf-viewer .annotationLayer .circleAnnotation svg ellipse,ngx-extended-pdf-viewer .annotationLayer .polylineAnnotation svg polyline,ngx-extended-pdf-viewer .annotationLayer .polygonAnnotation svg polygon,ngx-extended-pdf-viewer .annotationLayer .caretAnnotation,ngx-extended-pdf-viewer .annotationLayer .inkAnnotation svg polyline,ngx-extended-pdf-viewer .annotationLayer .stampAnnotation,ngx-extended-pdf-viewer .annotationLayer .fileAttachmentAnnotation{cursor:pointer}ngx-extended-pdf-viewer :root{--xfa-unfocused-field-background: url(\"data:image/svg+xml;charset=UTF-8,<svg width='1px' height='1px' xmlns='http://www.w3.org/2000/svg'><rect width='100%' height='100%' style='fill:rgba(0, 54, 255, 0.13);'/></svg>\")}ngx-extended-pdf-viewer .xfaLayer .highlight{margin:-1px;padding:1px;background-color:#efcbed;border-radius:4px}ngx-extended-pdf-viewer .xfaLayer .highlight.appended{position:initial}ngx-extended-pdf-viewer .xfaLayer .highlight.begin{border-radius:4px 0 0 4px}ngx-extended-pdf-viewer .xfaLayer .highlight.end{border-radius:0 4px 4px 0}ngx-extended-pdf-viewer .xfaLayer .highlight.middle{border-radius:0}ngx-extended-pdf-viewer .xfaLayer .highlight.selected{background-color:#cbdfcb}ngx-extended-pdf-viewer .xfaLayer ::selection{background:blue}ngx-extended-pdf-viewer .xfaPage{overflow:hidden;position:relative}ngx-extended-pdf-viewer .xfaContentarea{position:absolute}ngx-extended-pdf-viewer .xfaPrintOnly{display:none}ngx-extended-pdf-viewer .xfaLayer{position:absolute;text-align:initial;top:0;left:0;transform-origin:0 0;line-height:1.2}ngx-extended-pdf-viewer .xfaLayer *{color:inherit;font:inherit;font-style:inherit;font-weight:inherit;font-feature-settings:inherit;font-kerning:inherit;letter-spacing:-.01px;text-align:inherit;text-decoration:inherit;box-sizing:border-box;background-color:transparent;padding:0;margin:0;pointer-events:auto;line-height:inherit}ngx-extended-pdf-viewer .xfaLayer div{pointer-events:none}ngx-extended-pdf-viewer .xfaLayer svg{pointer-events:none}ngx-extended-pdf-viewer .xfaLayer svg *{pointer-events:none}ngx-extended-pdf-viewer .xfaLayer a{color:#00f}ngx-extended-pdf-viewer .xfaRich li{margin-left:3em}ngx-extended-pdf-viewer .xfaFont{color:#000;font-weight:400;font-feature-settings:\"kern\" off;font-kerning:none;font-size:10px;font-style:normal;letter-spacing:0;text-decoration:none;vertical-align:0}ngx-extended-pdf-viewer .xfaCaption{overflow:hidden;flex:0 0 auto}ngx-extended-pdf-viewer .xfaCaptionForCheckButton{overflow:hidden;flex:1 1 auto}ngx-extended-pdf-viewer .xfaLabel{height:100%;width:100%}ngx-extended-pdf-viewer .xfaLeft{display:flex;flex-direction:row;align-items:center}ngx-extended-pdf-viewer .xfaRight{display:flex;flex-direction:row-reverse;align-items:center}ngx-extended-pdf-viewer .xfaLeft>.xfaCaption,ngx-extended-pdf-viewer .xfaLeft>.xfaCaptionForCheckButton,ngx-extended-pdf-viewer .xfaRight>.xfaCaption,ngx-extended-pdf-viewer .xfaRight>.xfaCaptionForCheckButton{max-height:100%}ngx-extended-pdf-viewer .xfaTop{display:flex;flex-direction:column;align-items:flex-start}ngx-extended-pdf-viewer .xfaBottom{display:flex;flex-direction:column-reverse;align-items:flex-start}ngx-extended-pdf-viewer .xfaTop>.xfaCaption,ngx-extended-pdf-viewer .xfaTop>.xfaCaptionForCheckButton,ngx-extended-pdf-viewer .xfaBottom>.xfaCaption,ngx-extended-pdf-viewer .xfaBottom>.xfaCaptionForCheckButton{width:100%}ngx-extended-pdf-viewer .xfaBorder{background-color:transparent;position:absolute;pointer-events:none}ngx-extended-pdf-viewer .xfaWrapped{width:100%;height:100%}ngx-extended-pdf-viewer .xfaTextfield:focus,ngx-extended-pdf-viewer .xfaSelect:focus{background-image:none;background-color:transparent;outline:auto;outline-offset:-1px}ngx-extended-pdf-viewer .xfaCheckbox:focus,ngx-extended-pdf-viewer .xfaRadio:focus{outline:auto}ngx-extended-pdf-viewer .xfaTextfield,ngx-extended-pdf-viewer .xfaSelect{height:100%;width:100%;flex:1 1 auto;border:none;resize:none;background-image:var(--xfa-unfocused-field-background)}ngx-extended-pdf-viewer .xfaTop>.xfaTextfield,ngx-extended-pdf-viewer .xfaTop>.xfaSelect,ngx-extended-pdf-viewer .xfaBottom>.xfaTextfield,ngx-extended-pdf-viewer .xfaBottom>.xfaSelect{flex:0 1 auto}ngx-extended-pdf-viewer .xfaButton{cursor:pointer;width:100%;height:100%;border:none;text-align:center}ngx-extended-pdf-viewer .xfaLink{width:100%;height:100%}ngx-extended-pdf-viewer .xfaCheckbox,ngx-extended-pdf-viewer .xfaRadio{width:100%;height:100%;flex:0 0 auto;border:none}ngx-extended-pdf-viewer .xfaRich{white-space:pre-wrap;width:100%;height:100%}ngx-extended-pdf-viewer .xfaImage{object-position:left top;object-fit:contain;width:100%;height:100%}ngx-extended-pdf-viewer .xfaLrTb,ngx-extended-pdf-viewer .xfaRlTb,ngx-extended-pdf-viewer .xfaTb{display:flex;flex-direction:column;align-items:stretch}ngx-extended-pdf-viewer .xfaLr{display:flex;flex-direction:row;align-items:stretch}ngx-extended-pdf-viewer .xfaRl{display:flex;flex-direction:row-reverse;align-items:stretch}ngx-extended-pdf-viewer .xfaTb>div{justify-content:left}ngx-extended-pdf-viewer .xfaPosition{position:relative}ngx-extended-pdf-viewer .xfaArea{position:relative}ngx-extended-pdf-viewer .xfaValignMiddle{display:flex;align-items:center}ngx-extended-pdf-viewer .xfaTable{display:flex;flex-direction:column;align-items:stretch}ngx-extended-pdf-viewer .xfaTable .xfaRow{display:flex;flex-direction:row;align-items:stretch}ngx-extended-pdf-viewer .xfaTable .xfaRlRow{display:flex;flex-direction:row-reverse;align-items:stretch;flex:1}ngx-extended-pdf-viewer .xfaTable .xfaRlRow>div{flex:1}ngx-extended-pdf-viewer .xfaNonInteractive input,ngx-extended-pdf-viewer .xfaNonInteractive textarea,ngx-extended-pdf-viewer .xfaDisabled input,ngx-extended-pdf-viewer .xfaDisabled textarea,ngx-extended-pdf-viewer .xfaReadOnly input,ngx-extended-pdf-viewer .xfaReadOnly textarea{background:initial}@media print{ngx-extended-pdf-viewer .xfaTextfield,ngx-extended-pdf-viewer .xfaSelect{background:transparent}ngx-extended-pdf-viewer .xfaSelect{-webkit-appearance:none;-moz-appearance:none;appearance:none;text-indent:1px;text-overflow:\"\"}}ngx-extended-pdf-viewer .textLayer{position:absolute;text-align:initial;left:0;top:0;right:0;bottom:0;overflow:hidden;opacity:.2;line-height:1}ngx-extended-pdf-viewer .textLayer span,ngx-extended-pdf-viewer .textLayer br{color:transparent;position:absolute;white-space:pre;cursor:text;transform-origin:0% 0%}ngx-extended-pdf-viewer .textLayer .highlight{position:static;margin:-1px;padding:1px;background-color:var(#b400aa);border-radius:4px}ngx-extended-pdf-viewer .textLayer .highlight.appended{position:initial}ngx-extended-pdf-viewer .textLayer .highlight.begin{border-radius:4px 0 0 4px}ngx-extended-pdf-viewer .textLayer .highlight.end{border-radius:0 4px 4px 0}ngx-extended-pdf-viewer .textLayer .highlight.middle{border-radius:0}ngx-extended-pdf-viewer .textLayer .highlight.selected{background-color:#006400}ngx-extended-pdf-viewer .textLayer ::selection{background:blue}ngx-extended-pdf-viewer .textLayer br::selection{background:transparent}ngx-extended-pdf-viewer .textLayer .endOfContent{display:block;position:absolute;left:0;top:100%;right:0;bottom:0;z-index:-1;cursor:default;-webkit-user-select:none;user-select:none}ngx-extended-pdf-viewer .textLayer .endOfContent.active{top:0}ngx-extended-pdf-viewer *{box-sizing:content-box}ngx-extended-pdf-viewer :root{--pdfViewer-padding-bottom: none;--page-margin: 1px auto -8px;--page-border: 9px solid transparent;--spreadHorizontalWrapped-margin-LR: -3.5px;--zoom-factor: 1}@media screen and (forced-colors: active){ngx-extended-pdf-viewer :root{--pdfViewer-padding-bottom: 9px;--page-margin: 9px auto 0;--page-border: none;--spreadHorizontalWrapped-margin-LR: 4.5px}}ngx-extended-pdf-viewer .pdfViewer{padding-bottom:var(--pdfViewer-padding-bottom)}ngx-extended-pdf-viewer .pdfViewer .canvasWrapper{overflow:hidden}ngx-extended-pdf-viewer .pdfViewer .page{direction:ltr;width:816px;height:1056px;margin:1px auto -8px;position:relative;overflow:visible;border:9px solid transparent;background-clip:content-box;border-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAA6UlEQVR4Xl2Pi2rEMAwE16fm1f7/r14v7w4rI0IzLAF7hLxNevBSEMEF5+OilNCsRd8ZMyn+a4NmsOT8WJw1lFbSYgGFzF2bLFoLjTClWjKKGRWpDYAGXUnZ4uhbBUzF3Oe/GG/ue2fn4GgsyXhNgysV2JnrhKEMg4fEZcALmiKbNhBBRFpSyDOj1G4QOVly6O1FV54ZZq8OVygrciDt6JazRgi1ljTPH0gbrPmHPXAbCiDd4GawIjip1TPh9tt2sz24qaCjr/jAb/GBFTbq9KZ7Ke/Cqt8nayUikZKsWZK7Fe6bg5dOUt8fZHWG2BHc+6EAAAAASUVORK5CYII=) 9 9 repeat;background-color:#fff}ngx-extended-pdf-viewer .pdfViewer.removePageBorders .page{margin:0 auto 10px;border:none}ngx-extended-pdf-viewer .pdfViewer.singlePageView .page{margin:0}ngx-extended-pdf-viewer .html .pdfViewer.scrollHorizontal,ngx-extended-pdf-viewer .html .pdfViewer.scrollWrapped,ngx-extended-pdf-viewer .html .spread{margin-left:3.5px;margin-right:3.5px;text-align:center}ngx-extended-pdf-viewer .pdfViewer.scrollHorizontal,ngx-extended-pdf-viewer .spread{white-space:nowrap}ngx-extended-pdf-viewer .pdfViewer.removePageBorders,ngx-extended-pdf-viewer .pdfViewer.scrollHorizontal .spread,ngx-extended-pdf-viewer .pdfViewer.scrollWrapped .spread{margin-left:0;margin-right:0}ngx-extended-pdf-viewer .spread .page,ngx-extended-pdf-viewer .pdfViewer.scrollHorizontal .page,ngx-extended-pdf-viewer .pdfViewer.scrollWrapped .page,ngx-extended-pdf-viewer .pdfViewer.scrollHorizontal .spread,ngx-extended-pdf-viewer .pdfViewer.scrollWrapped .spread{display:inline-block;vertical-align:middle}ngx-extended-pdf-viewer .spread .page,ngx-extended-pdf-viewer .pdfViewer.scrollHorizontal .page,ngx-extended-pdf-viewer .pdfViewer.scrollWrapped .page{margin-left:-3.5px;margin-right:-3.5px}ngx-extended-pdf-viewer .pdfViewer.removePageBorders .spread .page,ngx-extended-pdf-viewer .pdfViewer.removePageBorders.scrollHorizontal .page,ngx-extended-pdf-viewer .pdfViewer.removePageBorders.scrollWrapped .page{margin-left:5px;margin-right:5px}ngx-extended-pdf-viewer .pdfViewer .page canvas{margin:0;display:block}ngx-extended-pdf-viewer .pdfViewer .page canvas[hidden]{display:none}ngx-extended-pdf-viewer .pdfViewer .page .loadingIcon{position:absolute;display:block;left:0;top:0;right:0;bottom:0;background:url(data:image/gif;base64,R0lGODlhGAAYAPQAAP///wAAAM7Ozvr6+uDg4LCwsOjo6I6OjsjIyJycnNjY2KioqMDAwPLy8nZ2doaGhri4uGhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJBwAAACwAAAAAGAAYAAAFriAgjiQAQWVaDgr5POSgkoTDjFE0NoQ8iw8HQZQTDQjDn4jhSABhAAOhoTqSDg7qSUQwxEaEwwFhXHhHgzOA1xshxAnfTzotGRaHglJqkJcaVEqCgyoCBQk