@prose-reader/enhancer-pdf 1.127.0 → 1.129.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 +46 -37
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +45 -36
- package/dist/index.umd.cjs.map +1 -1
- package/dist/renderer/PdfRenderer.d.ts +2 -5
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EMPTY, from, switchMap, of, tap,
|
|
1
|
+
import { EMPTY, from, switchMap, of, tap, map, catchError, finalize, mergeMap } from 'rxjs';
|
|
2
2
|
import * as pdfjsLib from 'pdfjs-dist';
|
|
3
3
|
import { TextLayer, RenderingCancelledException } from 'pdfjs-dist';
|
|
4
4
|
import { DocumentRenderer, waitForSwitch, injectCSS, waitForFrameReady, removeCSS } from '@prose-reader/core';
|
|
@@ -95,16 +95,20 @@ class PdfRenderer extends DocumentRenderer {
|
|
|
95
95
|
);
|
|
96
96
|
}
|
|
97
97
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
98
|
-
|
|
98
|
+
onLayout(_) {
|
|
99
|
+
const frameElement = this.getFrameElement();
|
|
100
|
+
if (!frameElement) return of(void 0);
|
|
99
101
|
const canvas = this.containerElement.ownerDocument.createElement("canvas");
|
|
100
102
|
const context = canvas?.getContext("2d");
|
|
101
103
|
const pixelRatioScale = window.devicePixelRatio || 1;
|
|
102
|
-
if (!this.pageProxy || !context) return void 0;
|
|
104
|
+
if (!this.pageProxy || !context) return of(void 0);
|
|
103
105
|
if (this.renderTask) {
|
|
104
106
|
this.renderTask.cancel();
|
|
105
107
|
this.renderTask = void 0;
|
|
106
108
|
}
|
|
107
109
|
const { height: pageHeight, width: pageWidth } = this.context.getPageSize();
|
|
110
|
+
frameElement.style.height = `${pageHeight}px`;
|
|
111
|
+
frameElement.style.width = `${pageWidth}px`;
|
|
108
112
|
const { width: viewportWidth, height: viewportHeight } = this.pageProxy.getViewport({ scale: 1 });
|
|
109
113
|
const pageScale = Math.max(pageWidth / viewportWidth, pageHeight / viewportHeight);
|
|
110
114
|
const viewport = this.pageProxy.getViewport({ scale: pageScale });
|
|
@@ -123,40 +127,45 @@ class PdfRenderer extends DocumentRenderer {
|
|
|
123
127
|
canvasContext: context,
|
|
124
128
|
viewport
|
|
125
129
|
});
|
|
126
|
-
this.renderTask?.promise.
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
this.textLayer
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
130
|
+
return from(this.renderTask?.promise).pipe(
|
|
131
|
+
map(() => {
|
|
132
|
+
const frameElement2 = this.getFrameElement();
|
|
133
|
+
const frameDoc = frameElement2?.contentDocument;
|
|
134
|
+
if (!frameDoc || !frameElement2) {
|
|
135
|
+
return void 0;
|
|
136
|
+
}
|
|
137
|
+
frameDoc.body.innerHTML = ``;
|
|
138
|
+
const frameCanvas = copyCanvasToFrame(canvas, frameDoc);
|
|
139
|
+
const pdfPage = this.pageProxy;
|
|
140
|
+
if (!pdfPage) return void 0;
|
|
141
|
+
const textLayerElement = frameDoc.createElement(`div`);
|
|
142
|
+
textLayerElement.setAttribute("class", "textLayer");
|
|
143
|
+
frameDoc.body.appendChild(textLayerElement);
|
|
144
|
+
const canvasScale = canvasWidth / viewportWidth;
|
|
145
|
+
textLayerElement.style.top = frameCanvas.offsetTop + "px";
|
|
146
|
+
textLayerElement.style.left = frameCanvas.offsetLeft + "px";
|
|
147
|
+
removeCSS(frameElement2, "pdf-scale-scale");
|
|
148
|
+
injectCSS(frameElement2, "pdf-scale-scale", `:root { --scale-factor: ${canvasScale}; }`);
|
|
149
|
+
if (this.textLayer) {
|
|
150
|
+
this.textLayer.cancel();
|
|
151
|
+
}
|
|
152
|
+
this.textLayer = new TextLayer({
|
|
153
|
+
container: textLayerElement,
|
|
154
|
+
textContentSource: pdfPage.streamTextContent(),
|
|
155
|
+
viewport
|
|
156
|
+
});
|
|
157
|
+
return from(this.textLayer.render());
|
|
158
|
+
}),
|
|
159
|
+
map(() => void 0),
|
|
160
|
+
catchError((e) => {
|
|
161
|
+
if (!(e instanceof RenderingCancelledException)) console.error(e);
|
|
162
|
+
return of(void 0);
|
|
163
|
+
}),
|
|
164
|
+
finalize(() => {
|
|
165
|
+
this.renderTask = void 0;
|
|
166
|
+
canvas.remove();
|
|
167
|
+
})
|
|
168
|
+
);
|
|
160
169
|
}
|
|
161
170
|
}
|
|
162
171
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/renderer/frames.ts","../src/renderer/PdfRenderer.ts","../src/createArchiveFromPdf.ts","../src/pdfEnhancer.ts"],"sourcesContent":["export const createPdfFrameElement = () => {\n const frame = document.createElement(`iframe`)\n frame.tabIndex = 0\n frame.style.cssText = `\n overflow: hidden;\n height: 100%;\n width: 100%;\n padding: 0px;\n position: absolute;\n left: 0;\n top: 0;\n `\n\n frame.setAttribute(\"frameBorder\", \"0\")\n\n return frame\n}\n\nexport const copyCanvasToFrame = (canvas: HTMLCanvasElement, frameDoc: Document) => {\n // Create a new canvas in the iframe\n const iframeCanvas = frameDoc.createElement(\"canvas\")\n iframeCanvas.width = canvas.width\n iframeCanvas.height = canvas.height\n iframeCanvas.style.width = canvas.style.width\n iframeCanvas.style.height = canvas.style.height\n\n // Copy the content\n const ctx = iframeCanvas.getContext(\"2d\")\n if (ctx) {\n ctx.drawImage(canvas, 0, 0)\n }\n\n frameDoc.body.appendChild(iframeCanvas)\n\n return iframeCanvas\n}\n","import { EMPTY, from, Observable, of, switchMap, tap } from \"rxjs\"\nimport { PDFPageProxy, RenderingCancelledException, RenderTask, TextLayer } from \"pdfjs-dist\"\nimport { DocumentRenderer, injectCSS, removeCSS, waitForFrameReady, waitForSwitch } from \"@prose-reader/core\"\nimport { copyCanvasToFrame, createPdfFrameElement } from \"./frames\"\nimport pdfFrameStyle from \"./frame.css?inline\"\n\nexport class PdfRenderer extends DocumentRenderer {\n private pageProxy: PDFPageProxy | undefined\n private renderTask: RenderTask | undefined\n private textLayer: TextLayer | undefined\n private getFrameElement() {\n const frame = this.layers[0]?.element\n\n if (!(frame instanceof HTMLIFrameElement)) return\n\n return frame\n }\n\n constructor(\n private pdfViewerStyle: string,\n params: ConstructorParameters<typeof DocumentRenderer>[0],\n ) {\n super(params)\n }\n\n onUnload(): Observable<unknown> {\n this.layers.forEach(({ element }) => {\n element.remove()\n })\n\n this.layers = []\n\n if (this.renderTask) {\n this.renderTask.cancel()\n }\n this.textLayer?.cancel()\n this.pageProxy?.cleanup()\n\n return EMPTY\n }\n\n onCreateDocument(): Observable<unknown> {\n const frameElement = createPdfFrameElement()\n\n frameElement.setAttribute(`src`, \"about:blank\")\n\n this.layers = [\n {\n element: frameElement,\n },\n ]\n\n return EMPTY\n }\n\n onLoadDocument(): Observable<unknown> {\n return from(this.resourcesHandler.fetchResource()).pipe(\n switchMap((resource) => {\n if (!(\"custom\" in resource)) return EMPTY\n\n const pageProxy = resource.data as PDFPageProxy\n\n this.pageProxy = pageProxy\n\n const frameElement = this.getFrameElement()\n\n if (!frameElement) return EMPTY\n\n return of(frameElement).pipe(\n waitForSwitch(this.context.bridgeEvent.viewportFree$),\n tap(() => {\n this.containerElement.appendChild(frameElement)\n // frame will instantly load, no need to wait for event\n\n injectCSS(frameElement, \"pdfjs-viewer-style\", this.pdfViewerStyle)\n injectCSS(frameElement, \"enhancer-pdf-style\", pdfFrameStyle)\n\n const body = frameElement?.contentDocument?.body\n\n if (body) {\n const canvas = body.ownerDocument.createElement(`canvas`)\n\n body.appendChild(canvas)\n }\n }),\n waitForFrameReady,\n )\n }),\n )\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n layout(_: {\n minPageSpread: number\n blankPagePosition: `before` | `after` | `none`\n spreadPosition: `none` | `left` | `right`\n }): { width: number; height: number } | undefined {\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 const context = canvas?.getContext(\"2d\")\n // Support HiDPI-screens.\n const pixelRatioScale = window.devicePixelRatio || 1\n\n if (!this.pageProxy || !context) return undefined\n\n if (this.renderTask) {\n this.renderTask.cancel()\n this.renderTask = undefined\n }\n\n // first we try to get the desired viewport for a confortable reading based on theh current page size\n const { height: pageHeight, width: pageWidth } = this.context.getPageSize()\n const { width: viewportWidth, height: viewportHeight } = this.pageProxy.getViewport({ scale: 1 })\n const pageScale = Math.max(pageWidth / viewportWidth, pageHeight / viewportHeight)\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 // Then wedefine 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 = 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 const transform = pixelRatioScale !== 1 ? [pixelRatioScale, 0, 0, pixelRatioScale, 0, 0] : null\n\n this.renderTask = this.pageProxy?.render({\n ...(transform && { transform }),\n canvasContext: context,\n viewport,\n })\n\n this.renderTask?.promise\n .then(() => {\n const frameElement = this.getFrameElement()\n const frameDoc = frameElement?.contentDocument\n if (!frameDoc || !frameElement) {\n return\n }\n frameDoc.body.innerHTML = ``\n const frameCanvas = copyCanvasToFrame(canvas, frameDoc)\n const pdfPage = this.pageProxy\n if (!pdfPage) return\n const textLayerElement = frameDoc.createElement(`div`)\n // Set it's class to textLayer which have required CSS styles\n textLayerElement.setAttribute(\"class\", \"textLayer\")\n frameDoc.body.appendChild(textLayerElement)\n // scale between original viewport size and the rendererd canvas size. (not the rendering scale)\n const canvasScale = canvasWidth / viewportWidth\n textLayerElement.style.top = frameCanvas.offsetTop + \"px\"\n textLayerElement.style.left = frameCanvas.offsetLeft + \"px\"\n\n removeCSS(frameElement, \"pdf-scale-scale\")\n injectCSS(frameElement, \"pdf-scale-scale\", `:root { --scale-factor: ${canvasScale}; }`)\n\n if (this.textLayer) {\n this.textLayer.cancel()\n }\n\n this.textLayer = new TextLayer({\n container: textLayerElement,\n textContentSource: pdfPage.streamTextContent(),\n viewport,\n })\n\n this.textLayer.render()\n })\n .catch((e) => {\n if (!(e instanceof RenderingCancelledException)) console.error(e)\n })\n .finally(() => {\n this.renderTask = undefined\n\n canvas.remove()\n })\n\n return undefined\n }\n}\n","import { 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 (file: Blob): Promise<Archive> => {\n const loadingTask = pdfjsLib.getDocument(await file.arrayBuffer())\n\n const pdf = await loadingTask.promise\n\n const archive = {\n filename: file.name,\n proxyDocument: pdf,\n _symbol: PDF_SYMBOL,\n files: Array.from(Array(pdf.numPages)).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 close: () => {\n return pdf.cleanup()\n },\n } satisfies PdfJsArchive\n\n return archive as Archive\n}\n","import { createReader, Reader } from \"@prose-reader/core\"\nimport { PdfRenderer } from \"./renderer/PdfRenderer\"\nimport { EnhancerOptions } from \"./types\"\nimport { from, map, mergeMap, of } from \"rxjs\"\nimport { isPdfJsArchive } from \"./createArchiveFromPdf\"\n\ntype CreateReader = typeof createReader\ntype CreateReaderOptions = Parameters<CreateReader>[0]\n\nexport const pdfEnhancer =\n <InheritOptions extends CreateReaderOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) =>\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) => 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 const fileIndex = archive.files.findIndex((file) => item.href.endsWith(file.uri))\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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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/renderer/frames.ts","../src/renderer/PdfRenderer.ts","../src/createArchiveFromPdf.ts","../src/pdfEnhancer.ts"],"sourcesContent":["export const createPdfFrameElement = () => {\n const frame = document.createElement(`iframe`)\n frame.tabIndex = 0\n frame.style.cssText = `\n overflow: hidden;\n height: 100%;\n width: 100%;\n padding: 0px;\n position: absolute;\n left: 0;\n top: 0;\n `\n\n frame.setAttribute(\"frameBorder\", \"0\")\n\n return frame\n}\n\nexport const copyCanvasToFrame = (canvas: HTMLCanvasElement, frameDoc: Document) => {\n // Create a new canvas in the iframe\n const iframeCanvas = frameDoc.createElement(\"canvas\")\n iframeCanvas.width = canvas.width\n iframeCanvas.height = canvas.height\n iframeCanvas.style.width = canvas.style.width\n iframeCanvas.style.height = canvas.style.height\n\n // Copy the content\n const ctx = iframeCanvas.getContext(\"2d\")\n if (ctx) {\n ctx.drawImage(canvas, 0, 0)\n }\n\n frameDoc.body.appendChild(iframeCanvas)\n\n return iframeCanvas\n}\n","import { catchError, EMPTY, finalize, from, map, Observable, of, switchMap, tap } from \"rxjs\"\nimport { PDFPageProxy, RenderingCancelledException, RenderTask, TextLayer } from \"pdfjs-dist\"\nimport { DocumentRenderer, injectCSS, removeCSS, waitForFrameReady, waitForSwitch } from \"@prose-reader/core\"\nimport { copyCanvasToFrame, createPdfFrameElement } from \"./frames\"\nimport pdfFrameStyle from \"./frame.css?inline\"\n\nexport class PdfRenderer extends DocumentRenderer {\n private pageProxy: PDFPageProxy | undefined\n private renderTask: RenderTask | undefined\n private textLayer: TextLayer | undefined\n private getFrameElement() {\n const frame = this.layers[0]?.element\n\n if (!(frame instanceof HTMLIFrameElement)) return\n\n return frame\n }\n\n constructor(\n private pdfViewerStyle: string,\n params: ConstructorParameters<typeof DocumentRenderer>[0],\n ) {\n super(params)\n }\n\n onUnload(): Observable<unknown> {\n this.layers.forEach(({ element }) => {\n element.remove()\n })\n\n this.layers = []\n\n if (this.renderTask) {\n this.renderTask.cancel()\n }\n this.textLayer?.cancel()\n this.pageProxy?.cleanup()\n\n return EMPTY\n }\n\n onCreateDocument(): Observable<unknown> {\n const frameElement = createPdfFrameElement()\n\n frameElement.setAttribute(`src`, \"about:blank\")\n\n this.layers = [\n {\n element: frameElement,\n },\n ]\n\n return EMPTY\n }\n\n onLoadDocument(): Observable<unknown> {\n return from(this.resourcesHandler.fetchResource()).pipe(\n switchMap((resource) => {\n if (!(\"custom\" in resource)) return EMPTY\n\n const pageProxy = resource.data as PDFPageProxy\n\n this.pageProxy = pageProxy\n\n const frameElement = this.getFrameElement()\n\n if (!frameElement) return EMPTY\n\n return of(frameElement).pipe(\n waitForSwitch(this.context.bridgeEvent.viewportFree$),\n tap(() => {\n this.containerElement.appendChild(frameElement)\n // frame will instantly load, no need to wait for event\n\n injectCSS(frameElement, \"pdfjs-viewer-style\", this.pdfViewerStyle)\n injectCSS(frameElement, \"enhancer-pdf-style\", pdfFrameStyle)\n\n const body = frameElement?.contentDocument?.body\n\n if (body) {\n const canvas = body.ownerDocument.createElement(`canvas`)\n\n body.appendChild(canvas)\n }\n }),\n waitForFrameReady,\n )\n }),\n )\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLayout(_: {\n minPageSpread: number\n blankPagePosition: `before` | `after` | `none`\n spreadPosition: `none` | `left` | `right`\n }) {\n const frameElement = this.getFrameElement()\n\n if (!frameElement) return of(undefined)\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 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 // first we try to get the desired viewport for a confortable reading based on theh current page size\n const { height: pageHeight, width: pageWidth } = this.context.getPageSize()\n\n frameElement.style.height = `${pageHeight}px`\n frameElement.style.width = `${pageWidth}px`\n\n const { width: viewportWidth, height: viewportHeight } = this.pageProxy.getViewport({ scale: 1 })\n const pageScale = Math.max(pageWidth / viewportWidth, pageHeight / viewportHeight)\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 // Then wedefine 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 = 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 const transform = pixelRatioScale !== 1 ? [pixelRatioScale, 0, 0, pixelRatioScale, 0, 0] : null\n\n this.renderTask = this.pageProxy?.render({\n ...(transform && { transform }),\n canvasContext: context,\n viewport,\n })\n\n return from(this.renderTask?.promise).pipe(\n map(() => {\n const frameElement = this.getFrameElement()\n const frameDoc = frameElement?.contentDocument\n\n if (!frameDoc || !frameElement) {\n return undefined\n }\n\n frameDoc.body.innerHTML = ``\n\n const frameCanvas = copyCanvasToFrame(canvas, frameDoc)\n const pdfPage = this.pageProxy\n\n if (!pdfPage) return undefined\n\n const textLayerElement = frameDoc.createElement(`div`)\n // Set it's class to textLayer which have required CSS styles\n textLayerElement.setAttribute(\"class\", \"textLayer\")\n frameDoc.body.appendChild(textLayerElement)\n // scale between original viewport size and the rendererd canvas size. (not the rendering scale)\n const canvasScale = canvasWidth / viewportWidth\n textLayerElement.style.top = frameCanvas.offsetTop + \"px\"\n textLayerElement.style.left = frameCanvas.offsetLeft + \"px\"\n\n removeCSS(frameElement, \"pdf-scale-scale\")\n injectCSS(frameElement, \"pdf-scale-scale\", `:root { --scale-factor: ${canvasScale}; }`)\n\n if (this.textLayer) {\n this.textLayer.cancel()\n }\n\n this.textLayer = new TextLayer({\n container: textLayerElement,\n textContentSource: pdfPage.streamTextContent(),\n viewport,\n })\n\n return from(this.textLayer.render())\n }),\n map(() => undefined),\n catchError((e) => {\n if (!(e instanceof RenderingCancelledException)) console.error(e)\n\n return of(undefined)\n }),\n finalize(() => {\n this.renderTask = undefined\n\n canvas.remove()\n }),\n )\n }\n}\n","import { 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 (file: Blob): Promise<Archive> => {\n const loadingTask = pdfjsLib.getDocument(await file.arrayBuffer())\n\n const pdf = await loadingTask.promise\n\n const archive = {\n filename: file.name,\n proxyDocument: pdf,\n _symbol: PDF_SYMBOL,\n files: Array.from(Array(pdf.numPages)).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 close: () => {\n return pdf.cleanup()\n },\n } satisfies PdfJsArchive\n\n return archive as Archive\n}\n","import { createReader, Reader } from \"@prose-reader/core\"\nimport { PdfRenderer } from \"./renderer/PdfRenderer\"\nimport { EnhancerOptions } from \"./types\"\nimport { from, map, mergeMap, of } from \"rxjs\"\nimport { isPdfJsArchive } from \"./createArchiveFromPdf\"\n\ntype CreateReader = typeof createReader\ntype CreateReaderOptions = Parameters<CreateReader>[0]\n\nexport const pdfEnhancer =\n <InheritOptions extends CreateReaderOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) =>\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) => 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 const fileIndex = archive.files.findIndex((file) => item.href.endsWith(file.uri))\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":["frameElement"],"mappings":"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"}
|
package/dist/index.umd.cjs
CHANGED
|
@@ -115,16 +115,20 @@
|
|
|
115
115
|
);
|
|
116
116
|
}
|
|
117
117
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
118
|
-
|
|
118
|
+
onLayout(_) {
|
|
119
|
+
const frameElement = this.getFrameElement();
|
|
120
|
+
if (!frameElement) return rxjs.of(void 0);
|
|
119
121
|
const canvas = this.containerElement.ownerDocument.createElement("canvas");
|
|
120
122
|
const context = canvas?.getContext("2d");
|
|
121
123
|
const pixelRatioScale = window.devicePixelRatio || 1;
|
|
122
|
-
if (!this.pageProxy || !context) return void 0;
|
|
124
|
+
if (!this.pageProxy || !context) return rxjs.of(void 0);
|
|
123
125
|
if (this.renderTask) {
|
|
124
126
|
this.renderTask.cancel();
|
|
125
127
|
this.renderTask = void 0;
|
|
126
128
|
}
|
|
127
129
|
const { height: pageHeight, width: pageWidth } = this.context.getPageSize();
|
|
130
|
+
frameElement.style.height = `${pageHeight}px`;
|
|
131
|
+
frameElement.style.width = `${pageWidth}px`;
|
|
128
132
|
const { width: viewportWidth, height: viewportHeight } = this.pageProxy.getViewport({ scale: 1 });
|
|
129
133
|
const pageScale = Math.max(pageWidth / viewportWidth, pageHeight / viewportHeight);
|
|
130
134
|
const viewport = this.pageProxy.getViewport({ scale: pageScale });
|
|
@@ -143,40 +147,45 @@
|
|
|
143
147
|
canvasContext: context,
|
|
144
148
|
viewport
|
|
145
149
|
});
|
|
146
|
-
this.renderTask?.promise.
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
this.textLayer
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
150
|
+
return rxjs.from(this.renderTask?.promise).pipe(
|
|
151
|
+
rxjs.map(() => {
|
|
152
|
+
const frameElement2 = this.getFrameElement();
|
|
153
|
+
const frameDoc = frameElement2?.contentDocument;
|
|
154
|
+
if (!frameDoc || !frameElement2) {
|
|
155
|
+
return void 0;
|
|
156
|
+
}
|
|
157
|
+
frameDoc.body.innerHTML = ``;
|
|
158
|
+
const frameCanvas = copyCanvasToFrame(canvas, frameDoc);
|
|
159
|
+
const pdfPage = this.pageProxy;
|
|
160
|
+
if (!pdfPage) return void 0;
|
|
161
|
+
const textLayerElement = frameDoc.createElement(`div`);
|
|
162
|
+
textLayerElement.setAttribute("class", "textLayer");
|
|
163
|
+
frameDoc.body.appendChild(textLayerElement);
|
|
164
|
+
const canvasScale = canvasWidth / viewportWidth;
|
|
165
|
+
textLayerElement.style.top = frameCanvas.offsetTop + "px";
|
|
166
|
+
textLayerElement.style.left = frameCanvas.offsetLeft + "px";
|
|
167
|
+
core.removeCSS(frameElement2, "pdf-scale-scale");
|
|
168
|
+
core.injectCSS(frameElement2, "pdf-scale-scale", `:root { --scale-factor: ${canvasScale}; }`);
|
|
169
|
+
if (this.textLayer) {
|
|
170
|
+
this.textLayer.cancel();
|
|
171
|
+
}
|
|
172
|
+
this.textLayer = new pdfjsLib.TextLayer({
|
|
173
|
+
container: textLayerElement,
|
|
174
|
+
textContentSource: pdfPage.streamTextContent(),
|
|
175
|
+
viewport
|
|
176
|
+
});
|
|
177
|
+
return rxjs.from(this.textLayer.render());
|
|
178
|
+
}),
|
|
179
|
+
rxjs.map(() => void 0),
|
|
180
|
+
rxjs.catchError((e) => {
|
|
181
|
+
if (!(e instanceof pdfjsLib.RenderingCancelledException)) console.error(e);
|
|
182
|
+
return rxjs.of(void 0);
|
|
183
|
+
}),
|
|
184
|
+
rxjs.finalize(() => {
|
|
185
|
+
this.renderTask = void 0;
|
|
186
|
+
canvas.remove();
|
|
187
|
+
})
|
|
188
|
+
);
|
|
180
189
|
}
|
|
181
190
|
}
|
|
182
191
|
|
package/dist/index.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.cjs","sources":["../src/renderer/frames.ts","../src/renderer/PdfRenderer.ts","../src/createArchiveFromPdf.ts","../src/pdfEnhancer.ts"],"sourcesContent":["export const createPdfFrameElement = () => {\n const frame = document.createElement(`iframe`)\n frame.tabIndex = 0\n frame.style.cssText = `\n overflow: hidden;\n height: 100%;\n width: 100%;\n padding: 0px;\n position: absolute;\n left: 0;\n top: 0;\n `\n\n frame.setAttribute(\"frameBorder\", \"0\")\n\n return frame\n}\n\nexport const copyCanvasToFrame = (canvas: HTMLCanvasElement, frameDoc: Document) => {\n // Create a new canvas in the iframe\n const iframeCanvas = frameDoc.createElement(\"canvas\")\n iframeCanvas.width = canvas.width\n iframeCanvas.height = canvas.height\n iframeCanvas.style.width = canvas.style.width\n iframeCanvas.style.height = canvas.style.height\n\n // Copy the content\n const ctx = iframeCanvas.getContext(\"2d\")\n if (ctx) {\n ctx.drawImage(canvas, 0, 0)\n }\n\n frameDoc.body.appendChild(iframeCanvas)\n\n return iframeCanvas\n}\n","import { EMPTY, from, Observable, of, switchMap, tap } from \"rxjs\"\nimport { PDFPageProxy, RenderingCancelledException, RenderTask, TextLayer } from \"pdfjs-dist\"\nimport { DocumentRenderer, injectCSS, removeCSS, waitForFrameReady, waitForSwitch } from \"@prose-reader/core\"\nimport { copyCanvasToFrame, createPdfFrameElement } from \"./frames\"\nimport pdfFrameStyle from \"./frame.css?inline\"\n\nexport class PdfRenderer extends DocumentRenderer {\n private pageProxy: PDFPageProxy | undefined\n private renderTask: RenderTask | undefined\n private textLayer: TextLayer | undefined\n private getFrameElement() {\n const frame = this.layers[0]?.element\n\n if (!(frame instanceof HTMLIFrameElement)) return\n\n return frame\n }\n\n constructor(\n private pdfViewerStyle: string,\n params: ConstructorParameters<typeof DocumentRenderer>[0],\n ) {\n super(params)\n }\n\n onUnload(): Observable<unknown> {\n this.layers.forEach(({ element }) => {\n element.remove()\n })\n\n this.layers = []\n\n if (this.renderTask) {\n this.renderTask.cancel()\n }\n this.textLayer?.cancel()\n this.pageProxy?.cleanup()\n\n return EMPTY\n }\n\n onCreateDocument(): Observable<unknown> {\n const frameElement = createPdfFrameElement()\n\n frameElement.setAttribute(`src`, \"about:blank\")\n\n this.layers = [\n {\n element: frameElement,\n },\n ]\n\n return EMPTY\n }\n\n onLoadDocument(): Observable<unknown> {\n return from(this.resourcesHandler.fetchResource()).pipe(\n switchMap((resource) => {\n if (!(\"custom\" in resource)) return EMPTY\n\n const pageProxy = resource.data as PDFPageProxy\n\n this.pageProxy = pageProxy\n\n const frameElement = this.getFrameElement()\n\n if (!frameElement) return EMPTY\n\n return of(frameElement).pipe(\n waitForSwitch(this.context.bridgeEvent.viewportFree$),\n tap(() => {\n this.containerElement.appendChild(frameElement)\n // frame will instantly load, no need to wait for event\n\n injectCSS(frameElement, \"pdfjs-viewer-style\", this.pdfViewerStyle)\n injectCSS(frameElement, \"enhancer-pdf-style\", pdfFrameStyle)\n\n const body = frameElement?.contentDocument?.body\n\n if (body) {\n const canvas = body.ownerDocument.createElement(`canvas`)\n\n body.appendChild(canvas)\n }\n }),\n waitForFrameReady,\n )\n }),\n )\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n layout(_: {\n minPageSpread: number\n blankPagePosition: `before` | `after` | `none`\n spreadPosition: `none` | `left` | `right`\n }): { width: number; height: number } | undefined {\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 const context = canvas?.getContext(\"2d\")\n // Support HiDPI-screens.\n const pixelRatioScale = window.devicePixelRatio || 1\n\n if (!this.pageProxy || !context) return undefined\n\n if (this.renderTask) {\n this.renderTask.cancel()\n this.renderTask = undefined\n }\n\n // first we try to get the desired viewport for a confortable reading based on theh current page size\n const { height: pageHeight, width: pageWidth } = this.context.getPageSize()\n const { width: viewportWidth, height: viewportHeight } = this.pageProxy.getViewport({ scale: 1 })\n const pageScale = Math.max(pageWidth / viewportWidth, pageHeight / viewportHeight)\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 // Then wedefine 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 = 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 const transform = pixelRatioScale !== 1 ? [pixelRatioScale, 0, 0, pixelRatioScale, 0, 0] : null\n\n this.renderTask = this.pageProxy?.render({\n ...(transform && { transform }),\n canvasContext: context,\n viewport,\n })\n\n this.renderTask?.promise\n .then(() => {\n const frameElement = this.getFrameElement()\n const frameDoc = frameElement?.contentDocument\n if (!frameDoc || !frameElement) {\n return\n }\n frameDoc.body.innerHTML = ``\n const frameCanvas = copyCanvasToFrame(canvas, frameDoc)\n const pdfPage = this.pageProxy\n if (!pdfPage) return\n const textLayerElement = frameDoc.createElement(`div`)\n // Set it's class to textLayer which have required CSS styles\n textLayerElement.setAttribute(\"class\", \"textLayer\")\n frameDoc.body.appendChild(textLayerElement)\n // scale between original viewport size and the rendererd canvas size. (not the rendering scale)\n const canvasScale = canvasWidth / viewportWidth\n textLayerElement.style.top = frameCanvas.offsetTop + \"px\"\n textLayerElement.style.left = frameCanvas.offsetLeft + \"px\"\n\n removeCSS(frameElement, \"pdf-scale-scale\")\n injectCSS(frameElement, \"pdf-scale-scale\", `:root { --scale-factor: ${canvasScale}; }`)\n\n if (this.textLayer) {\n this.textLayer.cancel()\n }\n\n this.textLayer = new TextLayer({\n container: textLayerElement,\n textContentSource: pdfPage.streamTextContent(),\n viewport,\n })\n\n this.textLayer.render()\n })\n .catch((e) => {\n if (!(e instanceof RenderingCancelledException)) console.error(e)\n })\n .finally(() => {\n this.renderTask = undefined\n\n canvas.remove()\n })\n\n return undefined\n }\n}\n","import { 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 (file: Blob): Promise<Archive> => {\n const loadingTask = pdfjsLib.getDocument(await file.arrayBuffer())\n\n const pdf = await loadingTask.promise\n\n const archive = {\n filename: file.name,\n proxyDocument: pdf,\n _symbol: PDF_SYMBOL,\n files: Array.from(Array(pdf.numPages)).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 close: () => {\n return pdf.cleanup()\n },\n } satisfies PdfJsArchive\n\n return archive as Archive\n}\n","import { createReader, Reader } from \"@prose-reader/core\"\nimport { PdfRenderer } from \"./renderer/PdfRenderer\"\nimport { EnhancerOptions } from \"./types\"\nimport { from, map, mergeMap, of } from \"rxjs\"\nimport { isPdfJsArchive } from \"./createArchiveFromPdf\"\n\ntype CreateReader = typeof createReader\ntype CreateReaderOptions = Parameters<CreateReader>[0]\n\nexport const pdfEnhancer =\n <InheritOptions extends CreateReaderOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) =>\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) => 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 const fileIndex = archive.files.findIndex((file) => item.href.endsWith(file.uri))\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":["DocumentRenderer","EMPTY","from","switchMap","of","waitForSwitch","tap","injectCSS","waitForFrameReady","removeCSS","TextLayer","RenderingCancelledException","pdfjsLib","mergeMap","map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.cjs","sources":["../src/renderer/frames.ts","../src/renderer/PdfRenderer.ts","../src/createArchiveFromPdf.ts","../src/pdfEnhancer.ts"],"sourcesContent":["export const createPdfFrameElement = () => {\n const frame = document.createElement(`iframe`)\n frame.tabIndex = 0\n frame.style.cssText = `\n overflow: hidden;\n height: 100%;\n width: 100%;\n padding: 0px;\n position: absolute;\n left: 0;\n top: 0;\n `\n\n frame.setAttribute(\"frameBorder\", \"0\")\n\n return frame\n}\n\nexport const copyCanvasToFrame = (canvas: HTMLCanvasElement, frameDoc: Document) => {\n // Create a new canvas in the iframe\n const iframeCanvas = frameDoc.createElement(\"canvas\")\n iframeCanvas.width = canvas.width\n iframeCanvas.height = canvas.height\n iframeCanvas.style.width = canvas.style.width\n iframeCanvas.style.height = canvas.style.height\n\n // Copy the content\n const ctx = iframeCanvas.getContext(\"2d\")\n if (ctx) {\n ctx.drawImage(canvas, 0, 0)\n }\n\n frameDoc.body.appendChild(iframeCanvas)\n\n return iframeCanvas\n}\n","import { catchError, EMPTY, finalize, from, map, Observable, of, switchMap, tap } from \"rxjs\"\nimport { PDFPageProxy, RenderingCancelledException, RenderTask, TextLayer } from \"pdfjs-dist\"\nimport { DocumentRenderer, injectCSS, removeCSS, waitForFrameReady, waitForSwitch } from \"@prose-reader/core\"\nimport { copyCanvasToFrame, createPdfFrameElement } from \"./frames\"\nimport pdfFrameStyle from \"./frame.css?inline\"\n\nexport class PdfRenderer extends DocumentRenderer {\n private pageProxy: PDFPageProxy | undefined\n private renderTask: RenderTask | undefined\n private textLayer: TextLayer | undefined\n private getFrameElement() {\n const frame = this.layers[0]?.element\n\n if (!(frame instanceof HTMLIFrameElement)) return\n\n return frame\n }\n\n constructor(\n private pdfViewerStyle: string,\n params: ConstructorParameters<typeof DocumentRenderer>[0],\n ) {\n super(params)\n }\n\n onUnload(): Observable<unknown> {\n this.layers.forEach(({ element }) => {\n element.remove()\n })\n\n this.layers = []\n\n if (this.renderTask) {\n this.renderTask.cancel()\n }\n this.textLayer?.cancel()\n this.pageProxy?.cleanup()\n\n return EMPTY\n }\n\n onCreateDocument(): Observable<unknown> {\n const frameElement = createPdfFrameElement()\n\n frameElement.setAttribute(`src`, \"about:blank\")\n\n this.layers = [\n {\n element: frameElement,\n },\n ]\n\n return EMPTY\n }\n\n onLoadDocument(): Observable<unknown> {\n return from(this.resourcesHandler.fetchResource()).pipe(\n switchMap((resource) => {\n if (!(\"custom\" in resource)) return EMPTY\n\n const pageProxy = resource.data as PDFPageProxy\n\n this.pageProxy = pageProxy\n\n const frameElement = this.getFrameElement()\n\n if (!frameElement) return EMPTY\n\n return of(frameElement).pipe(\n waitForSwitch(this.context.bridgeEvent.viewportFree$),\n tap(() => {\n this.containerElement.appendChild(frameElement)\n // frame will instantly load, no need to wait for event\n\n injectCSS(frameElement, \"pdfjs-viewer-style\", this.pdfViewerStyle)\n injectCSS(frameElement, \"enhancer-pdf-style\", pdfFrameStyle)\n\n const body = frameElement?.contentDocument?.body\n\n if (body) {\n const canvas = body.ownerDocument.createElement(`canvas`)\n\n body.appendChild(canvas)\n }\n }),\n waitForFrameReady,\n )\n }),\n )\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onLayout(_: {\n minPageSpread: number\n blankPagePosition: `before` | `after` | `none`\n spreadPosition: `none` | `left` | `right`\n }) {\n const frameElement = this.getFrameElement()\n\n if (!frameElement) return of(undefined)\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 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 // first we try to get the desired viewport for a confortable reading based on theh current page size\n const { height: pageHeight, width: pageWidth } = this.context.getPageSize()\n\n frameElement.style.height = `${pageHeight}px`\n frameElement.style.width = `${pageWidth}px`\n\n const { width: viewportWidth, height: viewportHeight } = this.pageProxy.getViewport({ scale: 1 })\n const pageScale = Math.max(pageWidth / viewportWidth, pageHeight / viewportHeight)\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 // Then wedefine 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 = 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 const transform = pixelRatioScale !== 1 ? [pixelRatioScale, 0, 0, pixelRatioScale, 0, 0] : null\n\n this.renderTask = this.pageProxy?.render({\n ...(transform && { transform }),\n canvasContext: context,\n viewport,\n })\n\n return from(this.renderTask?.promise).pipe(\n map(() => {\n const frameElement = this.getFrameElement()\n const frameDoc = frameElement?.contentDocument\n\n if (!frameDoc || !frameElement) {\n return undefined\n }\n\n frameDoc.body.innerHTML = ``\n\n const frameCanvas = copyCanvasToFrame(canvas, frameDoc)\n const pdfPage = this.pageProxy\n\n if (!pdfPage) return undefined\n\n const textLayerElement = frameDoc.createElement(`div`)\n // Set it's class to textLayer which have required CSS styles\n textLayerElement.setAttribute(\"class\", \"textLayer\")\n frameDoc.body.appendChild(textLayerElement)\n // scale between original viewport size and the rendererd canvas size. (not the rendering scale)\n const canvasScale = canvasWidth / viewportWidth\n textLayerElement.style.top = frameCanvas.offsetTop + \"px\"\n textLayerElement.style.left = frameCanvas.offsetLeft + \"px\"\n\n removeCSS(frameElement, \"pdf-scale-scale\")\n injectCSS(frameElement, \"pdf-scale-scale\", `:root { --scale-factor: ${canvasScale}; }`)\n\n if (this.textLayer) {\n this.textLayer.cancel()\n }\n\n this.textLayer = new TextLayer({\n container: textLayerElement,\n textContentSource: pdfPage.streamTextContent(),\n viewport,\n })\n\n return from(this.textLayer.render())\n }),\n map(() => undefined),\n catchError((e) => {\n if (!(e instanceof RenderingCancelledException)) console.error(e)\n\n return of(undefined)\n }),\n finalize(() => {\n this.renderTask = undefined\n\n canvas.remove()\n }),\n )\n }\n}\n","import { 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 (file: Blob): Promise<Archive> => {\n const loadingTask = pdfjsLib.getDocument(await file.arrayBuffer())\n\n const pdf = await loadingTask.promise\n\n const archive = {\n filename: file.name,\n proxyDocument: pdf,\n _symbol: PDF_SYMBOL,\n files: Array.from(Array(pdf.numPages)).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 close: () => {\n return pdf.cleanup()\n },\n } satisfies PdfJsArchive\n\n return archive as Archive\n}\n","import { createReader, Reader } from \"@prose-reader/core\"\nimport { PdfRenderer } from \"./renderer/PdfRenderer\"\nimport { EnhancerOptions } from \"./types\"\nimport { from, map, mergeMap, of } from \"rxjs\"\nimport { isPdfJsArchive } from \"./createArchiveFromPdf\"\n\ntype CreateReader = typeof createReader\ntype CreateReaderOptions = Parameters<CreateReader>[0]\n\nexport const pdfEnhancer =\n <InheritOptions extends CreateReaderOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) =>\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) => 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 const fileIndex = archive.files.findIndex((file) => item.href.endsWith(file.uri))\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":["DocumentRenderer","EMPTY","from","switchMap","of","waitForSwitch","tap","injectCSS","waitForFrameReady","map","frameElement","removeCSS","TextLayer","catchError","RenderingCancelledException","finalize","pdfjsLib","mergeMap"],"mappings":"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"}
|
|
@@ -10,12 +10,9 @@ export declare class PdfRenderer extends DocumentRenderer {
|
|
|
10
10
|
onUnload(): Observable<unknown>;
|
|
11
11
|
onCreateDocument(): Observable<unknown>;
|
|
12
12
|
onLoadDocument(): Observable<unknown>;
|
|
13
|
-
|
|
13
|
+
onLayout(_: {
|
|
14
14
|
minPageSpread: number;
|
|
15
15
|
blankPagePosition: `before` | `after` | `none`;
|
|
16
16
|
spreadPosition: `none` | `left` | `right`;
|
|
17
|
-
}):
|
|
18
|
-
width: number;
|
|
19
|
-
height: number;
|
|
20
|
-
} | undefined;
|
|
17
|
+
}): Observable<undefined>;
|
|
21
18
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prose-reader/enhancer-pdf",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.129.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.umd.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -28,5 +28,5 @@
|
|
|
28
28
|
"pdfjs-dist": "^4.8.69",
|
|
29
29
|
"rxjs": "*"
|
|
30
30
|
},
|
|
31
|
-
"gitHead": "
|
|
31
|
+
"gitHead": "9b2962eb6299f23922ab432ea0b239a57c5977d7"
|
|
32
32
|
}
|