@prose-reader/enhancer-pdf 1.295.0 → 1.297.0
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.
- package/dist/index.js +59 -26
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +58 -25
- package/dist/index.umd.cjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as pdfjsLib from 'pdfjs-dist';
|
|
2
2
|
import { TextLayer, RenderingCancelledException } from 'pdfjs-dist';
|
|
3
3
|
import { of, from, switchMap, EMPTY, tap, catchError, map, mergeMap } from 'rxjs';
|
|
4
|
-
import { DocumentRenderer, waitForSwitch, waitForFrameLoad, injectCSSToFrame,
|
|
4
|
+
import { setStylePropertyIfChanged, setPropertyIfChanged, DocumentRenderer, waitForSwitch, waitForFrameLoad, injectCSSToFrame, upsertCSSToFrame, setAttributeIfChanged, waitForFrameReady } from '@prose-reader/core';
|
|
5
5
|
|
|
6
6
|
const PDF_SYMBOL = /* @__PURE__ */ Symbol(`pdfjs`);
|
|
7
7
|
const isPdfJsArchive = (archive) => "_symbol" in archive && archive._symbol === PDF_SYMBOL;
|
|
@@ -63,14 +63,14 @@ const pdfFrameStyle = "html {\n /* Pdf are always pre-paginated so its safe to
|
|
|
63
63
|
const layoutContainer = (container, spreadPosition, viewport) => {
|
|
64
64
|
if (!container) return;
|
|
65
65
|
const { height: pageHeight, width: pageWidth } = viewport.pageSize;
|
|
66
|
-
container.style
|
|
67
|
-
container.style
|
|
66
|
+
setStylePropertyIfChanged(container.style, `width`, `${pageWidth}px`);
|
|
67
|
+
setStylePropertyIfChanged(container.style, `height`, `${pageHeight}px`);
|
|
68
68
|
if (spreadPosition === `right`) {
|
|
69
|
-
container.style
|
|
69
|
+
setStylePropertyIfChanged(container.style, `justify-content`, `flex-start`);
|
|
70
70
|
} else if (spreadPosition === `left`) {
|
|
71
|
-
container.style
|
|
71
|
+
setStylePropertyIfChanged(container.style, `justify-content`, `flex-end`);
|
|
72
72
|
} else {
|
|
73
|
-
container.style
|
|
73
|
+
setStylePropertyIfChanged(container.style, `justify-content`, `center`);
|
|
74
74
|
}
|
|
75
75
|
};
|
|
76
76
|
const layoutCanvas = (pageProxy, canvas, readerViewport) => {
|
|
@@ -87,12 +87,35 @@ const layoutCanvas = (pageProxy, canvas, readerViewport) => {
|
|
|
87
87
|
const isWiderThanPage = viewportRatio > pageRatio;
|
|
88
88
|
const canvasWidth = isWiderThanPage ? pageWidth : pageHeight * viewportRatio;
|
|
89
89
|
const canvasHeight = viewportRatio > pageRatio ? pageWidth / viewportRatio : pageHeight;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
90
|
+
setPropertyIfChanged(
|
|
91
|
+
canvas,
|
|
92
|
+
`width`,
|
|
93
|
+
Math.floor(viewport.width * pixelRatioScale)
|
|
94
|
+
);
|
|
95
|
+
setPropertyIfChanged(
|
|
96
|
+
canvas,
|
|
97
|
+
`height`,
|
|
98
|
+
Math.floor(viewport.height * pixelRatioScale)
|
|
99
|
+
);
|
|
100
|
+
setStylePropertyIfChanged(
|
|
101
|
+
canvas.style,
|
|
102
|
+
`width`,
|
|
103
|
+
`${Math.floor(canvasWidth)}px`
|
|
104
|
+
);
|
|
105
|
+
setStylePropertyIfChanged(
|
|
106
|
+
canvas.style,
|
|
107
|
+
`height`,
|
|
108
|
+
`${Math.floor(canvasHeight)}px`
|
|
109
|
+
);
|
|
94
110
|
};
|
|
95
111
|
|
|
112
|
+
const pdfScaleStyle = `:root {
|
|
113
|
+
--scale-factor: 1;
|
|
114
|
+
--user-unit: 1;
|
|
115
|
+
--total-scale-factor: calc(var(--scale-factor) * var(--user-unit));
|
|
116
|
+
--scale-round-x: 1px;
|
|
117
|
+
--scale-round-y: 1px;
|
|
118
|
+
}`;
|
|
96
119
|
class PdfRenderer extends DocumentRenderer {
|
|
97
120
|
constructor(pdfViewerStyle, params) {
|
|
98
121
|
super(params);
|
|
@@ -183,9 +206,10 @@ class PdfRenderer extends DocumentRenderer {
|
|
|
183
206
|
this.pdfViewerStyle
|
|
184
207
|
);
|
|
185
208
|
injectCSSToFrame(frameElement, "enhancer-pdf-style", pdfFrameStyle);
|
|
209
|
+
upsertCSSToFrame(frameElement, "pdf-scale-scale", pdfScaleStyle);
|
|
186
210
|
const frameBody = frameElement.contentDocument?.body;
|
|
187
211
|
if (!frameBody || !this.pageProxy) return EMPTY;
|
|
188
|
-
frameBody
|
|
212
|
+
setAttributeIfChanged(frameBody, "class", "textLayer");
|
|
189
213
|
this.textLayer = new TextLayer({
|
|
190
214
|
container: frameBody,
|
|
191
215
|
textContentSource: this.pageProxy.streamTextContent(),
|
|
@@ -237,21 +261,30 @@ class PdfRenderer extends DocumentRenderer {
|
|
|
237
261
|
}
|
|
238
262
|
const textLayerElement = frameDoc.body;
|
|
239
263
|
const canvasScale = canvas.clientWidth / viewportWidth;
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
264
|
+
setStylePropertyIfChanged(
|
|
265
|
+
textLayerElement.style,
|
|
266
|
+
`top`,
|
|
267
|
+
`${canvas.offsetTop}px`
|
|
268
|
+
);
|
|
269
|
+
setStylePropertyIfChanged(
|
|
270
|
+
textLayerElement.style,
|
|
271
|
+
`left`,
|
|
272
|
+
`${canvas.offsetLeft}px`
|
|
273
|
+
);
|
|
274
|
+
setStylePropertyIfChanged(
|
|
275
|
+
textLayerElement.style,
|
|
276
|
+
`height`,
|
|
277
|
+
canvas.style.height
|
|
278
|
+
);
|
|
279
|
+
setStylePropertyIfChanged(
|
|
280
|
+
textLayerElement.style,
|
|
281
|
+
`width`,
|
|
282
|
+
canvas.style.width
|
|
283
|
+
);
|
|
284
|
+
setStylePropertyIfChanged(
|
|
285
|
+
frameDoc.documentElement.style,
|
|
286
|
+
`--scale-factor`,
|
|
287
|
+
`${canvasScale}`
|
|
255
288
|
);
|
|
256
289
|
this.textLayer.update({
|
|
257
290
|
viewport
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/createArchiveFromPdf.ts","../src/renderer/layout.ts","../src/renderer/PdfRenderer.ts","../src/pdfEnhancer.ts"],"sourcesContent":["import type { Archive } from \"@prose-reader/streamer\"\nimport * as pdfjsLib from \"pdfjs-dist\"\n\ntype PdfJsArchive = Archive & {\n _symbol: symbol\n proxyDocument: pdfjsLib.PDFDocumentProxy\n}\n\nconst PDF_SYMBOL = Symbol(`pdfjs`)\n\nexport const isPdfJsArchive = (archive: Archive): archive is PdfJsArchive =>\n \"_symbol\" in archive && archive._symbol === PDF_SYMBOL\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromPdf = async (\n file: Blob,\n filename: string,\n): Promise<Archive> => {\n const loadingTask = pdfjsLib.getDocument(await file.arrayBuffer())\n\n const pdf = await loadingTask.promise\n\n const pages = Array.from({ length: pdf.numPages })\n\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">pre-paginated</meta>\n </metadata>\n <manifest>\n ${pages.map((_, index) => `<item id=\"${index}\" href=\"${index}.pdf\" />`).join(`\\n`)}\n </manifest>\n <spine>\n ${pages.map((_, index) => `<itemref idref=\"${index}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const opfFile: Archive[`records`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n const archive = {\n filename,\n proxyDocument: pdf,\n _symbol: PDF_SYMBOL,\n records: [\n opfFile,\n ...pages.map((_, index) => ({\n dir: false,\n blob: async () => {\n throw new Error(\"Unable to get blob from pdf\")\n },\n basename: `${index}.pdf`,\n size: 0,\n string: () => {\n throw new Error(\"Unable to get blob from pdf\")\n },\n uri: `${index}.pdf`,\n })),\n ],\n close: () => {\n return pdf.cleanup()\n },\n } satisfies PdfJsArchive\n\n return archive as Archive\n}\n","import type { Viewport } from \"@prose-reader/core\"\nimport type { PDFPageProxy } from \"pdfjs-dist\"\n\nexport const layoutContainer = (\n container: HTMLElement | undefined,\n spreadPosition: `none` | `left` | `right`,\n viewport: Viewport,\n) => {\n if (!container) return\n\n // first we try to get the desired viewport for a comfortable reading based on theh current page size\n const { height: pageHeight, width: pageWidth } = viewport.pageSize\n\n container.style.width = `${pageWidth}px`\n container.style.height = `${pageHeight}px`\n\n if (spreadPosition === `right`) {\n container.style.justifyContent = `flex-start`\n } else if (spreadPosition === `left`) {\n container.style.justifyContent = `flex-end`\n } else {\n container.style.justifyContent = `center`\n }\n}\n\nexport const layoutCanvas = (\n pageProxy: PDFPageProxy,\n canvas: HTMLCanvasElement,\n readerViewport: Viewport,\n) => {\n // Support HiDPI-screens.\n const pixelRatioScale = window.devicePixelRatio || 1\n const { height: pageHeight, width: pageWidth } = readerViewport.pageSize\n const { width: viewportWidth, height: viewportHeight } =\n pageProxy.getViewport({ scale: 1 })\n const pageScale = Math.max(\n pageWidth / viewportWidth,\n pageHeight / viewportHeight,\n )\n\n // then we generate the viewport for the canvas based on the page scale\n const viewport = pageProxy.getViewport({ scale: pageScale })\n\n // Then we define which axis should stretch or shrink to ratio\n const viewportRatio = viewport.width / viewport.height\n const pageRatio = pageWidth / pageHeight\n const isWiderThanPage = viewportRatio > pageRatio\n const canvasWidth = isWiderThanPage ? pageWidth : pageHeight * viewportRatio\n const canvasHeight =\n viewportRatio > pageRatio ? pageWidth / viewportRatio : pageHeight\n\n canvas.width = Math.floor(viewport.width * pixelRatioScale)\n canvas.height = Math.floor(viewport.height * pixelRatioScale)\n canvas.style.width = `${Math.floor(canvasWidth)}px`\n canvas.style.height = `${Math.floor(canvasHeight)}px`\n}\n","import {\n DocumentRenderer,\n injectCSSToFrame,\n removeCSS,\n waitForFrameLoad,\n waitForFrameReady,\n waitForSwitch,\n} from \"@prose-reader/core\"\nimport {\n type PDFPageProxy,\n RenderingCancelledException,\n type RenderTask,\n TextLayer,\n} from \"pdfjs-dist\"\nimport {\n catchError,\n EMPTY,\n from,\n map,\n type Observable,\n of,\n switchMap,\n tap,\n} from \"rxjs\"\nimport pdfFrameStyle from \"./frame.css?inline\"\nimport { layoutCanvas, layoutContainer } from \"./layout\"\n\nexport class PdfRenderer extends DocumentRenderer {\n private pageProxy: PDFPageProxy | undefined\n private renderTask: RenderTask | undefined\n private textLayer: TextLayer | undefined\n\n constructor(\n private pdfViewerStyle: string,\n params: ConstructorParameters<typeof DocumentRenderer>[0],\n ) {\n super(params)\n }\n\n private getCanvas() {\n const element = this.documentContainer?.children[0]\n\n if (!(element instanceof HTMLCanvasElement)) return\n\n return element\n }\n\n private getFrameElement() {\n const frame = this.documentContainer?.children[1].children[0]\n\n if (!(frame instanceof HTMLIFrameElement)) return\n\n return frame\n }\n\n private getPageProxy() {\n if (this.pageProxy) return of(this.pageProxy)\n\n return from(this.resourcesHandler.fetchResource()).pipe(\n switchMap((resource) => {\n if (!(\"custom\" in resource)) return EMPTY\n\n this.pageProxy = resource.data as PDFPageProxy\n\n return of(this.pageProxy)\n }),\n )\n }\n\n onUnload(): Observable<unknown> {\n this.detach()\n\n if (this.renderTask) {\n this.renderTask.cancel()\n }\n\n this.textLayer?.cancel()\n this.pageProxy?.cleanup()\n\n return EMPTY\n }\n\n onCreateDocument(): Observable<HTMLElement> {\n const frameElement = document.createElement(`iframe`)\n frameElement.style.cssText = `\n overflow: hidden;\n height: 100%;\n width: 100%;\n `\n\n frameElement.setAttribute(\"tabIndex\", \"0\")\n frameElement.setAttribute(\"frameBorder\", \"0\")\n frameElement.setAttribute(`src`, \"about:blank\")\n\n const frameContainer =\n this.containerElement.ownerDocument.createElement(\"div\")\n frameContainer.style.cssText = `\n mix-blend-mode: multiply;\n -webkit-transform: translateZ(0);\n transform: translateZ(0);\n position: absolute;\n height: 100%;\n width: 100%;\n top: 0;\n `\n\n /**\n * The canvas is never attached to the DOM and will be used for offscreen rendering\n * then copied into the frame.\n */\n const canvas = this.containerElement.ownerDocument.createElement(\"canvas\")\n\n frameContainer.appendChild(frameElement)\n\n const rootElement = this.containerElement.ownerDocument.createElement(`div`)\n rootElement.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: center;\n `\n\n rootElement.appendChild(canvas)\n rootElement.appendChild(frameContainer)\n\n this.setDocumentContainer(rootElement)\n\n return of(rootElement)\n }\n\n onLoadDocument(): Observable<unknown> {\n return this.getPageProxy().pipe(\n switchMap(() => {\n const frameElement = this.getFrameElement()\n const pageProxy = this.pageProxy\n\n if (!frameElement || !pageProxy) return EMPTY\n\n return of(frameElement).pipe(\n waitForSwitch(this.context.bridgeEvent.viewportFree$),\n tap(() => {\n this.attach()\n }),\n waitForFrameLoad,\n switchMap(() => {\n injectCSSToFrame(\n frameElement,\n \"pdfjs-viewer-style\",\n this.pdfViewerStyle,\n )\n injectCSSToFrame(frameElement, \"enhancer-pdf-style\", pdfFrameStyle)\n\n /**\n * We make sure to render the text layer to simulate the document being loaded.\n * It will be correctly re-layout later. Consumers looking for document load have at least\n * the actual text document ready. (cfi lookup, etc.)\n */\n const frameBody = frameElement.contentDocument?.body\n\n if (!frameBody || !this.pageProxy) return EMPTY\n\n frameBody.setAttribute(\"class\", \"textLayer\")\n\n this.textLayer = new TextLayer({\n container: frameBody,\n textContentSource: this.pageProxy.streamTextContent(),\n viewport: this.pageProxy.getViewport({ scale: 1 }),\n })\n\n return from(this.textLayer.render())\n }),\n waitForFrameReady,\n )\n }),\n )\n }\n\n onLayout({\n spreadPosition,\n }: {\n minPageSpread: number\n blankPagePosition: `before` | `after` | `none`\n spreadPosition: `none` | `left` | `right`\n }) {\n const frameElement = this.getFrameElement()\n const canvas = this.getCanvas()\n\n if (!frameElement || !canvas) return of(undefined)\n\n // first we try to get the desired viewport for a comfortable reading based on the current page size\n const { height: pageHeight, width: pageWidth } = this.viewport.pageSize\n\n layoutContainer(this.documentContainer, spreadPosition, this.viewport)\n\n const context = canvas.getContext(\"2d\")\n // Support HiDPI-screens.\n const pixelRatioScale = window.devicePixelRatio || 1\n\n if (!this.pageProxy || !context) return of(undefined)\n\n if (this.renderTask) {\n this.renderTask.cancel()\n this.renderTask = undefined\n }\n\n layoutCanvas(this.pageProxy, canvas, this.viewport)\n\n const { width: viewportWidth, height: viewportHeight } =\n this.pageProxy.getViewport({ scale: 1 })\n\n const pageScale = Math.max(\n pageWidth / viewportWidth,\n pageHeight / viewportHeight,\n )\n\n // then we generate the viewport for the canvas based on the page scale\n const viewport = this.pageProxy.getViewport({ scale: pageScale })\n\n const transform =\n pixelRatioScale !== 1\n ? [pixelRatioScale, 0, 0, pixelRatioScale, 0, 0]\n : null\n\n this.renderTask = this.pageProxy.render({\n ...(transform && { transform }),\n canvasContext: context,\n viewport,\n canvas,\n })\n\n return from(this.renderTask.promise).pipe(\n switchMap(() => {\n this.renderTask = undefined\n\n const frameDoc = frameElement?.contentDocument\n const pdfPage = this.pageProxy\n\n if (!frameDoc || !frameElement || !pdfPage || !this.textLayer) {\n throw new Error(\"Unable to update text layer due to missing elements\")\n }\n\n const textLayerElement = frameDoc.body\n const canvasScale = canvas.clientWidth / viewportWidth\n\n textLayerElement.style.top = `${canvas.offsetTop}px`\n textLayerElement.style.left = `${canvas.offsetLeft}px`\n textLayerElement.style.height = canvas.style.height\n textLayerElement.style.width = canvas.style.width\n\n removeCSS(frameElement, \"pdf-scale-scale\")\n /**\n * Taking inspiration from https://github.com/mozilla/pdf.js/blob/master/web/pdf_viewer.css.\n * Not sure why pdfjs DOES rely on css from the viewer to works. Or in another words, why is it\n * not more obvious that TextLayer requires a set of variables to work correctly.\n */\n injectCSSToFrame(\n frameElement,\n \"pdf-scale-scale\",\n `:root {\n --scale-factor: ${canvasScale};\n --user-unit: 1; \n --total-scale-factor: calc(var(--scale-factor) * var(--user-unit));\n --scale-round-x: 1px;\n --scale-round-y: 1px;\n }`,\n )\n\n this.textLayer.update({\n viewport,\n })\n\n return of(undefined)\n }),\n catchError((e) => {\n if (!(e instanceof RenderingCancelledException)) console.error(e)\n\n return of(undefined)\n }),\n )\n }\n\n /**\n * @important\n * We should keep the same node structure to preserve CFI integrity.\n */\n onRenderHeadless() {\n return this.getPageProxy().pipe(\n switchMap((pageProxy) => {\n const headlessDocument = document.implementation.createHTMLDocument()\n const textLayerElement = headlessDocument.body\n\n const textLayer = new TextLayer({\n container: textLayerElement,\n textContentSource: pageProxy.streamTextContent(),\n viewport: pageProxy.getViewport({ scale: 1 }),\n })\n\n return from(textLayer.render()).pipe(map(() => headlessDocument))\n }),\n )\n }\n\n getDocumentFrame() {\n return this.getFrameElement()\n }\n}\n","import type { createReader, Reader } from \"@prose-reader/core\"\nimport { from, map, mergeMap, of } from \"rxjs\"\nimport { isPdfJsArchive } from \"./createArchiveFromPdf\"\nimport { PdfRenderer } from \"./renderer/PdfRenderer\"\nimport type { EnhancerOptions } from \"./types\"\n\ntype CreateReader = typeof createReader\ntype CreateReaderOptions = Parameters<CreateReader>[0]\n\nexport const pdfEnhancer =\n <InheritOptions extends CreateReaderOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions & EnhancerOptions): InheritOutput => {\n const reader = next({\n ...options,\n /**\n * We have a special renderer for pdf so we need to inject it\n * for the relevant items. The enhancer could be configurable but for\n * the sake of simplicity we will assume that an item ending with .pdf should\n * be treated as a pdf document.\n *\n * The `getRenderer` hook should be non destructive, if we detect a renderer already\n * setup we should return it.\n */\n getRenderer(item) {\n const maybeFactory = options.getRenderer?.(item)\n\n if (!maybeFactory && item.href.endsWith(`.pdf`)) {\n return (params) =>\n new PdfRenderer(options.pdf.pdfjsViewerInlineCss, params)\n }\n\n return maybeFactory\n },\n getResource: (item) =>\n options.pdf.getArchiveForItem(item).pipe(\n mergeMap((archive) => {\n if (!archive) return of(undefined)\n\n if (!isPdfJsArchive(archive)) {\n console.warn(`You provided an invalid pdf archive`)\n\n return of(undefined)\n }\n\n // we account for opf file\n const fileIndex =\n archive.records.findIndex((file) =>\n item.href.endsWith(file.uri),\n ) - 1\n\n return from(archive.proxyDocument.getPage(fileIndex + 1)).pipe(\n map((pageProxy) => ({\n custom: true as const,\n data: pageProxy,\n })),\n )\n }),\n ),\n })\n\n return reader\n }\n"],"names":[],"mappings":";;;;;AAQA,MAAM,UAAA,0BAAoB,CAAA,KAAA,CAAO,CAAA;AAE1B,MAAM,iBAAiB,CAAC,OAAA,KAC7B,SAAA,IAAa,OAAA,IAAW,QAAQ,OAAA,KAAY;AAOvC,MAAM,oBAAA,GAAuB,OAClC,IAAA,EACA,QAAA,KACqB;AACrB,EAAA,MAAM,cAAc,QAAA,CAAS,WAAA,CAAY,MAAM,IAAA,CAAK,aAAa,CAAA;AAEjE,EAAA,MAAM,GAAA,GAAM,MAAM,WAAA,CAAY,OAAA;AAE9B,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAA,CAAI,UAAU,CAAA;AAEjD,EAAA,MAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAMZ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,KAAU,CAAA,UAAA,EAAa,KAAK,CAAA,QAAA,EAAW,KAAK,CAAA,QAAA,CAAU,CAAA,CAAE,IAAA,CAAK;AAAA,CAAI,CAAC;AAAA;AAAA;AAAA,QAAA,EAGhF,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,UAAU,CAAA,gBAAA,EAAmB,KAAK,CAAA,IAAA,CAAM,CAAA,CAAE,IAAA,CAAK;AAAA,CAAI,CAAC;AAAA;AAAA;AAAA,EAAA,CAAA;AAK1E,EAAA,MAAM,OAAA,GAAsC;AAAA,IAC1C,GAAA,EAAK,KAAA;AAAA,IACL,QAAA,EAAU,CAAA,WAAA,CAAA;AAAA,IACV,GAAA,EAAK,CAAA,WAAA,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,IAAA,EAAM,YAAY,IAAI,IAAA,EAAK;AAAA,IAC3B,QAAQ,YAAY;AAAA,GACtB;AAEA,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,QAAA;AAAA,IACA,aAAA,EAAe,GAAA;AAAA,IACf,OAAA,EAAS,UAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,OAAA;AAAA,MACA,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,KAAA,MAAW;AAAA,QAC1B,GAAA,EAAK,KAAA;AAAA,QACL,MAAM,YAAY;AAChB,UAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,QAC/C,CAAA;AAAA,QACA,QAAA,EAAU,GAAG,KAAK,CAAA,IAAA,CAAA;AAAA,QAClB,IAAA,EAAM,CAAA;AAAA,QACN,QAAQ,MAAM;AACZ,UAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,QAC/C,CAAA;AAAA,QACA,GAAA,EAAK,GAAG,KAAK,CAAA,IAAA;AAAA,OACf,CAAE;AAAA,KACJ;AAAA,IACA,OAAO,MAAM;AACX,MAAA,OAAO,IAAI,OAAA,EAAQ;AAAA,IACrB;AAAA,GACF;AAEA,EAAA,OAAO,OAAA;AACT;;;;ACzEO,MAAM,eAAA,GAAkB,CAC7B,SAAA,EACA,cAAA,EACA,QAAA,KACG;AACH,EAAA,IAAI,CAAC,SAAA,EAAW;AAGhB,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,SAAA,KAAc,QAAA,CAAS,QAAA;AAE1D,EAAA,SAAA,CAAU,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,SAAS,CAAA,EAAA,CAAA;AACpC,EAAA,SAAA,CAAU,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,UAAU,CAAA,EAAA,CAAA;AAEtC,EAAA,IAAI,mBAAmB,CAAA,KAAA,CAAA,EAAS;AAC9B,IAAA,SAAA,CAAU,MAAM,cAAA,GAAiB,CAAA,UAAA,CAAA;AAAA,EACnC,CAAA,MAAA,IAAW,mBAAmB,CAAA,IAAA,CAAA,EAAQ;AACpC,IAAA,SAAA,CAAU,MAAM,cAAA,GAAiB,CAAA,QAAA,CAAA;AAAA,EACnC,CAAA,MAAO;AACL,IAAA,SAAA,CAAU,MAAM,cAAA,GAAiB,CAAA,MAAA,CAAA;AAAA,EACnC;AACF,CAAA;AAEO,MAAM,YAAA,GAAe,CAC1B,SAAA,EACA,MAAA,EACA,cAAA,KACG;AAEH,EAAA,MAAM,eAAA,GAAkB,OAAO,gBAAA,IAAoB,CAAA;AACnD,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,SAAA,KAAc,cAAA,CAAe,QAAA;AAChE,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,MAAA,EAAQ,cAAA,EAAe,GACnD,SAAA,CAAU,WAAA,CAAY,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA;AACpC,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,IACrB,SAAA,GAAY,aAAA;AAAA,IACZ,UAAA,GAAa;AAAA,GACf;AAGA,EAAA,MAAM,WAAW,SAAA,CAAU,WAAA,CAAY,EAAE,KAAA,EAAO,WAAW,CAAA;AAG3D,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,KAAA,GAAQ,QAAA,CAAS,MAAA;AAChD,EAAA,MAAM,YAAY,SAAA,GAAY,UAAA;AAC9B,EAAA,MAAM,kBAAkB,aAAA,GAAgB,SAAA;AACxC,EAAA,MAAM,WAAA,GAAc,eAAA,GAAkB,SAAA,GAAY,UAAA,GAAa,aAAA;AAC/D,EAAA,MAAM,YAAA,GACJ,aAAA,GAAgB,SAAA,GAAY,SAAA,GAAY,aAAA,GAAgB,UAAA;AAE1D,EAAA,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,QAAQ,eAAe,CAAA;AAC1D,EAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,SAAS,eAAe,CAAA;AAC5D,EAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAA,EAAA,CAAA;AAC/C,EAAA,MAAA,CAAO,MAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,YAAY,CAAC,CAAA,EAAA,CAAA;AACnD,CAAA;;AC5BO,MAAM,oBAAoB,gBAAA,CAAiB;AAAA,EAKhD,WAAA,CACU,gBACR,MAAA,EACA;AACA,IAAA,KAAA,CAAM,MAAM,CAAA;AAHJ,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EAIV;AAAA,EAJU,cAAA;AAAA,EALF,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EASA,SAAA,GAAY;AAClB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,EAAmB,QAAA,CAAS,CAAC,CAAA;AAElD,IAAA,IAAI,EAAE,mBAAmB,iBAAA,CAAA,EAAoB;AAE7C,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,eAAA,GAAkB;AACxB,IAAA,MAAM,QAAQ,IAAA,CAAK,iBAAA,EAAmB,SAAS,CAAC,CAAA,CAAE,SAAS,CAAC,CAAA;AAE5D,IAAA,IAAI,EAAE,iBAAiB,iBAAA,CAAA,EAAoB;AAE3C,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,YAAA,GAAe;AACrB,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,OAAO,EAAA,CAAG,KAAK,SAAS,CAAA;AAE5C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,aAAA,EAAe,CAAA,CAAE,IAAA;AAAA,MACjD,SAAA,CAAU,CAAC,QAAA,KAAa;AACtB,QAAA,IAAI,EAAE,QAAA,IAAY,QAAA,CAAA,EAAW,OAAO,KAAA;AAEpC,QAAA,IAAA,CAAK,YAAY,QAAA,CAAS,IAAA;AAE1B,QAAA,OAAO,EAAA,CAAG,KAAK,SAAS,CAAA;AAAA,MAC1B,CAAC;AAAA,KACH;AAAA,EACF;AAAA,EAEA,QAAA,GAAgC;AAC9B,IAAA,IAAA,CAAK,MAAA,EAAO;AAEZ,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,WAAW,MAAA,EAAO;AAAA,IACzB;AAEA,IAAA,IAAA,CAAK,WAAW,MAAA,EAAO;AACvB,IAAA,IAAA,CAAK,WAAW,OAAA,EAAQ;AAExB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,gBAAA,GAA4C;AAC1C,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,CAAA,MAAA,CAAQ,CAAA;AACpD,IAAA,YAAA,CAAa,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAM7B,IAAA,YAAA,CAAa,YAAA,CAAa,YAAY,GAAG,CAAA;AACzC,IAAA,YAAA,CAAa,YAAA,CAAa,eAAe,GAAG,CAAA;AAC5C,IAAA,YAAA,CAAa,YAAA,CAAa,OAAO,aAAa,CAAA;AAE9C,IAAA,MAAM,cAAA,GACJ,IAAA,CAAK,gBAAA,CAAiB,aAAA,CAAc,cAAc,KAAK,CAAA;AACzD,IAAA,cAAA,CAAe,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAc/B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,aAAA,CAAc,cAAc,QAAQ,CAAA;AAEzE,IAAA,cAAA,CAAe,YAAY,YAAY,CAAA;AAEvC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,aAAA,CAAc,cAAc,CAAA,GAAA,CAAK,CAAA;AAC3E,IAAA,WAAA,CAAY,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAM5B,IAAA,WAAA,CAAY,YAAY,MAAM,CAAA;AAC9B,IAAA,WAAA,CAAY,YAAY,cAAc,CAAA;AAEtC,IAAA,IAAA,CAAK,qBAAqB,WAAW,CAAA;AAErC,IAAA,OAAO,GAAG,WAAW,CAAA;AAAA,EACvB;AAAA,EAEA,cAAA,GAAsC;AACpC,IAAA,OAAO,IAAA,CAAK,cAAa,CAAE,IAAA;AAAA,MACzB,UAAU,MAAM;AACd,QAAA,MAAM,YAAA,GAAe,KAAK,eAAA,EAAgB;AAC1C,QAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AAEvB,QAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,SAAA,EAAW,OAAO,KAAA;AAExC,QAAA,OAAO,EAAA,CAAG,YAAY,CAAA,CAAE,IAAA;AAAA,UACtB,aAAA,CAAc,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,aAAa,CAAA;AAAA,UACpD,IAAI,MAAM;AACR,YAAA,IAAA,CAAK,MAAA,EAAO;AAAA,UACd,CAAC,CAAA;AAAA,UACD,gBAAA;AAAA,UACA,UAAU,MAAM;AACd,YAAA,gBAAA;AAAA,cACE,YAAA;AAAA,cACA,oBAAA;AAAA,cACA,IAAA,CAAK;AAAA,aACP;AACA,YAAA,gBAAA,CAAiB,YAAA,EAAc,sBAAsB,aAAa,CAAA;AAOlE,YAAA,MAAM,SAAA,GAAY,aAAa,eAAA,EAAiB,IAAA;AAEhD,YAAA,IAAI,CAAC,SAAA,IAAa,CAAC,IAAA,CAAK,WAAW,OAAO,KAAA;AAE1C,YAAA,SAAA,CAAU,YAAA,CAAa,SAAS,WAAW,CAAA;AAE3C,YAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,cAC7B,SAAA,EAAW,SAAA;AAAA,cACX,iBAAA,EAAmB,IAAA,CAAK,SAAA,CAAU,iBAAA,EAAkB;AAAA,cACpD,UAAU,IAAA,CAAK,SAAA,CAAU,YAAY,EAAE,KAAA,EAAO,GAAG;AAAA,aAClD,CAAA;AAED,YAAA,OAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA;AAAA,UACrC,CAAC,CAAA;AAAA,UACD;AAAA,SACF;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAAA,EAEA,QAAA,CAAS;AAAA,IACP;AAAA,GACF,EAIG;AACD,IAAA,MAAM,YAAA,GAAe,KAAK,eAAA,EAAgB;AAC1C,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAE9B,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,MAAA,EAAQ,OAAO,GAAG,MAAS,CAAA;AAGjD,IAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,OAAO,SAAA,EAAU,GAAI,KAAK,QAAA,CAAS,QAAA;AAE/D,IAAA,eAAA,CAAgB,IAAA,CAAK,iBAAA,EAAmB,cAAA,EAAgB,IAAA,CAAK,QAAQ,CAAA;AAErE,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAEtC,IAAA,MAAM,eAAA,GAAkB,OAAO,gBAAA,IAAoB,CAAA;AAEnD,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,OAAA,EAAS,OAAO,GAAG,MAAS,CAAA;AAEpD,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAA,CAAK,WAAW,MAAA,EAAO;AACvB,MAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,IACpB;AAEA,IAAA,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAElD,IAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,MAAA,EAAQ,cAAA,EAAe,GACnD,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA;AAEzC,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,MACrB,SAAA,GAAY,aAAA;AAAA,MACZ,UAAA,GAAa;AAAA,KACf;AAGA,IAAA,MAAM,WAAW,IAAA,CAAK,SAAA,CAAU,YAAY,EAAE,KAAA,EAAO,WAAW,CAAA;AAEhE,IAAA,MAAM,SAAA,GACJ,eAAA,KAAoB,CAAA,GAChB,CAAC,eAAA,EAAiB,GAAG,CAAA,EAAG,eAAA,EAAiB,CAAA,EAAG,CAAC,CAAA,GAC7C,IAAA;AAEN,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO;AAAA,MACtC,GAAI,SAAA,IAAa,EAAE,SAAA,EAAU;AAAA,MAC7B,aAAA,EAAe,OAAA;AAAA,MACf,QAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,CAAE,IAAA;AAAA,MACnC,UAAU,MAAM;AACd,QAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAElB,QAAA,MAAM,WAAW,YAAA,EAAc,eAAA;AAC/B,QAAA,MAAM,UAAU,IAAA,CAAK,SAAA;AAErB,QAAA,IAAI,CAAC,YAAY,CAAC,YAAA,IAAgB,CAAC,OAAA,IAAW,CAAC,KAAK,SAAA,EAAW;AAC7D,UAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,QACvE;AAEA,QAAA,MAAM,mBAAmB,QAAA,CAAS,IAAA;AAClC,QAAA,MAAM,WAAA,GAAc,OAAO,WAAA,GAAc,aAAA;AAEzC,QAAA,gBAAA,CAAiB,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,MAAA,CAAO,SAAS,CAAA,EAAA,CAAA;AAChD,QAAA,gBAAA,CAAiB,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,MAAA,CAAO,UAAU,CAAA,EAAA,CAAA;AAClD,QAAA,gBAAA,CAAiB,KAAA,CAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,MAAA;AAC7C,QAAA,gBAAA,CAAiB,KAAA,CAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,KAAA;AAE5C,QAAA,SAAA,CAAU,cAAc,iBAAiB,CAAA;AAMzC,QAAA,gBAAA;AAAA,UACE,YAAA;AAAA,UACA,iBAAA;AAAA,UACA,CAAA;AAAA,4BAAA,EACoB,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA;AAAA,SAMjC;AAEA,QAAA,IAAA,CAAK,UAAU,MAAA,CAAO;AAAA,UACpB;AAAA,SACD,CAAA;AAED,QAAA,OAAO,GAAG,MAAS,CAAA;AAAA,MACrB,CAAC,CAAA;AAAA,MACD,UAAA,CAAW,CAAC,CAAA,KAAM;AAChB,QAAA,IAAI,EAAE,CAAA,YAAa,2BAAA,CAAA,EAA8B,OAAA,CAAQ,MAAM,CAAC,CAAA;AAEhE,QAAA,OAAO,GAAG,MAAS,CAAA;AAAA,MACrB,CAAC;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,cAAa,CAAE,IAAA;AAAA,MACzB,SAAA,CAAU,CAAC,SAAA,KAAc;AACvB,QAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,cAAA,CAAe,kBAAA,EAAmB;AACpE,QAAA,MAAM,mBAAmB,gBAAA,CAAiB,IAAA;AAE1C,QAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU;AAAA,UAC9B,SAAA,EAAW,gBAAA;AAAA,UACX,iBAAA,EAAmB,UAAU,iBAAA,EAAkB;AAAA,UAC/C,UAAU,SAAA,CAAU,WAAA,CAAY,EAAE,KAAA,EAAO,GAAG;AAAA,SAC7C,CAAA;AAED,QAAA,OAAO,IAAA,CAAK,UAAU,MAAA,EAAQ,EAAE,IAAA,CAAK,GAAA,CAAI,MAAM,gBAAgB,CAAC,CAAA;AAAA,MAClE,CAAC;AAAA,KACH;AAAA,EACF;AAAA,EAEA,gBAAA,GAAmB;AACjB,IAAA,OAAO,KAAK,eAAA,EAAgB;AAAA,EAC9B;AACF;;ACvSO,MAAM,WAAA,GACX,CACE,IAAA,KAEF,CAAC,OAAA,KAA6D;AAC5D,EAAA,MAAM,SAAS,IAAA,CAAK;AAAA,IAClB,GAAG,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUH,YAAY,IAAA,EAAM;AAChB,MAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,WAAA,GAAc,IAAI,CAAA;AAE/C,MAAA,IAAI,CAAC,YAAA,IAAgB,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AAC/C,QAAA,OAAO,CAAC,MAAA,KACN,IAAI,YAAY,OAAA,CAAQ,GAAA,CAAI,sBAAsB,MAAM,CAAA;AAAA,MAC5D;AAEA,MAAA,OAAO,YAAA;AAAA,IACT,CAAA;AAAA,IACA,aAAa,CAAC,IAAA,KACZ,QAAQ,GAAA,CAAI,iBAAA,CAAkB,IAAI,CAAA,CAAE,IAAA;AAAA,MAClC,QAAA,CAAS,CAAC,OAAA,KAAY;AACpB,QAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAA,CAAG,MAAS,CAAA;AAEjC,QAAA,IAAI,CAAC,cAAA,CAAe,OAAO,CAAA,EAAG;AAC5B,UAAA,OAAA,CAAQ,KAAK,CAAA,mCAAA,CAAqC,CAAA;AAElD,UAAA,OAAO,GAAG,MAAS,CAAA;AAAA,QACrB;AAGA,QAAA,MAAM,SAAA,GACJ,QAAQ,OAAA,CAAQ,SAAA;AAAA,UAAU,CAAC,IAAA,KACzB,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAK,GAAG;AAAA,SAC7B,GAAI,CAAA;AAEN,QAAA,OAAO,KAAK,OAAA,CAAQ,aAAA,CAAc,QAAQ,SAAA,GAAY,CAAC,CAAC,CAAA,CAAE,IAAA;AAAA,UACxD,GAAA,CAAI,CAAC,SAAA,MAAe;AAAA,YAClB,MAAA,EAAQ,IAAA;AAAA,YACR,IAAA,EAAM;AAAA,WACR,CAAE;AAAA,SACJ;AAAA,MACF,CAAC;AAAA;AACH,GACH,CAAA;AAED,EAAA,OAAO,MAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/createArchiveFromPdf.ts","../src/renderer/layout.ts","../src/renderer/PdfRenderer.ts","../src/pdfEnhancer.ts"],"sourcesContent":["import type { Archive } from \"@prose-reader/streamer\"\nimport * as pdfjsLib from \"pdfjs-dist\"\n\ntype PdfJsArchive = Archive & {\n _symbol: symbol\n proxyDocument: pdfjsLib.PDFDocumentProxy\n}\n\nconst PDF_SYMBOL = Symbol(`pdfjs`)\n\nexport const isPdfJsArchive = (archive: Archive): archive is PdfJsArchive =>\n \"_symbol\" in archive && archive._symbol === PDF_SYMBOL\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromPdf = async (\n file: Blob,\n filename: string,\n): Promise<Archive> => {\n const loadingTask = pdfjsLib.getDocument(await file.arrayBuffer())\n\n const pdf = await loadingTask.promise\n\n const pages = Array.from({ length: pdf.numPages })\n\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">pre-paginated</meta>\n </metadata>\n <manifest>\n ${pages.map((_, index) => `<item id=\"${index}\" href=\"${index}.pdf\" />`).join(`\\n`)}\n </manifest>\n <spine>\n ${pages.map((_, index) => `<itemref idref=\"${index}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const opfFile: Archive[`records`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n const archive = {\n filename,\n proxyDocument: pdf,\n _symbol: PDF_SYMBOL,\n records: [\n opfFile,\n ...pages.map((_, index) => ({\n dir: false,\n blob: async () => {\n throw new Error(\"Unable to get blob from pdf\")\n },\n basename: `${index}.pdf`,\n size: 0,\n string: () => {\n throw new Error(\"Unable to get blob from pdf\")\n },\n uri: `${index}.pdf`,\n })),\n ],\n close: () => {\n return pdf.cleanup()\n },\n } satisfies PdfJsArchive\n\n return archive as Archive\n}\n","import {\n setPropertyIfChanged,\n setStylePropertyIfChanged,\n type Viewport,\n} from \"@prose-reader/core\"\nimport type { PDFPageProxy } from \"pdfjs-dist\"\n\nexport const layoutContainer = (\n container: HTMLElement | undefined,\n spreadPosition: `none` | `left` | `right`,\n viewport: Viewport,\n) => {\n if (!container) return\n\n // first we try to get the desired viewport for a comfortable reading based on theh current page size\n const { height: pageHeight, width: pageWidth } = viewport.pageSize\n\n setStylePropertyIfChanged(container.style, `width`, `${pageWidth}px`)\n setStylePropertyIfChanged(container.style, `height`, `${pageHeight}px`)\n\n if (spreadPosition === `right`) {\n setStylePropertyIfChanged(container.style, `justify-content`, `flex-start`)\n } else if (spreadPosition === `left`) {\n setStylePropertyIfChanged(container.style, `justify-content`, `flex-end`)\n } else {\n setStylePropertyIfChanged(container.style, `justify-content`, `center`)\n }\n}\n\nexport const layoutCanvas = (\n pageProxy: PDFPageProxy,\n canvas: HTMLCanvasElement,\n readerViewport: Viewport,\n) => {\n // Support HiDPI-screens.\n const pixelRatioScale = window.devicePixelRatio || 1\n const { height: pageHeight, width: pageWidth } = readerViewport.pageSize\n const { width: viewportWidth, height: viewportHeight } =\n pageProxy.getViewport({ scale: 1 })\n const pageScale = Math.max(\n pageWidth / viewportWidth,\n pageHeight / viewportHeight,\n )\n\n // then we generate the viewport for the canvas based on the page scale\n const viewport = pageProxy.getViewport({ scale: pageScale })\n\n // Then we define which axis should stretch or shrink to ratio\n const viewportRatio = viewport.width / viewport.height\n const pageRatio = pageWidth / pageHeight\n const isWiderThanPage = viewportRatio > pageRatio\n const canvasWidth = isWiderThanPage ? pageWidth : pageHeight * viewportRatio\n const canvasHeight =\n viewportRatio > pageRatio ? pageWidth / viewportRatio : pageHeight\n\n setPropertyIfChanged(\n canvas,\n `width`,\n Math.floor(viewport.width * pixelRatioScale),\n )\n setPropertyIfChanged(\n canvas,\n `height`,\n Math.floor(viewport.height * pixelRatioScale),\n )\n setStylePropertyIfChanged(\n canvas.style,\n `width`,\n `${Math.floor(canvasWidth)}px`,\n )\n setStylePropertyIfChanged(\n canvas.style,\n `height`,\n `${Math.floor(canvasHeight)}px`,\n )\n}\n","import {\n DocumentRenderer,\n injectCSSToFrame,\n setAttributeIfChanged,\n setStylePropertyIfChanged,\n upsertCSSToFrame,\n waitForFrameLoad,\n waitForFrameReady,\n waitForSwitch,\n} from \"@prose-reader/core\"\nimport {\n type PDFPageProxy,\n RenderingCancelledException,\n type RenderTask,\n TextLayer,\n} from \"pdfjs-dist\"\nimport {\n catchError,\n EMPTY,\n from,\n map,\n type Observable,\n of,\n switchMap,\n tap,\n} from \"rxjs\"\nimport pdfFrameStyle from \"./frame.css?inline\"\nimport { layoutCanvas, layoutContainer } from \"./layout\"\n\nconst pdfScaleStyle = `:root {\n --scale-factor: 1;\n --user-unit: 1;\n --total-scale-factor: calc(var(--scale-factor) * var(--user-unit));\n --scale-round-x: 1px;\n --scale-round-y: 1px;\n}`\n\nexport class PdfRenderer extends DocumentRenderer {\n private pageProxy: PDFPageProxy | undefined\n private renderTask: RenderTask | undefined\n private textLayer: TextLayer | undefined\n\n constructor(\n private pdfViewerStyle: string,\n params: ConstructorParameters<typeof DocumentRenderer>[0],\n ) {\n super(params)\n }\n\n private getCanvas() {\n const element = this.documentContainer?.children[0]\n\n if (!(element instanceof HTMLCanvasElement)) return\n\n return element\n }\n\n private getFrameElement() {\n const frame = this.documentContainer?.children[1].children[0]\n\n if (!(frame instanceof HTMLIFrameElement)) return\n\n return frame\n }\n\n private getPageProxy() {\n if (this.pageProxy) return of(this.pageProxy)\n\n return from(this.resourcesHandler.fetchResource()).pipe(\n switchMap((resource) => {\n if (!(\"custom\" in resource)) return EMPTY\n\n this.pageProxy = resource.data as PDFPageProxy\n\n return of(this.pageProxy)\n }),\n )\n }\n\n onUnload(): Observable<unknown> {\n this.detach()\n\n if (this.renderTask) {\n this.renderTask.cancel()\n }\n\n this.textLayer?.cancel()\n this.pageProxy?.cleanup()\n\n return EMPTY\n }\n\n onCreateDocument(): Observable<HTMLElement> {\n const frameElement = document.createElement(`iframe`)\n frameElement.style.cssText = `\n overflow: hidden;\n height: 100%;\n width: 100%;\n `\n\n frameElement.setAttribute(\"tabIndex\", \"0\")\n frameElement.setAttribute(\"frameBorder\", \"0\")\n frameElement.setAttribute(`src`, \"about:blank\")\n\n const frameContainer =\n this.containerElement.ownerDocument.createElement(\"div\")\n frameContainer.style.cssText = `\n mix-blend-mode: multiply;\n -webkit-transform: translateZ(0);\n transform: translateZ(0);\n position: absolute;\n height: 100%;\n width: 100%;\n top: 0;\n `\n\n /**\n * The canvas is never attached to the DOM and will be used for offscreen rendering\n * then copied into the frame.\n */\n const canvas = this.containerElement.ownerDocument.createElement(\"canvas\")\n\n frameContainer.appendChild(frameElement)\n\n const rootElement = this.containerElement.ownerDocument.createElement(`div`)\n rootElement.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: center;\n `\n\n rootElement.appendChild(canvas)\n rootElement.appendChild(frameContainer)\n\n this.setDocumentContainer(rootElement)\n\n return of(rootElement)\n }\n\n onLoadDocument(): Observable<unknown> {\n return this.getPageProxy().pipe(\n switchMap(() => {\n const frameElement = this.getFrameElement()\n const pageProxy = this.pageProxy\n\n if (!frameElement || !pageProxy) return EMPTY\n\n return of(frameElement).pipe(\n waitForSwitch(this.context.bridgeEvent.viewportFree$),\n tap(() => {\n this.attach()\n }),\n waitForFrameLoad,\n switchMap(() => {\n injectCSSToFrame(\n frameElement,\n \"pdfjs-viewer-style\",\n this.pdfViewerStyle,\n )\n injectCSSToFrame(frameElement, \"enhancer-pdf-style\", pdfFrameStyle)\n upsertCSSToFrame(frameElement, \"pdf-scale-scale\", pdfScaleStyle)\n\n /**\n * We make sure to render the text layer to simulate the document being loaded.\n * It will be correctly re-layout later. Consumers looking for document load have at least\n * the actual text document ready. (cfi lookup, etc.)\n */\n const frameBody = frameElement.contentDocument?.body\n\n if (!frameBody || !this.pageProxy) return EMPTY\n\n setAttributeIfChanged(frameBody, \"class\", \"textLayer\")\n\n this.textLayer = new TextLayer({\n container: frameBody,\n textContentSource: this.pageProxy.streamTextContent(),\n viewport: this.pageProxy.getViewport({ scale: 1 }),\n })\n\n return from(this.textLayer.render())\n }),\n waitForFrameReady,\n )\n }),\n )\n }\n\n onLayout({\n spreadPosition,\n }: {\n minPageSpread: number\n blankPagePosition: `before` | `after` | `none`\n spreadPosition: `none` | `left` | `right`\n }) {\n const frameElement = this.getFrameElement()\n const canvas = this.getCanvas()\n\n if (!frameElement || !canvas) return of(undefined)\n\n // first we try to get the desired viewport for a comfortable reading based on the current page size\n const { height: pageHeight, width: pageWidth } = this.viewport.pageSize\n\n layoutContainer(this.documentContainer, spreadPosition, this.viewport)\n\n const context = canvas.getContext(\"2d\")\n // Support HiDPI-screens.\n const pixelRatioScale = window.devicePixelRatio || 1\n\n if (!this.pageProxy || !context) return of(undefined)\n\n if (this.renderTask) {\n this.renderTask.cancel()\n this.renderTask = undefined\n }\n\n layoutCanvas(this.pageProxy, canvas, this.viewport)\n\n const { width: viewportWidth, height: viewportHeight } =\n this.pageProxy.getViewport({ scale: 1 })\n\n const pageScale = Math.max(\n pageWidth / viewportWidth,\n pageHeight / viewportHeight,\n )\n\n // then we generate the viewport for the canvas based on the page scale\n const viewport = this.pageProxy.getViewport({ scale: pageScale })\n\n const transform =\n pixelRatioScale !== 1\n ? [pixelRatioScale, 0, 0, pixelRatioScale, 0, 0]\n : null\n\n this.renderTask = this.pageProxy.render({\n ...(transform && { transform }),\n canvasContext: context,\n viewport,\n canvas,\n })\n\n return from(this.renderTask.promise).pipe(\n switchMap(() => {\n this.renderTask = undefined\n\n const frameDoc = frameElement?.contentDocument\n const pdfPage = this.pageProxy\n\n if (!frameDoc || !frameElement || !pdfPage || !this.textLayer) {\n throw new Error(\"Unable to update text layer due to missing elements\")\n }\n\n const textLayerElement = frameDoc.body\n const canvasScale = canvas.clientWidth / viewportWidth\n\n setStylePropertyIfChanged(\n textLayerElement.style,\n `top`,\n `${canvas.offsetTop}px`,\n )\n setStylePropertyIfChanged(\n textLayerElement.style,\n `left`,\n `${canvas.offsetLeft}px`,\n )\n setStylePropertyIfChanged(\n textLayerElement.style,\n `height`,\n canvas.style.height,\n )\n setStylePropertyIfChanged(\n textLayerElement.style,\n `width`,\n canvas.style.width,\n )\n\n /**\n * Taking inspiration from https://github.com/mozilla/pdf.js/blob/master/web/pdf_viewer.css.\n * Not sure why pdfjs DOES rely on css from the viewer to works. Or in another words, why is it\n * not more obvious that TextLayer requires a set of variables to work correctly.\n */\n setStylePropertyIfChanged(\n frameDoc.documentElement.style,\n `--scale-factor`,\n `${canvasScale}`,\n )\n\n this.textLayer.update({\n viewport,\n })\n\n return of(undefined)\n }),\n catchError((e) => {\n if (!(e instanceof RenderingCancelledException)) console.error(e)\n\n return of(undefined)\n }),\n )\n }\n\n /**\n * @important\n * We should keep the same node structure to preserve CFI integrity.\n */\n onRenderHeadless() {\n return this.getPageProxy().pipe(\n switchMap((pageProxy) => {\n const headlessDocument = document.implementation.createHTMLDocument()\n const textLayerElement = headlessDocument.body\n\n const textLayer = new TextLayer({\n container: textLayerElement,\n textContentSource: pageProxy.streamTextContent(),\n viewport: pageProxy.getViewport({ scale: 1 }),\n })\n\n return from(textLayer.render()).pipe(map(() => headlessDocument))\n }),\n )\n }\n\n getDocumentFrame() {\n return this.getFrameElement()\n }\n}\n","import type { createReader, Reader } from \"@prose-reader/core\"\nimport { from, map, mergeMap, of } from \"rxjs\"\nimport { isPdfJsArchive } from \"./createArchiveFromPdf\"\nimport { PdfRenderer } from \"./renderer/PdfRenderer\"\nimport type { EnhancerOptions } from \"./types\"\n\ntype CreateReader = typeof createReader\ntype CreateReaderOptions = Parameters<CreateReader>[0]\n\nexport const pdfEnhancer =\n <InheritOptions extends CreateReaderOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions & EnhancerOptions): InheritOutput => {\n const reader = next({\n ...options,\n /**\n * We have a special renderer for pdf so we need to inject it\n * for the relevant items. The enhancer could be configurable but for\n * the sake of simplicity we will assume that an item ending with .pdf should\n * be treated as a pdf document.\n *\n * The `getRenderer` hook should be non destructive, if we detect a renderer already\n * setup we should return it.\n */\n getRenderer(item) {\n const maybeFactory = options.getRenderer?.(item)\n\n if (!maybeFactory && item.href.endsWith(`.pdf`)) {\n return (params) =>\n new PdfRenderer(options.pdf.pdfjsViewerInlineCss, params)\n }\n\n return maybeFactory\n },\n getResource: (item) =>\n options.pdf.getArchiveForItem(item).pipe(\n mergeMap((archive) => {\n if (!archive) return of(undefined)\n\n if (!isPdfJsArchive(archive)) {\n console.warn(`You provided an invalid pdf archive`)\n\n return of(undefined)\n }\n\n // we account for opf file\n const fileIndex =\n archive.records.findIndex((file) =>\n item.href.endsWith(file.uri),\n ) - 1\n\n return from(archive.proxyDocument.getPage(fileIndex + 1)).pipe(\n map((pageProxy) => ({\n custom: true as const,\n data: pageProxy,\n })),\n )\n }),\n ),\n })\n\n return reader\n }\n"],"names":[],"mappings":"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"}
|
package/dist/index.umd.cjs
CHANGED
|
@@ -83,14 +83,14 @@
|
|
|
83
83
|
const layoutContainer = (container, spreadPosition, viewport) => {
|
|
84
84
|
if (!container) return;
|
|
85
85
|
const { height: pageHeight, width: pageWidth } = viewport.pageSize;
|
|
86
|
-
container.style
|
|
87
|
-
container.style
|
|
86
|
+
core.setStylePropertyIfChanged(container.style, `width`, `${pageWidth}px`);
|
|
87
|
+
core.setStylePropertyIfChanged(container.style, `height`, `${pageHeight}px`);
|
|
88
88
|
if (spreadPosition === `right`) {
|
|
89
|
-
container.style
|
|
89
|
+
core.setStylePropertyIfChanged(container.style, `justify-content`, `flex-start`);
|
|
90
90
|
} else if (spreadPosition === `left`) {
|
|
91
|
-
container.style
|
|
91
|
+
core.setStylePropertyIfChanged(container.style, `justify-content`, `flex-end`);
|
|
92
92
|
} else {
|
|
93
|
-
container.style
|
|
93
|
+
core.setStylePropertyIfChanged(container.style, `justify-content`, `center`);
|
|
94
94
|
}
|
|
95
95
|
};
|
|
96
96
|
const layoutCanvas = (pageProxy, canvas, readerViewport) => {
|
|
@@ -107,12 +107,35 @@
|
|
|
107
107
|
const isWiderThanPage = viewportRatio > pageRatio;
|
|
108
108
|
const canvasWidth = isWiderThanPage ? pageWidth : pageHeight * viewportRatio;
|
|
109
109
|
const canvasHeight = viewportRatio > pageRatio ? pageWidth / viewportRatio : pageHeight;
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
110
|
+
core.setPropertyIfChanged(
|
|
111
|
+
canvas,
|
|
112
|
+
`width`,
|
|
113
|
+
Math.floor(viewport.width * pixelRatioScale)
|
|
114
|
+
);
|
|
115
|
+
core.setPropertyIfChanged(
|
|
116
|
+
canvas,
|
|
117
|
+
`height`,
|
|
118
|
+
Math.floor(viewport.height * pixelRatioScale)
|
|
119
|
+
);
|
|
120
|
+
core.setStylePropertyIfChanged(
|
|
121
|
+
canvas.style,
|
|
122
|
+
`width`,
|
|
123
|
+
`${Math.floor(canvasWidth)}px`
|
|
124
|
+
);
|
|
125
|
+
core.setStylePropertyIfChanged(
|
|
126
|
+
canvas.style,
|
|
127
|
+
`height`,
|
|
128
|
+
`${Math.floor(canvasHeight)}px`
|
|
129
|
+
);
|
|
114
130
|
};
|
|
115
131
|
|
|
132
|
+
const pdfScaleStyle = `:root {
|
|
133
|
+
--scale-factor: 1;
|
|
134
|
+
--user-unit: 1;
|
|
135
|
+
--total-scale-factor: calc(var(--scale-factor) * var(--user-unit));
|
|
136
|
+
--scale-round-x: 1px;
|
|
137
|
+
--scale-round-y: 1px;
|
|
138
|
+
}`;
|
|
116
139
|
class PdfRenderer extends core.DocumentRenderer {
|
|
117
140
|
constructor(pdfViewerStyle, params) {
|
|
118
141
|
super(params);
|
|
@@ -203,9 +226,10 @@
|
|
|
203
226
|
this.pdfViewerStyle
|
|
204
227
|
);
|
|
205
228
|
core.injectCSSToFrame(frameElement, "enhancer-pdf-style", pdfFrameStyle);
|
|
229
|
+
core.upsertCSSToFrame(frameElement, "pdf-scale-scale", pdfScaleStyle);
|
|
206
230
|
const frameBody = frameElement.contentDocument?.body;
|
|
207
231
|
if (!frameBody || !this.pageProxy) return rxjs.EMPTY;
|
|
208
|
-
|
|
232
|
+
core.setAttributeIfChanged(frameBody, "class", "textLayer");
|
|
209
233
|
this.textLayer = new pdfjsLib.TextLayer({
|
|
210
234
|
container: frameBody,
|
|
211
235
|
textContentSource: this.pageProxy.streamTextContent(),
|
|
@@ -257,21 +281,30 @@
|
|
|
257
281
|
}
|
|
258
282
|
const textLayerElement = frameDoc.body;
|
|
259
283
|
const canvasScale = canvas.clientWidth / viewportWidth;
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
core.
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
284
|
+
core.setStylePropertyIfChanged(
|
|
285
|
+
textLayerElement.style,
|
|
286
|
+
`top`,
|
|
287
|
+
`${canvas.offsetTop}px`
|
|
288
|
+
);
|
|
289
|
+
core.setStylePropertyIfChanged(
|
|
290
|
+
textLayerElement.style,
|
|
291
|
+
`left`,
|
|
292
|
+
`${canvas.offsetLeft}px`
|
|
293
|
+
);
|
|
294
|
+
core.setStylePropertyIfChanged(
|
|
295
|
+
textLayerElement.style,
|
|
296
|
+
`height`,
|
|
297
|
+
canvas.style.height
|
|
298
|
+
);
|
|
299
|
+
core.setStylePropertyIfChanged(
|
|
300
|
+
textLayerElement.style,
|
|
301
|
+
`width`,
|
|
302
|
+
canvas.style.width
|
|
303
|
+
);
|
|
304
|
+
core.setStylePropertyIfChanged(
|
|
305
|
+
frameDoc.documentElement.style,
|
|
306
|
+
`--scale-factor`,
|
|
307
|
+
`${canvasScale}`
|
|
275
308
|
);
|
|
276
309
|
this.textLayer.update({
|
|
277
310
|
viewport
|
package/dist/index.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.cjs","sources":["../src/createArchiveFromPdf.ts","../src/renderer/layout.ts","../src/renderer/PdfRenderer.ts","../src/pdfEnhancer.ts"],"sourcesContent":["import type { Archive } from \"@prose-reader/streamer\"\nimport * as pdfjsLib from \"pdfjs-dist\"\n\ntype PdfJsArchive = Archive & {\n _symbol: symbol\n proxyDocument: pdfjsLib.PDFDocumentProxy\n}\n\nconst PDF_SYMBOL = Symbol(`pdfjs`)\n\nexport const isPdfJsArchive = (archive: Archive): archive is PdfJsArchive =>\n \"_symbol\" in archive && archive._symbol === PDF_SYMBOL\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromPdf = async (\n file: Blob,\n filename: string,\n): Promise<Archive> => {\n const loadingTask = pdfjsLib.getDocument(await file.arrayBuffer())\n\n const pdf = await loadingTask.promise\n\n const pages = Array.from({ length: pdf.numPages })\n\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">pre-paginated</meta>\n </metadata>\n <manifest>\n ${pages.map((_, index) => `<item id=\"${index}\" href=\"${index}.pdf\" />`).join(`\\n`)}\n </manifest>\n <spine>\n ${pages.map((_, index) => `<itemref idref=\"${index}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const opfFile: Archive[`records`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n const archive = {\n filename,\n proxyDocument: pdf,\n _symbol: PDF_SYMBOL,\n records: [\n opfFile,\n ...pages.map((_, index) => ({\n dir: false,\n blob: async () => {\n throw new Error(\"Unable to get blob from pdf\")\n },\n basename: `${index}.pdf`,\n size: 0,\n string: () => {\n throw new Error(\"Unable to get blob from pdf\")\n },\n uri: `${index}.pdf`,\n })),\n ],\n close: () => {\n return pdf.cleanup()\n },\n } satisfies PdfJsArchive\n\n return archive as Archive\n}\n","import type { Viewport } from \"@prose-reader/core\"\nimport type { PDFPageProxy } from \"pdfjs-dist\"\n\nexport const layoutContainer = (\n container: HTMLElement | undefined,\n spreadPosition: `none` | `left` | `right`,\n viewport: Viewport,\n) => {\n if (!container) return\n\n // first we try to get the desired viewport for a comfortable reading based on theh current page size\n const { height: pageHeight, width: pageWidth } = viewport.pageSize\n\n container.style.width = `${pageWidth}px`\n container.style.height = `${pageHeight}px`\n\n if (spreadPosition === `right`) {\n container.style.justifyContent = `flex-start`\n } else if (spreadPosition === `left`) {\n container.style.justifyContent = `flex-end`\n } else {\n container.style.justifyContent = `center`\n }\n}\n\nexport const layoutCanvas = (\n pageProxy: PDFPageProxy,\n canvas: HTMLCanvasElement,\n readerViewport: Viewport,\n) => {\n // Support HiDPI-screens.\n const pixelRatioScale = window.devicePixelRatio || 1\n const { height: pageHeight, width: pageWidth } = readerViewport.pageSize\n const { width: viewportWidth, height: viewportHeight } =\n pageProxy.getViewport({ scale: 1 })\n const pageScale = Math.max(\n pageWidth / viewportWidth,\n pageHeight / viewportHeight,\n )\n\n // then we generate the viewport for the canvas based on the page scale\n const viewport = pageProxy.getViewport({ scale: pageScale })\n\n // Then we define which axis should stretch or shrink to ratio\n const viewportRatio = viewport.width / viewport.height\n const pageRatio = pageWidth / pageHeight\n const isWiderThanPage = viewportRatio > pageRatio\n const canvasWidth = isWiderThanPage ? pageWidth : pageHeight * viewportRatio\n const canvasHeight =\n viewportRatio > pageRatio ? pageWidth / viewportRatio : pageHeight\n\n canvas.width = Math.floor(viewport.width * pixelRatioScale)\n canvas.height = Math.floor(viewport.height * pixelRatioScale)\n canvas.style.width = `${Math.floor(canvasWidth)}px`\n canvas.style.height = `${Math.floor(canvasHeight)}px`\n}\n","import {\n DocumentRenderer,\n injectCSSToFrame,\n removeCSS,\n waitForFrameLoad,\n waitForFrameReady,\n waitForSwitch,\n} from \"@prose-reader/core\"\nimport {\n type PDFPageProxy,\n RenderingCancelledException,\n type RenderTask,\n TextLayer,\n} from \"pdfjs-dist\"\nimport {\n catchError,\n EMPTY,\n from,\n map,\n type Observable,\n of,\n switchMap,\n tap,\n} from \"rxjs\"\nimport pdfFrameStyle from \"./frame.css?inline\"\nimport { layoutCanvas, layoutContainer } from \"./layout\"\n\nexport class PdfRenderer extends DocumentRenderer {\n private pageProxy: PDFPageProxy | undefined\n private renderTask: RenderTask | undefined\n private textLayer: TextLayer | undefined\n\n constructor(\n private pdfViewerStyle: string,\n params: ConstructorParameters<typeof DocumentRenderer>[0],\n ) {\n super(params)\n }\n\n private getCanvas() {\n const element = this.documentContainer?.children[0]\n\n if (!(element instanceof HTMLCanvasElement)) return\n\n return element\n }\n\n private getFrameElement() {\n const frame = this.documentContainer?.children[1].children[0]\n\n if (!(frame instanceof HTMLIFrameElement)) return\n\n return frame\n }\n\n private getPageProxy() {\n if (this.pageProxy) return of(this.pageProxy)\n\n return from(this.resourcesHandler.fetchResource()).pipe(\n switchMap((resource) => {\n if (!(\"custom\" in resource)) return EMPTY\n\n this.pageProxy = resource.data as PDFPageProxy\n\n return of(this.pageProxy)\n }),\n )\n }\n\n onUnload(): Observable<unknown> {\n this.detach()\n\n if (this.renderTask) {\n this.renderTask.cancel()\n }\n\n this.textLayer?.cancel()\n this.pageProxy?.cleanup()\n\n return EMPTY\n }\n\n onCreateDocument(): Observable<HTMLElement> {\n const frameElement = document.createElement(`iframe`)\n frameElement.style.cssText = `\n overflow: hidden;\n height: 100%;\n width: 100%;\n `\n\n frameElement.setAttribute(\"tabIndex\", \"0\")\n frameElement.setAttribute(\"frameBorder\", \"0\")\n frameElement.setAttribute(`src`, \"about:blank\")\n\n const frameContainer =\n this.containerElement.ownerDocument.createElement(\"div\")\n frameContainer.style.cssText = `\n mix-blend-mode: multiply;\n -webkit-transform: translateZ(0);\n transform: translateZ(0);\n position: absolute;\n height: 100%;\n width: 100%;\n top: 0;\n `\n\n /**\n * The canvas is never attached to the DOM and will be used for offscreen rendering\n * then copied into the frame.\n */\n const canvas = this.containerElement.ownerDocument.createElement(\"canvas\")\n\n frameContainer.appendChild(frameElement)\n\n const rootElement = this.containerElement.ownerDocument.createElement(`div`)\n rootElement.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: center;\n `\n\n rootElement.appendChild(canvas)\n rootElement.appendChild(frameContainer)\n\n this.setDocumentContainer(rootElement)\n\n return of(rootElement)\n }\n\n onLoadDocument(): Observable<unknown> {\n return this.getPageProxy().pipe(\n switchMap(() => {\n const frameElement = this.getFrameElement()\n const pageProxy = this.pageProxy\n\n if (!frameElement || !pageProxy) return EMPTY\n\n return of(frameElement).pipe(\n waitForSwitch(this.context.bridgeEvent.viewportFree$),\n tap(() => {\n this.attach()\n }),\n waitForFrameLoad,\n switchMap(() => {\n injectCSSToFrame(\n frameElement,\n \"pdfjs-viewer-style\",\n this.pdfViewerStyle,\n )\n injectCSSToFrame(frameElement, \"enhancer-pdf-style\", pdfFrameStyle)\n\n /**\n * We make sure to render the text layer to simulate the document being loaded.\n * It will be correctly re-layout later. Consumers looking for document load have at least\n * the actual text document ready. (cfi lookup, etc.)\n */\n const frameBody = frameElement.contentDocument?.body\n\n if (!frameBody || !this.pageProxy) return EMPTY\n\n frameBody.setAttribute(\"class\", \"textLayer\")\n\n this.textLayer = new TextLayer({\n container: frameBody,\n textContentSource: this.pageProxy.streamTextContent(),\n viewport: this.pageProxy.getViewport({ scale: 1 }),\n })\n\n return from(this.textLayer.render())\n }),\n waitForFrameReady,\n )\n }),\n )\n }\n\n onLayout({\n spreadPosition,\n }: {\n minPageSpread: number\n blankPagePosition: `before` | `after` | `none`\n spreadPosition: `none` | `left` | `right`\n }) {\n const frameElement = this.getFrameElement()\n const canvas = this.getCanvas()\n\n if (!frameElement || !canvas) return of(undefined)\n\n // first we try to get the desired viewport for a comfortable reading based on the current page size\n const { height: pageHeight, width: pageWidth } = this.viewport.pageSize\n\n layoutContainer(this.documentContainer, spreadPosition, this.viewport)\n\n const context = canvas.getContext(\"2d\")\n // Support HiDPI-screens.\n const pixelRatioScale = window.devicePixelRatio || 1\n\n if (!this.pageProxy || !context) return of(undefined)\n\n if (this.renderTask) {\n this.renderTask.cancel()\n this.renderTask = undefined\n }\n\n layoutCanvas(this.pageProxy, canvas, this.viewport)\n\n const { width: viewportWidth, height: viewportHeight } =\n this.pageProxy.getViewport({ scale: 1 })\n\n const pageScale = Math.max(\n pageWidth / viewportWidth,\n pageHeight / viewportHeight,\n )\n\n // then we generate the viewport for the canvas based on the page scale\n const viewport = this.pageProxy.getViewport({ scale: pageScale })\n\n const transform =\n pixelRatioScale !== 1\n ? [pixelRatioScale, 0, 0, pixelRatioScale, 0, 0]\n : null\n\n this.renderTask = this.pageProxy.render({\n ...(transform && { transform }),\n canvasContext: context,\n viewport,\n canvas,\n })\n\n return from(this.renderTask.promise).pipe(\n switchMap(() => {\n this.renderTask = undefined\n\n const frameDoc = frameElement?.contentDocument\n const pdfPage = this.pageProxy\n\n if (!frameDoc || !frameElement || !pdfPage || !this.textLayer) {\n throw new Error(\"Unable to update text layer due to missing elements\")\n }\n\n const textLayerElement = frameDoc.body\n const canvasScale = canvas.clientWidth / viewportWidth\n\n textLayerElement.style.top = `${canvas.offsetTop}px`\n textLayerElement.style.left = `${canvas.offsetLeft}px`\n textLayerElement.style.height = canvas.style.height\n textLayerElement.style.width = canvas.style.width\n\n removeCSS(frameElement, \"pdf-scale-scale\")\n /**\n * Taking inspiration from https://github.com/mozilla/pdf.js/blob/master/web/pdf_viewer.css.\n * Not sure why pdfjs DOES rely on css from the viewer to works. Or in another words, why is it\n * not more obvious that TextLayer requires a set of variables to work correctly.\n */\n injectCSSToFrame(\n frameElement,\n \"pdf-scale-scale\",\n `:root {\n --scale-factor: ${canvasScale};\n --user-unit: 1; \n --total-scale-factor: calc(var(--scale-factor) * var(--user-unit));\n --scale-round-x: 1px;\n --scale-round-y: 1px;\n }`,\n )\n\n this.textLayer.update({\n viewport,\n })\n\n return of(undefined)\n }),\n catchError((e) => {\n if (!(e instanceof RenderingCancelledException)) console.error(e)\n\n return of(undefined)\n }),\n )\n }\n\n /**\n * @important\n * We should keep the same node structure to preserve CFI integrity.\n */\n onRenderHeadless() {\n return this.getPageProxy().pipe(\n switchMap((pageProxy) => {\n const headlessDocument = document.implementation.createHTMLDocument()\n const textLayerElement = headlessDocument.body\n\n const textLayer = new TextLayer({\n container: textLayerElement,\n textContentSource: pageProxy.streamTextContent(),\n viewport: pageProxy.getViewport({ scale: 1 }),\n })\n\n return from(textLayer.render()).pipe(map(() => headlessDocument))\n }),\n )\n }\n\n getDocumentFrame() {\n return this.getFrameElement()\n }\n}\n","import type { createReader, Reader } from \"@prose-reader/core\"\nimport { from, map, mergeMap, of } from \"rxjs\"\nimport { isPdfJsArchive } from \"./createArchiveFromPdf\"\nimport { PdfRenderer } from \"./renderer/PdfRenderer\"\nimport type { EnhancerOptions } from \"./types\"\n\ntype CreateReader = typeof createReader\ntype CreateReaderOptions = Parameters<CreateReader>[0]\n\nexport const pdfEnhancer =\n <InheritOptions extends CreateReaderOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions & EnhancerOptions): InheritOutput => {\n const reader = next({\n ...options,\n /**\n * We have a special renderer for pdf so we need to inject it\n * for the relevant items. The enhancer could be configurable but for\n * the sake of simplicity we will assume that an item ending with .pdf should\n * be treated as a pdf document.\n *\n * The `getRenderer` hook should be non destructive, if we detect a renderer already\n * setup we should return it.\n */\n getRenderer(item) {\n const maybeFactory = options.getRenderer?.(item)\n\n if (!maybeFactory && item.href.endsWith(`.pdf`)) {\n return (params) =>\n new PdfRenderer(options.pdf.pdfjsViewerInlineCss, params)\n }\n\n return maybeFactory\n },\n getResource: (item) =>\n options.pdf.getArchiveForItem(item).pipe(\n mergeMap((archive) => {\n if (!archive) return of(undefined)\n\n if (!isPdfJsArchive(archive)) {\n console.warn(`You provided an invalid pdf archive`)\n\n return of(undefined)\n }\n\n // we account for opf file\n const fileIndex =\n archive.records.findIndex((file) =>\n item.href.endsWith(file.uri),\n ) - 1\n\n return from(archive.proxyDocument.getPage(fileIndex + 1)).pipe(\n map((pageProxy) => ({\n custom: true as const,\n data: pageProxy,\n })),\n )\n }),\n ),\n })\n\n return reader\n }\n"],"names":["pdfjsLib","DocumentRenderer","of","from","switchMap","EMPTY","waitForSwitch","tap","waitForFrameLoad","injectCSSToFrame","TextLayer","waitForFrameReady","removeCSS","catchError","RenderingCancelledException","map","mergeMap"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.cjs","sources":["../src/createArchiveFromPdf.ts","../src/renderer/layout.ts","../src/renderer/PdfRenderer.ts","../src/pdfEnhancer.ts"],"sourcesContent":["import type { Archive } from \"@prose-reader/streamer\"\nimport * as pdfjsLib from \"pdfjs-dist\"\n\ntype PdfJsArchive = Archive & {\n _symbol: symbol\n proxyDocument: pdfjsLib.PDFDocumentProxy\n}\n\nconst PDF_SYMBOL = Symbol(`pdfjs`)\n\nexport const isPdfJsArchive = (archive: Archive): archive is PdfJsArchive =>\n \"_symbol\" in archive && archive._symbol === PDF_SYMBOL\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromPdf = async (\n file: Blob,\n filename: string,\n): Promise<Archive> => {\n const loadingTask = pdfjsLib.getDocument(await file.arrayBuffer())\n\n const pdf = await loadingTask.promise\n\n const pages = Array.from({ length: pdf.numPages })\n\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">pre-paginated</meta>\n </metadata>\n <manifest>\n ${pages.map((_, index) => `<item id=\"${index}\" href=\"${index}.pdf\" />`).join(`\\n`)}\n </manifest>\n <spine>\n ${pages.map((_, index) => `<itemref idref=\"${index}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const opfFile: Archive[`records`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n const archive = {\n filename,\n proxyDocument: pdf,\n _symbol: PDF_SYMBOL,\n records: [\n opfFile,\n ...pages.map((_, index) => ({\n dir: false,\n blob: async () => {\n throw new Error(\"Unable to get blob from pdf\")\n },\n basename: `${index}.pdf`,\n size: 0,\n string: () => {\n throw new Error(\"Unable to get blob from pdf\")\n },\n uri: `${index}.pdf`,\n })),\n ],\n close: () => {\n return pdf.cleanup()\n },\n } satisfies PdfJsArchive\n\n return archive as Archive\n}\n","import {\n setPropertyIfChanged,\n setStylePropertyIfChanged,\n type Viewport,\n} from \"@prose-reader/core\"\nimport type { PDFPageProxy } from \"pdfjs-dist\"\n\nexport const layoutContainer = (\n container: HTMLElement | undefined,\n spreadPosition: `none` | `left` | `right`,\n viewport: Viewport,\n) => {\n if (!container) return\n\n // first we try to get the desired viewport for a comfortable reading based on theh current page size\n const { height: pageHeight, width: pageWidth } = viewport.pageSize\n\n setStylePropertyIfChanged(container.style, `width`, `${pageWidth}px`)\n setStylePropertyIfChanged(container.style, `height`, `${pageHeight}px`)\n\n if (spreadPosition === `right`) {\n setStylePropertyIfChanged(container.style, `justify-content`, `flex-start`)\n } else if (spreadPosition === `left`) {\n setStylePropertyIfChanged(container.style, `justify-content`, `flex-end`)\n } else {\n setStylePropertyIfChanged(container.style, `justify-content`, `center`)\n }\n}\n\nexport const layoutCanvas = (\n pageProxy: PDFPageProxy,\n canvas: HTMLCanvasElement,\n readerViewport: Viewport,\n) => {\n // Support HiDPI-screens.\n const pixelRatioScale = window.devicePixelRatio || 1\n const { height: pageHeight, width: pageWidth } = readerViewport.pageSize\n const { width: viewportWidth, height: viewportHeight } =\n pageProxy.getViewport({ scale: 1 })\n const pageScale = Math.max(\n pageWidth / viewportWidth,\n pageHeight / viewportHeight,\n )\n\n // then we generate the viewport for the canvas based on the page scale\n const viewport = pageProxy.getViewport({ scale: pageScale })\n\n // Then we define which axis should stretch or shrink to ratio\n const viewportRatio = viewport.width / viewport.height\n const pageRatio = pageWidth / pageHeight\n const isWiderThanPage = viewportRatio > pageRatio\n const canvasWidth = isWiderThanPage ? pageWidth : pageHeight * viewportRatio\n const canvasHeight =\n viewportRatio > pageRatio ? pageWidth / viewportRatio : pageHeight\n\n setPropertyIfChanged(\n canvas,\n `width`,\n Math.floor(viewport.width * pixelRatioScale),\n )\n setPropertyIfChanged(\n canvas,\n `height`,\n Math.floor(viewport.height * pixelRatioScale),\n )\n setStylePropertyIfChanged(\n canvas.style,\n `width`,\n `${Math.floor(canvasWidth)}px`,\n )\n setStylePropertyIfChanged(\n canvas.style,\n `height`,\n `${Math.floor(canvasHeight)}px`,\n )\n}\n","import {\n DocumentRenderer,\n injectCSSToFrame,\n setAttributeIfChanged,\n setStylePropertyIfChanged,\n upsertCSSToFrame,\n waitForFrameLoad,\n waitForFrameReady,\n waitForSwitch,\n} from \"@prose-reader/core\"\nimport {\n type PDFPageProxy,\n RenderingCancelledException,\n type RenderTask,\n TextLayer,\n} from \"pdfjs-dist\"\nimport {\n catchError,\n EMPTY,\n from,\n map,\n type Observable,\n of,\n switchMap,\n tap,\n} from \"rxjs\"\nimport pdfFrameStyle from \"./frame.css?inline\"\nimport { layoutCanvas, layoutContainer } from \"./layout\"\n\nconst pdfScaleStyle = `:root {\n --scale-factor: 1;\n --user-unit: 1;\n --total-scale-factor: calc(var(--scale-factor) * var(--user-unit));\n --scale-round-x: 1px;\n --scale-round-y: 1px;\n}`\n\nexport class PdfRenderer extends DocumentRenderer {\n private pageProxy: PDFPageProxy | undefined\n private renderTask: RenderTask | undefined\n private textLayer: TextLayer | undefined\n\n constructor(\n private pdfViewerStyle: string,\n params: ConstructorParameters<typeof DocumentRenderer>[0],\n ) {\n super(params)\n }\n\n private getCanvas() {\n const element = this.documentContainer?.children[0]\n\n if (!(element instanceof HTMLCanvasElement)) return\n\n return element\n }\n\n private getFrameElement() {\n const frame = this.documentContainer?.children[1].children[0]\n\n if (!(frame instanceof HTMLIFrameElement)) return\n\n return frame\n }\n\n private getPageProxy() {\n if (this.pageProxy) return of(this.pageProxy)\n\n return from(this.resourcesHandler.fetchResource()).pipe(\n switchMap((resource) => {\n if (!(\"custom\" in resource)) return EMPTY\n\n this.pageProxy = resource.data as PDFPageProxy\n\n return of(this.pageProxy)\n }),\n )\n }\n\n onUnload(): Observable<unknown> {\n this.detach()\n\n if (this.renderTask) {\n this.renderTask.cancel()\n }\n\n this.textLayer?.cancel()\n this.pageProxy?.cleanup()\n\n return EMPTY\n }\n\n onCreateDocument(): Observable<HTMLElement> {\n const frameElement = document.createElement(`iframe`)\n frameElement.style.cssText = `\n overflow: hidden;\n height: 100%;\n width: 100%;\n `\n\n frameElement.setAttribute(\"tabIndex\", \"0\")\n frameElement.setAttribute(\"frameBorder\", \"0\")\n frameElement.setAttribute(`src`, \"about:blank\")\n\n const frameContainer =\n this.containerElement.ownerDocument.createElement(\"div\")\n frameContainer.style.cssText = `\n mix-blend-mode: multiply;\n -webkit-transform: translateZ(0);\n transform: translateZ(0);\n position: absolute;\n height: 100%;\n width: 100%;\n top: 0;\n `\n\n /**\n * The canvas is never attached to the DOM and will be used for offscreen rendering\n * then copied into the frame.\n */\n const canvas = this.containerElement.ownerDocument.createElement(\"canvas\")\n\n frameContainer.appendChild(frameElement)\n\n const rootElement = this.containerElement.ownerDocument.createElement(`div`)\n rootElement.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: center;\n `\n\n rootElement.appendChild(canvas)\n rootElement.appendChild(frameContainer)\n\n this.setDocumentContainer(rootElement)\n\n return of(rootElement)\n }\n\n onLoadDocument(): Observable<unknown> {\n return this.getPageProxy().pipe(\n switchMap(() => {\n const frameElement = this.getFrameElement()\n const pageProxy = this.pageProxy\n\n if (!frameElement || !pageProxy) return EMPTY\n\n return of(frameElement).pipe(\n waitForSwitch(this.context.bridgeEvent.viewportFree$),\n tap(() => {\n this.attach()\n }),\n waitForFrameLoad,\n switchMap(() => {\n injectCSSToFrame(\n frameElement,\n \"pdfjs-viewer-style\",\n this.pdfViewerStyle,\n )\n injectCSSToFrame(frameElement, \"enhancer-pdf-style\", pdfFrameStyle)\n upsertCSSToFrame(frameElement, \"pdf-scale-scale\", pdfScaleStyle)\n\n /**\n * We make sure to render the text layer to simulate the document being loaded.\n * It will be correctly re-layout later. Consumers looking for document load have at least\n * the actual text document ready. (cfi lookup, etc.)\n */\n const frameBody = frameElement.contentDocument?.body\n\n if (!frameBody || !this.pageProxy) return EMPTY\n\n setAttributeIfChanged(frameBody, \"class\", \"textLayer\")\n\n this.textLayer = new TextLayer({\n container: frameBody,\n textContentSource: this.pageProxy.streamTextContent(),\n viewport: this.pageProxy.getViewport({ scale: 1 }),\n })\n\n return from(this.textLayer.render())\n }),\n waitForFrameReady,\n )\n }),\n )\n }\n\n onLayout({\n spreadPosition,\n }: {\n minPageSpread: number\n blankPagePosition: `before` | `after` | `none`\n spreadPosition: `none` | `left` | `right`\n }) {\n const frameElement = this.getFrameElement()\n const canvas = this.getCanvas()\n\n if (!frameElement || !canvas) return of(undefined)\n\n // first we try to get the desired viewport for a comfortable reading based on the current page size\n const { height: pageHeight, width: pageWidth } = this.viewport.pageSize\n\n layoutContainer(this.documentContainer, spreadPosition, this.viewport)\n\n const context = canvas.getContext(\"2d\")\n // Support HiDPI-screens.\n const pixelRatioScale = window.devicePixelRatio || 1\n\n if (!this.pageProxy || !context) return of(undefined)\n\n if (this.renderTask) {\n this.renderTask.cancel()\n this.renderTask = undefined\n }\n\n layoutCanvas(this.pageProxy, canvas, this.viewport)\n\n const { width: viewportWidth, height: viewportHeight } =\n this.pageProxy.getViewport({ scale: 1 })\n\n const pageScale = Math.max(\n pageWidth / viewportWidth,\n pageHeight / viewportHeight,\n )\n\n // then we generate the viewport for the canvas based on the page scale\n const viewport = this.pageProxy.getViewport({ scale: pageScale })\n\n const transform =\n pixelRatioScale !== 1\n ? [pixelRatioScale, 0, 0, pixelRatioScale, 0, 0]\n : null\n\n this.renderTask = this.pageProxy.render({\n ...(transform && { transform }),\n canvasContext: context,\n viewport,\n canvas,\n })\n\n return from(this.renderTask.promise).pipe(\n switchMap(() => {\n this.renderTask = undefined\n\n const frameDoc = frameElement?.contentDocument\n const pdfPage = this.pageProxy\n\n if (!frameDoc || !frameElement || !pdfPage || !this.textLayer) {\n throw new Error(\"Unable to update text layer due to missing elements\")\n }\n\n const textLayerElement = frameDoc.body\n const canvasScale = canvas.clientWidth / viewportWidth\n\n setStylePropertyIfChanged(\n textLayerElement.style,\n `top`,\n `${canvas.offsetTop}px`,\n )\n setStylePropertyIfChanged(\n textLayerElement.style,\n `left`,\n `${canvas.offsetLeft}px`,\n )\n setStylePropertyIfChanged(\n textLayerElement.style,\n `height`,\n canvas.style.height,\n )\n setStylePropertyIfChanged(\n textLayerElement.style,\n `width`,\n canvas.style.width,\n )\n\n /**\n * Taking inspiration from https://github.com/mozilla/pdf.js/blob/master/web/pdf_viewer.css.\n * Not sure why pdfjs DOES rely on css from the viewer to works. Or in another words, why is it\n * not more obvious that TextLayer requires a set of variables to work correctly.\n */\n setStylePropertyIfChanged(\n frameDoc.documentElement.style,\n `--scale-factor`,\n `${canvasScale}`,\n )\n\n this.textLayer.update({\n viewport,\n })\n\n return of(undefined)\n }),\n catchError((e) => {\n if (!(e instanceof RenderingCancelledException)) console.error(e)\n\n return of(undefined)\n }),\n )\n }\n\n /**\n * @important\n * We should keep the same node structure to preserve CFI integrity.\n */\n onRenderHeadless() {\n return this.getPageProxy().pipe(\n switchMap((pageProxy) => {\n const headlessDocument = document.implementation.createHTMLDocument()\n const textLayerElement = headlessDocument.body\n\n const textLayer = new TextLayer({\n container: textLayerElement,\n textContentSource: pageProxy.streamTextContent(),\n viewport: pageProxy.getViewport({ scale: 1 }),\n })\n\n return from(textLayer.render()).pipe(map(() => headlessDocument))\n }),\n )\n }\n\n getDocumentFrame() {\n return this.getFrameElement()\n }\n}\n","import type { createReader, Reader } from \"@prose-reader/core\"\nimport { from, map, mergeMap, of } from \"rxjs\"\nimport { isPdfJsArchive } from \"./createArchiveFromPdf\"\nimport { PdfRenderer } from \"./renderer/PdfRenderer\"\nimport type { EnhancerOptions } from \"./types\"\n\ntype CreateReader = typeof createReader\ntype CreateReaderOptions = Parameters<CreateReader>[0]\n\nexport const pdfEnhancer =\n <InheritOptions extends CreateReaderOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions & EnhancerOptions): InheritOutput => {\n const reader = next({\n ...options,\n /**\n * We have a special renderer for pdf so we need to inject it\n * for the relevant items. The enhancer could be configurable but for\n * the sake of simplicity we will assume that an item ending with .pdf should\n * be treated as a pdf document.\n *\n * The `getRenderer` hook should be non destructive, if we detect a renderer already\n * setup we should return it.\n */\n getRenderer(item) {\n const maybeFactory = options.getRenderer?.(item)\n\n if (!maybeFactory && item.href.endsWith(`.pdf`)) {\n return (params) =>\n new PdfRenderer(options.pdf.pdfjsViewerInlineCss, params)\n }\n\n return maybeFactory\n },\n getResource: (item) =>\n options.pdf.getArchiveForItem(item).pipe(\n mergeMap((archive) => {\n if (!archive) return of(undefined)\n\n if (!isPdfJsArchive(archive)) {\n console.warn(`You provided an invalid pdf archive`)\n\n return of(undefined)\n }\n\n // we account for opf file\n const fileIndex =\n archive.records.findIndex((file) =>\n item.href.endsWith(file.uri),\n ) - 1\n\n return from(archive.proxyDocument.getPage(fileIndex + 1)).pipe(\n map((pageProxy) => ({\n custom: true as const,\n data: pageProxy,\n })),\n )\n }),\n ),\n })\n\n return reader\n }\n"],"names":["pdfjsLib","setStylePropertyIfChanged","setPropertyIfChanged","DocumentRenderer","of","from","switchMap","EMPTY","waitForSwitch","tap","waitForFrameLoad","injectCSSToFrame","upsertCSSToFrame","setAttributeIfChanged","TextLayer","waitForFrameReady","catchError","RenderingCancelledException","map","mergeMap"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prose-reader/enhancer-pdf",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.297.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.umd.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -26,5 +26,5 @@
|
|
|
26
26
|
"pdfjs-dist": "5.x",
|
|
27
27
|
"rxjs": "*"
|
|
28
28
|
},
|
|
29
|
-
"gitHead": "
|
|
29
|
+
"gitHead": "28c3e3cc50036fc624fc48111e0461251026c177"
|
|
30
30
|
}
|