@build-qube/papyra 0.0.4 → 0.2.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/README.md +129 -0
- package/dist/cache.d.ts +3 -0
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js.map +1 -1
- package/dist/document.d.ts +251 -3
- package/dist/document.d.ts.map +1 -1
- package/dist/document.js +444 -16
- package/dist/document.js.map +1 -1
- package/dist/encode.d.ts +49 -0
- package/dist/encode.d.ts.map +1 -0
- package/dist/encode.js +71 -0
- package/dist/encode.js.map +1 -0
- package/dist/encoded.d.ts +91 -0
- package/dist/encoded.d.ts.map +1 -0
- package/dist/encoded.js +84 -0
- package/dist/encoded.js.map +1 -0
- package/dist/errors.d.ts +45 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +69 -0
- package/dist/errors.js.map +1 -0
- package/dist/fingerprint.d.ts +18 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +48 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/index.d.ts +12 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/links.d.ts +53 -0
- package/dist/links.d.ts.map +1 -0
- package/dist/links.js +26 -0
- package/dist/links.js.map +1 -0
- package/dist/outline.d.ts +72 -0
- package/dist/outline.d.ts.map +1 -0
- package/dist/outline.js +73 -0
- package/dist/outline.js.map +1 -0
- package/dist/runtime.d.ts +8 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +2 -0
- package/dist/runtime.js.map +1 -1
- package/dist/scheduler.d.ts +20 -2
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +15 -0
- package/dist/scheduler.js.map +1 -1
- package/dist/search.d.ts +50 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +151 -0
- package/dist/search.js.map +1 -0
- package/dist/text.d.ts +113 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +84 -0
- package/dist/text.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -3
package/dist/document.js
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
|
-
import { PdfDocument as NativeDocument } from '@build-qube/papyra-native';
|
|
1
|
+
import { PdfDocument as NativeDocument, } from '@build-qube/papyra-native';
|
|
2
2
|
import { RenderCache } from './cache.js';
|
|
3
|
+
import { PageImage, svgPage } from './encode.js';
|
|
4
|
+
import { rethrowLoadError } from './errors.js';
|
|
5
|
+
import { fingerprint } from './fingerprint.js';
|
|
6
|
+
import { toPageLink } from './links.js';
|
|
7
|
+
import { buildOutlineTree } from './outline.js';
|
|
3
8
|
import { currentRuntime, hardwareConcurrency, init, MAX_WASM_CONCURRENCY, } from './runtime.js';
|
|
4
9
|
import { DEFAULT_PRIORITY, Scheduler } from './scheduler.js';
|
|
10
|
+
import { searchPageText } from './search.js';
|
|
5
11
|
import { toBytes } from './source.js';
|
|
12
|
+
import { pageTextBytes, toPageText } from './text.js';
|
|
6
13
|
const DEFAULT_DPI = 72;
|
|
7
14
|
/**
|
|
8
15
|
* Refuse renders large enough to take down the tab.
|
|
@@ -12,28 +19,126 @@ const DEFAULT_DPI = 72;
|
|
|
12
19
|
const MAX_PIXELS = 100_000_000;
|
|
13
20
|
/** Default bytes of rendered pages to keep. Roughly eleven 2000px ARCH-E sheets. */
|
|
14
21
|
const DEFAULT_CACHE_BYTES = 128 * 1024 * 1024;
|
|
15
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Default bytes of extracted text to keep.
|
|
24
|
+
*
|
|
25
|
+
* Text is three orders of magnitude smaller than the pixels of the same page — a
|
|
26
|
+
* dense page of a paper is ~80 KB against ~11 MB — so this holds hundreds of pages
|
|
27
|
+
* and a repeated search never re-extracts.
|
|
28
|
+
*/
|
|
29
|
+
const DEFAULT_TEXT_CACHE_BYTES = 32 * 1024 * 1024;
|
|
30
|
+
/**
|
|
31
|
+
* Bytes of page links to keep.
|
|
32
|
+
*
|
|
33
|
+
* Not an option, unlike the render and text budgets: links are two orders of
|
|
34
|
+
* magnitude smaller again — a page of a linked table of contents is a few hundred
|
|
35
|
+
* bytes — so 4 MB holds tens of thousands of them and there is nothing to tune.
|
|
36
|
+
*/
|
|
37
|
+
const LINK_CACHE_BYTES = 4 * 1024 * 1024;
|
|
38
|
+
/** Rough bytes per cached link: two objects, a rect, and a short string. */
|
|
39
|
+
const LINK_BYTES = 96;
|
|
40
|
+
/**
|
|
41
|
+
* Where text extraction sits in the queue by default.
|
|
42
|
+
*
|
|
43
|
+
* Behind rendering: a search that stalls the page the user is looking at is worse
|
|
44
|
+
* than one that takes another beat to fill in.
|
|
45
|
+
*/
|
|
46
|
+
const DEFAULT_TEXT_PRIORITY = 3;
|
|
47
|
+
/** napi omits absent strings rather than nulling them; normalise to one shape. */
|
|
48
|
+
function toMetadata(info) {
|
|
49
|
+
return {
|
|
50
|
+
title: info.title ?? null,
|
|
51
|
+
author: info.author ?? null,
|
|
52
|
+
subject: info.subject ?? null,
|
|
53
|
+
keywords: info.keywords ?? null,
|
|
54
|
+
creator: info.creator ?? null,
|
|
55
|
+
producer: info.producer ?? null,
|
|
56
|
+
created: info.created ?? null,
|
|
57
|
+
modified: info.modified ?? null,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** Wire an `AbortSignal` to a queued job. Cancelling only drops work not yet started. */
|
|
61
|
+
function attachSignal(handle, signal) {
|
|
62
|
+
if (!signal)
|
|
63
|
+
return;
|
|
64
|
+
if (signal.aborted) {
|
|
65
|
+
handle.cancel('signal aborted');
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
signal.addEventListener('abort', () => handle.cancel('signal aborted'), {
|
|
69
|
+
once: true,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Open a PDF from bytes, an `ArrayBuffer`, a `Blob`, or a `File`.
|
|
74
|
+
*
|
|
75
|
+
* Throws {@link PasswordRequiredError} when the document is encrypted and no
|
|
76
|
+
* {@link OpenOptions.password} was given, and {@link IncorrectPasswordError} when one
|
|
77
|
+
* was given and rejected. Both extend {@link PasswordError}, so a viewer that shows
|
|
78
|
+
* one dialog for both can catch the base.
|
|
79
|
+
*/
|
|
16
80
|
export async function open(source, options = {}) {
|
|
17
81
|
init();
|
|
18
82
|
const bytes = await toBytes(source);
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
83
|
+
try {
|
|
84
|
+
const inner = options.password === undefined
|
|
85
|
+
? NativeDocument.load(bytes)
|
|
86
|
+
: NativeDocument.loadWithPassword(bytes, options.password);
|
|
87
|
+
return new Document(inner, fingerprint(bytes), options);
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
rethrowLoadError(e);
|
|
91
|
+
}
|
|
23
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* An open PDF, and the queue and caches that serve it.
|
|
95
|
+
*
|
|
96
|
+
* Every page-level call goes through one shared scheduler, so a thumbnail sweep can
|
|
97
|
+
* never starve the page on screen — attach a {@link RenderOptions.priority} and the
|
|
98
|
+
* queue reorders around it. Construct via {@link open}, not `new`.
|
|
99
|
+
*/
|
|
24
100
|
export class Document {
|
|
25
101
|
#inner;
|
|
102
|
+
// One queue for every kind of job, `renderImage` included: priority and concurrency
|
|
103
|
+
// are the point of this library, and a bulk export must not starve the visible page.
|
|
26
104
|
#scheduler;
|
|
27
105
|
#limit;
|
|
28
106
|
#cache;
|
|
107
|
+
#text;
|
|
108
|
+
#links;
|
|
109
|
+
/** In-flight link reads, so two callers on one page share a single task. */
|
|
110
|
+
#linksPending = new Map();
|
|
111
|
+
/** Memoised by {@link outline}; the outline cannot change under us. */
|
|
112
|
+
#outline;
|
|
113
|
+
/** Memoised by {@link pageLabels}. */
|
|
114
|
+
#labels;
|
|
115
|
+
/** Memoised by {@link metadata}. */
|
|
116
|
+
#metadata;
|
|
117
|
+
/** Memoised by {@link indexText}. */
|
|
118
|
+
#indexed;
|
|
119
|
+
/**
|
|
120
|
+
* A stable identifier for this document's bytes.
|
|
121
|
+
*
|
|
122
|
+
* Sixteen hex characters, for keying whatever you remember per document — the page
|
|
123
|
+
* it was left on, a zoom level, a set of highlights. Two `open` calls on the same
|
|
124
|
+
* file always agree.
|
|
125
|
+
*
|
|
126
|
+
* It is a hash of the file, **not** the PDF's own `/ID`: the engine exposes no
|
|
127
|
+
* trailer accessor, so that identifier is out of reach. The practical difference is
|
|
128
|
+
* that saving an incremental update changes this while `/ID` would have survived.
|
|
129
|
+
*/
|
|
130
|
+
fingerprint;
|
|
29
131
|
/** @internal — construct via {@link open}. */
|
|
30
|
-
constructor(inner, options = {}) {
|
|
132
|
+
constructor(inner, fingerprintOfBytes, options = {}) {
|
|
31
133
|
this.#inner = inner;
|
|
134
|
+
this.fingerprint = fingerprintOfBytes;
|
|
32
135
|
this.#limit = Math.max(1, options.concurrency ?? defaultConcurrency());
|
|
33
136
|
this.#scheduler = new Scheduler(this.#limit, {
|
|
34
137
|
yieldToUrgent: options.yieldToUrgent,
|
|
35
138
|
});
|
|
36
139
|
this.#cache = new RenderCache(options.cacheBytes ?? DEFAULT_CACHE_BYTES, (page) => page.data.byteLength);
|
|
140
|
+
this.#text = new RenderCache(options.textCacheBytes ?? DEFAULT_TEXT_CACHE_BYTES, pageTextBytes);
|
|
141
|
+
this.#links = new RenderCache(LINK_CACHE_BYTES, (links) => links.length * LINK_BYTES);
|
|
37
142
|
}
|
|
38
143
|
/** Rendered pages held for reuse, and how often that has paid off. */
|
|
39
144
|
get cache() {
|
|
@@ -51,9 +156,140 @@ export class Document {
|
|
|
51
156
|
oldestWaitMs: this.#scheduler.oldestWaitMs,
|
|
52
157
|
};
|
|
53
158
|
}
|
|
159
|
+
/** How many pages the document has. Page indices are 0-based throughout. */
|
|
54
160
|
get pageCount() {
|
|
55
161
|
return this.#inner.pageCount;
|
|
56
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* The PDF specification version the file declares, e.g. `'1.7'`.
|
|
165
|
+
*
|
|
166
|
+
* Deliberately not part of {@link Document.metadata}: that is what the producer
|
|
167
|
+
* chose to say about the document, while this is a structural property read from
|
|
168
|
+
* the file's header — and from the catalog, which overrides it for 1.4 and later,
|
|
169
|
+
* so an incrementally saved file reports the version it was last written as.
|
|
170
|
+
*
|
|
171
|
+
* `'1.0'` is worth treating with suspicion. Genuine PDF 1.0 files are close to
|
|
172
|
+
* extinct, and it is also what a file with an unreadable header reports.
|
|
173
|
+
*/
|
|
174
|
+
get pdfVersion() {
|
|
175
|
+
return this.#inner.pdfVersion ?? null;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* The document outline — bookmarks, the table of contents — as a tree.
|
|
179
|
+
*
|
|
180
|
+
* Resolves to an empty array when the document has no outline, which is the common
|
|
181
|
+
* case. The walk runs off the event loop and the result is memoised, so calling
|
|
182
|
+
* this on every render of a sidebar costs nothing after the first.
|
|
183
|
+
*
|
|
184
|
+
* Entries that point outside the document (a URL, another file) and containers that
|
|
185
|
+
* group children without a destination of their own both have a `dest` of `null`;
|
|
186
|
+
* they are kept because a viewer still lists them.
|
|
187
|
+
*
|
|
188
|
+
* @example
|
|
189
|
+
* ```ts
|
|
190
|
+
* for (const node of await doc.outline()) {
|
|
191
|
+
* if (node.page !== null) void doc.render(node.page, { fitWidth: 1600 });
|
|
192
|
+
* }
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
async outline() {
|
|
196
|
+
this.#outline ??= this.#inner
|
|
197
|
+
.outline()
|
|
198
|
+
.then(buildOutlineTree)
|
|
199
|
+
// A failed walk must not be cached as a permanent empty outline.
|
|
200
|
+
.catch((e) => {
|
|
201
|
+
this.#outline = undefined;
|
|
202
|
+
throw e;
|
|
203
|
+
});
|
|
204
|
+
return this.#outline;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* What the document says about itself: title, author, dates, the tool that wrote it.
|
|
208
|
+
*
|
|
209
|
+
* Synchronous — the engine reads the information dictionary while loading, so this
|
|
210
|
+
* only decodes strings. Every field is independently `null`, and none of it is
|
|
211
|
+
* verified; `title` in particular is often a filename or missing entirely.
|
|
212
|
+
*/
|
|
213
|
+
get metadata() {
|
|
214
|
+
this.#metadata ??= toMetadata(this.#inner.info());
|
|
215
|
+
return this.#metadata;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* The label printed on each page, one entry per page.
|
|
219
|
+
*
|
|
220
|
+
* Resolves to an **empty array** when the document defines no page labels, which is
|
|
221
|
+
* the common case — that is the signal to number pages by index yourself. A
|
|
222
|
+
* document that defines labels but says nothing about a particular page gives that
|
|
223
|
+
* page an empty string, which is a different answer.
|
|
224
|
+
*
|
|
225
|
+
* Worth honouring wherever a page number is shown: a document with front matter
|
|
226
|
+
* numbers its first pages i, ii, iii, and a viewer that says "page 4 of 300" when
|
|
227
|
+
* the sheet reads "A101" is describing a document nobody else can see.
|
|
228
|
+
*
|
|
229
|
+
* The walk runs off the event loop and the result is memoised.
|
|
230
|
+
*
|
|
231
|
+
* @example
|
|
232
|
+
* ```ts
|
|
233
|
+
* const labels = await doc.pageLabels();
|
|
234
|
+
* const shown = labels[index] || String(index + 1);
|
|
235
|
+
* ```
|
|
236
|
+
*/
|
|
237
|
+
async pageLabels() {
|
|
238
|
+
this.#labels ??= this.#inner.pageLabels().catch((e) => {
|
|
239
|
+
// A failed walk must not be cached as a permanent absence of labels.
|
|
240
|
+
this.#labels = undefined;
|
|
241
|
+
throw e;
|
|
242
|
+
});
|
|
243
|
+
return this.#labels;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* The links on one page — where they are, and where they go.
|
|
247
|
+
*
|
|
248
|
+
* Rectangles are in the same 72-DPI top-left space as {@link Document.pageText} and
|
|
249
|
+
* {@link Document.pageSize}, so placing them over a render is one multiply; see
|
|
250
|
+
* {@link scaleRect}. Only links that resolve to something actionable are reported.
|
|
251
|
+
*
|
|
252
|
+
* Unlike text extraction this never interprets a content stream — it is an
|
|
253
|
+
* object-graph read, roughly a thousandth the cost of rendering the page — so it
|
|
254
|
+
* does **not** go through the priority queue. Making a link layer wait behind
|
|
255
|
+
* renders would add latency a viewer can feel, for work that costs nothing.
|
|
256
|
+
* Results are cached, and two calls for the same page share one read.
|
|
257
|
+
*
|
|
258
|
+
* @example
|
|
259
|
+
* ```ts
|
|
260
|
+
* const scale = rendered.width / doc.pageSize(index).width;
|
|
261
|
+
* for (const link of await doc.links(index)) {
|
|
262
|
+
* const { x, y, width, height } = scaleRect(link.rect, scale);
|
|
263
|
+
* // ...position an anchor over the canvas
|
|
264
|
+
* }
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
267
|
+
async links(index) {
|
|
268
|
+
const key = `links:${index}`;
|
|
269
|
+
const hit = this.#links.get(key);
|
|
270
|
+
if (hit)
|
|
271
|
+
return hit;
|
|
272
|
+
const pending = this.#linksPending.get(index);
|
|
273
|
+
if (pending)
|
|
274
|
+
return pending;
|
|
275
|
+
const read = this.#inner
|
|
276
|
+
.pageLinks(index)
|
|
277
|
+
.then((native) => {
|
|
278
|
+
// `toPageLink` only returns null for a link with no resolvable target, which
|
|
279
|
+
// the bindings do not emit — the filter is here so a future one cannot leak
|
|
280
|
+
// a null into the array.
|
|
281
|
+
const links = native
|
|
282
|
+
.map(toPageLink)
|
|
283
|
+
.filter((link) => link !== null);
|
|
284
|
+
this.#links.set(key, links);
|
|
285
|
+
return links;
|
|
286
|
+
})
|
|
287
|
+
.finally(() => {
|
|
288
|
+
this.#linksPending.delete(index);
|
|
289
|
+
});
|
|
290
|
+
this.#linksPending.set(index, read);
|
|
291
|
+
return read;
|
|
292
|
+
}
|
|
57
293
|
/** Page dimensions in PDF points (1/72 inch). */
|
|
58
294
|
pageSize(index) {
|
|
59
295
|
return this.#inner.pageSize(index);
|
|
@@ -62,6 +298,90 @@ export class Document {
|
|
|
62
298
|
async renderPage(index, options = {}) {
|
|
63
299
|
return this.render(index, options).promise;
|
|
64
300
|
}
|
|
301
|
+
/**
|
|
302
|
+
* Render a page for export, keeping the pixels in Rust.
|
|
303
|
+
*
|
|
304
|
+
* The returned {@link PageImage} encodes on demand — `toWebp()`, `toPng()`,
|
|
305
|
+
* `toJpeg()`, `toDataUrl()` — and never hands the raw bitmap to JS. A 42x30in
|
|
306
|
+
* drawing at 150 DPI is 6.5 MB raw and a fraction of that encoded, so for anything
|
|
307
|
+
* leaving the process that buffer is pure overhead.
|
|
308
|
+
*
|
|
309
|
+
* Use `renderPage` when you want to paint to a canvas, and `encode()` when you want
|
|
310
|
+
* both the pixels and a file.
|
|
311
|
+
*
|
|
312
|
+
* Shares the scheduler with every other render, so priority and concurrency behave
|
|
313
|
+
* exactly as they do for `render`. **Not cached** — the cache is keyed by page and
|
|
314
|
+
* size with no format dimension, and it measures raw bytes.
|
|
315
|
+
*
|
|
316
|
+
* @example
|
|
317
|
+
* ```ts
|
|
318
|
+
* const img = await doc.renderImage(0, { fitWidth: 2000 });
|
|
319
|
+
* await writeFile('page-0.webp', (await img.toWebp()).bytes);
|
|
320
|
+
* ```
|
|
321
|
+
*/
|
|
322
|
+
async renderImage(index, options = {}) {
|
|
323
|
+
return this.imageHandle(index, options).promise;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* As {@link renderImage}, but returns the handle so the job can be reprioritised,
|
|
327
|
+
* cancelled, or timed — the same relationship `render` has to `renderPage`.
|
|
328
|
+
*
|
|
329
|
+
* `timing` is where the export path becomes measurable: it separates queue wait from
|
|
330
|
+
* render time, which end-to-end timing around the promise cannot.
|
|
331
|
+
*/
|
|
332
|
+
imageHandle(index, options = {}) {
|
|
333
|
+
const dpi = this.#resolveDpi(index, options);
|
|
334
|
+
// A distinct key space from `render`, so an image request never coalesces onto a
|
|
335
|
+
// pending raw render (different return type) or vice versa.
|
|
336
|
+
const handle = this.#scheduler.submit({
|
|
337
|
+
key: `image:${index}@${dpi.toFixed(4)}`,
|
|
338
|
+
priority: options.priority ?? DEFAULT_PRIORITY,
|
|
339
|
+
run: () => this.#inner.renderPageImageAsync(index, dpi, options.signal).then((img) => new PageImage(img)),
|
|
340
|
+
});
|
|
341
|
+
attachSignal(handle, options.signal);
|
|
342
|
+
return handle;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Convert a page to SVG — vector output, not pixels.
|
|
346
|
+
*
|
|
347
|
+
* Paths stay paths and text stays glyph outlines, so the result scales to any size
|
|
348
|
+
* and can be edited downstream. That is the trade: an SVG of a dense drawing is
|
|
349
|
+
* larger than a WebP of the same page at screen size and slower for a browser to
|
|
350
|
+
* paint, but it is the only output that survives being scaled up.
|
|
351
|
+
*
|
|
352
|
+
* Conversion is content-stream interpretation without rasterisation — roughly the
|
|
353
|
+
* non-preemptible portion of a render — so it shares the scheduler with everything
|
|
354
|
+
* else and honours {@link SvgOptions.priority}. **Not cached**, for the same reason
|
|
355
|
+
* {@link renderImage} is not.
|
|
356
|
+
*
|
|
357
|
+
* @example
|
|
358
|
+
* ```ts
|
|
359
|
+
* const page = await doc.renderSvg(0, { background: 'transparent' });
|
|
360
|
+
* await writeFile('page-0.svg', page.markup);
|
|
361
|
+
* ```
|
|
362
|
+
*/
|
|
363
|
+
async renderSvg(index, options = {}) {
|
|
364
|
+
return this.svgHandle(index, options).promise;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* As {@link renderSvg}, but returns the handle so the job can be reprioritised,
|
|
368
|
+
* cancelled, or timed — the same relationship `imageHandle` has to `renderImage`.
|
|
369
|
+
*/
|
|
370
|
+
svgHandle(index, options = {}) {
|
|
371
|
+
if (index < 0 || index >= this.pageCount) {
|
|
372
|
+
throw new RangeError(`papyra: page ${index} is out of range (0..${this.pageCount - 1})`);
|
|
373
|
+
}
|
|
374
|
+
const opaque = options.background !== 'transparent';
|
|
375
|
+
const handle = this.#scheduler.submit({
|
|
376
|
+
// The background is part of the key: the scheduler coalesces same-key requests,
|
|
377
|
+
// and an opaque and a transparent conversion of one page are different output.
|
|
378
|
+
key: `svg:${index}${opaque ? '' : ':transparent'}`,
|
|
379
|
+
priority: options.priority ?? DEFAULT_PRIORITY,
|
|
380
|
+
run: () => this.#inner.renderPageSvgAsync(index, opaque, options.signal).then(svgPage),
|
|
381
|
+
});
|
|
382
|
+
attachSignal(handle, options.signal);
|
|
383
|
+
return handle;
|
|
384
|
+
}
|
|
65
385
|
/**
|
|
66
386
|
* Render a page, returning a handle you can reprioritise or drop.
|
|
67
387
|
*
|
|
@@ -92,15 +412,7 @@ export class Document {
|
|
|
92
412
|
return page;
|
|
93
413
|
}),
|
|
94
414
|
});
|
|
95
|
-
|
|
96
|
-
if (signal) {
|
|
97
|
-
if (signal.aborted)
|
|
98
|
-
handle.cancel('signal aborted');
|
|
99
|
-
else
|
|
100
|
-
signal.addEventListener('abort', () => handle.cancel('signal aborted'), {
|
|
101
|
-
once: true,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
415
|
+
attachSignal(handle, options.signal);
|
|
104
416
|
return liveHandle(handle);
|
|
105
417
|
}
|
|
106
418
|
/**
|
|
@@ -207,6 +519,122 @@ export class Document {
|
|
|
207
519
|
handles.clear();
|
|
208
520
|
}
|
|
209
521
|
}
|
|
522
|
+
/**
|
|
523
|
+
* Extract the text of one page.
|
|
524
|
+
*
|
|
525
|
+
* Scheduled like a render, but behind one by default: a search should not stall the
|
|
526
|
+
* page the user is looking at. Results are cached, so searching the same document
|
|
527
|
+
* repeatedly extracts each page once.
|
|
528
|
+
*
|
|
529
|
+
* Extraction is interpretation without rasterisation, which makes it roughly a
|
|
530
|
+
* hundredth the cost of rendering the same page — about 1ms for a dense page of a
|
|
531
|
+
* paper. It is cheap enough to do speculatively.
|
|
532
|
+
*/
|
|
533
|
+
async pageText(index, options = {}) {
|
|
534
|
+
const key = `text:${index}`;
|
|
535
|
+
const hit = this.#text.get(key);
|
|
536
|
+
if (hit)
|
|
537
|
+
return hit;
|
|
538
|
+
// One queue for renders and text both, so priority means something across them.
|
|
539
|
+
// Coalescing by key is what stops a search and a text selection extracting the
|
|
540
|
+
// same page twice.
|
|
541
|
+
const handle = this.#scheduler.submit({
|
|
542
|
+
key,
|
|
543
|
+
priority: options.priority ?? DEFAULT_TEXT_PRIORITY,
|
|
544
|
+
run: async () => {
|
|
545
|
+
const text = toPageText(index, await this.#inner.pageTextAsync(index));
|
|
546
|
+
this.#text.set(key, text);
|
|
547
|
+
return text;
|
|
548
|
+
},
|
|
549
|
+
});
|
|
550
|
+
const { signal } = options;
|
|
551
|
+
if (signal) {
|
|
552
|
+
if (signal.aborted)
|
|
553
|
+
handle.cancel('signal aborted');
|
|
554
|
+
else
|
|
555
|
+
signal.addEventListener('abort', () => handle.cancel('signal aborted'), {
|
|
556
|
+
once: true,
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
return handle.promise;
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Extract every page's text up front, so a later search is immediate.
|
|
563
|
+
*
|
|
564
|
+
* Worth calling on a long document: on native this fans out across rayon rather
|
|
565
|
+
* than the JS thread pool, which an addon cannot resize past four threads —
|
|
566
|
+
* measured 15ms for a 14-page paper against ~1ms per page one at a time.
|
|
567
|
+
*
|
|
568
|
+
* On wasm it walks the pages through the scheduler instead. The rayon batch is a
|
|
569
|
+
* native-only path for the same reason `renderPages` is: rayon's wasm workers are
|
|
570
|
+
* Web Workers the JS event loop has to create, and driving a batch from a blocked
|
|
571
|
+
* thread traps (`docs/spike-results.md`, "wasm parallel rendering is UNSTABLE").
|
|
572
|
+
*
|
|
573
|
+
* Idempotent, and never necessary — {@link search} extracts what it needs as it
|
|
574
|
+
* goes. This only trades a pause now for instant results later.
|
|
575
|
+
*/
|
|
576
|
+
async indexText(options = {}) {
|
|
577
|
+
this.#indexed ??= this.#index(options).catch((e) => {
|
|
578
|
+
// A failed pass must not be remembered as a completed one.
|
|
579
|
+
this.#indexed = undefined;
|
|
580
|
+
throw e;
|
|
581
|
+
});
|
|
582
|
+
return this.#indexed;
|
|
583
|
+
}
|
|
584
|
+
async #index(options) {
|
|
585
|
+
if (currentRuntime() === 'native') {
|
|
586
|
+
const all = await this.#inner.pageTextsAsync(0, this.pageCount);
|
|
587
|
+
for (const [i, native] of all.entries()) {
|
|
588
|
+
this.#text.set(`text:${i}`, toPageText(i, native));
|
|
589
|
+
}
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
// The scheduler bounds how many run at once, so this stays within the four
|
|
593
|
+
// in-flight tasks napi-rs's browser glue allows.
|
|
594
|
+
await Promise.all(range(0, this.pageCount).map((i) => this.pageText(i, options)));
|
|
595
|
+
}
|
|
596
|
+
/**
|
|
597
|
+
* Find `query` in the document, yielding matches as each page is searched.
|
|
598
|
+
*
|
|
599
|
+
* Streaming rather than collected, because the first hit is usually the one the user
|
|
600
|
+
* wants and a long document should not make them wait for the last. Breaking out of
|
|
601
|
+
* the loop stops the search.
|
|
602
|
+
*
|
|
603
|
+
* `order` is the lever a viewer wants: searching outward from the current page finds
|
|
604
|
+
* the nearest hit first, which is almost never page 1.
|
|
605
|
+
*
|
|
606
|
+
* @example
|
|
607
|
+
* ```ts
|
|
608
|
+
* for await (const hit of doc.search('site plan', { order: outward(current) })) {
|
|
609
|
+
* show(hit.page, hit.rects);
|
|
610
|
+
* break;
|
|
611
|
+
* }
|
|
612
|
+
* ```
|
|
613
|
+
*/
|
|
614
|
+
async *search(query, options = {}) {
|
|
615
|
+
if (query.trim() === '')
|
|
616
|
+
return;
|
|
617
|
+
const pages = options.order ?? range(0, this.pageCount);
|
|
618
|
+
const limit = options.limit ?? Number.POSITIVE_INFINITY;
|
|
619
|
+
let found = 0;
|
|
620
|
+
for (const page of pages) {
|
|
621
|
+
if (options.signal?.aborted)
|
|
622
|
+
return;
|
|
623
|
+
const text = await this.pageText(page, {
|
|
624
|
+
priority: options.priority ?? DEFAULT_TEXT_PRIORITY,
|
|
625
|
+
signal: options.signal,
|
|
626
|
+
});
|
|
627
|
+
for (const match of searchPageText(text, query, options)) {
|
|
628
|
+
yield match;
|
|
629
|
+
if (++found >= limit)
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
/** Extracted page text held for reuse, and how often that has paid off. */
|
|
635
|
+
get textCache() {
|
|
636
|
+
return this.#text.stats;
|
|
637
|
+
}
|
|
210
638
|
/** How many pages this document will render at once. */
|
|
211
639
|
get concurrency() {
|
|
212
640
|
return this.#limit;
|
package/dist/document.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.js","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"document.js","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}
|
package/dist/encode.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type PageImage as NativePageImage } from '@build-qube/papyra-native';
|
|
2
|
+
import { type EncodedImage, type EncodeOptions } from './encoded.js';
|
|
3
|
+
import type { RenderedPage } from './types.js';
|
|
4
|
+
export type { EncodedFormat, EncodedImage, EncodeOptions, RasterFormat, SvgPage, } from './encoded.js';
|
|
5
|
+
export { encodedImage, mimeType, svgPage } from './encoded.js';
|
|
6
|
+
/**
|
|
7
|
+
* Encode a page you already hold — a cache hit, or one you have just painted.
|
|
8
|
+
*
|
|
9
|
+
* This copies the pixels back into Rust, because a `Uint8Array` points at the JS heap
|
|
10
|
+
* and cannot be held across the worker-thread boundary. When you do not also need the
|
|
11
|
+
* raw pixels, `doc.renderImage()` skips the round trip entirely.
|
|
12
|
+
*/
|
|
13
|
+
export declare function encode(page: RenderedPage, options?: EncodeOptions): Promise<EncodedImage>;
|
|
14
|
+
/**
|
|
15
|
+
* A page held in Rust, encoded on demand.
|
|
16
|
+
*
|
|
17
|
+
* The pixels never cross into JS. A 42x30in drawing at 150 DPI is 6.5 MB raw and a
|
|
18
|
+
* fraction of that encoded, so for export the raw buffer is pure overhead. There is no
|
|
19
|
+
* accessor for it on purpose: use `renderPage` when you want pixels, this when you
|
|
20
|
+
* want a file.
|
|
21
|
+
*/
|
|
22
|
+
export declare class PageImage {
|
|
23
|
+
#private;
|
|
24
|
+
constructor(inner: NativePageImage);
|
|
25
|
+
/** Output width in pixels. */
|
|
26
|
+
get width(): number;
|
|
27
|
+
/** Output height in pixels. */
|
|
28
|
+
get height(): number;
|
|
29
|
+
/** Size of the *raw* bitmap still held in Rust. Encoded output is much smaller. */
|
|
30
|
+
get byteLength(): number;
|
|
31
|
+
/** Encode to {@link EncodeOptions.format}, defaulting to WebP. */
|
|
32
|
+
encode(options?: EncodeOptions): Promise<EncodedImage>;
|
|
33
|
+
/** Lossless VP8L. The default, and ~3x smaller than PNG on page content. */
|
|
34
|
+
toWebp(options?: Omit<EncodeOptions, 'format' | 'quality'>): Promise<EncodedImage>;
|
|
35
|
+
/** Lossless PNG. Reach for it when the consumer cannot be trusted to read WebP. */
|
|
36
|
+
toPng(options?: Omit<EncodeOptions, 'format' | 'quality'>): Promise<EncodedImage>;
|
|
37
|
+
/**
|
|
38
|
+
* Lossy JPEG at `quality` (1-100, default 80).
|
|
39
|
+
*
|
|
40
|
+
* No alpha: transparent pixels composite onto white, matching how pages render.
|
|
41
|
+
*/
|
|
42
|
+
toJpeg(quality?: number, options?: Omit<EncodeOptions, 'format'>): Promise<EncodedImage>;
|
|
43
|
+
/**
|
|
44
|
+
* Encode straight to a `data:` URL. Nothing but the finished string crosses the
|
|
45
|
+
* boundary — not the pixels, not the encoded bytes.
|
|
46
|
+
*/
|
|
47
|
+
toDataUrl(options?: EncodeOptions): Promise<string>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=encode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../src/encode.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,SAAS,IAAI,eAAe,EAClC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,aAAa,EAEnB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,YAAY,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,OAAO,GACR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE/D;;;;;;GAMG;AACH,wBAAsB,MAAM,CAC1B,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAYvB;AAED;;;;;;;GAOG;AACH,qBAAa,SAAS;;IAGpB,YAAY,KAAK,EAAE,eAAe,EAEjC;IAED,8BAA8B;IAC9B,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,+BAA+B;IAC/B,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,mFAAmF;IACnF,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,kEAAkE;IAC5D,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAQ/D;IAED,4EAA4E;IAC5E,MAAM,CAAC,OAAO,GAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,SAAS,CAAM,yBAE7D;IAED,mFAAmF;IACnF,KAAK,CAAC,OAAO,GAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,SAAS,CAAM,yBAE5D;IAED;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAM,yBAEnE;IAED;;;OAGG;IACH,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAMtD;CACF"}
|