@octanejs/pdf 0.0.1
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/LICENSE +21 -0
- package/README.md +54 -0
- package/THIRD_PARTY_NOTICES.md +12 -0
- package/UPSTREAM.md +30 -0
- package/dist/Page/AnnotationLayer.css +333 -0
- package/dist/Page/TextLayer.css +119 -0
- package/package.json +80 -0
- package/src/LinkService.ts +128 -0
- package/src/PasswordResponses.ts +6 -0
- package/src/Ref.ts +15 -0
- package/src/components.tsrx +887 -0
- package/src/contexts.ts +19 -0
- package/src/index.server.ts +18 -0
- package/src/index.ts +20 -0
- package/src/refs.ts +14 -0
- package/src/types.ts +205 -0
- package/src/utils.ts +27 -0
- package/src/vite-env.d.ts +4 -0
- package/upstream-public-surface.json +65 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type { PDFDocumentProxy } from 'pdfjs-dist';
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
Dest,
|
|
5
|
+
ExternalLinkRel,
|
|
6
|
+
ExternalLinkTarget,
|
|
7
|
+
ResolvedDest,
|
|
8
|
+
ScrollPageIntoViewArgs,
|
|
9
|
+
} from './types.js';
|
|
10
|
+
|
|
11
|
+
type PDFViewer = {
|
|
12
|
+
currentPageNumber?: number;
|
|
13
|
+
scrollPageIntoView: (args: ScrollPageIntoViewArgs) => void;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const DEFAULT_LINK_REL = 'noopener noreferrer nofollow';
|
|
17
|
+
|
|
18
|
+
export default class LinkService {
|
|
19
|
+
externalLinkEnabled = true;
|
|
20
|
+
externalLinkRel?: ExternalLinkRel;
|
|
21
|
+
externalLinkTarget?: ExternalLinkTarget;
|
|
22
|
+
isInPresentationMode = false;
|
|
23
|
+
pdfDocument?: PDFDocumentProxy | null;
|
|
24
|
+
pdfViewer?: PDFViewer | null;
|
|
25
|
+
|
|
26
|
+
setDocument(pdfDocument: PDFDocumentProxy): void {
|
|
27
|
+
this.pdfDocument = pdfDocument;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
setViewer(pdfViewer: PDFViewer): void {
|
|
31
|
+
this.pdfViewer = pdfViewer;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
setExternalLinkRel(value?: ExternalLinkRel): void {
|
|
35
|
+
this.externalLinkRel = value;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
setExternalLinkTarget(value?: ExternalLinkTarget): void {
|
|
39
|
+
this.externalLinkTarget = value;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
setHash(): void {}
|
|
43
|
+
setHistory(): void {}
|
|
44
|
+
goToXY(): void {}
|
|
45
|
+
cachePageRef(): void {}
|
|
46
|
+
executeNamedAction(): void {}
|
|
47
|
+
executeSetOCGState(): void {}
|
|
48
|
+
|
|
49
|
+
get pagesCount(): number {
|
|
50
|
+
return this.pdfDocument?.numPages ?? 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
get page(): number {
|
|
54
|
+
return this.pdfViewer?.currentPageNumber ?? 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
set page(value: number) {
|
|
58
|
+
if (!this.pdfViewer) throw new Error('PDF viewer is not initialized.');
|
|
59
|
+
this.pdfViewer.currentPageNumber = value;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
get rotation(): number {
|
|
63
|
+
return 0;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
set rotation(_value: number) {}
|
|
67
|
+
|
|
68
|
+
addLinkAttributes(link: HTMLAnchorElement, url: string, newWindow = false): void {
|
|
69
|
+
link.href = url;
|
|
70
|
+
link.rel = this.externalLinkRel || DEFAULT_LINK_REL;
|
|
71
|
+
link.target = newWindow ? '_blank' : this.externalLinkTarget || '';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async goToDestination(dest: Dest): Promise<void> {
|
|
75
|
+
if (!this.pdfDocument) throw new Error('PDF document not loaded.');
|
|
76
|
+
if (!dest) throw new Error('Destination is not specified.');
|
|
77
|
+
const explicitDest =
|
|
78
|
+
typeof dest === 'string' ? await this.pdfDocument.getDestination(dest) : await dest;
|
|
79
|
+
if (!Array.isArray(explicitDest))
|
|
80
|
+
throw new Error(`"${explicitDest}" is not a valid destination array.`);
|
|
81
|
+
const destRef = explicitDest[0];
|
|
82
|
+
let pageIndex: number;
|
|
83
|
+
if (typeof destRef === 'number') {
|
|
84
|
+
pageIndex = destRef;
|
|
85
|
+
} else if (destRef && typeof destRef === 'object') {
|
|
86
|
+
try {
|
|
87
|
+
pageIndex = await this.pdfDocument.getPageIndex(destRef);
|
|
88
|
+
} catch {
|
|
89
|
+
throw new Error(`"${destRef}" is not a valid page reference.`);
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
throw new Error(`"${destRef}" is not a valid destination reference.`);
|
|
93
|
+
}
|
|
94
|
+
this.scrollTo(pageIndex + 1, explicitDest as ResolvedDest);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
goToPage(pageNumber: number): void {
|
|
98
|
+
this.scrollTo(pageNumber);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private scrollTo(pageNumber: number, dest?: ResolvedDest): void {
|
|
102
|
+
if (!this.pdfViewer) throw new Error('PDF viewer is not initialized.');
|
|
103
|
+
if (pageNumber < 1 || pageNumber > this.pagesCount) {
|
|
104
|
+
throw new Error(`"${pageNumber}" is not a valid page number.`);
|
|
105
|
+
}
|
|
106
|
+
this.pdfViewer.scrollPageIntoView({ dest, pageIndex: pageNumber - 1, pageNumber });
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
getDestinationHash(): string {
|
|
110
|
+
return '#';
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
getAnchorUrl(): string {
|
|
114
|
+
return '#';
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
isPageVisible(): boolean {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
isPageCached(): boolean {
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
navigateTo(dest: Dest): void {
|
|
126
|
+
void this.goToDestination(dest);
|
|
127
|
+
}
|
|
128
|
+
}
|
package/src/Ref.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RefProxy } from 'pdfjs-dist/types/src/display/api.js';
|
|
2
|
+
|
|
3
|
+
export default class Ref implements RefProxy {
|
|
4
|
+
readonly num: number;
|
|
5
|
+
readonly gen: number;
|
|
6
|
+
|
|
7
|
+
constructor({ num, gen }: RefProxy) {
|
|
8
|
+
this.num = num;
|
|
9
|
+
this.gen = gen;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
toString(): string {
|
|
13
|
+
return `${this.num}R${this.gen === 0 ? '' : this.gen}`;
|
|
14
|
+
}
|
|
15
|
+
}
|