PDF Document Resource
retab-ui/pdf-document-resourceFreeUtility
Load and cache PDF.js documents and pages without viewer chrome.
Install it
npx shadcn@latest add https://ui.retab.com/r/pdf-document-resource.jsonSource
1import {2 isResourceError,3 isViewerFormatError,4 ViewerFormatError,5 type ViewerFormatErrorMapperOptions,6} from "@/lib/viewer-errors";7import type {8 PdfDocumentProxy,9 PdfjsModule,10 PdfPageProxy,11} from "@/lib/pdf-document-types";12import type {13 ViewerContentBytes,14 ViewerContentDirectUrl,15 ViewerContentIdentity,16} from "@/lib/viewer-resource";1718const PDF_CACHE_MAX = 6;1920type PdfDocumentContent = ViewerContentIdentity &21 ViewerContentDirectUrl &22 ViewerContentBytes;2324type DocumentCacheEntry = {25 loadKey: string;26 promise: Promise<PdfDocumentProxy>;27 consumers: number;28 lastUsedAt: number;29 retainRejected: boolean;30 status: "pending" | "resolved" | "rejected";31 document?: PdfDocumentProxy;32 error?: unknown;33};3435type PageCacheEntry = {36 promise: Promise<PdfPageProxy>;37 retainRejected: boolean;38 status: "pending" | "resolved" | "rejected";39 page?: PdfPageProxy;40 error?: unknown;41};4243type PdfResourceOptions = {44 retainRejected?: boolean;45};4647let pdfjsPromise: Promise<PdfjsModule> | null = null;48const documentCache = new Map<string, DocumentCacheEntry>();49const pageCache = new WeakMap<PdfDocumentProxy, Map<number, PageCacheEntry>>();50const detachedDocumentEntries = new Set<DocumentCacheEntry>();51let pruneTimer = 0;5253function loadPdfjs(): Promise<PdfjsModule> {54 if (!pdfjsPromise) {55 pdfjsPromise = import("pdfjs-dist/legacy/build/pdf.mjs").then((pdfjs) => {56 const pdfjsModule = pdfjs as unknown as PdfjsModule;57 if (!pdfjsModule.GlobalWorkerOptions.workerSrc) {58 pdfjsModule.GlobalWorkerOptions.workerSrc = new URL(59 "pdfjs-dist/legacy/build/pdf.worker.min.mjs",60 import.meta.url,61 ).toString();62 }63 return pdfjsModule;64 });65 }66 return pdfjsPromise;67}6869function scheduleDocumentPrune() {70 if (typeof window === "undefined" || pruneTimer) return;71 pruneTimer = window.setTimeout(() => {72 pruneTimer = 0;73 pruneDocumentCache();74 }, 0);75}7677function pruneDocumentCache() {78 while (documentCache.size > PDF_CACHE_MAX) {79 let evictKey: string | null = null;80 let evictEntry: DocumentCacheEntry | null = null;81 for (const [key, documentEntry] of documentCache) {82 if (documentEntry.consumers > 0 || documentEntry.status === "pending") {83 continue;84 }85 if (!evictEntry || documentEntry.lastUsedAt < evictEntry.lastUsedAt) {86 evictKey = key;87 evictEntry = documentEntry;88 }89 }90 if (!evictKey || !evictEntry) return;91// … truncated
What it pulls in
npm packages
Files it writes
More from retab-ui
All 130 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| CSV parsercsv | retab-ui | Utilities | Free | no deps · 4 files | |
| Document source modeldocument-source | retab-ui | Utilities | Free | no deps | |
| DOCX Document Resourcedocx-document-resource | retab-ui | Utilities | Free | no deps · 5 files | |
| Effect Keyeffect-key | retab-ui | Utilities | Free | no deps | |
| Segment Interactionsegment-interaction | retab-ui | Utilities | Free | no deps | |
| Segments modelsegments | retab-ui | Utilities | Free | no deps | |
| Utilsutils | retab-ui | Utilities | Free | 2 deps | |
| XLSX SheetJS flattenerxlsx-sheetjs-flattener | retab-ui | Utilities | Free | 1 dep |
