Enhancement: pngx pdf viewer (#12043)

This commit is contained in:
shamoon
2026-02-08 21:24:43 -08:00
committed by GitHub
parent 6a87c3f4dd
commit 9e9e55758f
29 changed files with 1123 additions and 165 deletions

View File

@@ -0,0 +1,24 @@
export class PDFDocumentProxy {
numPages = 1
}
export class PDFDocumentLoadingTask {
promise: Promise<PDFDocumentProxy>
destroyed = false
constructor(promise: Promise<PDFDocumentProxy>) {
this.promise = promise
}
destroy(): void {
this.destroyed = true
}
}
export const GlobalWorkerOptions = {
workerSrc: '',
}
export const getDocument = (_src: unknown): PDFDocumentLoadingTask => {
return new PDFDocumentLoadingTask(Promise.resolve(new PDFDocumentProxy()))
}

View File

@@ -0,0 +1,79 @@
type EventHandler = (event?: unknown) => void
export class EventBus {
private readonly listeners = new Map<string, Set<EventHandler>>()
on(eventName: string, listener: EventHandler): void {
let listeners = this.listeners.get(eventName)
if (!listeners) {
listeners = new Set()
this.listeners.set(eventName, listeners)
}
listeners.add(listener)
}
off(eventName: string, listener: EventHandler): void {
this.listeners.get(eventName)?.delete(listener)
}
dispatch(eventName: string, event?: unknown): void {
this.listeners.get(eventName)?.forEach((listener) => listener(event))
}
}
export class PDFFindController {
onIsPageVisible?: () => boolean
}
export class PDFLinkService {
private document?: unknown
private viewer?: unknown
setDocument(document: unknown): void {
this.document = document
}
setViewer(viewer: unknown): void {
this.viewer = viewer
}
}
class BaseViewer {
pagesCount = 0
currentScale = 1
currentScaleValue: string | number = 1
pagesRotation = 0
readonly options: Record<string, unknown>
private readonly eventBus?: EventBus
private _currentPageNumber = 1
constructor(options: { eventBus?: EventBus }) {
this.options = options
this.eventBus = options.eventBus
}
setDocument(document: { numPages?: number } | null | undefined): void {
this.pagesCount = document?.numPages ?? 1
this.eventBus?.dispatch('pagesinit', {})
this.eventBus?.dispatch('pagerendered', {
pageNumber: this._currentPageNumber,
})
}
cleanup(): void {
this.pagesCount = 0
}
get currentPageNumber(): number {
return this._currentPageNumber
}
set currentPageNumber(value: number) {
this._currentPageNumber = value
this.eventBus?.dispatch('pagechanging', { pageNumber: value })
}
}
export class PDFViewer extends BaseViewer {}
export class PDFSinglePageViewer extends BaseViewer {}