@prose-reader/enhancer-pdf 1.118.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/PdfRenderer.d.ts +18 -0
- package/dist/createArchiveFromPdf.d.ts +14 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +159 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.cjs +185 -0
- package/dist/index.umd.cjs.map +1 -0
- package/dist/pdfEnhancer.d.ts +6 -0
- package/dist/types.d.ts +8 -0
- package/package.json +28 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { DocumentRenderer } from '@prose-reader/core';
|
|
3
|
+
export declare class PdfRenderer extends DocumentRenderer {
|
|
4
|
+
private pageProxy;
|
|
5
|
+
private renderTask;
|
|
6
|
+
getCanvas(): HTMLCanvasElement | undefined;
|
|
7
|
+
onUnload(): Observable<unknown>;
|
|
8
|
+
onCreateDocument(): Observable<unknown>;
|
|
9
|
+
onLoadDocument(): Observable<unknown>;
|
|
10
|
+
layout(_: {
|
|
11
|
+
minPageSpread: number;
|
|
12
|
+
blankPagePosition: `before` | `after` | `none`;
|
|
13
|
+
spreadPosition: `none` | `left` | `right`;
|
|
14
|
+
}): {
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
} | undefined;
|
|
18
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Archive } from '@prose-reader/streamer';
|
|
2
|
+
import * as pdfjsLib from "pdfjs-dist";
|
|
3
|
+
type PdfJsArchive = Archive & {
|
|
4
|
+
_symbol: symbol;
|
|
5
|
+
proxyDocument: pdfjsLib.PDFDocumentProxy;
|
|
6
|
+
};
|
|
7
|
+
export declare const isPdfJsArchive: (archive: Archive) => archive is PdfJsArchive;
|
|
8
|
+
/**
|
|
9
|
+
* @important
|
|
10
|
+
* Make sure the urls are on the same origin or the cors header is set otherwise
|
|
11
|
+
* the resource cannot be consumed as it is on the web.
|
|
12
|
+
*/
|
|
13
|
+
export declare const createArchiveFromPdf: (file: Blob) => Promise<Archive>;
|
|
14
|
+
export {};
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { EMPTY, from, switchMap, mergeMap, of, map } from 'rxjs';
|
|
2
|
+
import * as pdfjsLib from 'pdfjs-dist';
|
|
3
|
+
import { RenderingCancelledException } from 'pdfjs-dist';
|
|
4
|
+
import { DocumentRenderer } from '@prose-reader/core';
|
|
5
|
+
|
|
6
|
+
class PdfRenderer extends DocumentRenderer {
|
|
7
|
+
pageProxy;
|
|
8
|
+
renderTask;
|
|
9
|
+
getCanvas() {
|
|
10
|
+
const element = this.layers[0]?.element.children[0];
|
|
11
|
+
if (element instanceof HTMLCanvasElement) return element;
|
|
12
|
+
return void 0;
|
|
13
|
+
}
|
|
14
|
+
onUnload() {
|
|
15
|
+
this.layers.forEach(({ element }) => {
|
|
16
|
+
element.remove();
|
|
17
|
+
});
|
|
18
|
+
this.layers = [];
|
|
19
|
+
this.pageProxy?.cleanup();
|
|
20
|
+
return EMPTY;
|
|
21
|
+
}
|
|
22
|
+
onCreateDocument() {
|
|
23
|
+
const canvasContainer = this.containerElement.ownerDocument.createElement(`div`);
|
|
24
|
+
canvasContainer.style.cssText = `
|
|
25
|
+
width: 100%;
|
|
26
|
+
height: 100%;
|
|
27
|
+
display: flex;
|
|
28
|
+
justify-content: center;
|
|
29
|
+
align-items: center;
|
|
30
|
+
`;
|
|
31
|
+
const canvas = this.containerElement.ownerDocument.createElement(`canvas`);
|
|
32
|
+
canvasContainer.appendChild(canvas);
|
|
33
|
+
this.layers = [
|
|
34
|
+
{
|
|
35
|
+
element: canvasContainer
|
|
36
|
+
}
|
|
37
|
+
];
|
|
38
|
+
return EMPTY;
|
|
39
|
+
}
|
|
40
|
+
onLoadDocument() {
|
|
41
|
+
return from(this.resourcesHandler.fetchResource()).pipe(
|
|
42
|
+
switchMap((resource) => {
|
|
43
|
+
if (!("custom" in resource)) return EMPTY;
|
|
44
|
+
const pageProxy = resource.data;
|
|
45
|
+
this.pageProxy = pageProxy;
|
|
46
|
+
const container = this.layers[0]?.element;
|
|
47
|
+
if (container) {
|
|
48
|
+
this.containerElement.appendChild(container);
|
|
49
|
+
}
|
|
50
|
+
return EMPTY;
|
|
51
|
+
})
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
55
|
+
layout(_) {
|
|
56
|
+
const canvas = this.getCanvas();
|
|
57
|
+
const context = canvas?.getContext("2d");
|
|
58
|
+
const pixelRatioScale = window.devicePixelRatio || 1;
|
|
59
|
+
if (!canvas || !this.pageProxy || !context) return void 0;
|
|
60
|
+
const { height: pageHeight, width: pageWidth } = this.context.getPageSize();
|
|
61
|
+
const { width: viewportWidth, height: viewportHeight } = this.pageProxy.getViewport({ scale: 1 });
|
|
62
|
+
const pageScale = Math.max(pageWidth / viewportWidth, pageHeight / viewportHeight);
|
|
63
|
+
const viewport = this.pageProxy.getViewport({ scale: pageScale });
|
|
64
|
+
const viewportRatio = viewport.width / viewport.height;
|
|
65
|
+
const pageRatio = pageWidth / pageHeight;
|
|
66
|
+
const isWiderThanPage = viewportRatio > pageRatio;
|
|
67
|
+
const canvasWidth = isWiderThanPage ? pageWidth : pageHeight * viewportRatio;
|
|
68
|
+
const canvasHeight = viewportRatio > pageRatio ? pageWidth / viewportRatio : pageHeight;
|
|
69
|
+
canvas.width = Math.floor(viewport.width * pixelRatioScale);
|
|
70
|
+
canvas.height = Math.floor(viewport.height * pixelRatioScale);
|
|
71
|
+
canvas.style.width = Math.floor(canvasWidth) + "px";
|
|
72
|
+
canvas.style.height = Math.floor(canvasHeight) + "px";
|
|
73
|
+
if (this.renderTask) {
|
|
74
|
+
this.renderTask.cancel();
|
|
75
|
+
}
|
|
76
|
+
const transform = pixelRatioScale !== 1 ? [pixelRatioScale, 0, 0, pixelRatioScale, 0, 0] : null;
|
|
77
|
+
this.renderTask = this.pageProxy?.render({
|
|
78
|
+
...transform && { transform },
|
|
79
|
+
canvasContext: context,
|
|
80
|
+
viewport
|
|
81
|
+
});
|
|
82
|
+
this.renderTask?.promise.catch((e) => {
|
|
83
|
+
if (!(e instanceof RenderingCancelledException)) console.error(e);
|
|
84
|
+
}).finally(() => {
|
|
85
|
+
this.renderTask = void 0;
|
|
86
|
+
});
|
|
87
|
+
return void 0;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const PDF_SYMBOL = Symbol(`pdfjs`);
|
|
92
|
+
const isPdfJsArchive = (archive) => "_symbol" in archive && archive._symbol === PDF_SYMBOL;
|
|
93
|
+
const createArchiveFromPdf = async (file) => {
|
|
94
|
+
const loadingTask = pdfjsLib.getDocument(await file.arrayBuffer());
|
|
95
|
+
const pdf = await loadingTask.promise;
|
|
96
|
+
const archive = {
|
|
97
|
+
filename: file.name,
|
|
98
|
+
proxyDocument: pdf,
|
|
99
|
+
_symbol: PDF_SYMBOL,
|
|
100
|
+
files: Array.from(Array(pdf.numPages)).map((_, index) => ({
|
|
101
|
+
dir: false,
|
|
102
|
+
blob: async () => {
|
|
103
|
+
throw new Error("Unable to get blob from pdf");
|
|
104
|
+
},
|
|
105
|
+
basename: `${index}.pdf`,
|
|
106
|
+
size: 0,
|
|
107
|
+
string: () => {
|
|
108
|
+
throw new Error("Unable to get blob from pdf");
|
|
109
|
+
},
|
|
110
|
+
uri: `${index}.pdf`
|
|
111
|
+
})),
|
|
112
|
+
close: () => {
|
|
113
|
+
return pdf.cleanup();
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
return archive;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const pdfEnhancer = (next) => (options) => {
|
|
120
|
+
const reader = next({
|
|
121
|
+
...options,
|
|
122
|
+
/**
|
|
123
|
+
* We have a special renderer for pdf so we need to inject it
|
|
124
|
+
* for the relevant items. The enhancer could be configurable but for
|
|
125
|
+
* the sake of simplicity we will assume that an item ending with .pdf should
|
|
126
|
+
* be treated as a pdf document.
|
|
127
|
+
*
|
|
128
|
+
* The `getRenderer` hook should be non destructive, if we detect a renderer already
|
|
129
|
+
* setup we should return it.
|
|
130
|
+
*/
|
|
131
|
+
getRenderer(item) {
|
|
132
|
+
const MaybeRenderer = options.getRenderer?.(item);
|
|
133
|
+
if (!MaybeRenderer && item.href.endsWith(`.pdf`)) {
|
|
134
|
+
return PdfRenderer;
|
|
135
|
+
}
|
|
136
|
+
return MaybeRenderer;
|
|
137
|
+
},
|
|
138
|
+
getResource: (item) => options.pdf.getArchiveForItem(item).pipe(
|
|
139
|
+
mergeMap((archive) => {
|
|
140
|
+
if (!archive) return of(void 0);
|
|
141
|
+
if (!isPdfJsArchive(archive)) {
|
|
142
|
+
console.warn(`You provided an invalid pdf archive`);
|
|
143
|
+
return of(void 0);
|
|
144
|
+
}
|
|
145
|
+
const fileIndex = archive.files.findIndex((file) => item.href.endsWith(file.uri));
|
|
146
|
+
return from(archive.proxyDocument.getPage(fileIndex + 1)).pipe(
|
|
147
|
+
map((pageProxy) => ({
|
|
148
|
+
custom: true,
|
|
149
|
+
data: pageProxy
|
|
150
|
+
}))
|
|
151
|
+
);
|
|
152
|
+
})
|
|
153
|
+
)
|
|
154
|
+
});
|
|
155
|
+
return reader;
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
export { createArchiveFromPdf, isPdfJsArchive, pdfEnhancer };
|
|
159
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/PdfRenderer.ts","../src/createArchiveFromPdf.ts","../src/pdfEnhancer.ts"],"sourcesContent":["import { EMPTY, from, Observable, switchMap } from \"rxjs\"\nimport { PDFPageProxy, RenderingCancelledException, RenderTask } from \"pdfjs-dist\"\nimport { DocumentRenderer } from \"@prose-reader/core\"\n\nexport class PdfRenderer extends DocumentRenderer {\n private pageProxy: PDFPageProxy | undefined\n private renderTask: RenderTask | undefined\n\n getCanvas() {\n const element = this.layers[0]?.element.children[0]\n\n if (element instanceof HTMLCanvasElement) return element\n\n return undefined\n }\n\n onUnload(): Observable<unknown> {\n this.layers.forEach(({ element }) => {\n element.remove()\n })\n\n this.layers = []\n\n this.pageProxy?.cleanup()\n\n return EMPTY\n }\n\n onCreateDocument(): Observable<unknown> {\n const canvasContainer = this.containerElement.ownerDocument.createElement(`div`)\n canvasContainer.style.cssText = `\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n `\n\n const canvas = this.containerElement.ownerDocument.createElement(`canvas`)\n\n canvasContainer.appendChild(canvas)\n\n this.layers = [\n {\n element: canvasContainer,\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 container = this.layers[0]?.element\n\n if (container) {\n this.containerElement.appendChild(container)\n }\n\n return EMPTY\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 const canvas = this.getCanvas()\n const context = canvas?.getContext(\"2d\")\n // Support HiDPI-screens.\n const pixelRatioScale = window.devicePixelRatio || 1\n\n if (!canvas || !this.pageProxy || !context) return undefined\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 if (this.renderTask) {\n this.renderTask.cancel()\n }\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 .catch((e) => {\n if (!(e instanceof RenderingCancelledException)) console.error(e)\n })\n .finally(() => {\n this.renderTask = undefined\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 \"./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 MaybeRenderer = options.getRenderer?.(item)\n\n if (!MaybeRenderer && item.href.endsWith(`.pdf`)) {\n return PdfRenderer\n }\n\n return MaybeRenderer\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":";;;;;AAIO,MAAM,oBAAoB,gBAAiB,CAAA;AAAA,EACxC,SAAA;AAAA,EACA,UAAA;AAAA,EAER,SAAY,GAAA;AACV,IAAA,MAAM,UAAU,IAAK,CAAA,MAAA,CAAO,CAAC,CAAG,EAAA,OAAA,CAAQ,SAAS,CAAC,CAAA;AAElD,IAAI,IAAA,OAAA,YAAmB,mBAA0B,OAAA,OAAA;AAEjD,IAAO,OAAA,KAAA,CAAA;AAAA;AACT,EAEA,QAAgC,GAAA;AAC9B,IAAA,IAAA,CAAK,MAAO,CAAA,OAAA,CAAQ,CAAC,EAAE,SAAc,KAAA;AACnC,MAAA,OAAA,CAAQ,MAAO,EAAA;AAAA,KAChB,CAAA;AAED,IAAA,IAAA,CAAK,SAAS,EAAC;AAEf,IAAA,IAAA,CAAK,WAAW,OAAQ,EAAA;AAExB,IAAO,OAAA,KAAA;AAAA;AACT,EAEA,gBAAwC,GAAA;AACtC,IAAA,MAAM,eAAkB,GAAA,IAAA,CAAK,gBAAiB,CAAA,aAAA,CAAc,cAAc,CAAK,GAAA,CAAA,CAAA;AAC/E,IAAA,eAAA,CAAgB,MAAM,OAAU,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAQhC,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,gBAAiB,CAAA,aAAA,CAAc,cAAc,CAAQ,MAAA,CAAA,CAAA;AAEzE,IAAA,eAAA,CAAgB,YAAY,MAAM,CAAA;AAElC,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ;AAAA,QACE,OAAS,EAAA;AAAA;AACX,KACF;AAEA,IAAO,OAAA,KAAA;AAAA;AACT,EAEA,cAAsC,GAAA;AACpC,IAAA,OAAO,IAAK,CAAA,IAAA,CAAK,gBAAiB,CAAA,aAAA,EAAe,CAAE,CAAA,IAAA;AAAA,MACjD,SAAA,CAAU,CAAC,QAAa,KAAA;AACtB,QAAI,IAAA,EAAE,QAAY,IAAA,QAAA,CAAA,EAAkB,OAAA,KAAA;AAEpC,QAAA,MAAM,YAAY,QAAS,CAAA,IAAA;AAE3B,QAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AAEjB,QAAA,MAAM,SAAY,GAAA,IAAA,CAAK,MAAO,CAAA,CAAC,CAAG,EAAA,OAAA;AAElC,QAAA,IAAI,SAAW,EAAA;AACb,UAAK,IAAA,CAAA,gBAAA,CAAiB,YAAY,SAAS,CAAA;AAAA;AAG7C,QAAO,OAAA,KAAA;AAAA,OACR;AAAA,KACH;AAAA;AACF;AAAA,EAGA,OAAO,CAI2C,EAAA;AAChD,IAAM,MAAA,MAAA,GAAS,KAAK,SAAU,EAAA;AAC9B,IAAM,MAAA,OAAA,GAAU,MAAQ,EAAA,UAAA,CAAW,IAAI,CAAA;AAEvC,IAAM,MAAA,eAAA,GAAkB,OAAO,gBAAoB,IAAA,CAAA;AAEnD,IAAA,IAAI,CAAC,MAAU,IAAA,CAAC,KAAK,SAAa,IAAA,CAAC,SAAgB,OAAA,KAAA,CAAA;AAGnD,IAAM,MAAA,EAAE,QAAQ,UAAY,EAAA,KAAA,EAAO,WAAc,GAAA,IAAA,CAAK,QAAQ,WAAY,EAAA;AAC1E,IAAA,MAAM,EAAE,KAAA,EAAO,aAAe,EAAA,MAAA,EAAQ,cAAe,EAAA,GAAI,IAAK,CAAA,SAAA,CAAU,WAAY,CAAA,EAAE,KAAO,EAAA,CAAA,EAAG,CAAA;AAChG,IAAA,MAAM,YAAY,IAAK,CAAA,GAAA,CAAI,SAAY,GAAA,aAAA,EAAe,aAAa,cAAc,CAAA;AAGjF,IAAA,MAAM,WAAW,IAAK,CAAA,SAAA,CAAU,YAAY,EAAE,KAAA,EAAO,WAAW,CAAA;AAGhE,IAAM,MAAA,aAAA,GAAgB,QAAS,CAAA,KAAA,GAAQ,QAAS,CAAA,MAAA;AAChD,IAAA,MAAM,YAAY,SAAY,GAAA,UAAA;AAC9B,IAAA,MAAM,kBAAkB,aAAgB,GAAA,SAAA;AACxC,IAAM,MAAA,WAAA,GAAc,eAAkB,GAAA,SAAA,GAAY,UAAa,GAAA,aAAA;AAC/D,IAAA,MAAM,YAAe,GAAA,aAAA,GAAgB,SAAY,GAAA,SAAA,GAAY,aAAgB,GAAA,UAAA;AAE7E,IAAA,MAAA,CAAO,KAAQ,GAAA,IAAA,CAAK,KAAM,CAAA,QAAA,CAAS,QAAQ,eAAe,CAAA;AAC1D,IAAA,MAAA,CAAO,MAAS,GAAA,IAAA,CAAK,KAAM,CAAA,QAAA,CAAS,SAAS,eAAe,CAAA;AAC5D,IAAA,MAAA,CAAO,KAAM,CAAA,KAAA,GAAQ,IAAK,CAAA,KAAA,CAAM,WAAW,CAAI,GAAA,IAAA;AAC/C,IAAA,MAAA,CAAO,KAAM,CAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,YAAY,CAAI,GAAA,IAAA;AAEjD,IAAA,IAAI,KAAK,UAAY,EAAA;AACnB,MAAA,IAAA,CAAK,WAAW,MAAO,EAAA;AAAA;AAGzB,IAAM,MAAA,SAAA,GAAY,eAAoB,KAAA,CAAA,GAAI,CAAC,eAAA,EAAiB,GAAG,CAAG,EAAA,eAAA,EAAiB,CAAG,EAAA,CAAC,CAAI,GAAA,IAAA;AAE3F,IAAK,IAAA,CAAA,UAAA,GAAa,IAAK,CAAA,SAAA,EAAW,MAAO,CAAA;AAAA,MACvC,GAAI,SAAa,IAAA,EAAE,SAAU,EAAA;AAAA,MAC7B,aAAe,EAAA,OAAA;AAAA,MACf;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,UAAY,EAAA,OAAA,CACd,KAAM,CAAA,CAAC,CAAM,KAAA;AACZ,MAAA,IAAI,EAAE,CAAA,YAAa,2BAA8B,CAAA,EAAA,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,KACjE,CACA,CAAA,OAAA,CAAQ,MAAM;AACb,MAAA,IAAA,CAAK,UAAa,GAAA,KAAA,CAAA;AAAA,KACnB,CAAA;AAEH,IAAO,OAAA,KAAA,CAAA;AAAA;AAEX;;ACtHA,MAAM,UAAA,GAAa,OAAO,CAAO,KAAA,CAAA,CAAA;AAE1B,MAAM,iBAAiB,CAAC,OAAA,KAC7B,SAAa,IAAA,OAAA,IAAW,QAAQ,OAAY,KAAA;AAOjC,MAAA,oBAAA,GAAuB,OAAO,IAAiC,KAAA;AAC1E,EAAA,MAAM,cAAc,QAAS,CAAA,WAAA,CAAY,MAAM,IAAA,CAAK,aAAa,CAAA;AAEjE,EAAM,MAAA,GAAA,GAAM,MAAM,WAAY,CAAA,OAAA;AAE9B,EAAA,MAAM,OAAU,GAAA;AAAA,IACd,UAAU,IAAK,CAAA,IAAA;AAAA,IACf,aAAe,EAAA,GAAA;AAAA,IACf,OAAS,EAAA,UAAA;AAAA,IACT,KAAA,EAAO,KAAM,CAAA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAI,QAAQ,CAAC,CAAE,CAAA,GAAA,CAAI,CAAC,CAAA,EAAG,KAAW,MAAA;AAAA,MACxD,GAAK,EAAA,KAAA;AAAA,MACL,MAAM,YAAY;AAChB,QAAM,MAAA,IAAI,MAAM,6BAA6B,CAAA;AAAA,OAC/C;AAAA,MACA,QAAA,EAAU,GAAG,KAAK,CAAA,IAAA,CAAA;AAAA,MAClB,IAAM,EAAA,CAAA;AAAA,MACN,QAAQ,MAAM;AACZ,QAAM,MAAA,IAAI,MAAM,6BAA6B,CAAA;AAAA,OAC/C;AAAA,MACA,GAAA,EAAK,GAAG,KAAK,CAAA,IAAA;AAAA,KACb,CAAA,CAAA;AAAA,IACF,OAAO,MAAM;AACX,MAAA,OAAO,IAAI,OAAQ,EAAA;AAAA;AACrB,GACF;AAEA,EAAO,OAAA,OAAA;AACT;;ACpCO,MAAM,WACX,GAAA,CAA2E,IAC3E,KAAA,CAAC,OAA6D,KAAA;AAC5D,EAAA,MAAM,SAAS,IAAK,CAAA;AAAA,IAClB,GAAG,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUH,YAAY,IAAM,EAAA;AAChB,MAAM,MAAA,aAAA,GAAgB,OAAQ,CAAA,WAAA,GAAc,IAAI,CAAA;AAEhD,MAAA,IAAI,CAAC,aAAiB,IAAA,IAAA,CAAK,IAAK,CAAA,QAAA,CAAS,MAAM,CAAG,EAAA;AAChD,QAAO,OAAA,WAAA;AAAA;AAGT,MAAO,OAAA,aAAA;AAAA,KACT;AAAA,IACA,aAAa,CAAC,IAAA,KACZ,QAAQ,GAAI,CAAA,iBAAA,CAAkB,IAAI,CAAE,CAAA,IAAA;AAAA,MAClC,QAAA,CAAS,CAAC,OAAY,KAAA;AACpB,QAAA,IAAI,CAAC,OAAA,EAAgB,OAAA,EAAA,CAAG,KAAS,CAAA,CAAA;AAEjC,QAAI,IAAA,CAAC,cAAe,CAAA,OAAO,CAAG,EAAA;AAC5B,UAAA,OAAA,CAAQ,KAAK,CAAqC,mCAAA,CAAA,CAAA;AAElD,UAAA,OAAO,GAAG,KAAS,CAAA,CAAA;AAAA;AAGrB,QAAM,MAAA,SAAA,GAAY,OAAQ,CAAA,KAAA,CAAM,SAAU,CAAA,CAAC,IAAS,KAAA,IAAA,CAAK,IAAK,CAAA,QAAA,CAAS,IAAK,CAAA,GAAG,CAAC,CAAA;AAEhF,QAAA,OAAO,KAAK,OAAQ,CAAA,aAAA,CAAc,QAAQ,SAAY,GAAA,CAAC,CAAC,CAAE,CAAA,IAAA;AAAA,UACxD,GAAA,CAAI,CAAC,SAAe,MAAA;AAAA,YAClB,MAAQ,EAAA,IAAA;AAAA,YACR,IAAM,EAAA;AAAA,WACN,CAAA;AAAA,SACJ;AAAA,OACD;AAAA;AACH,GACH,CAAA;AAED,EAAO,OAAA,MAAA;AACT;;;;"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
(function (global, factory) {
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs'), require('pdfjs-dist'), require('@prose-reader/core')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports', 'rxjs', 'pdfjs-dist', '@prose-reader/core'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["prose-reader-enhancer-pdf"] = {}, global.rxjs, global.pdfjsLib, global.core));
|
|
5
|
+
})(this, (function (exports, rxjs, pdfjsLib, core) { 'use strict';
|
|
6
|
+
|
|
7
|
+
function _interopNamespaceDefault(e) {
|
|
8
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
|
|
9
|
+
if (e) {
|
|
10
|
+
for (const k in e) {
|
|
11
|
+
if (k !== 'default') {
|
|
12
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
13
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: () => e[k]
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
n.default = e;
|
|
21
|
+
return Object.freeze(n);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const pdfjsLib__namespace = /*#__PURE__*/_interopNamespaceDefault(pdfjsLib);
|
|
25
|
+
|
|
26
|
+
class PdfRenderer extends core.DocumentRenderer {
|
|
27
|
+
pageProxy;
|
|
28
|
+
renderTask;
|
|
29
|
+
getCanvas() {
|
|
30
|
+
const element = this.layers[0]?.element.children[0];
|
|
31
|
+
if (element instanceof HTMLCanvasElement) return element;
|
|
32
|
+
return void 0;
|
|
33
|
+
}
|
|
34
|
+
onUnload() {
|
|
35
|
+
this.layers.forEach(({ element }) => {
|
|
36
|
+
element.remove();
|
|
37
|
+
});
|
|
38
|
+
this.layers = [];
|
|
39
|
+
this.pageProxy?.cleanup();
|
|
40
|
+
return rxjs.EMPTY;
|
|
41
|
+
}
|
|
42
|
+
onCreateDocument() {
|
|
43
|
+
const canvasContainer = this.containerElement.ownerDocument.createElement(`div`);
|
|
44
|
+
canvasContainer.style.cssText = `
|
|
45
|
+
width: 100%;
|
|
46
|
+
height: 100%;
|
|
47
|
+
display: flex;
|
|
48
|
+
justify-content: center;
|
|
49
|
+
align-items: center;
|
|
50
|
+
`;
|
|
51
|
+
const canvas = this.containerElement.ownerDocument.createElement(`canvas`);
|
|
52
|
+
canvasContainer.appendChild(canvas);
|
|
53
|
+
this.layers = [
|
|
54
|
+
{
|
|
55
|
+
element: canvasContainer
|
|
56
|
+
}
|
|
57
|
+
];
|
|
58
|
+
return rxjs.EMPTY;
|
|
59
|
+
}
|
|
60
|
+
onLoadDocument() {
|
|
61
|
+
return rxjs.from(this.resourcesHandler.fetchResource()).pipe(
|
|
62
|
+
rxjs.switchMap((resource) => {
|
|
63
|
+
if (!("custom" in resource)) return rxjs.EMPTY;
|
|
64
|
+
const pageProxy = resource.data;
|
|
65
|
+
this.pageProxy = pageProxy;
|
|
66
|
+
const container = this.layers[0]?.element;
|
|
67
|
+
if (container) {
|
|
68
|
+
this.containerElement.appendChild(container);
|
|
69
|
+
}
|
|
70
|
+
return rxjs.EMPTY;
|
|
71
|
+
})
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
75
|
+
layout(_) {
|
|
76
|
+
const canvas = this.getCanvas();
|
|
77
|
+
const context = canvas?.getContext("2d");
|
|
78
|
+
const pixelRatioScale = window.devicePixelRatio || 1;
|
|
79
|
+
if (!canvas || !this.pageProxy || !context) return void 0;
|
|
80
|
+
const { height: pageHeight, width: pageWidth } = this.context.getPageSize();
|
|
81
|
+
const { width: viewportWidth, height: viewportHeight } = this.pageProxy.getViewport({ scale: 1 });
|
|
82
|
+
const pageScale = Math.max(pageWidth / viewportWidth, pageHeight / viewportHeight);
|
|
83
|
+
const viewport = this.pageProxy.getViewport({ scale: pageScale });
|
|
84
|
+
const viewportRatio = viewport.width / viewport.height;
|
|
85
|
+
const pageRatio = pageWidth / pageHeight;
|
|
86
|
+
const isWiderThanPage = viewportRatio > pageRatio;
|
|
87
|
+
const canvasWidth = isWiderThanPage ? pageWidth : pageHeight * viewportRatio;
|
|
88
|
+
const canvasHeight = viewportRatio > pageRatio ? pageWidth / viewportRatio : pageHeight;
|
|
89
|
+
canvas.width = Math.floor(viewport.width * pixelRatioScale);
|
|
90
|
+
canvas.height = Math.floor(viewport.height * pixelRatioScale);
|
|
91
|
+
canvas.style.width = Math.floor(canvasWidth) + "px";
|
|
92
|
+
canvas.style.height = Math.floor(canvasHeight) + "px";
|
|
93
|
+
if (this.renderTask) {
|
|
94
|
+
this.renderTask.cancel();
|
|
95
|
+
}
|
|
96
|
+
const transform = pixelRatioScale !== 1 ? [pixelRatioScale, 0, 0, pixelRatioScale, 0, 0] : null;
|
|
97
|
+
this.renderTask = this.pageProxy?.render({
|
|
98
|
+
...transform && { transform },
|
|
99
|
+
canvasContext: context,
|
|
100
|
+
viewport
|
|
101
|
+
});
|
|
102
|
+
this.renderTask?.promise.catch((e) => {
|
|
103
|
+
if (!(e instanceof pdfjsLib.RenderingCancelledException)) console.error(e);
|
|
104
|
+
}).finally(() => {
|
|
105
|
+
this.renderTask = void 0;
|
|
106
|
+
});
|
|
107
|
+
return void 0;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const PDF_SYMBOL = Symbol(`pdfjs`);
|
|
112
|
+
const isPdfJsArchive = (archive) => "_symbol" in archive && archive._symbol === PDF_SYMBOL;
|
|
113
|
+
const createArchiveFromPdf = async (file) => {
|
|
114
|
+
const loadingTask = pdfjsLib__namespace.getDocument(await file.arrayBuffer());
|
|
115
|
+
const pdf = await loadingTask.promise;
|
|
116
|
+
const archive = {
|
|
117
|
+
filename: file.name,
|
|
118
|
+
proxyDocument: pdf,
|
|
119
|
+
_symbol: PDF_SYMBOL,
|
|
120
|
+
files: Array.from(Array(pdf.numPages)).map((_, index) => ({
|
|
121
|
+
dir: false,
|
|
122
|
+
blob: async () => {
|
|
123
|
+
throw new Error("Unable to get blob from pdf");
|
|
124
|
+
},
|
|
125
|
+
basename: `${index}.pdf`,
|
|
126
|
+
size: 0,
|
|
127
|
+
string: () => {
|
|
128
|
+
throw new Error("Unable to get blob from pdf");
|
|
129
|
+
},
|
|
130
|
+
uri: `${index}.pdf`
|
|
131
|
+
})),
|
|
132
|
+
close: () => {
|
|
133
|
+
return pdf.cleanup();
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
return archive;
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
const pdfEnhancer = (next) => (options) => {
|
|
140
|
+
const reader = next({
|
|
141
|
+
...options,
|
|
142
|
+
/**
|
|
143
|
+
* We have a special renderer for pdf so we need to inject it
|
|
144
|
+
* for the relevant items. The enhancer could be configurable but for
|
|
145
|
+
* the sake of simplicity we will assume that an item ending with .pdf should
|
|
146
|
+
* be treated as a pdf document.
|
|
147
|
+
*
|
|
148
|
+
* The `getRenderer` hook should be non destructive, if we detect a renderer already
|
|
149
|
+
* setup we should return it.
|
|
150
|
+
*/
|
|
151
|
+
getRenderer(item) {
|
|
152
|
+
const MaybeRenderer = options.getRenderer?.(item);
|
|
153
|
+
if (!MaybeRenderer && item.href.endsWith(`.pdf`)) {
|
|
154
|
+
return PdfRenderer;
|
|
155
|
+
}
|
|
156
|
+
return MaybeRenderer;
|
|
157
|
+
},
|
|
158
|
+
getResource: (item) => options.pdf.getArchiveForItem(item).pipe(
|
|
159
|
+
rxjs.mergeMap((archive) => {
|
|
160
|
+
if (!archive) return rxjs.of(void 0);
|
|
161
|
+
if (!isPdfJsArchive(archive)) {
|
|
162
|
+
console.warn(`You provided an invalid pdf archive`);
|
|
163
|
+
return rxjs.of(void 0);
|
|
164
|
+
}
|
|
165
|
+
const fileIndex = archive.files.findIndex((file) => item.href.endsWith(file.uri));
|
|
166
|
+
return rxjs.from(archive.proxyDocument.getPage(fileIndex + 1)).pipe(
|
|
167
|
+
rxjs.map((pageProxy) => ({
|
|
168
|
+
custom: true,
|
|
169
|
+
data: pageProxy
|
|
170
|
+
}))
|
|
171
|
+
);
|
|
172
|
+
})
|
|
173
|
+
)
|
|
174
|
+
});
|
|
175
|
+
return reader;
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
exports.createArchiveFromPdf = createArchiveFromPdf;
|
|
179
|
+
exports.isPdfJsArchive = isPdfJsArchive;
|
|
180
|
+
exports.pdfEnhancer = pdfEnhancer;
|
|
181
|
+
|
|
182
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
183
|
+
|
|
184
|
+
}));
|
|
185
|
+
//# sourceMappingURL=index.umd.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.umd.cjs","sources":["../src/PdfRenderer.ts","../src/createArchiveFromPdf.ts","../src/pdfEnhancer.ts"],"sourcesContent":["import { EMPTY, from, Observable, switchMap } from \"rxjs\"\nimport { PDFPageProxy, RenderingCancelledException, RenderTask } from \"pdfjs-dist\"\nimport { DocumentRenderer } from \"@prose-reader/core\"\n\nexport class PdfRenderer extends DocumentRenderer {\n private pageProxy: PDFPageProxy | undefined\n private renderTask: RenderTask | undefined\n\n getCanvas() {\n const element = this.layers[0]?.element.children[0]\n\n if (element instanceof HTMLCanvasElement) return element\n\n return undefined\n }\n\n onUnload(): Observable<unknown> {\n this.layers.forEach(({ element }) => {\n element.remove()\n })\n\n this.layers = []\n\n this.pageProxy?.cleanup()\n\n return EMPTY\n }\n\n onCreateDocument(): Observable<unknown> {\n const canvasContainer = this.containerElement.ownerDocument.createElement(`div`)\n canvasContainer.style.cssText = `\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n `\n\n const canvas = this.containerElement.ownerDocument.createElement(`canvas`)\n\n canvasContainer.appendChild(canvas)\n\n this.layers = [\n {\n element: canvasContainer,\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 container = this.layers[0]?.element\n\n if (container) {\n this.containerElement.appendChild(container)\n }\n\n return EMPTY\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 const canvas = this.getCanvas()\n const context = canvas?.getContext(\"2d\")\n // Support HiDPI-screens.\n const pixelRatioScale = window.devicePixelRatio || 1\n\n if (!canvas || !this.pageProxy || !context) return undefined\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 if (this.renderTask) {\n this.renderTask.cancel()\n }\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 .catch((e) => {\n if (!(e instanceof RenderingCancelledException)) console.error(e)\n })\n .finally(() => {\n this.renderTask = undefined\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 \"./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 MaybeRenderer = options.getRenderer?.(item)\n\n if (!MaybeRenderer && item.href.endsWith(`.pdf`)) {\n return PdfRenderer\n }\n\n return MaybeRenderer\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","RenderingCancelledException","pdfjsLib","mergeMap","of","map"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createReader, Reader } from '@prose-reader/core';
|
|
2
|
+
import { EnhancerOptions } from './types';
|
|
3
|
+
type CreateReader = typeof createReader;
|
|
4
|
+
type CreateReaderOptions = Parameters<CreateReader>[0];
|
|
5
|
+
export declare const pdfEnhancer: <InheritOptions extends CreateReaderOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) => (options: InheritOptions & EnhancerOptions) => InheritOutput;
|
|
6
|
+
export {};
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Manifest } from '@prose-reader/core';
|
|
2
|
+
import { Archive } from '@prose-reader/streamer';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
export type EnhancerOptions = {
|
|
5
|
+
pdf: {
|
|
6
|
+
getArchiveForItem: (item: Manifest["spineItems"][number]) => Observable<Archive | undefined>;
|
|
7
|
+
};
|
|
8
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@prose-reader/enhancer-pdf",
|
|
3
|
+
"version": "1.118.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.umd.cjs",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"/dist"
|
|
10
|
+
],
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/index.umd.cjs"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"start": "vite build --watch --mode development",
|
|
19
|
+
"build": "tsc && vite build",
|
|
20
|
+
"lint:read": "prettier --check . && eslint . --ext .ts,.tsx,.js,.jsx",
|
|
21
|
+
"lint:write": "prettier --write . && eslint --fix . --ext .ts,.tsx,.js,.jsx"
|
|
22
|
+
},
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"@prose-reader/core": "^1.117.0",
|
|
25
|
+
"pdfjs-dist": "^4.8.69",
|
|
26
|
+
"rxjs": "*"
|
|
27
|
+
}
|
|
28
|
+
}
|