From 74c317d58c2cedb53811da2973d0bf9bb6a70dcb Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sat, 9 May 2026 21:03:39 -0400 Subject: [PATCH] Allow explicit PDF.js resource paths for bundler compatibility Bundlers like Vite cannot resolve directory paths (cmaps/, standard_fonts/) through the new URL(..., import.meta.url) pattern. Add optional config to makePDF, makeBook, and View.open so consumers can provide explicit URLs. When options are not provided, falls back to import.meta.url resolution (preserving existing behavior for direct module usage). --- pdf.js | 11 ++++++++--- view.js | 8 ++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/pdf.js b/pdf.js index ee5d32c..a27385c 100644 --- a/pdf.js +++ b/pdf.js @@ -129,7 +129,12 @@ const makeTOCItem = (item) => ({ subitems: item.items.length ? item.items.map(makeTOCItem) : null, }); -export const makePDF = async (file) => { +export const makePDF = async (file, options = {}) => { + const cMapUrl = options.cMapUrl ?? pdfjsPath("cmaps/"); + const standardFontDataUrl = options.standardFontDataUrl ?? pdfjsPath("standard_fonts/"); + if (options.workerSrc) { + pdfjsLib.GlobalWorkerOptions.workerSrc = options.workerSrc; + } const transport = new pdfjsLib.PDFDataRangeTransport(file.size, []); transport.requestDataRange = (begin, end) => { file @@ -141,8 +146,8 @@ export const makePDF = async (file) => { }; const pdf = await pdfjsLib.getDocument({ range: transport, - cMapUrl: pdfjsPath("cmaps/"), - standardFontDataUrl: pdfjsPath("standard_fonts/"), + cMapUrl, + standardFontDataUrl, isEvalSupported: false, }).promise; diff --git a/view.js b/view.js index 7397ea2..d37f791 100644 --- a/view.js +++ b/view.js @@ -76,7 +76,7 @@ const fetchFile = async url => { return new File([await res.blob()], new URL(res.url).pathname) } -export const makeBook = async file => { +export const makeBook = async (file, options = {}) => { if (typeof file === 'string') file = await fetchFile(file) let book if (file.isDirectory) { @@ -105,7 +105,7 @@ export const makeBook = async file => { } else if (await isPDF(file)) { const { makePDF } = await import('./pdf.js') - book = await makePDF(file) + book = await makePDF(file, options.pdf) } else { const { isMOBI, MOBI } = await import('./mobi.js') @@ -230,10 +230,10 @@ export class View extends HTMLElement { this.renderer.goTo(resolved) }) } - async open(book) { + async open(book, options = {}) { if (typeof book === 'string' || typeof book.arrayBuffer === 'function' - || book.isDirectory) book = await makeBook(book) + || book.isDirectory) book = await makeBook(book, options) this.book = book this.language = languageInfo(book.metadata?.language)