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.
153 lines • 13.3 kB
JavaScript
import { Component } from '@angular/core';
import * as i0 from "@angular/core";
/** List of all fields that can be customized */
const requiredIds = [
'toolbarViewer',
'numPages',
'pageNumber',
'scaleSelectContainer',
'customScaleOption',
'scaleSelect',
'scrollPage',
'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',
'passwordText',
'password',
'passwordSubmit',
'passwordCancel',
'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',
'editorModeButtons',
'editorNone',
'editorFreeText',
'editorInk',
];
export 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.3.12", ngImport: i0, type: PdfDummyComponentsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
PdfDummyComponentsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", 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.3.12", ngImport: i0, type: PdfDummyComponentsComponent, decorators: [{
type: Component,
args: [{ selector: 'pdf-dummy-components', template: "<span class=\"invisible dummy-pdf-viewer-components\">\n</span>\n" }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWR1bW15LWNvbXBvbmVudHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi9wZGYtZHVtbXktY29tcG9uZW50cy9wZGYtZHVtbXktY29tcG9uZW50cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlci9zcmMvbGliL3BkZi1kdW1teS1jb21wb25lbnRzL3BkZi1kdW1teS1jb21wb25lbnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTFDLGdEQUFnRDtBQUNoRCxNQUFNLFdBQVcsR0FBRztJQUNsQixlQUFlO0lBQ2YsVUFBVTtJQUNWLFlBQVk7SUFDWixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLGFBQWE7SUFDYixZQUFZO0lBQ1osVUFBVTtJQUNWLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YsY0FBYztJQUNkLGtCQUFrQjtJQUNsQix3QkFBd0I7SUFDeEIsaUNBQWlDO0lBQ2pDLDJCQUEyQjtJQUMzQixtQkFBbUI7SUFDbkIsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtJQUNuQix1QkFBdUI7SUFDdkIsV0FBVztJQUNYLFVBQVU7SUFDVixjQUFjO0lBQ2QsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsWUFBWTtJQUNaLFdBQVc7SUFDWCxZQUFZO0lBQ1osb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIscUJBQXFCO0lBQ3JCLHNCQUFzQjtJQUN0QixvQkFB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T0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOzt5SEF0Q1UsMkJBQTJCOzZHQUEzQiwyQkFBMkIsNERDcEh4QyxtRUFFQTs0RkRrSGEsMkJBQTJCO2tCQUp2QyxTQUFTOytCQUNFLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKiogTGlzdCBvZiBhbGwgZmllbGRzIHRoYXQgY2FuIGJlIGN1c3RvbWl6ZWQgKi9cbmNvbnN0IHJlcXVpcmVkSWRzID0gW1xuICAndG9vbGJhclZpZXdlcicsXG4gICdudW1QYWdlcycsXG4gICdwYWdlTnVtYmVyJyxcbiAgJ3NjYWxlU2VsZWN0Q29udGFpbmVyJyxcbiAgJ2N1c3RvbVNjYWxlT3B0aW9uJyxcbiAgJ3NjYWxlU2VsZWN0JyxcbiAgJ3Njcm9sbFBhZ2UnLFxuICAncHJldmlvdXMnLFxuICAnbmV4dCcsXG4gICd6b29tSW4nLFxuICAnem9vbU91dCcsXG4gICd2aWV3RmluZCcsXG4gICdvcGVuRmlsZScsXG4gICdwcmludCcsXG4gICdwcmVzZW50YXRpb25Nb2RlJyxcbiAgJ2Rvd25sb2FkJyxcbiAgJ3ZpZXdCb29rbWFyaycsXG4gICdzZWNvbmRhcnlUb29sYmFyJyxcbiAgJ3NlY29uZGFyeVRvb2xiYXJUb2dnbGUnLFxuICAnc2Vjb25kYXJ5VG9vbGJhckJ1dHRvbkNvbnRhaW5lcicsXG4gICdzZWNvbmRhcnlQcmVzZW50YXRpb25Nb2RlJyxcbiAgJ3NlY29uZGFyeU9wZW5GaWxlJyxcbiAgJ3NlY29uZGFyeVByaW50JyxcbiAgJ3NlY29uZGFyeURvd25sb2FkJyxcbiAgJ3NlY29uZGFyeVZpZXdCb29rbWFyaycsXG4gICdmaXJzdFBhZ2UnLFxuICAnbGFzdFBhZ2UnLFxuICAncGFnZVJvdGF0ZUN3JyxcbiAgJ3BhZ2VSb3RhdGVDY3cnLFxuICAnY3Vyc29yU2VsZWN0VG9vbCcsXG4gICdjdXJzb3JIYW5kVG9vbCcsXG4gICdzY3JvbGxWZXJ0aWNhbCcsXG4gICdzY3JvbGxIb3Jpem9udGFsJyxcbiAgJ3Njcm9sbFdyYXBwZWQnLFxuICAnc3ByZWFkTm9uZScsXG4gICdzcHJlYWRPZGQnLFxuICAnc3ByZWFkRXZlbicsXG4gICdkb2N1bWVudFByb3BlcnRpZXMnLFxuICAnY29udGV4dEZpcnN0UGFnZScsXG4gICdjb250ZXh0TGFzdFBhZ2UnLFxuICAnY29udGV4dFBhZ2VSb3RhdGVDdycsXG4gICdjb250ZXh0UGFnZVJvdGF0ZUNjdycsXG4gICdjdXJyZW50T3V0bGluZUl0ZW0nLFxuICAnb3V0ZXJDb250YWluZXInLFxuICAndmlld2VyQ29udGFpbmVyJyxcbiAgJ3NpZGViYXJUb2dnbGUnLFxuICAndmlld1RodW1ibmFpbCcsXG4gICd2aWV3T3V0bGluZScsXG4gICd2aWV3QXR0YWNobWVudHMnLFxuICAndGh1bWJuYWlsVmlldycsXG4gICdvdXRsaW5lVmlldycsXG4gICdhdHRhY2htZW50c1ZpZXcnLFxuICAnb3V0ZXJDb250YWluZXInLFxuICAnc2lkZWJhclJlc2l6ZXInLFxuICAnb3V0bGluZU9wdGlvbnNDb250YWluZXInLFxuICAnZmluZGJhcicsXG4gICd2aWV3RmluZCcsXG4gICdmaW5kSW5wdXQnLFxuICAnZmluZElucHV0TXVsdGlsaW5lJyxcbiAgJ2ZpbmRIaWdobGlnaHRBbGwnLFxuICAnZmluZEN1cnJlbnRQYWdlJyxcbiAgJ2ZpbmRSYW5nZScsXG4gICdmaW5kTWF0Y2hDYXNlJyxcbiAgJ2ZpbmRNYXRjaERpYWNyaXRpY3MnLFxuICAnZmluZEVudGlyZVdvcmQnLFxuICAnZmluZE11bHRpcGxlU2VhcmNoVGV4dHMnLFxuICAnZmluZElnbm9yZUFjY2VudHMnLFxuICAnZmluZE1zZycsXG4gICdmaW5kUmVzdWx0c0NvdW50JyxcbiAgJ2ZpbmRQcmV2aW91cycsXG4gICdmaW5kTmV4dCcsXG4gICdmaW5kRnV6enknLFxuICAncGFzc3dvcmRUZXh0JyxcbiAgJ3Bhc3N3b3JkJyxcbiAgJ3Bhc3N3b3JkU3VibWl0JyxcbiAgJ3Bhc3N3b3JkQ2FuY2VsJyxcbiAgJ2RvY3VtZW50UHJvcGVydGllc0Nsb3NlJyxcbiAgJ2ZpbGVOYW1lRmllbGQnLFxuICAnZmlsZVNpemVGaWVsZCcsXG4gICd0aXRsZUZpZWxkJyxcbiAgJ2F1dGhvckZpZWxkJyxcbiAgJ3N1YmplY3RGaWVsZCcsXG4gICdrZXl3b3Jkc0ZpZWxkJyxcbiAgJ2NyZWF0aW9uRGF0ZUZpZWxkJyxcbiAgJ21vZGlmaWNhdGlvbkRhdGVGaWVsZCcsXG4gICdjcmVhdG9yRmllbGQnLFxuICAncHJvZHVjZXJGaWVsZCcsXG4gICd2ZXJzaW9uRmllbGQnLFxuICAncGFnZUNvdW50RmllbGQnLFxuICAncGFnZVNpemVGaWVsZCcsXG4gICdsaW5lYXJpemVkRmllbGQnLFxuICAnZXJyb3JXcmFwcGVyJyxcbiAgJ2Vycm9yTWVzc2FnZScsXG4gICdlcnJvckNsb3NlJyxcbiAgJ2Vycm9yTW9yZUluZm8nLFxuICAnZXJyb3JTaG93TW9yZScsXG4gICdlcnJvclNob3dMZXNzJyxcbiAgJ3NjYWxlU2VsZWN0Q29udGFpbmVyJyxcbiAgJ3ZpZXdBdHRhY2htZW50cycsXG4gICd2aWV3TGF5ZXJzJyxcbiAgJ3ZpZXdUaHVtYm5haWwnLFxuICAndmlld091dGxpbmUnLFxuICAnZWRpdG9yTW9kZUJ1dHRvbnMnLFxuICAnZWRpdG9yTm9uZScsXG4gICdlZGl0b3JGcmVlVGV4dCcsXG4gICdlZGl0b3JJbmsnLFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRmLWR1bW15LWNvbXBvbmVudHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGRmLWR1bW15LWNvbXBvbmVudHMuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBQZGZEdW1teUNvbXBvbmVudHNDb21wb25lbnQge1xuICBwcml2YXRlIGR1bW15Q29tcG9uZW50c0NvbnRhaW5lcjogRWxlbWVudDtcblxuICBwdWJsaWMgYWRkTWlzc2luZ1N0YW5kYXJkV2lkZ2V0cygpOiB2b2lkIHtcbiAgICB0aGlzLmR1bW15Q29tcG9uZW50c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2R1bW15LXBkZi12aWV3ZXItY29tcG9uZW50cycpWzBdO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZHVtbXlDb21wb25lbnRzQ29udGFpbmVyIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGFpbmVyLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXF1aXJlZElkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmVlZHNEdW1teVdpZGdldChpZCkpIHtcbiAgICAgICAgY29uc3QgZHVtbXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIGR1bW15LmlkID0gaWQ7XG4gICAgICAgIGR1bW15LmNsYXNzTmFtZSA9ICdpbnZpc2libGUgZHVtbXktY29tcG9uZW50JztcbiAgICAgICAgdGhpcy5kdW1teUNvbXBvbmVudHNDb250YWluZXIuYXBwZW5kQ2hpbGQoZHVtbXkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubmVlZHNEdW1teVdpZGdldCgnc2NhbGVTZWxlY3QnKSkge1xuICAgICAgY29uc3QgZHVtbXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxlY3QnKTtcbiAgICAgIGR1bW15LmlkID0gJ3NjYWxlU2VsZWN0JztcbiAgICAgIGR1bW15LmNsYXNzTmFtZSA9ICdpbnZpc2libGUgZHVtbXktY29tcG9uZW50JztcbiAgICAgIHRoaXMuZHVtbXlDb21wb25lbnRzQ29udGFpbmVyLmFwcGVuZENoaWxkKGR1bW15KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5lZWRzRHVtbXlXaWRnZXQoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHdpZGdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoIXdpZGdldCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiPHNwYW4gY2xhc3M9XCJpbnZpc2libGUgZHVtbXktcGRmLXZpZXdlci1jb21wb25lbnRzXCI+XG48L3NwYW4+XG4iXX0=