UNPKG

@hmcts/annotation-ui-lib

Version:

PDF Viewer and ability to highlight text with and comment tracking

203 lines 17.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable } from '@angular/core'; import { PdfWrapper } from './js-wrapper/pdf-wrapper'; import { PdfAnnotateWrapper } from './js-wrapper/pdf-annotate-wrapper'; import { BehaviorSubject, Subject } from 'rxjs'; import { EmLoggerService } from '../logging/em-logger.service'; import { RotationModel } from '../model/rotation-factory.model'; export class PdfRenderService { /** * @param {?} pdfWrapper * @param {?} log * @param {?} pdfAnnotateWrapper */ constructor(pdfWrapper, log, pdfAnnotateWrapper) { this.pdfWrapper = pdfWrapper; this.log = log; this.pdfAnnotateWrapper = pdfAnnotateWrapper; this.listPages = []; this.log.setClass('PdfRenderService'); this.dataLoadedSubject = new BehaviorSubject(false); this.listPagesSubject = new Subject(); } /** * @return {?} */ getDataLoadedSub() { return this.dataLoadedSubject; } /** * @param {?} isLoaded * @return {?} */ dataLoadedUpdate(isLoaded) { this.dataLoadedSubject.next(isLoaded); } /** * @return {?} */ getRenderOptions() { return Object.assign({}, this.RENDER_OPTIONS); } /** * @param {?} RENDER_OPTIONS * @return {?} */ setRenderOptions(RENDER_OPTIONS) { this.RENDER_OPTIONS = RENDER_OPTIONS; } /** * @return {?} */ getViewerElementRef() { return this.viewerElementRef; } /** * @return {?} */ getPdfPages() { return this.pdfPages; } /** * @param {?=} viewerElementRef * @return {?} */ render(viewerElementRef) { if (viewerElementRef != null) { this.viewerElementRef = viewerElementRef; } /** @type {?} */ const renderOptions = this.getRenderOptions(); this.pdfWrapper.getDocument(renderOptions.documentId) .then(pdf => { renderOptions.pdfDocument = pdf; /** @type {?} */ const viewer = this.viewerElementRef.nativeElement; viewer.innerHTML = ''; this.pdfPages = pdf.pdfInfo.numPages; this.listPages = []; for (let i = 1; i < this.pdfPages + 1; i++) { /** @type {?} */ const pageDom = this.pdfAnnotateWrapper.createPage(i); // Create a copy of the render options for each page. /** @type {?} */ const pageOptions = Object.assign({}, renderOptions); viewer.appendChild(pageDom); this.addDomPage(pageDom, i); pdf.getPage(i).then((pdfPage) => { // Get current page rotation from page rotation objects pageOptions.rotate = this.addPageRotation(renderOptions, pageOptions, pdfPage); setTimeout(() => { this.pdfAnnotateWrapper.renderPage(i, pageOptions).then(() => { if (i === this.pdfPages) { this.setRenderOptions(renderOptions); this.dataLoadedUpdate(true); this.listPagesSubject.next(this.listPages); } }); }); }); } }).catch((error) => { /** @type {?} */ const errorMessage = new Error('Unable to render your supplied PDF. ' + renderOptions.documentId + '. Error is: ' + error); this.log.error('Encountered error while rendering the PDF:' + errorMessage); }); } /** * @param {?} pageDom * @param {?} pageNumber * @return {?} */ addDomPage(pageDom, pageNumber) { /** @type {?} */ const pagedetails = new RotationModel(pageNumber, pageDom); /** @type {?} */ const index = this.listPages.findIndex(pageElement => pageElement.pageNumber === pageNumber); if (index > 0) { this.listPages[index] = pagedetails; } else { this.listPages.push(pagedetails); } } /** * @param {?} renderOptions * @param {?} pageOptions * @param {?} pdfPage * @return {?} */ addPageRotation(renderOptions, pageOptions, pdfPage) { /** @type {?} */ let rotation = this.getPageRotation(pageOptions, pdfPage); if (!rotation) { renderOptions.rotationPages.push({ page: pdfPage.pageNumber, rotate: pdfPage.rotate }); rotation = pdfPage.rotate; } return rotation; } /** * @param {?} pageOptions * @param {?} pdfPage * @return {?} */ getPageRotation(pageOptions, pdfPage) { return pageOptions.rotationPages .filter(rotateObj => rotateObj.page === pdfPage.pageNumber) .map(rotateObj => rotateObj.rotate)[0]; } } PdfRenderService.decorators = [ { type: Injectable } ]; PdfRenderService.ctorParameters = () => [ { type: PdfWrapper }, { type: EmLoggerService }, { type: PdfAnnotateWrapper } ]; if (false) { /** * @type {?} * @private */ PdfRenderService.prototype.viewerElementRef; /** * @type {?} * @private */ PdfRenderService.prototype.RENDER_OPTIONS; /** * @type {?} * @private */ PdfRenderService.prototype.pdfPages; /** * @type {?} * @private */ PdfRenderService.prototype.dataLoadedSubject; /** @type {?} */ PdfRenderService.prototype.listPagesSubject; /** @type {?} */ PdfRenderService.prototype.listPages; /** * @type {?} * @private */ PdfRenderService.prototype.pdfWrapper; /** * @type {?} * @private */ PdfRenderService.prototype.log; /** * @type {?} * @private */ PdfRenderService.prototype.pdfAnnotateWrapper; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXJlbmRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL2Fubm90YXRpb24tdWktbGliLyIsInNvdXJjZXMiOlsibGliL2RhdGEvcGRmLXJlbmRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2hFLE1BQU07Ozs7OztJQVVGLFlBQW9CLFVBQXNCLEVBQ3RCLEdBQW9CLEVBQ3BCLGtCQUFzQztRQUZ0QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFFBQUcsR0FBSCxHQUFHLENBQWlCO1FBQ3BCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFKMUQsY0FBUyxHQUFvQixFQUFFLENBQUM7UUFLNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDMUMsQ0FBQzs7OztJQUVELGdCQUFnQjtRQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDbEMsQ0FBQzs7Ozs7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFpQjtRQUM5QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEs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O2FBQzdCLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUMxRCxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7O1lBNUdKLFVBQVU7OztZQU5GLFVBQVU7WUFHVixlQUFlO1lBRmYsa0JBQWtCOzs7Ozs7O0lBUXZCLDRDQUFxQzs7Ozs7SUFDckMsMENBQXNDOzs7OztJQUN0QyxvQ0FBeUI7Ozs7O0lBQ3pCLDZDQUFvRDs7SUFFcEQsNENBQTJDOztJQUMzQyxxQ0FBZ0M7Ozs7O0lBRXBCLHNDQUE4Qjs7Ozs7SUFDOUIsK0JBQTRCOzs7OztJQUM1Qiw4Q0FBOEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZW5kZXJPcHRpb25zIH0gZnJvbSAnLi9qcy13cmFwcGVyL3JlbmRlck9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgUGRmV3JhcHBlciB9IGZyb20gJy4vanMtd3JhcHBlci9wZGYtd3JhcHBlcic7XG5pbXBvcnQgeyBQZGZBbm5vdGF0ZVdyYXBwZXIgfSBmcm9tICcuL2pzLXdyYXBwZXIvcGRmLWFubm90YXRlLXdyYXBwZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFbUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi9sb2dnaW5nL2VtLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdGF0aW9uTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9yb3RhdGlvbi1mYWN0b3J5Lm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBkZlJlbmRlclNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSB2aWV3ZXJFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgUkVOREVSX09QVElPTlM6IFJlbmRlck9wdGlvbnM7XG4gICAgcHJpdmF0ZSBwZGZQYWdlczogbnVtYmVyO1xuICAgIHByaXZhdGUgZGF0YUxvYWRlZFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcblxuICAgIGxpc3RQYWdlc1N1YmplY3Q6IFN1YmplY3Q8Um90YXRpb25Nb2RlbFtdPjtcbiAgICBsaXN0UGFnZXM6IFJvdGF0aW9uTW9kZWxbXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBwZGZXcmFwcGVyOiBQZGZXcmFwcGVyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgbG9nOiBFbUxvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZBbm5vdGF0ZVdyYXBwZXI6IFBkZkFubm90YXRlV3JhcHBlcikge1xuICAgICAgICB0aGlzLmxvZy5zZXRDbGFzcygnUGRmUmVuZGVyU2VydmljZScpO1xuICAgICAgICB0aGlzLmRhdGFMb2FkZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gICAgICAgIHRoaXMubGlzdFBhZ2VzU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgfVxuXG4gICAgZ2V0RGF0YUxvYWRlZFN1YigpOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhTG9hZGVkU3ViamVjdDtcbiAgICB9XG5cbiAgICBkYXRhTG9hZGVkVXBkYXRlKGlzTG9hZGVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGF0YUxvYWRlZFN1YmplY3QubmV4dChpc0xvYWRlZCk7XG4gICAgfVxuXG4gICAgZ2V0UmVuZGVyT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuUkVOREVSX09QVElPTlMpO1xuICAgIH1cblxuICAgIHNldFJlbmRlck9wdGlvbnMoUkVOREVSX09QVElPTlM6IFJlbmRlck9wdGlvbnMpOiBhbnkge1xuICAgICAgICB0aGlzLlJFTkRFUl9PUFRJT05TID0gUkVOREVSX09QVElPTlM7XG4gICAgfVxuXG4gICAgZ2V0Vmlld2VyRWxlbWVudFJlZigpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld2VyRWxlbWVudFJlZjtcbiAgICB9XG5cbiAgICBnZXRQZGZQYWdlcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wZGZQYWdlcztcbiAgICB9XG4gICAgXG4gICAgcmVuZGVyKHZpZXdlckVsZW1lbnRSZWY/OiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmICh2aWV3ZXJFbGVtZW50UmVmICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyRWxlbWVudFJlZiA9IHZpZXdlckVsZW1lbnRSZWY7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZW5kZXJPcHRpb25zID0gdGhpcy5nZXRSZW5kZXJPcHRpb25zKCk7XG4gICAgICAgIHRoaXMucGRmV3JhcHBlci5nZXREb2N1bWVudChyZW5kZXJPcHRpb25zLmRvY3VtZW50SWQpXG4gICAgICAgICAgICAudGhlbihwZGYgPT4ge1xuICAgICAgICAgICAgICAgIHJlbmRlck9wdGlvbnMucGRmRG9jdW1lbnQgPSBwZGY7XG4gICAgICAgICAgICAgICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdmlld2VyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMucGRmUGFnZXMgPSBwZGYucGRmSW5mby5udW1QYWdlcztcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RQYWdlcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnBkZlBhZ2VzICsgMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VEb20gPSB0aGlzLnBkZkFubm90YXRlV3JhcHBlci5jcmVhdGVQYWdlKGkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSByZW5kZXIgb3B0aW9ucyBmb3IgZWFjaCBwYWdlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHJlbmRlck9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3ZXIuYXBwZW5kQ2hpbGQocGFnZURvbSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkRG9tUGFnZShwYWdlRG9tLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgcGRmLmdldFBhZ2UoaSkudGhlbigocGRmUGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGN1cnJlbnQgcGFnZSByb3RhdGlvbiBmcm9tIHBhZ2Ugcm90YXRpb24gb2JqZWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9wdGlvbnMucm90YXRlID0gdGhpcy5hZGRQYWdlUm90YXRpb24ocmVuZGVyT3B0aW9ucywgcGFnZU9wdGlvbnMsIHBkZlBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZGZBbm5vdGF0ZVdyYXBwZXIucmVuZGVyUGFnZShpLCBwYWdlT3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSB0aGlzLnBkZlBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFJlbmRlck9wdGlvbnMocmVuZGVyT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWRVcGRhdGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RQYWdlc1N1YmplY3QubmV4dCh0aGlzLmxpc3RQYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5jYXRjaChcbiAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IG5ldyBFcnJvcignVW5hYmxlIHRvIHJlbmRlciB5b3VyIHN1cHBsaWVkIFBERi4gJyArXG4gICAgICAgICAgICAgICAgcmVuZGVyT3B0aW9ucy5kb2N1bWVudElkICsgJy4gRXJyb3IgaXM6ICcgKyBlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ0VuY291bnRlcmVkIGVycm9yIHdoaWxlIHJlbmRlcmluZyB0aGUgUERGOicgKyBlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkRG9tUGFnZShwYWdlRG9tOiBhbnksIHBhZ2VOdW1iZXI6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwYWdlZGV0YWlscyA9IG5ldyBSb3RhdGlvbk1vZGVsKHBhZ2VOdW1iZXIsIHBhZ2VEb20pO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGlzdFBhZ2VzLmZpbmRJbmRleChwYWdlRWxlbWVudCA9PiBwYWdlRWxlbWVudC5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyKTtcbiAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5saXN0UGFnZXNbaW5kZXhdID0gcGFnZWRldGFpbHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RQYWdlcy5wdXNoKHBhZ2VkZXRhaWxzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFBhZ2VSb3RhdGlvbihyZW5kZXJPcHRpb25zOiBSZW5kZXJPcHRpb25zLCBwYWdlT3B0aW9uczogUmVuZGVyT3B0aW9ucywgcGRmUGFnZTogYW55KTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHJvdGF0aW9uID0gdGhpcy5nZXRQYWdlUm90YXRpb24ocGFnZU9wdGlvbnMsIHBkZlBhZ2UpO1xuICAgICAgICBpZiAoIXJvdGF0aW9uKSB7XG4gICAgICAgICAgICByZW5kZXJPcHRpb25zLnJvdGF0aW9uUGFnZXMucHVzaCh7cGFnZTogcGRmUGFnZS5wYWdlTnVtYmVyLCByb3RhdGU6IHBkZlBhZ2Uucm90YXRlfSk7XG4gICAgICAgICAgICByb3RhdGlvbiA9IHBkZlBhZ2Uucm90YXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3RhdGlvbjtcbiAgICB9XG5cbiAgICBnZXRQYWdlUm90YXRpb24ocGFnZU9wdGlvbnM6IFJlbmRlck9wdGlvbnMsIHBkZlBhZ2U6IGFueSk6IG51bWJlciB7XG4gICAgICByZXR1cm4gcGFnZU9wdGlvbnMucm90YXRpb25QYWdlc1xuICAgICAgICAuZmlsdGVyKHJvdGF0ZU9iaiA9PiByb3RhdGVPYmoucGFnZSA9PT0gcGRmUGFnZS5wYWdlTnVtYmVyKVxuICAgICAgICAubWFwKHJvdGF0ZU9iaiA9PiByb3RhdGVPYmoucm90YXRlKVswXTtcbiAgICB9XG59XG4iXX0=