@ngstarter-ui/components 21.0.32 → 21.0.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngstarter-ui-components-pdf-viewer.mjs","sources":["../../../projects/components/pdf-viewer/src/pdf-viewer/pdf-viewer-engine.service.ts","../../../projects/components/pdf-viewer/src/pdf-viewer/pdf-viewer.ts","../../../projects/components/pdf-viewer/src/pdf-viewer/pdf-viewer.html","../../../projects/components/pdf-viewer/ngstarter-ui-components-pdf-viewer.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { PluginRegistry } from '@embedpdf/core';\nimport type { PdfEngine } from '@embedpdf/models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PdfViewerEngineService {\n private readonly engines = new Map<string, Promise<PdfEngine<Blob>>>();\n\n getEngine(wasmUrl: string): Promise<PdfEngine<Blob>> {\n const cachedEngine = this.engines.get(wasmUrl);\n\n if (cachedEngine) {\n return cachedEngine;\n }\n\n const engine = this.createEngine(wasmUrl);\n this.engines.set(wasmUrl, engine);\n return engine;\n }\n\n createRegistry(engine: PdfEngine<Blob>, defaultScale: number): Promise<PluginRegistry> {\n const registry = new PluginRegistry(engine, { defaultScale });\n return registry.initialize().then(() => registry);\n }\n\n private async createEngine(wasmUrl: string): Promise<PdfEngine<Blob>> {\n const { createPdfiumEngine } = await import('@embedpdf/engines/pdfium-direct-engine');\n return createPdfiumEngine(wasmUrl, { encoderPoolSize: 0 });\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n effect,\n inject,\n input,\n numberAttribute,\n output,\n PLATFORM_ID,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport type { PdfDocumentObject, PdfEngine, PdfPageObject } from '@embedpdf/models';\nimport { BlockLoader } from '@ngstarter-ui/components/block-loader';\nimport { Button } from '@ngstarter-ui/components/button';\nimport { Icon } from '@ngstarter-ui/components/icon';\nimport { ImagePlaceholder } from '@ngstarter-ui/components/image-placeholder';\nimport {\n Menu,\n MenuDivider,\n MenuHeading,\n MenuItem,\n MenuTrigger,\n} from '@ngstarter-ui/components/menu';\nimport {\n Panel,\n PanelContent,\n PanelHeader,\n PanelSidebar,\n} from '@ngstarter-ui/components/panel';\nimport { PdfViewerEngineService } from './pdf-viewer-engine.service';\nimport {\n PdfViewerLoadedEvent,\n PdfViewerPageRenderedEvent,\n PdfViewerThumbnailView,\n PdfViewerPageView,\n PdfViewerSelectionRectView,\n PdfViewerSource,\n PdfViewerTextGlyphView,\n} from './types';\n\ninterface PdfViewerPageListItem {\n pageNumber: number;\n thumbnail: PdfViewerThumbnailView | null;\n}\n\ntype PdfViewerSpreadMode = 'single' | 'two-odd' | 'two-even';\ntype PdfViewerScrollLayout = 'vertical' | 'horizontal';\n\ninterface PdfViewerSelectionPoint {\n pageNumber: number;\n x: number;\n y: number;\n offset: number;\n}\n\ninterface PdfViewerTextLineView {\n lineId: number;\n glyphs: PdfViewerTextGlyphView[];\n top: number;\n bottom: number;\n left: number;\n right: number;\n center: number;\n}\n\n@Component({\n selector: 'ngs-pdf-viewer',\n exportAs: 'ngsPdfViewer',\n standalone: true,\n imports: [\n BlockLoader,\n Button,\n Icon,\n ImagePlaceholder,\n Menu,\n MenuDivider,\n MenuHeading,\n MenuItem,\n MenuTrigger,\n Panel,\n PanelContent,\n PanelHeader,\n PanelSidebar,\n ],\n templateUrl: './pdf-viewer.html',\n styleUrl: './pdf-viewer.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngs-pdf-viewer not-prose',\n '[class.is-loading]': 'isLoading()',\n '[class.has-toolbar]': 'showToolbar()',\n '[class.has-page-list]': 'isPageListVisible()',\n '[class.has-error]': 'errorState()',\n },\n})\nexport class PdfViewer {\n private readonly textSelectionHorizontalPadding = 2;\n private readonly textSelectionLineHeight = 1.2;\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n private readonly engineService = inject(PdfViewerEngineService);\n private readonly hostElement = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private readonly viewerBody = viewChild<ElementRef<HTMLElement>>('viewerBody');\n private readonly pageList = viewChild<ElementRef<HTMLElement>>('pageList');\n\n src = input<PdfViewerSource>(null);\n wasmUrl = input('/assets/embedpdf/pdfium.wasm');\n page = input(1, { transform: numberAttribute });\n scale = input(1, { transform: numberAttribute });\n minScale = input(0.2, { transform: numberAttribute });\n maxScale = input(60, { transform: numberAttribute });\n zoomStep = input(0.1, { transform: numberAttribute });\n renderAll = input(true, { transform: booleanAttribute });\n showToolbar = input(true, { transform: booleanAttribute });\n showPageList = input(true, { transform: booleanAttribute });\n withAnnotations = input(true, { transform: booleanAttribute });\n withForms = input(true, { transform: booleanAttribute });\n\n loaded = output<PdfViewerLoadedEvent>();\n pageChanged = output<number>();\n pageRendered = output<PdfViewerPageRenderedEvent>();\n error = output<unknown>();\n\n protected readonly isLoading = signal(false);\n protected readonly errorState = signal<unknown>(null);\n protected readonly renderedPages = signal<PdfViewerPageView[]>([]);\n protected readonly thumbnailPages = signal<PdfViewerThumbnailView[]>([]);\n protected readonly pageCount = signal(0);\n protected readonly activePage = signal(1);\n protected readonly zoom = signal(1);\n protected readonly pageListVisible = signal(true);\n protected readonly spreadMode = signal<PdfViewerSpreadMode>('single');\n protected readonly scrollLayout = signal<PdfViewerScrollLayout>('horizontal');\n protected readonly selectionRects = signal<PdfViewerSelectionRectView[]>([]);\n protected readonly hasDocument = computed(() => this.pageCount() > 0);\n protected readonly isPageListVisible = computed(() =>\n this.showPageList() && this.hasDocument() && this.pageListVisible(),\n );\n protected readonly thumbnailPageMap = computed(() =>\n new Map(this.thumbnailPages().map((thumbnail) => [thumbnail.pageNumber, thumbnail])),\n );\n protected readonly pageItems = computed<PdfViewerPageListItem[]>(() =>\n Array.from({ length: this.pageCount() }, (_, index) => {\n const pageNumber = index + 1;\n\n return {\n pageNumber,\n thumbnail: this.thumbnailPageMap().get(pageNumber) ?? null,\n };\n }),\n );\n protected readonly canGoPrevious = computed(() => this.activePage() > 1);\n protected readonly canGoNext = computed(() => this.activePage() < this.pageCount());\n protected readonly canZoomOut = computed(() => this.zoom() > this.getScaleBounds().min);\n protected readonly canZoomIn = computed(() => this.zoom() < this.getScaleBounds().max);\n protected readonly zoomLabel = computed(() => `${Math.round(this.zoom() * 100)}%`);\n\n private engine: PdfEngine<Blob> | null = null;\n private pdfDocument: PdfDocumentObject | null = null;\n private registry: { destroy(): Promise<void> | void } | null = null;\n private pageIntersectionObserver: IntersectionObserver | null = null;\n private visiblePageRatios = new Map<number, number>();\n private loadToken = 0;\n private renderToken = 0;\n private scrollSyncFrame: number | null = null;\n private programmaticScrollTargetPage: number | null = null;\n private programmaticScrollTimeout: number | null = null;\n private pageObserverFrame: number | null = null;\n private pageObserverTimeout: number | null = null;\n private visiblePageRenderFrame: number | null = null;\n private pageObserverRefreshAttempts = 0;\n private selectionStart: PdfViewerSelectionPoint | null = null;\n private isViewInitialized = false;\n private readonly programmaticScrollMinDuration = 900;\n private readonly programmaticScrollMaxDuration = 6000;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.loadToken++;\n this.renderToken++;\n this.cancelScrollSyncFrame();\n this.clearProgrammaticScrollLock();\n this.cancelPageObserverFrame();\n this.cancelVisiblePageRenderFrame();\n this.disconnectPageObserver();\n this.revokeRenderedPages();\n this.revokeThumbnailPages();\n void this.closeDocument();\n void this.registry?.destroy();\n });\n\n effect(() => {\n const source = this.src();\n const wasmUrl = this.wasmUrl();\n\n if (!this.isViewInitialized || !this.isBrowser) {\n return;\n }\n\n untracked(() => {\n void this.loadDocument(source, wasmUrl);\n });\n });\n\n effect(() => {\n const scale = this.sanitizeScale(this.scale());\n\n if (untracked(() => this.zoom()) !== scale) {\n untracked(() => this.setZoom(scale));\n }\n });\n\n effect(() => {\n const requestedPage = this.sanitizePage(this.page());\n\n if (requestedPage !== untracked(() => this.activePage())) {\n this.activePage.set(requestedPage);\n }\n });\n\n effect(() => {\n const zoom = this.zoom();\n const renderAll = this.renderAll();\n const activePage = renderAll ? untracked(() => this.activePage()) : this.activePage();\n const withAnnotations = this.withAnnotations();\n const withForms = this.withForms();\n\n if (!this.pdfDocument || !this.engine || this.isLoading()) {\n return;\n }\n\n untracked(() => {\n this.applyInstantZoom(zoom);\n this.scheduleVisiblePagesRender({ zoom, activePage, renderAll, withAnnotations, withForms });\n });\n });\n\n effect(() => {\n const withAnnotations = this.withAnnotations();\n const isLoading = this.isLoading();\n const pageCount = this.pageCount();\n\n if (isLoading || pageCount === 0 || !this.pdfDocument || !this.engine) {\n return;\n }\n\n untracked(() => {\n void this.renderThumbnails(this.loadToken, { withAnnotations });\n });\n });\n }\n\n ngAfterViewInit(): void {\n this.isViewInitialized = true;\n\n if (this.isBrowser) {\n void this.loadDocument(this.src(), this.wasmUrl());\n }\n }\n\n previousPage(): void {\n if (!this.canGoPrevious()) {\n return;\n }\n\n this.setPage(this.activePage() - 1);\n }\n\n nextPage(): void {\n if (!this.canGoNext()) {\n return;\n }\n\n this.setPage(this.activePage() + 1);\n }\n\n zoomIn(): void {\n this.setZoom(this.roundZoom(this.zoom() + this.sanitizeZoomStep()));\n }\n\n zoomOut(): void {\n this.setZoom(this.roundZoom(this.zoom() - this.sanitizeZoomStep()));\n }\n\n togglePageList(): void {\n this.pageListVisible.update((isVisible) => !isVisible);\n }\n\n protected setSpreadMode(mode: PdfViewerSpreadMode): void {\n this.spreadMode.set(mode);\n }\n\n protected setScrollLayout(layout: PdfViewerScrollLayout): void {\n this.scrollLayout.set(layout);\n }\n\n protected rotateClockwise(): void {\n this.renderedPages.update((pages) => [...pages]);\n }\n\n protected rotateCounterClockwise(): void {\n this.renderedPages.update((pages) => [...pages]);\n }\n\n protected toggleFullscreen(): void {\n if (!this.isBrowser) {\n return;\n }\n\n const target = this.hostElement.nativeElement;\n const currentFullscreenElement = this.document.fullscreenElement;\n\n if (currentFullscreenElement) {\n void this.document.exitFullscreen?.();\n return;\n }\n\n void target.requestFullscreen?.();\n }\n\n setPage(pageNumber: number): void {\n const nextPage = this.clamp(pageNumber, 1, Math.max(this.pageCount(), 1));\n const hasChanged = nextPage !== this.activePage();\n\n if (!hasChanged) {\n this.scrollToPage(nextPage);\n this.scrollPageListToPage(nextPage);\n return;\n }\n\n this.activePage.set(nextPage);\n this.pageChanged.emit(nextPage);\n this.scrollToPage(nextPage);\n this.scrollPageListToPage(nextPage);\n }\n\n protected onViewerScroll(): void {\n if (!this.renderAll() || !this.isBrowser || this.renderedPages().length < 2) {\n return;\n }\n\n if (this.scrollSyncFrame !== null) {\n return;\n }\n\n this.scrollSyncFrame = this.document.defaultView?.requestAnimationFrame(() => {\n this.scrollSyncFrame = null;\n\n if (this.isProgrammaticScrollActive()) {\n this.completeProgrammaticScrollIfSettled();\n return;\n }\n\n this.syncActivePageFromViewport();\n this.scheduleCurrentVisiblePagesRender();\n }) ?? null;\n }\n\n protected selectionRectsForPage(pageNumber: number): PdfViewerSelectionRectView[] {\n return this.selectionRects().filter((rect) => rect.pageNumber === pageNumber);\n }\n\n protected isPageImageFresh(page: PdfViewerPageView): boolean {\n return !!page.url && Math.abs((page.renderedScale ?? 0) - page.scale) < 0.0001;\n }\n\n protected startTextSelection(event: PointerEvent | MouseEvent, page: PdfViewerPageView): void {\n if (event.button !== 0 || page.textGlyphs.length === 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const surface = event.currentTarget as HTMLElement;\n if ('pointerId' in event) {\n surface.setPointerCapture?.(event.pointerId);\n }\n\n this.selectionStart = this.getSelectionPoint(event, page, surface);\n this.selectionRects.set([]);\n }\n\n protected updateTextSelection(event: PointerEvent | MouseEvent, page: PdfViewerPageView): void {\n if (!this.selectionStart || this.selectionStart.pageNumber !== page.pageNumber) {\n return;\n }\n\n event.preventDefault();\n const surface = event.currentTarget as HTMLElement;\n const currentPoint = this.getSelectionPoint(event, page, surface);\n\n if (this.selectionStart.offset === currentPoint.offset) {\n this.selectionRects.set([]);\n return;\n }\n\n this.selectionRects.set(this.getSelectionRects(page, this.selectionStart.offset, currentPoint.offset));\n }\n\n protected finishTextSelection(event: PointerEvent | MouseEvent, page: PdfViewerPageView): void {\n if (!this.selectionStart) {\n return;\n }\n\n this.updateTextSelection(event, page);\n this.selectionStart = null;\n\n const surface = event.currentTarget as HTMLElement;\n if ('pointerId' in event) {\n surface.releasePointerCapture?.(event.pointerId);\n }\n }\n\n protected cancelTextSelection(): void {\n this.selectionStart = null;\n }\n\n private async loadDocument(source: PdfViewerSource, wasmUrl: string): Promise<void> {\n const token = ++this.loadToken;\n this.renderToken++;\n this.isLoading.set(true);\n this.errorState.set(null);\n this.pageCount.set(0);\n this.selectionStart = null;\n this.selectionRects.set([]);\n this.revokeRenderedPages();\n this.revokeThumbnailPages();\n\n await this.closeDocument();\n await this.registry?.destroy();\n this.registry = null;\n\n if (!source) {\n this.isLoading.set(false);\n return;\n }\n\n try {\n const engine = await this.engineService.getEngine(wasmUrl);\n\n if (token !== this.loadToken) {\n return;\n }\n\n this.engine = engine;\n this.registry = await this.engineService.createRegistry(engine, this.zoom());\n\n if (token !== this.loadToken) {\n return;\n }\n\n const documentId = this.createDocumentId();\n const pdfDocument = await this.openSource(engine, documentId, source);\n\n if (token !== this.loadToken) {\n await engine.closeDocument(pdfDocument).toPromise();\n return;\n }\n\n this.pdfDocument = pdfDocument;\n this.pageCount.set(pdfDocument.pageCount);\n this.activePage.set(this.clamp(this.activePage(), 1, Math.max(pdfDocument.pageCount, 1)));\n this.loaded.emit({ pageCount: pdfDocument.pageCount });\n this.initializePageShells(pdfDocument, this.zoom(), this.renderAll(), this.activePage());\n this.schedulePageObserverRefresh();\n await this.renderVisiblePages(token, ++this.renderToken, {\n zoom: this.zoom(),\n activePage: this.activePage(),\n renderAll: this.renderAll(),\n withAnnotations: this.withAnnotations(),\n withForms: this.withForms(),\n });\n } catch (error) {\n if (token === this.loadToken) {\n this.errorState.set(error);\n this.error.emit(error);\n }\n } finally {\n if (token === this.loadToken) {\n this.isLoading.set(false);\n }\n }\n }\n\n private initializePageShells(\n pdfDocument: PdfDocumentObject,\n scale: number,\n renderAll: boolean,\n activePage: number,\n ): void {\n const previousPages = this.renderedPages();\n const previousPageMap = new Map(previousPages.map((page) => [page.pageNumber, page]));\n const pageNumbers = this.getPageNumbersToDisplay(pdfDocument, renderAll, activePage);\n const nextScale = this.sanitizeScale(scale);\n const nextPages = pageNumbers.map((pageNumber) => {\n const pdfPage = pdfDocument.pages[pageNumber - 1];\n const previousPage = previousPageMap.get(pageNumber);\n const displaySize = this.getPageDisplaySize(pdfPage, nextScale);\n const isFresh = previousPage?.url && Math.abs((previousPage.renderedScale ?? 0) - nextScale) < 0.0001;\n\n return {\n pageNumber,\n url: isFresh ? previousPage.url : null,\n scale: nextScale,\n renderedScale: isFresh ? previousPage.renderedScale : null,\n width: displaySize.width,\n height: displaySize.height,\n isRendering: false,\n textGlyphs: isFresh ? previousPage.textGlyphs : [],\n };\n });\n const nextUrlSet = new Set(nextPages.map((page) => page.url).filter((url): url is string => !!url));\n\n for (const page of previousPages) {\n if (page.url && !nextUrlSet.has(page.url)) {\n this.revokeObjectUrl(page.url);\n }\n }\n\n this.selectionStart = null;\n this.selectionRects.set([]);\n this.disconnectPageObserver();\n this.renderedPages.set(nextPages);\n }\n\n private getPageNumbersToDisplay(\n pdfDocument: PdfDocumentObject,\n renderAll: boolean,\n activePage: number,\n ): number[] {\n if (!renderAll) {\n return [this.clamp(activePage, 1, pdfDocument.pageCount)];\n }\n\n return Array.from({ length: pdfDocument.pageCount }, (_, index) => index + 1);\n }\n\n private scheduleVisiblePagesRender(\n options: {\n zoom: number;\n activePage: number;\n renderAll: boolean;\n withAnnotations: boolean;\n withForms: boolean;\n },\n ): void {\n const targetWindow = this.document.defaultView;\n\n if (!targetWindow) {\n return;\n }\n\n this.cancelVisiblePageRenderFrame();\n const token = this.loadToken;\n const renderToken = ++this.renderToken;\n\n this.visiblePageRenderFrame = targetWindow.requestAnimationFrame(() => {\n this.visiblePageRenderFrame = null;\n void this.renderVisiblePages(token, renderToken, options);\n });\n }\n\n private scheduleCurrentVisiblePagesRender(): void {\n this.scheduleVisiblePagesRender({\n zoom: this.zoom(),\n activePage: this.activePage(),\n renderAll: this.renderAll(),\n withAnnotations: this.withAnnotations(),\n withForms: this.withForms(),\n });\n }\n\n private async renderVisiblePages(\n token: number,\n renderToken: number,\n options: {\n zoom: number;\n activePage: number;\n renderAll: boolean;\n withAnnotations: boolean;\n withForms: boolean;\n },\n ): Promise<void> {\n if (!this.engine || !this.pdfDocument) {\n return;\n }\n\n const pdfDocument = this.pdfDocument;\n const renderScale = this.sanitizeScale(options.zoom);\n const pageNumbers = this.getPriorityPageNumbers(options.activePage, options.renderAll);\n\n for (const pageNumber of pageNumbers) {\n if (!this.isRenderCurrent(token, renderToken)) {\n return;\n }\n\n const currentPage = this.renderedPages().find((page) => page.pageNumber === pageNumber);\n\n if (!currentPage || Math.abs(currentPage.scale - renderScale) > 0.0001) {\n continue;\n }\n\n if (currentPage.url && Math.abs((currentPage.renderedScale ?? 0) - renderScale) < 0.0001) {\n continue;\n }\n\n this.patchRenderedPage(pageNumber, { isRendering: true });\n const page = pdfDocument.pages[pageNumber - 1];\n const blob = await this.engine.renderPage(pdfDocument, page, {\n scaleFactor: renderScale,\n dpr: this.getDevicePixelRatio(),\n withAnnotations: options.withAnnotations,\n withForms: options.withForms,\n }).toPromise();\n\n if (!this.isRenderCurrent(token, renderToken)) {\n return;\n }\n\n const displaySize = this.getPageDisplaySize(page, renderScale);\n const textGlyphs = await this.getPageTextGlyphs(pdfDocument, page, renderScale);\n\n if (!this.isRenderCurrent(token, renderToken)) {\n return;\n }\n\n const url = this.document.defaultView?.URL.createObjectURL(blob) ?? URL.createObjectURL(blob);\n const previousUrl = this.renderedPages().find((renderedPage) => renderedPage.pageNumber === pageNumber)?.url;\n\n this.patchRenderedPage(pageNumber, {\n url,\n scale: renderScale,\n renderedScale: renderScale,\n width: displaySize.width,\n height: displaySize.height,\n isRendering: false,\n textGlyphs,\n });\n\n if (previousUrl && previousUrl !== url) {\n this.revokeObjectUrl(previousUrl);\n }\n\n this.pageRendered.emit({ pageNumber, url, width: displaySize.width, height: displaySize.height });\n }\n }\n\n private setZoom(scale: number): void {\n const nextZoom = this.sanitizeScale(scale);\n\n if (this.zoom() !== nextZoom) {\n this.zoom.set(nextZoom);\n }\n\n this.applyInstantZoom(nextZoom);\n }\n\n private applyInstantZoom(scale: number): void {\n const nextScale = this.sanitizeScale(scale);\n const pdfDocument = this.pdfDocument;\n const pages = this.renderedPages();\n\n if (!pdfDocument || pages.length === 0) {\n return;\n }\n\n let hasChanges = false;\n const nextPages = pages.map((page) => {\n if (Math.abs(page.scale - nextScale) < 0.0001) {\n return page;\n }\n\n hasChanges = true;\n const pdfPage = pdfDocument.pages[page.pageNumber - 1];\n const displaySize = this.getPageDisplaySize(pdfPage, nextScale);\n\n return {\n ...page,\n url: null,\n scale: nextScale,\n renderedScale: null,\n width: displaySize.width,\n height: displaySize.height,\n isRendering: false,\n textGlyphs: [],\n };\n });\n\n if (!hasChanges) {\n return;\n }\n\n for (const page of pages) {\n if (page.url) {\n this.revokeObjectUrl(page.url);\n }\n }\n\n this.selectionStart = null;\n this.selectionRects.set([]);\n this.renderedPages.set(nextPages);\n this.schedulePageObserverRefresh();\n }\n\n private getPriorityPageNumbers(activePage: number, renderAll: boolean): number[] {\n if (!this.pdfDocument) {\n return [];\n }\n\n const pageCount = this.pdfDocument.pageCount;\n const visiblePageNumbers = renderAll\n ? this.getVisiblePageNumbers()\n : [this.clamp(activePage, 1, pageCount)];\n const priorityPageNumbers = new Set<number>();\n\n for (const pageNumber of visiblePageNumbers.length > 0 ? visiblePageNumbers : [activePage]) {\n for (let candidate = pageNumber - 1; candidate <= pageNumber + 1; candidate++) {\n if (candidate >= 1 && candidate <= pageCount) {\n priorityPageNumbers.add(candidate);\n }\n }\n }\n\n priorityPageNumbers.add(this.clamp(activePage, 1, pageCount));\n\n return [...priorityPageNumbers].sort((a, b) => {\n const activeDistance = Math.abs(a - activePage) - Math.abs(b - activePage);\n\n return activeDistance || a - b;\n });\n }\n\n private getVisiblePageNumbers(): number[] {\n const container = this.viewerBody()?.nativeElement;\n\n if (!container) {\n return [];\n }\n\n const containerRect = container.getBoundingClientRect();\n const prefetchMargin = containerRect.height;\n const pages = Array.from(container.querySelectorAll<HTMLElement>('[data-ngs-pdf-page]'));\n const visiblePageNumbers: number[] = [];\n\n for (const page of pages) {\n const rect = page.getBoundingClientRect();\n const pageNumber = Number(page.dataset['ngsPdfPage']);\n\n if (\n Number.isFinite(pageNumber) &&\n rect.bottom >= containerRect.top - prefetchMargin &&\n rect.top <= containerRect.bottom + prefetchMargin\n ) {\n visiblePageNumbers.push(pageNumber);\n }\n }\n\n return visiblePageNumbers;\n }\n\n private patchRenderedPage(pageNumber: number, patch: Partial<PdfViewerPageView>): void {\n this.renderedPages.update((pages) =>\n pages.map((page) => page.pageNumber === pageNumber ? { ...page, ...patch } : page),\n );\n }\n\n private async renderThumbnails(\n token: number,\n options: {\n withAnnotations: boolean;\n },\n ): Promise<void> {\n if (!this.engine || !this.pdfDocument) {\n return;\n }\n\n const pdfDocument = this.pdfDocument;\n const thumbnailScale = 0.18;\n const nextThumbnails: PdfViewerThumbnailView[] = [];\n const previousThumbnails = this.thumbnailPages();\n\n for (const page of pdfDocument.pages) {\n const blob = await this.engine.renderThumbnail(pdfDocument, page, {\n scaleFactor: thumbnailScale,\n dpr: this.getDevicePixelRatio(),\n withAnnotations: options.withAnnotations,\n }).toPromise();\n\n if (token !== this.loadToken) {\n const staleUrl = this.document.defaultView?.URL.createObjectURL(blob) ?? URL.createObjectURL(blob);\n this.revokeObjectUrl(staleUrl);\n return;\n }\n\n const url = this.document.defaultView?.URL.createObjectURL(blob) ?? URL.createObjectURL(blob);\n const pageNumber = page.index + 1;\n const displaySize = this.getPageDisplaySize(page, thumbnailScale);\n nextThumbnails.push({ pageNumber, url, width: displaySize.width, height: displaySize.height });\n }\n\n if (token !== this.loadToken) {\n for (const thumbnail of nextThumbnails) {\n this.revokeObjectUrl(thumbnail.url);\n }\n return;\n }\n\n this.thumbnailPages.set(nextThumbnails);\n\n for (const thumbnail of previousThumbnails) {\n this.revokeObjectUrl(thumbnail.url);\n }\n }\n\n private async getPageTextGlyphs(\n pdfDocument: PdfDocumentObject,\n page: PdfPageObject,\n scale: number,\n ): Promise<PdfViewerTextGlyphView[]> {\n if (!this.engine) {\n return [];\n }\n\n try {\n const geometry = await this.engine.getPageGeometry(pdfDocument, page).toPromise();\n const displaySize = this.getPageDisplaySize(page, scale);\n const glyphs: PdfViewerTextGlyphView[] = [];\n\n for (const run of geometry.runs) {\n for (const glyph of run.glyphs) {\n if ((glyph.flags & 2) === 2 || glyph.width <= 0 || glyph.height <= 0) {\n continue;\n }\n\n const glyphLeft = glyph.x * scale;\n const glyphTop = glyph.y * scale;\n const glyphWidth = glyph.width * scale;\n const glyphHeight = glyph.height * scale;\n const lineHeight = Math.max(\n glyphHeight,\n (run.fontSize ?? glyph.height) * this.textSelectionLineHeight * scale,\n );\n const lineTop = this.clamp(glyphTop - (lineHeight - glyphHeight) / 2, 0, displaySize.height);\n const lineBottom = this.clamp(lineTop + lineHeight, 0, displaySize.height);\n const left = this.clamp(glyphLeft, 0, displaySize.width);\n const right = this.clamp(glyphLeft + glyphWidth, 0, displaySize.width);\n\n glyphs.push({\n index: glyphs.length,\n left,\n top: this.clamp(glyphTop, 0, displaySize.height),\n width: Math.max(0, right - left),\n height: Math.max(0, glyphHeight),\n lineTop,\n lineHeight: Math.max(0, lineBottom - lineTop),\n lineId: -1,\n });\n }\n }\n\n return this.assignTextGlyphLines(glyphs).map((glyph) => ({\n ...glyph,\n left: this.roundCssPixel(glyph.left),\n top: this.roundCssPixel(glyph.top),\n width: this.roundCssPixel(glyph.width),\n height: this.roundCssPixel(glyph.height),\n lineTop: this.roundCssPixel(glyph.lineTop),\n lineHeight: this.roundCssPixel(glyph.lineHeight),\n }));\n } catch {\n return [];\n }\n }\n\n private assignTextGlyphLines(glyphs: PdfViewerTextGlyphView[]): PdfViewerTextGlyphView[] {\n const lines: PdfViewerTextLineView[] = [];\n\n for (const glyph of [...glyphs].sort((a, b) => a.lineTop - b.lineTop || a.left - b.left)) {\n const glyphBottom = glyph.lineTop + glyph.lineHeight;\n const glyphCenter = glyph.lineTop + glyph.lineHeight / 2;\n let line = lines.find((candidate) =>\n this.rangesOverlap(candidate.top, candidate.bottom, glyph.lineTop, glyphBottom) ||\n Math.abs(candidate.center - glyphCenter) <= Math.max(2, glyph.lineHeight * 0.4),\n );\n\n if (!line) {\n line = {\n lineId: lines.length,\n glyphs: [],\n top: glyph.lineTop,\n bottom: glyphBottom,\n left: glyph.left,\n right: glyph.left + glyph.width,\n center: glyphCenter,\n };\n lines.push(line);\n }\n\n glyph.lineId = line.lineId;\n line.glyphs.push(glyph);\n line.top = Math.min(line.top, glyph.lineTop);\n line.bottom = Math.max(line.bottom, glyphBottom);\n line.left = Math.min(line.left, glyph.left);\n line.right = Math.max(line.right, glyph.left + glyph.width);\n line.center = line.top + (line.bottom - line.top) / 2;\n }\n\n return glyphs;\n }\n\n private getTextLines(glyphs: PdfViewerTextGlyphView[]): PdfViewerTextLineView[] {\n const lines = new Map<number, PdfViewerTextLineView>();\n\n for (const glyph of glyphs) {\n const glyphBottom = glyph.lineTop + glyph.lineHeight;\n const glyphRight = glyph.left + glyph.width;\n const existing = lines.get(glyph.lineId);\n\n if (!existing) {\n lines.set(glyph.lineId, {\n lineId: glyph.lineId,\n glyphs: [glyph],\n top: glyph.lineTop,\n bottom: glyphBottom,\n left: glyph.left,\n right: glyphRight,\n center: glyph.lineTop + glyph.lineHeight / 2,\n });\n continue;\n }\n\n existing.glyphs.push(glyph);\n existing.top = Math.min(existing.top, glyph.lineTop);\n existing.bottom = Math.max(existing.bottom, glyphBottom);\n existing.left = Math.min(existing.left, glyph.left);\n existing.right = Math.max(existing.right, glyphRight);\n existing.center = existing.top + (existing.bottom - existing.top) / 2;\n }\n\n return [...lines.values()]\n .map((line) => ({\n ...line,\n glyphs: [...line.glyphs].sort((a, b) => a.left - b.left || a.index - b.index),\n }))\n .sort((a, b) => a.top - b.top || a.left - b.left);\n }\n\n private rangesOverlap(aStart: number, aEnd: number, bStart: number, bEnd: number): boolean {\n return aStart < bEnd && aEnd > bStart;\n }\n\n private getCaretOffsetAtPoint(page: PdfViewerPageView, point: Pick<PdfViewerSelectionPoint, 'x' | 'y'>): number {\n const lines = this.getTextLines(page.textGlyphs);\n\n if (lines.length === 0) {\n return 0;\n }\n\n const line =\n lines.find((candidate) => point.y >= candidate.top && point.y <= candidate.bottom) ??\n lines.reduce((closest, candidate) =>\n Math.abs(candidate.center - point.y) < Math.abs(closest.center - point.y) ? candidate : closest,\n );\n const glyphs = line.glyphs;\n\n if (glyphs.length === 0) {\n return 0;\n }\n\n for (const glyph of glyphs) {\n if (point.x < glyph.left + glyph.width / 2) {\n return glyph.index;\n }\n }\n\n return glyphs[glyphs.length - 1].index + 1;\n }\n\n private getSelectionPoint(\n event: PointerEvent | MouseEvent,\n page: PdfViewerPageView,\n surface: HTMLElement,\n ): PdfViewerSelectionPoint {\n const rect = surface.getBoundingClientRect();\n const x = this.clamp(event.clientX - rect.left, 0, page.width);\n const y = this.clamp(event.clientY - rect.top, 0, page.height);\n\n return {\n pageNumber: page.pageNumber,\n x,\n y,\n offset: this.getCaretOffsetAtPoint(page, { x, y }),\n };\n }\n\n private getSelectionRects(\n page: PdfViewerPageView,\n startOffset: number,\n endOffset: number,\n ): PdfViewerSelectionRectView[] {\n const rangeStart = Math.min(startOffset, endOffset);\n const rangeEnd = Math.max(startOffset, endOffset);\n const selectedGlyphs = page.textGlyphs.filter((glyph) =>\n glyph.index >= rangeStart && glyph.index < rangeEnd,\n );\n\n return this.getTextLines(selectedGlyphs).map((line) => {\n const left = this.clamp(line.left - this.textSelectionHorizontalPadding, 0, page.width);\n const top = this.clamp(line.top, 0, page.height);\n const right = this.clamp(line.right + this.textSelectionHorizontalPadding, 0, page.width);\n const bottom = this.clamp(line.bottom, 0, page.height);\n\n return {\n text: '',\n pageNumber: page.pageNumber,\n left: this.roundCssPixel(left),\n top: this.roundCssPixel(top),\n width: this.roundCssPixel(Math.max(0, right - left)),\n height: this.roundCssPixel(Math.max(0, bottom - top)),\n };\n });\n }\n\n private async openSource(\n engine: PdfEngine<Blob>,\n documentId: string,\n source: Exclude<PdfViewerSource, null | undefined>,\n ): Promise<PdfDocumentObject> {\n if (typeof source === 'string') {\n return engine.openDocumentUrl({ id: documentId, url: source }).toPromise();\n }\n\n if (source instanceof Blob) {\n return engine.openDocumentBuffer({ id: documentId, content: await source.arrayBuffer() }).toPromise();\n }\n\n if (source instanceof Uint8Array) {\n const content = new Uint8Array(source).buffer;\n return engine.openDocumentBuffer({ id: documentId, content }).toPromise();\n }\n\n return engine.openDocumentBuffer({ id: documentId, content: source }).toPromise();\n }\n\n private async closeDocument(): Promise<void> {\n if (!this.engine || !this.pdfDocument) {\n this.pdfDocument = null;\n return;\n }\n\n const documentToClose = this.pdfDocument;\n this.pdfDocument = null;\n\n try {\n await this.engine.closeDocument(documentToClose).toPromise();\n } catch {\n // Best-effort cleanup; the viewer should not surface cleanup failures as user-facing load errors.\n }\n }\n\n private revokeRenderedPages(): void {\n this.disconnectPageObserver();\n this.cancelVisiblePageRenderFrame();\n\n for (const page of this.renderedPages()) {\n if (page.url) {\n this.revokeObjectUrl(page.url);\n }\n }\n\n this.renderedPages.set([]);\n }\n\n private revokeThumbnailPages(): void {\n for (const thumbnail of this.thumbnailPages()) {\n this.revokeObjectUrl(thumbnail.url);\n }\n\n this.thumbnailPages.set([]);\n }\n\n private revokeObjectUrl(url: string): void {\n const targetWindow = this.document.defaultView;\n\n if (targetWindow) {\n targetWindow.URL.revokeObjectURL(url);\n return;\n }\n\n URL.revokeObjectURL(url);\n }\n\n private sanitizePage(pageNumber: number): number {\n return this.clamp(Math.trunc(Number.isFinite(pageNumber) ? pageNumber : 1), 1, Math.max(this.pageCount(), 1));\n }\n\n private sanitizeScale(scale: number): number {\n const bounds = this.getScaleBounds();\n return this.clamp(Number.isFinite(scale) ? scale : 1, bounds.min, bounds.max);\n }\n\n private roundZoom(value: number): number {\n return this.sanitizeScale(Math.round(this.sanitizeScale(value) * 100) / 100);\n }\n\n private clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n }\n\n private roundCssPixel(value: number): number {\n return Math.round(value * 100) / 100;\n }\n\n private getDevicePixelRatio(): number {\n return this.document.defaultView?.devicePixelRatio || 1;\n }\n\n private createDocumentId(): string {\n return `ngs-pdf-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n\n private isRenderCurrent(loadToken: number, renderToken: number): boolean {\n return loadToken === this.loadToken && renderToken === this.renderToken;\n }\n\n private cancelScrollSyncFrame(): void {\n if (this.scrollSyncFrame === null) {\n return;\n }\n\n this.document.defaultView?.cancelAnimationFrame(this.scrollSyncFrame);\n this.scrollSyncFrame = null;\n }\n\n private cancelPageObserverFrame(): void {\n if (this.pageObserverTimeout !== null) {\n this.document.defaultView?.clearTimeout(this.pageObserverTimeout);\n this.pageObserverTimeout = null;\n }\n\n if (this.pageObserverFrame === null) {\n return;\n }\n\n this.document.defaultView?.cancelAnimationFrame(this.pageObserverFrame);\n this.pageObserverFrame = null;\n }\n\n private cancelVisiblePageRenderFrame(): void {\n if (this.visiblePageRenderFrame === null) {\n return;\n }\n\n this.document.defaultView?.cancelAnimationFrame(this.visiblePageRenderFrame);\n this.visiblePageRenderFrame = null;\n }\n\n private disconnectPageObserver(): void {\n this.cancelPageObserverFrame();\n this.pageIntersectionObserver?.disconnect();\n this.pageIntersectionObserver = null;\n this.visiblePageRatios.clear();\n }\n\n private schedulePageObserverRefresh(): void {\n const targetWindow = this.document.defaultView;\n\n if (!this.isBrowser || !targetWindow) {\n return;\n }\n\n this.cancelPageObserverFrame();\n this.pageObserverRefreshAttempts = 0;\n this.scheduleNextPageObserverRefresh();\n }\n\n private scheduleNextPageObserverRefresh(): void {\n const targetWindow = this.document.defaultView;\n\n if (!targetWindow) {\n return;\n }\n\n this.pageObserverTimeout = targetWindow.setTimeout(() => {\n this.pageObserverTimeout = null;\n this.pageObserverFrame = targetWindow.requestAnimationFrame(() => {\n this.pageObserverFrame = null;\n const isReady = this.setupPageIntersectionObserver();\n\n if (!isReady && this.pageObserverRefreshAttempts < 10) {\n this.pageObserverRefreshAttempts++;\n this.scheduleNextPageObserverRefresh();\n return;\n }\n\n this.syncActivePageFromViewport();\n });\n }, 0);\n }\n\n private setupPageIntersectionObserver(): boolean {\n const targetWindow = this.document.defaultView;\n const container = this.viewerBody()?.nativeElement;\n\n if (!targetWindow || !container || !('IntersectionObserver' in targetWindow)) {\n return false;\n }\n\n const pages = Array.from(container.querySelectorAll<HTMLElement>('[data-ngs-pdf-page]'));\n\n if (pages.length === 0) {\n return false;\n }\n\n this.pageIntersectionObserver?.disconnect();\n this.visiblePageRatios.clear();\n this.pageIntersectionObserver = new targetWindow.IntersectionObserver((entries) => {\n if (this.isProgrammaticScrollActive()) {\n this.scheduleCurrentVisiblePagesRender();\n return;\n }\n\n for (const entry of entries) {\n const pageNumber = Number(entry.target.getAttribute('data-ngs-pdf-page'));\n\n if (!Number.isFinite(pageNumber)) {\n continue;\n }\n\n this.visiblePageRatios.set(pageNumber, entry.intersectionRatio);\n }\n\n this.syncActivePageFromIntersections();\n this.scheduleCurrentVisiblePagesRender();\n }, {\n root: container,\n threshold: [0, 0.1, 0.25, 0.5, 0.75, 1],\n });\n\n for (const page of pages) {\n this.pageIntersectionObserver.observe(page);\n }\n\n return true;\n }\n\n private getScaleBounds(): { min: number; max: number } {\n const min = this.sanitizePositiveNumber(this.minScale(), 0.2);\n const max = this.sanitizePositiveNumber(this.maxScale(), 60);\n\n return min <= max ? { min, max } : { min: max, max: min };\n }\n\n private sanitizeZoomStep(): number {\n return this.sanitizePositiveNumber(this.zoomStep(), 0.1);\n }\n\n private sanitizePositiveNumber(value: number, fallback: number): number {\n return Number.isFinite(value) && value > 0 ? value : fallback;\n }\n\n private getPageDisplaySize(page: PdfPageObject, scale: number): { width: number; height: number } {\n const isRotatedSideways = page.rotation === 1 || page.rotation === 3;\n const width = isRotatedSideways ? page.size.height : page.size.width;\n const height = isRotatedSideways ? page.size.width : page.size.height;\n\n return {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n };\n }\n\n private scrollToPage(pageNumber: number): void {\n if (!this.renderAll()) {\n return;\n }\n\n const container = this.viewerBody()?.nativeElement;\n const target = container?.querySelector<HTMLElement>(`[data-ngs-pdf-page=\"${pageNumber}\"]`);\n\n if (!container || !target) {\n return;\n }\n\n const nextScrollTop = this.getPageScrollTop(container, target);\n const scrollDistance = Math.abs(container.scrollTop - nextScrollTop);\n\n this.startProgrammaticScrollLock(pageNumber, scrollDistance);\n container.scrollTo({\n top: nextScrollTop,\n behavior: 'smooth',\n });\n }\n\n private syncActivePageFromViewport(): void {\n const pageNumber = this.findActivePageInViewport();\n\n this.activatePageFromScroll(pageNumber);\n }\n\n private syncActivePageFromIntersections(): void {\n let activePage: number | null = null;\n let activeRatio = 0;\n\n for (const [pageNumber, ratio] of this.visiblePageRatios) {\n if (ratio > activeRatio) {\n activeRatio = ratio;\n activePage = pageNumber;\n }\n }\n\n if (!activePage) {\n activePage = this.findActivePageInViewport();\n }\n\n this.activatePageFromScroll(activePage);\n }\n\n private activatePageFromScroll(pageNumber: number | null): void {\n if (this.isProgrammaticScrollActive()) {\n return;\n }\n\n if (!pageNumber || pageNumber === this.activePage()) {\n return;\n }\n\n this.activePage.set(pageNumber);\n this.pageChanged.emit(pageNumber);\n this.scrollPageListToPage(pageNumber);\n this.scheduleCurrentVisiblePagesRender();\n }\n\n private findActivePageInViewport(): number | null {\n const container = this.viewerBody()?.nativeElement;\n\n if (!container) {\n return null;\n }\n\n const containerRect = container.getBoundingClientRect();\n const viewportCenter = containerRect.top + containerRect.height / 2;\n const pages = Array.from(container.querySelectorAll<HTMLElement>('[data-ngs-pdf-page]'));\n\n let closestPage: number | null = null;\n let closestDistance = Number.POSITIVE_INFINITY;\n let mostVisiblePage: number | null = null;\n let mostVisibleHeight = 0;\n\n for (const page of pages) {\n const rect = page.getBoundingClientRect();\n const pageNumber = Number(page.dataset['ngsPdfPage']);\n\n if (!Number.isFinite(pageNumber)) {\n continue;\n }\n\n if (rect.top <= viewportCenter && rect.bottom >= viewportCenter) {\n return pageNumber;\n }\n\n const visibleHeight = Math.max(0, Math.min(rect.bottom, containerRect.bottom) - Math.max(rect.top, containerRect.top));\n\n if (visibleHeight > mostVisibleHeight) {\n mostVisibleHeight = visibleHeight;\n mostVisiblePage = pageNumber;\n }\n\n const distance = Math.min(Math.abs(rect.top - viewportCenter), Math.abs(rect.bottom - viewportCenter));\n\n if (distance < closestDistance) {\n closestDistance = distance;\n closestPage = pageNumber;\n }\n }\n\n return mostVisiblePage ?? closestPage;\n }\n\n private scrollPageListToPage(pageNumber: number): void {\n const container = this.pageList()?.nativeElement;\n const target = container?.querySelector<HTMLElement>(`[data-ngs-pdf-page-button=\"${pageNumber}\"]`);\n\n if (!container || !target) {\n return;\n }\n\n const containerRect = container.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n const isAbove = targetRect.top < containerRect.top;\n const isBelow = targetRect.bottom > containerRect.bottom;\n\n if (!isAbove && !isBelow) {\n return;\n }\n\n container.scrollTo({\n top: this.getElementScrollTop(container, target, 'center'),\n behavior: 'smooth',\n });\n }\n\n private getPageScrollTop(container: HTMLElement, target: HTMLElement): number {\n return this.getElementScrollTop(container, target, 'start');\n }\n\n private getElementScrollTop(container: HTMLElement, target: HTMLElement, align: 'start' | 'center'): number {\n const containerRect = container.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n const targetTop = container.scrollTop + targetRect.top - containerRect.top;\n const alignedTop = align === 'center'\n ? targetTop - container.clientHeight / 2 + targetRect.height / 2\n : targetTop;\n\n return this.clamp(alignedTop, 0, Math.max(0, container.scrollHeight - container.clientHeight));\n }\n\n private getProgrammaticScrollTimeout(distance: number): number {\n return this.clamp(\n this.programmaticScrollMinDuration + distance * 0.45,\n this.programmaticScrollMinDuration,\n this.programmaticScrollMaxDuration,\n );\n }\n\n private startProgrammaticScrollLock(pageNumber: number, distance: number): void {\n const targetWindow = this.document.defaultView;\n\n if (!targetWindow) {\n return;\n }\n\n this.clearProgrammaticScrollLock();\n this.programmaticScrollTargetPage = pageNumber;\n this.programmaticScrollTimeout = targetWindow.setTimeout(() => {\n this.programmaticScrollTimeout = null;\n this.completeProgrammaticScroll();\n }, this.getProgrammaticScrollTimeout(distance));\n }\n\n private isProgrammaticScrollActive(): boolean {\n return this.programmaticScrollTargetPage !== null;\n }\n\n private completeProgrammaticScrollIfSettled(): void {\n const pageNumber = this.programmaticScrollTargetPage;\n\n if (pageNumber === null) {\n return;\n }\n\n const container = this.viewerBody()?.nativeElement;\n const target = container?.querySelector<HTMLElement>(`[data-ngs-pdf-page=\"${pageNumber}\"]`);\n\n if (!container || !target) {\n this.completeProgrammaticScroll();\n return;\n }\n\n if (Math.abs(container.scrollTop - this.getPageScrollTop(container, target)) <= 2) {\n this.completeProgrammaticScroll();\n }\n }\n\n private completeProgrammaticScroll(): void {\n const pageNumber = this.programmaticScrollTargetPage;\n\n this.clearProgrammaticScrollLock();\n\n if (pageNumber === null) {\n return;\n }\n\n if (pageNumber !== this.activePage()) {\n this.activePage.set(pageNumber);\n this.pageChanged.emit(pageNumber);\n }\n\n this.scrollPageListToPage(pageNumber);\n }\n\n private clearProgrammaticScrollLock(): void {\n if (this.programmaticScrollTimeout !== null) {\n this.document.defaultView?.clearTimeout(this.programmaticScrollTimeout);\n this.programmaticScrollTimeout = null;\n }\n\n this.programmaticScrollTargetPage = null;\n }\n}\n","<ngs-panel class=\"pdf-viewer-panel\">\n @if (showToolbar()) {\n <ngs-panel-header flex>\n <div class=\"pdf-viewer-toolbar\" aria-label=\"PDF viewer controls\">\n @if (showPageList()) {\n <button\n ngsIconButton\n type=\"button\"\n [attr.aria-label]=\"pageListVisible() ? 'Hide pages panel' : 'Show pages panel'\"\n [attr.aria-pressed]=\"pageListVisible()\"\n (click)=\"togglePageList()\">\n <ngs-icon\n [name]=\"pageListVisible() ? 'fluent:panel-left-contract-24-regular' : 'fluent:panel-left-expand-24-regular'\" />\n </button>\n }\n <button ngsIconButton type=\"button\" aria-label=\"Previous page\" [disabled]=\"!canGoPrevious()\" (click)=\"previousPage()\">\n <ngs-icon name=\"fluent:chevron-up-24-regular\" />\n </button>\n <span class=\"pdf-viewer-toolbar__page\">{{ activePage() }} / {{ pageCount() || 1 }}</span>\n <button ngsIconButton type=\"button\" aria-label=\"Next page\" [disabled]=\"!canGoNext()\" (click)=\"nextPage()\">\n <ngs-icon name=\"fluent:chevron-down-24-regular\" />\n </button>\n <span class=\"pdf-viewer-toolbar__spacer\"></span>\n <button ngsIconButton type=\"button\" aria-label=\"Zoom out\" [disabled]=\"!canZoomOut()\" (click)=\"zoomOut()\">\n <ngs-icon name=\"fluent:zoom-out-24-regular\" />\n </button>\n <span class=\"pdf-viewer-toolbar__zoom\">{{ zoomLabel() }}</span>\n <button ngsIconButton type=\"button\" aria-label=\"Zoom in\" [disabled]=\"!canZoomIn()\" (click)=\"zoomIn()\">\n <ngs-icon name=\"fluent:zoom-in-24-regular\" />\n </button>\n <button ngsIconButton type=\"button\" aria-label=\"PDF viewer settings\" [ngsMenuTriggerFor]=\"settingsMenu\">\n <ngs-icon name=\"fluent:settings-24-regular\" />\n </button>\n </div>\n\n <ngs-menu #settingsMenu=\"ngsMenu\" xPosition=\"before\">\n <ngs-menu-heading>SPREAD MODE</ngs-menu-heading>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"spreadMode() === 'single'\"\n (click)=\"setSpreadMode('single')\">\n <ngs-icon name=\"fluent:document-24-regular\" />\n <span>Single Page</span>\n </button>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"spreadMode() === 'two-odd'\"\n (click)=\"setSpreadMode('two-odd')\">\n <ngs-icon name=\"fluent:book-open-24-regular\" />\n <span>Two Page (Odd)</span>\n </button>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"spreadMode() === 'two-even'\"\n (click)=\"setSpreadMode('two-even')\">\n <ngs-icon name=\"fluent:document-text-24-regular\" />\n <span>Two Page (Even)</span>\n </button>\n\n <ngs-menu-divider />\n <ngs-menu-heading>SCROLL LAYOUT</ngs-menu-heading>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"scrollLayout() === 'vertical'\"\n (click)=\"setScrollLayout('vertical')\">\n <ngs-icon name=\"fluent:arrow-sort-24-regular\" />\n <span>Vertical</span>\n </button>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"scrollLayout() === 'horizontal'\"\n (click)=\"setScrollLayout('horizontal')\">\n <ngs-icon name=\"fluent:arrow-swap-24-regular\" />\n <span>Horizontal</span>\n </button>\n\n <ngs-menu-divider />\n <ngs-menu-heading>PAGE ROTATION</ngs-menu-heading>\n <button ngs-menu-item type=\"button\" (click)=\"rotateClockwise()\">\n <ngs-icon name=\"fluent:arrow-clockwise-24-regular\" />\n <span>Rotate Clockwise</span>\n </button>\n <button ngs-menu-item type=\"button\" (click)=\"rotateCounterClockwise()\">\n <ngs-icon name=\"fluent:arrow-counterclockwise-24-regular\" />\n <span>Rotate Counter-Clockwise</span>\n </button>\n\n <ngs-menu-divider />\n <button ngs-menu-item type=\"button\" (click)=\"toggleFullscreen()\">\n <ngs-icon name=\"fluent:arrow-maximize-24-regular\" />\n <span>Fullscreen</span>\n </button>\n </ngs-menu>\n </ngs-panel-header>\n }\n\n @if (isPageListVisible()) {\n <ngs-panel-sidebar>\n <div class=\"pdf-viewer-sidebar\" #pageList>\n <div class=\"pdf-viewer-sidebar__title\">Pages</div>\n <div class=\"pdf-viewer-sidebar__pages\" aria-label=\"PDF pages\">\n @for (pageItem of pageItems(); track pageItem.pageNumber) {\n <button\n class=\"pdf-viewer-sidebar__page\"\n type=\"button\"\n [class.is-active]=\"pageItem.pageNumber === activePage()\"\n [attr.aria-current]=\"pageItem.pageNumber === activePage() ? 'page' : null\"\n [attr.aria-label]=\"'Open page ' + pageItem.pageNumber\"\n [attr.data-ngs-pdf-page-button]=\"pageItem.pageNumber\"\n (click)=\"setPage(pageItem.pageNumber)\">\n <span class=\"pdf-viewer-sidebar__thumb\" aria-hidden=\"true\">\n @if (pageItem.thumbnail; as thumbnail) {\n <img\n [src]=\"thumbnail.url\"\n [attr.width]=\"thumbnail.width\"\n [attr.height]=\"thumbnail.height\"\n alt=\"\"\n draggable=\"false\" />\n } @else {\n <ngs-image-placeholder />\n }\n </span>\n <span class=\"pdf-viewer-sidebar__label\">Page {{ pageItem.pageNumber }}</span>\n </button>\n }\n </div>\n </div>\n </ngs-panel-sidebar>\n }\n\n <ngs-panel-content>\n <div class=\"pdf-viewer-body\" #viewerBody (scroll)=\"onViewerScroll()\">\n <ngs-block-loader [loading]=\"isLoading()\">Loading PDF...</ngs-block-loader>\n @if (errorState()) {\n <div class=\"pdf-viewer-state pdf-viewer-state--error\">\n <ngs-icon name=\"fluent:error-circle-24-regular\" />\n <span>PDF could not be loaded.</span>\n </div>\n } @else if (!src()) {\n <div class=\"pdf-viewer-state\">\n <ngs-icon name=\"fluent:document-pdf-24-regular\" />\n <span>No PDF selected.</span>\n </div>\n } @else {\n <div class=\"pdf-viewer-pages\">\n @for (pdfPage of renderedPages(); track pdfPage.pageNumber) {\n <article\n class=\"pdf-viewer-page\"\n [attr.aria-label]=\"'PDF page ' + pdfPage.pageNumber\"\n [attr.data-ngs-pdf-page]=\"pdfPage.pageNumber\">\n <div\n class=\"pdf-viewer-page__surface\"\n [style.width.px]=\"pdfPage.width\"\n [style.height.px]=\"pdfPage.height\"\n (pointerdown)=\"startTextSelection($event, pdfPage)\"\n (pointermove)=\"updateTextSelection($event, pdfPage)\"\n (pointerup)=\"finishTextSelection($event, pdfPage)\"\n (pointercancel)=\"cancelTextSelection()\"\n (mousedown)=\"startTextSelection($event, pdfPage)\"\n (mousemove)=\"updateTextSelection($event, pdfPage)\"\n (mouseup)=\"finishTextSelection($event, pdfPage)\">\n @if (isPageImageFresh(pdfPage) && pdfPage.url; as pageUrl) {\n <img\n [src]=\"pageUrl\"\n [alt]=\"'PDF page ' + pdfPage.pageNumber\"\n [attr.width]=\"pdfPage.width\"\n [attr.height]=\"pdfPage.height\"\n draggable=\"false\" />\n } @else {\n <div class=\"pdf-viewer-page__placeholder\" aria-hidden=\"true\">\n @if (pdfPage.isRendering) {\n <span></span>\n }\n </div>\n }\n @if (selectionRectsForPage(pdfPage.pageNumber); as selectionRects) {\n @if (selectionRects.length > 0) {\n <div class=\"pdf-viewer-page__selection-layer\" aria-hidden=\"true\">\n @for (selectionRect of selectionRects; track selectionRect.left + '-' + selectionRect.top + '-' + $index) {\n <div\n class=\"pdf-viewer-page__selection-rect\"\n [style.left.px]=\"selectionRect.left\"\n [style.top.px]=\"selectionRect.top\"\n [style.width.px]=\"selectionRect.width\"\n [style.height.px]=\"selectionRect.height\"></div>\n }\n </div>\n }\n }\n </div>\n </article>\n }\n </div>\n }\n </div>\n </ngs-panel-content>\n</ngs-panel>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ngstarter-ui/components",
|
|
3
3
|
"description": "NgStarter - AI-friendly Enterprise Angular UI Components and Admin Panel",
|
|
4
|
-
"version": "21.0.
|
|
4
|
+
"version": "21.0.33",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/elementarlabsdev/ngstarter.git"
|
|
@@ -51,6 +51,9 @@
|
|
|
51
51
|
"@ctrl/tinycolor": "^4.1.0",
|
|
52
52
|
"@dicebear/collection": "^9.2.2",
|
|
53
53
|
"@dicebear/core": "^9.4.2",
|
|
54
|
+
"@embedpdf/core": "^2.14.3",
|
|
55
|
+
"@embedpdf/engines": "^2.14.3",
|
|
56
|
+
"@embedpdf/models": "^2.14.3",
|
|
54
57
|
"@ngrx/signals": "^21.0.1",
|
|
55
58
|
"@tailwindcss/postcss": "^4.2.2",
|
|
56
59
|
"@tailwindcss/typography": "^0.5.19",
|
|
@@ -422,6 +425,10 @@
|
|
|
422
425
|
"types": "./types/ngstarter-ui-components-password-strength.d.ts",
|
|
423
426
|
"default": "./fesm2022/ngstarter-ui-components-password-strength.mjs"
|
|
424
427
|
},
|
|
428
|
+
"./pdf-viewer": {
|
|
429
|
+
"types": "./types/ngstarter-ui-components-pdf-viewer.d.ts",
|
|
430
|
+
"default": "./fesm2022/ngstarter-ui-components-pdf-viewer.mjs"
|
|
431
|
+
},
|
|
425
432
|
"./phone-input": {
|
|
426
433
|
"types": "./types/ngstarter-ui-components-phone-input.d.ts",
|
|
427
434
|
"default": "./fesm2022/ngstarter-ui-components-phone-input.mjs"
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { PluginRegistry } from '@embedpdf/core';
|
|
3
|
+
import { PdfEngine } from '@embedpdf/models';
|
|
4
|
+
|
|
5
|
+
type PdfViewerSource = string | ArrayBuffer | Uint8Array | Blob | null | undefined;
|
|
6
|
+
interface PdfViewerLoadedEvent {
|
|
7
|
+
pageCount: number;
|
|
8
|
+
}
|
|
9
|
+
interface PdfViewerPageRenderedEvent {
|
|
10
|
+
pageNumber: number;
|
|
11
|
+
url: string;
|
|
12
|
+
width?: number;
|
|
13
|
+
height?: number;
|
|
14
|
+
}
|
|
15
|
+
interface PdfViewerPageView {
|
|
16
|
+
pageNumber: number;
|
|
17
|
+
url: string | null;
|
|
18
|
+
scale: number;
|
|
19
|
+
renderedScale: number | null;
|
|
20
|
+
width: number;
|
|
21
|
+
height: number;
|
|
22
|
+
isRendering: boolean;
|
|
23
|
+
textGlyphs: PdfViewerTextGlyphView[];
|
|
24
|
+
}
|
|
25
|
+
interface PdfViewerThumbnailView {
|
|
26
|
+
pageNumber: number;
|
|
27
|
+
url: string;
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
}
|
|
31
|
+
interface PdfViewerTextRectView {
|
|
32
|
+
text: string;
|
|
33
|
+
left: number;
|
|
34
|
+
top: number;
|
|
35
|
+
width: number;
|
|
36
|
+
height: number;
|
|
37
|
+
}
|
|
38
|
+
interface PdfViewerTextGlyphView {
|
|
39
|
+
index: number;
|
|
40
|
+
left: number;
|
|
41
|
+
top: number;
|
|
42
|
+
width: number;
|
|
43
|
+
height: number;
|
|
44
|
+
lineTop: number;
|
|
45
|
+
lineHeight: number;
|
|
46
|
+
lineId: number;
|
|
47
|
+
}
|
|
48
|
+
interface PdfViewerSelectionRectView extends PdfViewerTextRectView {
|
|
49
|
+
pageNumber: number;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface PdfViewerPageListItem {
|
|
53
|
+
pageNumber: number;
|
|
54
|
+
thumbnail: PdfViewerThumbnailView | null;
|
|
55
|
+
}
|
|
56
|
+
type PdfViewerSpreadMode = 'single' | 'two-odd' | 'two-even';
|
|
57
|
+
type PdfViewerScrollLayout = 'vertical' | 'horizontal';
|
|
58
|
+
declare class PdfViewer {
|
|
59
|
+
private readonly textSelectionHorizontalPadding;
|
|
60
|
+
private readonly textSelectionLineHeight;
|
|
61
|
+
private readonly document;
|
|
62
|
+
private readonly destroyRef;
|
|
63
|
+
private readonly engineService;
|
|
64
|
+
private readonly hostElement;
|
|
65
|
+
private readonly platformId;
|
|
66
|
+
private readonly isBrowser;
|
|
67
|
+
private readonly viewerBody;
|
|
68
|
+
private readonly pageList;
|
|
69
|
+
src: _angular_core.InputSignal<PdfViewerSource>;
|
|
70
|
+
wasmUrl: _angular_core.InputSignal<string>;
|
|
71
|
+
page: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
72
|
+
scale: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
73
|
+
minScale: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
74
|
+
maxScale: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
75
|
+
zoomStep: _angular_core.InputSignalWithTransform<number, unknown>;
|
|
76
|
+
renderAll: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
77
|
+
showToolbar: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
78
|
+
showPageList: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
79
|
+
withAnnotations: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
80
|
+
withForms: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
81
|
+
loaded: _angular_core.OutputEmitterRef<PdfViewerLoadedEvent>;
|
|
82
|
+
pageChanged: _angular_core.OutputEmitterRef<number>;
|
|
83
|
+
pageRendered: _angular_core.OutputEmitterRef<PdfViewerPageRenderedEvent>;
|
|
84
|
+
error: _angular_core.OutputEmitterRef<unknown>;
|
|
85
|
+
protected readonly isLoading: _angular_core.WritableSignal<boolean>;
|
|
86
|
+
protected readonly errorState: _angular_core.WritableSignal<unknown>;
|
|
87
|
+
protected readonly renderedPages: _angular_core.WritableSignal<PdfViewerPageView[]>;
|
|
88
|
+
protected readonly thumbnailPages: _angular_core.WritableSignal<PdfViewerThumbnailView[]>;
|
|
89
|
+
protected readonly pageCount: _angular_core.WritableSignal<number>;
|
|
90
|
+
protected readonly activePage: _angular_core.WritableSignal<number>;
|
|
91
|
+
protected readonly zoom: _angular_core.WritableSignal<number>;
|
|
92
|
+
protected readonly pageListVisible: _angular_core.WritableSignal<boolean>;
|
|
93
|
+
protected readonly spreadMode: _angular_core.WritableSignal<PdfViewerSpreadMode>;
|
|
94
|
+
protected readonly scrollLayout: _angular_core.WritableSignal<PdfViewerScrollLayout>;
|
|
95
|
+
protected readonly selectionRects: _angular_core.WritableSignal<PdfViewerSelectionRectView[]>;
|
|
96
|
+
protected readonly hasDocument: _angular_core.Signal<boolean>;
|
|
97
|
+
protected readonly isPageListVisible: _angular_core.Signal<boolean>;
|
|
98
|
+
protected readonly thumbnailPageMap: _angular_core.Signal<Map<number, PdfViewerThumbnailView>>;
|
|
99
|
+
protected readonly pageItems: _angular_core.Signal<PdfViewerPageListItem[]>;
|
|
100
|
+
protected readonly canGoPrevious: _angular_core.Signal<boolean>;
|
|
101
|
+
protected readonly canGoNext: _angular_core.Signal<boolean>;
|
|
102
|
+
protected readonly canZoomOut: _angular_core.Signal<boolean>;
|
|
103
|
+
protected readonly canZoomIn: _angular_core.Signal<boolean>;
|
|
104
|
+
protected readonly zoomLabel: _angular_core.Signal<string>;
|
|
105
|
+
private engine;
|
|
106
|
+
private pdfDocument;
|
|
107
|
+
private registry;
|
|
108
|
+
private pageIntersectionObserver;
|
|
109
|
+
private visiblePageRatios;
|
|
110
|
+
private loadToken;
|
|
111
|
+
private renderToken;
|
|
112
|
+
private scrollSyncFrame;
|
|
113
|
+
private programmaticScrollTargetPage;
|
|
114
|
+
private programmaticScrollTimeout;
|
|
115
|
+
private pageObserverFrame;
|
|
116
|
+
private pageObserverTimeout;
|
|
117
|
+
private visiblePageRenderFrame;
|
|
118
|
+
private pageObserverRefreshAttempts;
|
|
119
|
+
private selectionStart;
|
|
120
|
+
private isViewInitialized;
|
|
121
|
+
private readonly programmaticScrollMinDuration;
|
|
122
|
+
private readonly programmaticScrollMaxDuration;
|
|
123
|
+
constructor();
|
|
124
|
+
ngAfterViewInit(): void;
|
|
125
|
+
previousPage(): void;
|
|
126
|
+
nextPage(): void;
|
|
127
|
+
zoomIn(): void;
|
|
128
|
+
zoomOut(): void;
|
|
129
|
+
togglePageList(): void;
|
|
130
|
+
protected setSpreadMode(mode: PdfViewerSpreadMode): void;
|
|
131
|
+
protected setScrollLayout(layout: PdfViewerScrollLayout): void;
|
|
132
|
+
protected rotateClockwise(): void;
|
|
133
|
+
protected rotateCounterClockwise(): void;
|
|
134
|
+
protected toggleFullscreen(): void;
|
|
135
|
+
setPage(pageNumber: number): void;
|
|
136
|
+
protected onViewerScroll(): void;
|
|
137
|
+
protected selectionRectsForPage(pageNumber: number): PdfViewerSelectionRectView[];
|
|
138
|
+
protected isPageImageFresh(page: PdfViewerPageView): boolean;
|
|
139
|
+
protected startTextSelection(event: PointerEvent | MouseEvent, page: PdfViewerPageView): void;
|
|
140
|
+
protected updateTextSelection(event: PointerEvent | MouseEvent, page: PdfViewerPageView): void;
|
|
141
|
+
protected finishTextSelection(event: PointerEvent | MouseEvent, page: PdfViewerPageView): void;
|
|
142
|
+
protected cancelTextSelection(): void;
|
|
143
|
+
private loadDocument;
|
|
144
|
+
private initializePageShells;
|
|
145
|
+
private getPageNumbersToDisplay;
|
|
146
|
+
private scheduleVisiblePagesRender;
|
|
147
|
+
private scheduleCurrentVisiblePagesRender;
|
|
148
|
+
private renderVisiblePages;
|
|
149
|
+
private setZoom;
|
|
150
|
+
private applyInstantZoom;
|
|
151
|
+
private getPriorityPageNumbers;
|
|
152
|
+
private getVisiblePageNumbers;
|
|
153
|
+
private patchRenderedPage;
|
|
154
|
+
private renderThumbnails;
|
|
155
|
+
private getPageTextGlyphs;
|
|
156
|
+
private assignTextGlyphLines;
|
|
157
|
+
private getTextLines;
|
|
158
|
+
private rangesOverlap;
|
|
159
|
+
private getCaretOffsetAtPoint;
|
|
160
|
+
private getSelectionPoint;
|
|
161
|
+
private getSelectionRects;
|
|
162
|
+
private openSource;
|
|
163
|
+
private closeDocument;
|
|
164
|
+
private revokeRenderedPages;
|
|
165
|
+
private revokeThumbnailPages;
|
|
166
|
+
private revokeObjectUrl;
|
|
167
|
+
private sanitizePage;
|
|
168
|
+
private sanitizeScale;
|
|
169
|
+
private roundZoom;
|
|
170
|
+
private clamp;
|
|
171
|
+
private roundCssPixel;
|
|
172
|
+
private getDevicePixelRatio;
|
|
173
|
+
private createDocumentId;
|
|
174
|
+
private isRenderCurrent;
|
|
175
|
+
private cancelScrollSyncFrame;
|
|
176
|
+
private cancelPageObserverFrame;
|
|
177
|
+
private cancelVisiblePageRenderFrame;
|
|
178
|
+
private disconnectPageObserver;
|
|
179
|
+
private schedulePageObserverRefresh;
|
|
180
|
+
private scheduleNextPageObserverRefresh;
|
|
181
|
+
private setupPageIntersectionObserver;
|
|
182
|
+
private getScaleBounds;
|
|
183
|
+
private sanitizeZoomStep;
|
|
184
|
+
private sanitizePositiveNumber;
|
|
185
|
+
private getPageDisplaySize;
|
|
186
|
+
private scrollToPage;
|
|
187
|
+
private syncActivePageFromViewport;
|
|
188
|
+
private syncActivePageFromIntersections;
|
|
189
|
+
private activatePageFromScroll;
|
|
190
|
+
private findActivePageInViewport;
|
|
191
|
+
private scrollPageListToPage;
|
|
192
|
+
private getPageScrollTop;
|
|
193
|
+
private getElementScrollTop;
|
|
194
|
+
private getProgrammaticScrollTimeout;
|
|
195
|
+
private startProgrammaticScrollLock;
|
|
196
|
+
private isProgrammaticScrollActive;
|
|
197
|
+
private completeProgrammaticScrollIfSettled;
|
|
198
|
+
private completeProgrammaticScroll;
|
|
199
|
+
private clearProgrammaticScrollLock;
|
|
200
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PdfViewer, never>;
|
|
201
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<PdfViewer, "ngs-pdf-viewer", ["ngsPdfViewer"], { "src": { "alias": "src"; "required": false; "isSignal": true; }; "wasmUrl": { "alias": "wasmUrl"; "required": false; "isSignal": true; }; "page": { "alias": "page"; "required": false; "isSignal": true; }; "scale": { "alias": "scale"; "required": false; "isSignal": true; }; "minScale": { "alias": "minScale"; "required": false; "isSignal": true; }; "maxScale": { "alias": "maxScale"; "required": false; "isSignal": true; }; "zoomStep": { "alias": "zoomStep"; "required": false; "isSignal": true; }; "renderAll": { "alias": "renderAll"; "required": false; "isSignal": true; }; "showToolbar": { "alias": "showToolbar"; "required": false; "isSignal": true; }; "showPageList": { "alias": "showPageList"; "required": false; "isSignal": true; }; "withAnnotations": { "alias": "withAnnotations"; "required": false; "isSignal": true; }; "withForms": { "alias": "withForms"; "required": false; "isSignal": true; }; }, { "loaded": "loaded"; "pageChanged": "pageChanged"; "pageRendered": "pageRendered"; "error": "error"; }, never, never, true, never>;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
declare class PdfViewerEngineService {
|
|
205
|
+
private readonly engines;
|
|
206
|
+
getEngine(wasmUrl: string): Promise<PdfEngine<Blob>>;
|
|
207
|
+
createRegistry(engine: PdfEngine<Blob>, defaultScale: number): Promise<PluginRegistry>;
|
|
208
|
+
private createEngine;
|
|
209
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<PdfViewerEngineService, never>;
|
|
210
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<PdfViewerEngineService>;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export { PdfViewer, PdfViewerEngineService };
|
|
214
|
+
export type { PdfViewerLoadedEvent, PdfViewerPageRenderedEvent, PdfViewerPageView, PdfViewerSelectionRectView, PdfViewerSource, PdfViewerTextGlyphView, PdfViewerTextRectView, PdfViewerThumbnailView };
|