position: absolute;
inset: 0;
pointer-events: none;
+
+ & .annotationTextContent {
+ opacity: 0;
+ }
}
const pageSpy = jest.fn()
component.pageChange.subscribe(pageSpy)
+ // In real usage the viewer may have multiple pages; our pdfjs mock defaults
+ // to a single page, so explicitly simulate a multi-page document here.
+ const pdf = (component as any).pdf as { numPages: number }
+ pdf.numPages = 3
+ const viewer = (component as any).pdfViewer as PDFViewer
+ viewer.setDocument(pdf)
+
component.zoomScale = PdfZoomScale.PageFit
component.zoom = PdfZoomLevel.Two
component.rotation = 90
page: new SimpleChange(undefined, 2, false),
})
- const viewer = (component as any).pdfViewer as PDFViewer
expect(viewer.pagesRotation).toBe(90)
expect(viewer.currentPageNumber).toBe(2)
expect(pageSpy).toHaveBeenCalledWith(2)
const scaleSpy = jest.spyOn(component as any, 'applyViewerState')
const resizeSpy = jest.spyOn(component as any, 'setupResizeObserver')
+ // Angular sets the input value before calling ngOnChanges; mirror that here.
+ component.src = 'test.pdf'
component.ngOnChanges({
src: new SimpleChange(undefined, 'test.pdf', true),
zoomScale: new SimpleChange(
expect(scaleSpy).not.toHaveBeenCalled()
})
+ it('resets viewer state on src change', () => {
+ const mockViewer = {
+ setDocument: jest.fn(),
+ currentPageNumber: 7,
+ cleanup: jest.fn(),
+ }
+ ;(component as any).pdfViewer = mockViewer
+ ;(component as any).loadingTask = { destroy: jest.fn() }
+ jest.spyOn(component as any, 'loadDocument').mockImplementation(() => {})
+
+ component.src = 'test.pdf'
+ component.ngOnChanges({
+ src: new SimpleChange(undefined, 'test.pdf', true),
+ })
+
+ expect(mockViewer.setDocument).toHaveBeenCalledWith(null)
+ expect(mockViewer.currentPageNumber).toBe(1)
+ })
+
it('applies viewer state after view init when already loaded', () => {
const applySpy = jest.spyOn(component as any, 'applyViewerState')
;(component as any).hasLoaded = true
this.dispatchFindIfReady()
this.rendered.emit()
}
- private readonly onPagesInit = () => this.applyScale()
+ private readonly onPagesInit = () => this.applyViewerState()
private readonly onPageChanging = (evt: { pageNumber: number }) => {
// Avoid [(page)] two-way binding re-triggers navigation
this.lastViewerPage = evt.pageNumber
ngOnChanges(changes: SimpleChanges): void {
if (changes['src']) {
- this.hasLoaded = false
- this.loadDocument()
+ this.resetViewerState()
+ if (this.src) {
+ this.loadDocument()
+ }
return
}
this.pdfViewer = undefined
}
+ private resetViewerState(): void {
+ this.hasLoaded = false
+ this.hasRenderedPage = false
+ this.lastFindQuery = ''
+ this.lastViewerPage = undefined
+ this.loadingTask?.destroy()
+ this.loadingTask = undefined
+ this.pdf = undefined
+ this.linkService.setDocument(null)
+ if (this.pdfViewer) {
+ this.pdfViewer.setDocument(null)
+ this.pdfViewer.currentPageNumber = 1
+ }
+ }
+
private async loadDocument(): Promise<void> {
if (this.hasLoaded) {
return
hasPages &&
this.page !== this.lastViewerPage
) {
- this.pdfViewer.currentPageNumber = this.page
+ const nextPage = Math.min(
+ Math.max(Math.trunc(this.page), 1),
+ this.pdfViewer.pagesCount
+ )
+ this.pdfViewer.currentPageNumber = nextPage
}
if (this.page === this.lastViewerPage) {
this.lastViewerPage = undefined
@if (!useNativePdfViewer) {
<div class="preview-sticky pdf-viewer-container">
<pngx-pdf-viewer
- [src]="{ url: previewUrl, password: password }"
+ [src]="pdfSource"
[renderMode]="PdfRenderMode.All"
[(page)]="previewCurrentPage"
[zoomScale]="previewZoomScale"
import { PngxPdfViewerComponent } from '../common/pdf-viewer/pdf-viewer.component'
import {
PdfRenderMode,
+ PdfSource,
PdfZoomLevel,
PdfZoomScale,
PngxPdfDocumentProxy,
title: string
titleSubject: Subject<string> = new Subject()
previewUrl: string
+ pdfSource?: PdfSource
thumbUrl: string
previewText: string
previewLoaded: boolean = false
return ContentRenderType.Other
}
+ private updatePdfSource() {
+ if (!this.previewUrl) {
+ this.pdfSource = undefined
+ return
+ }
+ this.pdfSource = {
+ url: this.previewUrl,
+ password: this.password || undefined,
+ }
+ }
+
get isRTL() {
if (!this.metadata || !this.metadata.lang) return false
else {
private loadDocument(documentId: number): void {
this.previewUrl = this.documentsService.getPreviewUrl(documentId)
+ this.updatePdfSource()
this.http
.get(this.previewUrl, { responseType: 'text' })
.pipe(
onPasswordKeyUp(event: KeyboardEvent) {
if ('Enter' == event.key) {
this.password = (event.target as HTMLInputElement).value
+ this.updatePdfSource()
}
}