From ed7652d8f79a7c00c2586bbfa76cbfc4f13fd4b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Tue, 19 Apr 2022 15:48:32 +0300 Subject: [PATCH] RED-3893: File stamping service --- .../file-preview/file-preview-providers.ts | 2 + .../file-preview-screen.component.ts | 72 +--------------- .../file-preview/services/stamp.service.ts | 83 +++++++++++++++++++ libs/common-ui | 2 +- 4 files changed, 90 insertions(+), 69 deletions(-) create mode 100644 apps/red-ui/src/app/modules/file-preview/services/stamp.service.ts diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview-providers.ts b/apps/red-ui/src/app/modules/file-preview/file-preview-providers.ts index 52b7b66bf..85e0bf603 100644 --- a/apps/red-ui/src/app/modules/file-preview/file-preview-providers.ts +++ b/apps/red-ui/src/app/modules/file-preview/file-preview-providers.ts @@ -17,6 +17,7 @@ import { FileDataService } from './services/file-data.service'; import { ViewerHeaderConfigService } from './services/viewer-header-config.service'; import { TooltipsService } from './services/tooltips.service'; import { AnnotationsListingService } from './services/annotations-listing.service'; +import { StampService } from './services/stamp.service'; export const filePreviewScreenProviders = [ FilterService, @@ -40,4 +41,5 @@ export const filePreviewScreenProviders = [ TooltipsService, { provide: ListingService, useClass: AnnotationsListingService }, SearchService, + StampService, ]; diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts index 48e6f2bf0..f68b5d4d4 100644 --- a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts @@ -25,14 +25,12 @@ import { File, ViewMode, ViewModes } from '@red/domain'; import { PermissionsService } from '@services/permissions.service'; import { combineLatest, firstValueFrom, Observable, of, pairwise } from 'rxjs'; import { UserPreferenceService } from '@services/user-preference.service'; -import { clearStamps, download, handleFilterDelta, stampPDFPage } from '../../utils'; +import { download, handleFilterDelta } from '../../utils'; import { FileWorkloadComponent } from './components/file-workload/file-workload.component'; -import { TranslateService } from '@ngx-translate/core'; import { FilesService } from '@services/entity-services/files.service'; import { FileManagementService } from '@services/entity-services/file-management.service'; import { catchError, debounceTime, map, startWith, switchMap, tap } from 'rxjs/operators'; import { FilesMapService } from '@services/entity-services/files-map.service'; -import { WatermarkService } from '@shared/services/watermark.service'; import { ExcludedPagesService } from './services/excluded-pages.service'; import { ViewModeService } from './services/view-mode.service'; import { MultiSelectService } from './services/multi-select.service'; @@ -51,8 +49,8 @@ import { FilePreviewDialogService } from './services/file-preview-dialog.service import { FileDataService } from './services/file-data.service'; import { ALL_HOTKEYS } from './shared/constants'; import { NGXLogger } from 'ngx-logger'; +import { StampService } from './services/stamp.service'; import Annotation = Core.Annotations.Annotation; -import PDFNet = Core.PDFNet; @Component({ templateUrl: './file-preview-screen.component.html', @@ -101,8 +99,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni private readonly _dossiersService: DossiersService, private readonly _fileDataService: FileDataService, private readonly _viewModeService: ViewModeService, - private readonly _watermarkService: WatermarkService, - private readonly _translateService: TranslateService, private readonly _changeDetectorRef: ChangeDetectorRef, private readonly _reanalysisService: ReanalysisService, private readonly _dialogService: FilePreviewDialogService, @@ -111,6 +107,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni private readonly _fileManagementService: FileManagementService, private readonly _manualRedactionService: ManualRedactionService, private readonly _annotationProcessingService: AnnotationProcessingService, + private readonly _stampService: StampService, ) { super(); this.canPerformAnnotationActions$ = this._canPerformAnnotationActions$; @@ -188,7 +185,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni } } - await this._stampPDF(); + await this._stampService.stampPDF(); this.#rebuildFilters(); } @@ -504,67 +501,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni }, 100); } - private async _stampPDF() { - const pdfDoc = await this.pdf.documentViewer.getDocument()?.getPDFDoc(); - if (!pdfDoc) { - return; - } - - const file = await this.state.file; - const allPages = [...Array(file.numberOfPages).keys()].map(page => page + 1); - - try { - await clearStamps(pdfDoc, this.pdf.PDFNet, allPages); - } catch (e) { - this._logger.error('Error clearing stamps: ', e); - return; - } - - if (this._viewModeService.isRedacted) { - const dossier = await this.state.dossier; - if (dossier.watermarkPreviewEnabled) { - await this._stampPreview(pdfDoc, dossier.dossierTemplateId); - } - } else { - await this._stampExcludedPages(pdfDoc, file.excludedPages); - } - - this.pdf.documentViewer.refreshAll(); - this.pdf.documentViewer.updateView([this.pdf.currentPage], this.pdf.currentPage); - this._changeDetectorRef.markForCheck(); - } - - private async _stampPreview(document: PDFNet.PDFDoc, dossierTemplateId: string) { - const watermark = await firstValueFrom(this._watermarkService.getWatermark(dossierTemplateId)); - await stampPDFPage( - document, - this.pdf.PDFNet, - watermark.text, - watermark.fontSize, - watermark.fontType, - watermark.orientation, - watermark.opacity, - watermark.hexColor, - Array.from({ length: await document.getPageCount() }, (x, i) => i + 1), - ); - } - - private async _stampExcludedPages(document: PDFNet.PDFDoc, excludedPages: number[]) { - if (excludedPages && excludedPages.length > 0) { - await stampPDFPage( - document, - this.pdf.PDFNet, - this._translateService.instant('file-preview.excluded-from-redaction') as string, - 17, - 'courier', - 'TOP_LEFT', - 50, - '#dd4d50', - excludedPages, - ); - } - } - private _subscribeToFileUpdates(): void { this.addActiveScreenSubscription = this.loadAnnotations().subscribe(); diff --git a/apps/red-ui/src/app/modules/file-preview/services/stamp.service.ts b/apps/red-ui/src/app/modules/file-preview/services/stamp.service.ts new file mode 100644 index 000000000..40758b128 --- /dev/null +++ b/apps/red-ui/src/app/modules/file-preview/services/stamp.service.ts @@ -0,0 +1,83 @@ +import { Injectable } from '@angular/core'; +import { clearStamps, stampPDFPage } from '../../../utils'; +import { PdfViewer } from './pdf-viewer.service'; +import { FilePreviewStateService } from './file-preview-state.service'; +import { NGXLogger } from 'ngx-logger'; +import { ViewModeService } from './view-mode.service'; +import { TranslateService } from '@ngx-translate/core'; +import { Core } from '@pdftron/webviewer'; +import { firstValueFrom } from 'rxjs'; +import { WatermarkService } from '../../shared/services/watermark.service'; +import PDFNet = Core.PDFNet; + +@Injectable() +export class StampService { + constructor( + private readonly _pdf: PdfViewer, + private readonly _state: FilePreviewStateService, + private readonly _logger: NGXLogger, + private readonly _viewModeService: ViewModeService, + private readonly _translateService: TranslateService, + private readonly _watermarkService: WatermarkService, + ) {} + + async stampPDF(): Promise { + const pdfDoc = await this._pdf.documentViewer.getDocument()?.getPDFDoc(); + if (!pdfDoc) { + return; + } + + const file = await this._state.file; + const allPages = [...Array(file.numberOfPages).keys()].map(page => page + 1); + + try { + await clearStamps(pdfDoc, this._pdf.PDFNet, allPages); + } catch (e) { + this._logger.error('Error clearing stamps: ', e); + return; + } + + if (this._viewModeService.isRedacted) { + const dossier = await this._state.dossier; + if (dossier.watermarkPreviewEnabled) { + await this._stampPreview(pdfDoc, dossier.dossierTemplateId); + } + } else { + await this._stampExcludedPages(pdfDoc, file.excludedPages); + } + + this._pdf.documentViewer.refreshAll(); + this._pdf.documentViewer.updateView([this._pdf.currentPage], this._pdf.currentPage); + } + + private async _stampExcludedPages(document: PDFNet.PDFDoc, excludedPages: number[]): Promise { + if (excludedPages && excludedPages.length > 0) { + await stampPDFPage( + document, + this._pdf.PDFNet, + this._translateService.instant('file-preview.excluded-from-redaction') as string, + 17, + 'courier', + 'TOP_LEFT', + 50, + '#dd4d50', + excludedPages, + ); + } + } + + private async _stampPreview(document: PDFNet.PDFDoc, dossierTemplateId: string): Promise { + const watermark = await firstValueFrom(this._watermarkService.getWatermark(dossierTemplateId)); + await stampPDFPage( + document, + this._pdf.PDFNet, + watermark.text, + watermark.fontSize, + watermark.fontType, + watermark.orientation, + watermark.opacity, + watermark.hexColor, + Array.from({ length: await document.getPageCount() }, (x, i) => i + 1), + ); + } +} diff --git a/libs/common-ui b/libs/common-ui index d8c2a342b..6a0e22e68 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit d8c2a342baa6acb330132c44000562bdd823f620 +Subproject commit 6a0e22e68441a1dbbaaa38cfebed1aa8e8bb91be