@qrcommunication/gigapdf-lib 0.1.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.cjs ADDED
@@ -0,0 +1,541 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ GigaPdfDoc: () => GigaPdfDoc,
34
+ GigaPdfEngine: () => GigaPdfEngine
35
+ });
36
+ module.exports = __toCommonJS(index_exports);
37
+
38
+ // node_modules/.pnpm/tsup@8.5.1_postcss@8.5.15_typescript@6.0.3/node_modules/tsup/assets/cjs_shims.js
39
+ var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.tagName.toUpperCase() === "SCRIPT" ? document.currentScript.src : new URL("main.js", document.baseURI).href;
40
+ var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
41
+
42
+ // src/index.ts
43
+ var enc = new TextEncoder();
44
+ var dec = new TextDecoder();
45
+ var GigaPdfEngine = class _GigaPdfEngine {
46
+ constructor(ex) {
47
+ this.ex = ex;
48
+ }
49
+ ex;
50
+ /** Instantiate from raw wasm bytes, a URL/path, or a Response. */
51
+ static async load(source) {
52
+ let bytes;
53
+ if (typeof source === "string") {
54
+ const res = await fetch(source);
55
+ bytes = await res.arrayBuffer();
56
+ } else if (source instanceof Response) {
57
+ bytes = await source.arrayBuffer();
58
+ } else {
59
+ bytes = source;
60
+ }
61
+ const { instance } = await WebAssembly.instantiate(
62
+ bytes instanceof Uint8Array ? bytes.slice().buffer : bytes,
63
+ {}
64
+ );
65
+ return new _GigaPdfEngine(instance.exports);
66
+ }
67
+ /**
68
+ * Convenience loader for Node: instantiate from the `gigapdf.wasm` shipped
69
+ * inside this package (resolved relative to the built module). In the browser,
70
+ * pass a URL or bytes to {@link load} instead.
71
+ *
72
+ * In Next.js `output: "standalone"`, add the asset to `outputFileTracingIncludes`
73
+ * for the consuming route so the `.wasm` is copied into the standalone bundle.
74
+ */
75
+ static async loadDefault() {
76
+ const { readFile } = await import("fs/promises");
77
+ const { fileURLToPath } = await import("url");
78
+ const wasmPath = fileURLToPath(new URL("../gigapdf.wasm", importMetaUrl));
79
+ return _GigaPdfEngine.load(await readFile(wasmPath));
80
+ }
81
+ // ── linear-memory ABI helpers (internal) ─────────────────────────────────
82
+ u8() {
83
+ return new Uint8Array(this.ex.memory.buffer);
84
+ }
85
+ dv() {
86
+ return new DataView(this.ex.memory.buffer);
87
+ }
88
+ /** Copy host bytes into wasm memory; returns the pointer (caller frees). */
89
+ _toWasm(bytes) {
90
+ const ptr = this.ex.gp_alloc(bytes.length);
91
+ this.u8().set(bytes, ptr);
92
+ return ptr;
93
+ }
94
+ _free(ptr, len) {
95
+ this.ex.gp_free(ptr, len);
96
+ }
97
+ /** Call a buffer-returning export `(…, outLenPtr) -> dataPtr`; copies + frees. */
98
+ _buffer(call) {
99
+ const lenPtr = this.ex.gp_alloc(4);
100
+ const dataPtr = call(lenPtr);
101
+ if (dataPtr === 0) {
102
+ this.ex.gp_free(lenPtr, 4);
103
+ return new Uint8Array(0);
104
+ }
105
+ const len = this.dv().getUint32(lenPtr, true);
106
+ const out = this.u8().slice(dataPtr, dataPtr + len);
107
+ this.ex.gp_free(dataPtr, len);
108
+ this.ex.gp_free(lenPtr, 4);
109
+ return out;
110
+ }
111
+ _str(call) {
112
+ return dec.decode(this._buffer(call));
113
+ }
114
+ _json(call) {
115
+ const s = this._str(call);
116
+ return s ? JSON.parse(s) : [];
117
+ }
118
+ /** Pass a string argument; runs `fn(ptr, len)` then frees. */
119
+ _withStr(s, fn) {
120
+ const b = enc.encode(s);
121
+ const ptr = this._toWasm(b);
122
+ try {
123
+ return fn(ptr, b.length);
124
+ } finally {
125
+ this._free(ptr, b.length);
126
+ }
127
+ }
128
+ /** Pass a bytes argument; runs `fn(ptr, len)` then frees. */
129
+ _withBytes(bytes, fn) {
130
+ const ptr = this._toWasm(bytes);
131
+ try {
132
+ return fn(ptr, bytes.length);
133
+ } finally {
134
+ this._free(ptr, bytes.length);
135
+ }
136
+ }
137
+ /** Pass a `u32[]` argument (e.g. page numbers); runs `fn(ptr, count)` then frees. */
138
+ _withU32(values, fn) {
139
+ const ptr = this.ex.gp_alloc(values.length * 4);
140
+ const dv = this.dv();
141
+ for (const [i, v] of values.entries()) dv.setUint32(ptr + i * 4, v >>> 0, true);
142
+ try {
143
+ return fn(ptr, values.length);
144
+ } finally {
145
+ this._free(ptr, values.length * 4);
146
+ }
147
+ }
148
+ /** Pass a flat `f64[]` argument (e.g. ink x,y pairs); runs `fn(ptr, count)` then frees. */
149
+ _withF64(values, fn) {
150
+ const ptr = this.ex.gp_alloc(values.length * 8);
151
+ const dv = this.dv();
152
+ for (const [i, v] of values.entries()) dv.setFloat64(ptr + i * 8, v, true);
153
+ try {
154
+ return fn(ptr, values.length);
155
+ } finally {
156
+ this._free(ptr, values.length * 8);
157
+ }
158
+ }
159
+ get raw() {
160
+ return this.ex;
161
+ }
162
+ // ── documents ─────────────────────────────────────────────────────────────
163
+ /** Open a PDF. Throws if it can't be parsed. */
164
+ open(pdf) {
165
+ const handle = this._withBytes(pdf, (p, l) => this.ex.gp_open(p, l));
166
+ if (handle === 0) throw new Error("gigapdf: failed to open PDF");
167
+ return new GigaPdfDoc(this, handle);
168
+ }
169
+ /** Open an encrypted PDF with a password. Returns null if the password is wrong. */
170
+ openEncrypted(pdf, password) {
171
+ const b = enc.encode(password);
172
+ const pwPtr = this._toWasm(b);
173
+ const handle = this._withBytes(pdf, (p, l) => this.ex.gp_open_encrypted(p, l, pwPtr, b.length));
174
+ this._free(pwPtr, b.length);
175
+ return handle === 0 ? null : new GigaPdfDoc(this, handle);
176
+ }
177
+ // ── stateless <format> → PDF conversions ───────────────────────────────────
178
+ txtToPdf(text) {
179
+ return this._withStr(text, (p, l) => this._buffer((o) => this.ex.gp_txt_to_pdf(p, l, o)));
180
+ }
181
+ htmlToPdf(html) {
182
+ return this._withStr(html, (p, l) => this._buffer((o) => this.ex.gp_html_to_pdf(p, l, o)));
183
+ }
184
+ rtfToPdf(rtf) {
185
+ return this._withStr(rtf, (p, l) => this._buffer((o) => this.ex.gp_rtf_to_pdf(p, l, o)));
186
+ }
187
+ /** Office (DOCX/ODT/PPTX/XLSX/ODS) → PDF, auto-detected. Empty array if unrecognized. */
188
+ officeToPdf(office) {
189
+ return this._withBytes(
190
+ office,
191
+ (p, l) => this._buffer((o) => this.ex.gp_office_to_pdf(p, l, o))
192
+ );
193
+ }
194
+ // ── fonts (catalog / Google Fonts URL — the host performs the fetch) ───────
195
+ fontCatalog() {
196
+ return this._json((o) => this.ex.gp_font_catalog_json(o));
197
+ }
198
+ /** Google Fonts CSS2 URL for a family/weight/italic (host fetches it). */
199
+ fontRequestUrl(family, weight = 400, italic = false) {
200
+ return this._withStr(
201
+ family,
202
+ (p, l) => this._str((o) => this.ex.gp_font_request_url(p, l, weight, italic ? 1 : 0, o))
203
+ );
204
+ }
205
+ /** Extract the trusted gstatic font URL from a Google Fonts CSS2 response. */
206
+ parseCssFontUrl(css) {
207
+ return this._withStr(css, (p, l) => this._str((o) => this.ex.gp_parse_css_font_url(p, l, o)));
208
+ }
209
+ };
210
+ var RGB = (rgb) => rgb & 16777215;
211
+ var GigaPdfDoc = class {
212
+ constructor(g, h) {
213
+ this.g = g;
214
+ this.h = h;
215
+ }
216
+ g;
217
+ h;
218
+ ex() {
219
+ return this.g.raw;
220
+ }
221
+ close() {
222
+ this.ex().gp_close(this.h);
223
+ }
224
+ pageCount() {
225
+ return this.ex().gp_page_count(this.h);
226
+ }
227
+ save() {
228
+ return this.g._buffer((o) => this.ex().gp_save(this.h, o));
229
+ }
230
+ saveCompressed() {
231
+ return this.g._buffer((o) => this.ex().gp_save_compressed(this.h, o));
232
+ }
233
+ // text intelligence
234
+ textRuns(page) {
235
+ return this.g._json((o) => this.ex().gp_text_runs_json(this.h, page, o));
236
+ }
237
+ elements(page) {
238
+ return this.g._json((o) => this.ex().gp_elements_json(this.h, page, o));
239
+ }
240
+ structuredText(page) {
241
+ return this.g._json((o) => this.ex().gp_structured_text_json(this.h, page, o));
242
+ }
243
+ search(query, caseInsensitive = true) {
244
+ return this.g._withStr(
245
+ query,
246
+ (p, l) => this.g._json((o) => this.ex().gp_search_json(this.h, p, l, caseInsensitive ? 1 : 0, o))
247
+ );
248
+ }
249
+ /** OCR a (scanned) page → words with PDF-space boxes. `scale` ≥ 2 for small text. */
250
+ ocr(page, scale = 2) {
251
+ return this.g._json((o) => this.ex().gp_ocr_json(this.h, page, scale, o));
252
+ }
253
+ ocrText(page, scale = 2) {
254
+ return this.g._str((o) => this.ex().gp_ocr_text(this.h, page, scale, o));
255
+ }
256
+ // editing
257
+ replaceText(page, index, text) {
258
+ return this.g._withStr(text, (p, l) => this.ex().gp_replace_text(this.h, page, index, p, l)) === 0;
259
+ }
260
+ removeElement(page, index) {
261
+ return this.ex().gp_remove_element(this.h, page, index) === 0;
262
+ }
263
+ moveElement(page, index, dx, dy) {
264
+ return this.ex().gp_move_element(this.h, page, index, dx, dy) === 0;
265
+ }
266
+ duplicateElement(page, index) {
267
+ return this.ex().gp_duplicate_element(this.h, page, index) === 0;
268
+ }
269
+ /** Index of the element at page point `(x, y)`, or -1 if none. */
270
+ elementAt(page, x, y) {
271
+ return this.ex().gp_element_at(this.h, page, x, y);
272
+ }
273
+ /**
274
+ * Draw a vector rectangle. Pass an `0xRRGGBB` colour for `stroke`/`fill`, or
275
+ * `null` to omit that paint. 0 → success.
276
+ */
277
+ addRectangle(page, x, y, w, h, stroke = null, fill = 0, lineWidth = 1) {
278
+ return this.ex().gp_add_rectangle(
279
+ this.h,
280
+ page,
281
+ x,
282
+ y,
283
+ w,
284
+ h,
285
+ RGB(stroke ?? 0),
286
+ stroke === null ? 0 : 1,
287
+ RGB(fill ?? 0),
288
+ fill === null ? 0 : 1,
289
+ lineWidth
290
+ ) === 0;
291
+ }
292
+ /** True redaction: delete content intersecting the region (no opaque cover by default). */
293
+ redact(page, x, y, w, h, coverRgb = 0, hasCover = false) {
294
+ return this.ex().gp_redact_region(this.h, page, x, y, w, h, RGB(coverRgb), hasCover ? 1 : 0);
295
+ }
296
+ // pages
297
+ rotatePage(page, degrees) {
298
+ return this.ex().gp_rotate_page(this.h, page, degrees) === 0;
299
+ }
300
+ deletePage(page) {
301
+ return this.ex().gp_delete_page(this.h, page) === 0;
302
+ }
303
+ movePage(from, to) {
304
+ return this.ex().gp_move_page(this.h, from, to) === 0;
305
+ }
306
+ appendPages(otherPdf) {
307
+ return this.g._withBytes(otherPdf, (p, l) => this.ex().gp_append_pages(this.h, p, l)) === 0;
308
+ }
309
+ /** Extract the given 1-based page numbers into a NEW standalone PDF. */
310
+ extractPages(pages) {
311
+ return this.g._withU32(
312
+ pages,
313
+ (p, c) => this.g._buffer((o) => this.ex().gp_extract_pages(this.h, p, c, o))
314
+ );
315
+ }
316
+ /** Resize a page's MediaBox to `width`×`height` points. */
317
+ resizePage(page, width, height) {
318
+ return this.ex().gp_resize_page(this.h, page, width, height) === 0;
319
+ }
320
+ /** Insert a blank page after the 1-based `after` page (0 = front); returns its id. */
321
+ addPage(width, height, after = 0) {
322
+ return this.ex().gp_add_page(this.h, width, height, after);
323
+ }
324
+ /** Duplicate a page, inserting the copy right after it; returns the new page's id. */
325
+ copyPage(page) {
326
+ return this.ex().gp_copy_page(this.h, page);
327
+ }
328
+ /** A page's size (points) and `/Rotate` (0/90/180/270). */
329
+ pageInfo(page) {
330
+ return this.g._json((o) => this.ex().gp_page_info_json(this.h, page, o));
331
+ }
332
+ // render
333
+ renderPage(page, scale = 1) {
334
+ return this.g._buffer((o) => this.ex().gp_render_page(this.h, page, scale, o));
335
+ }
336
+ // fonts — embed a downloaded TTF, then add real selectable text
337
+ embedFont(family, ttf) {
338
+ const b = enc.encode(family);
339
+ const famPtr = this.g._toWasm(b);
340
+ const obj = this.g._withBytes(
341
+ ttf,
342
+ (p, l) => this.ex().gp_embed_font(this.h, famPtr, b.length, p, l)
343
+ );
344
+ this.g._free(famPtr, b.length);
345
+ return obj;
346
+ }
347
+ addText(page, x, y, size, text, fontObj, rgb = 0) {
348
+ return this.g._withStr(
349
+ text,
350
+ (p, l) => this.ex().gp_add_text(this.h, page, x, y, size, p, l, fontObj, RGB(rgb))
351
+ ) === 0;
352
+ }
353
+ neededFonts() {
354
+ return this.g._json((o) => this.ex().gp_needed_fonts(this.h, o));
355
+ }
356
+ // convert PDF → X
357
+ toText() {
358
+ return this.g._str((o) => this.ex().gp_to_text(this.h, o));
359
+ }
360
+ toHtml() {
361
+ return this.g._str((o) => this.ex().gp_to_html(this.h, o));
362
+ }
363
+ toDocx() {
364
+ return this.g._buffer((o) => this.ex().gp_to_docx(this.h, o));
365
+ }
366
+ toPptx() {
367
+ return this.g._buffer((o) => this.ex().gp_to_pptx(this.h, o));
368
+ }
369
+ toOdt() {
370
+ return this.g._buffer((o) => this.ex().gp_to_odt(this.h, o));
371
+ }
372
+ toXlsx() {
373
+ return this.g._buffer((o) => this.ex().gp_to_xlsx(this.h, o));
374
+ }
375
+ toOds() {
376
+ return this.g._buffer((o) => this.ex().gp_to_ods(this.h, o));
377
+ }
378
+ toRtf() {
379
+ return this.g._buffer((o) => this.ex().gp_to_rtf(this.h, o));
380
+ }
381
+ toPdfA() {
382
+ return this.g._buffer((o) => this.ex().gp_to_pdfa(this.h, o));
383
+ }
384
+ // security
385
+ saveEncrypted(password, fileId, permissions = -44) {
386
+ return this.g._withStr(
387
+ password,
388
+ (pwP, pwL) => this.g._withStr(
389
+ fileId,
390
+ (idP, idL) => this.g._buffer(
391
+ (o) => this.ex().gp_save_encrypted(this.h, pwP, pwL, idP, idL, permissions, o)
392
+ )
393
+ )
394
+ );
395
+ }
396
+ /** Self-signed digital signature. `random` ≥ 256 bytes from crypto.getRandomValues. */
397
+ sign(fields, random, keyBits = 2048) {
398
+ const rPtr = this.g._toWasm(random);
399
+ const out = this.g._withStr(
400
+ fields,
401
+ (fP, fL) => this.g._buffer((o) => this.ex().gp_sign(this.h, fP, fL, rPtr, random.length, keyBits, o))
402
+ );
403
+ this.g._free(rPtr, random.length);
404
+ return out;
405
+ }
406
+ // metadata
407
+ getMetadata(key) {
408
+ return this.g._withStr(
409
+ key,
410
+ (p, l) => this.g._str((o) => this.ex().gp_get_metadata(this.h, p, l, o))
411
+ );
412
+ }
413
+ /** Set an Info-dictionary entry (e.g. "Title", "Author"). */
414
+ setMetadata(key, value) {
415
+ return this.g._withStr(
416
+ key,
417
+ (kP, kL) => this.g._withStr(value, (vP, vL) => this.ex().gp_set_metadata(this.h, kP, kL, vP, vL))
418
+ ) === 0;
419
+ }
420
+ // annotations (Acrobat-style markup)
421
+ annotations(page) {
422
+ return this.g._json((o) => this.ex().gp_annotations_json(this.h, page, o));
423
+ }
424
+ removeAnnotation(page, index) {
425
+ return this.ex().gp_remove_annotation(this.h, page, index) === 0;
426
+ }
427
+ addSquare(page, x0, y0, x1, y1, stroke = 0, fill = null, lineWidth = 1) {
428
+ return this.ex().gp_add_square(
429
+ this.h,
430
+ page,
431
+ x0,
432
+ y0,
433
+ x1,
434
+ y1,
435
+ RGB(stroke ?? 0),
436
+ stroke === null ? 0 : 1,
437
+ RGB(fill ?? 0),
438
+ fill === null ? 0 : 1,
439
+ lineWidth
440
+ ) === 0;
441
+ }
442
+ addHighlight(page, x0, y0, x1, y1, rgb = 16776960) {
443
+ return this.ex().gp_add_highlight(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;
444
+ }
445
+ addLineAnnotation(page, x1, y1, x2, y2, rgb = 0, lineWidth = 1) {
446
+ return this.ex().gp_add_line(this.h, page, x1, y1, x2, y2, RGB(rgb), lineWidth) === 0;
447
+ }
448
+ addFreeText(page, x0, y0, x1, y1, text, fontSize = 12, rgb = 0) {
449
+ return this.g._withStr(
450
+ text,
451
+ (p, l) => this.ex().gp_add_free_text(this.h, page, x0, y0, x1, y1, p, l, fontSize, RGB(rgb))
452
+ ) === 0;
453
+ }
454
+ addUnderline(page, x0, y0, x1, y1, rgb = 0) {
455
+ return this.ex().gp_add_underline(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;
456
+ }
457
+ addStrikeOut(page, x0, y0, x1, y1, rgb = 0) {
458
+ return this.ex().gp_add_strike_out(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;
459
+ }
460
+ /** Freehand ink annotation from one polyline (`points` = flat [x0,y0,x1,y1,…]). */
461
+ addInk(page, points, rgb = 0, lineWidth = 1) {
462
+ return this.g._withF64(points, (p, c) => this.ex().gp_add_ink(this.h, page, p, c, RGB(rgb), lineWidth)) === 0;
463
+ }
464
+ addStamp(page, x0, y0, x1, y1, label, rgb = 12582912) {
465
+ return this.g._withStr(
466
+ label,
467
+ (p, l) => this.ex().gp_add_stamp(this.h, page, x0, y0, x1, y1, p, l, RGB(rgb))
468
+ ) === 0;
469
+ }
470
+ flattenAnnotations(page) {
471
+ return this.ex().gp_flatten_annotations(this.h, page);
472
+ }
473
+ // hyperlinks
474
+ links(page) {
475
+ return this.g._json((o) => this.ex().gp_links_json(this.h, page, o));
476
+ }
477
+ addUriLink(page, x0, y0, x1, y1, uri) {
478
+ return this.g._withStr(uri, (p, l) => this.ex().gp_add_uri_link(this.h, page, x0, y0, x1, y1, p, l)) === 0;
479
+ }
480
+ addGotoLink(page, x0, y0, x1, y1, targetPage) {
481
+ return this.ex().gp_add_goto_link(this.h, page, x0, y0, x1, y1, targetPage) === 0;
482
+ }
483
+ // optional-content layers (calques): list + show/hide + lock/unlock + remove
484
+ layers() {
485
+ return this.g._json((o) => this.ex().gp_layers_json(this.h, o));
486
+ }
487
+ /** Create a new (visible, unlocked) layer; returns its id (0 on error). */
488
+ addLayer(name) {
489
+ return this.g._withStr(name, (p, l) => this.ex().gp_add_layer(this.h, p, l));
490
+ }
491
+ setLayerVisibility(id, visible) {
492
+ return this.ex().gp_set_layer_visibility(this.h, id, visible ? 1 : 0) === 0;
493
+ }
494
+ setLayerLocked(id, locked) {
495
+ return this.ex().gp_set_layer_locked(this.h, id, locked ? 1 : 0) === 0;
496
+ }
497
+ removeLayer(id) {
498
+ return this.ex().gp_remove_layer(this.h, id) === 0;
499
+ }
500
+ // outline (bookmarks)
501
+ outline() {
502
+ return this.g._json((o) => this.ex().gp_outline_json(this.h, o));
503
+ }
504
+ /** Replace the outline. Each entry: `{level, page?, title}` (page 0/undefined = no dest). */
505
+ setOutline(entries) {
506
+ const text = entries.map((e) => `${e.level} ${e.page ?? 0} ${e.title}`).join("\n");
507
+ return this.g._withStr(text, (p, l) => this.ex().gp_set_outline(this.h, p, l)) === 0;
508
+ }
509
+ // interactive forms (AcroForm)
510
+ fields() {
511
+ return this.g._json((o) => this.ex().gp_fields_json(this.h, o));
512
+ }
513
+ setTextField(name, value) {
514
+ return this.g._withStr(
515
+ name,
516
+ (nP, nL) => this.g._withStr(value, (vP, vL) => this.ex().gp_set_text_field(this.h, nP, nL, vP, vL))
517
+ ) === 0;
518
+ }
519
+ setCheckbox(name, checked) {
520
+ return this.g._withStr(name, (p, l) => this.ex().gp_set_checkbox(this.h, p, l, checked ? 1 : 0)) === 0;
521
+ }
522
+ setRadio(name, value) {
523
+ return this.g._withStr(
524
+ name,
525
+ (nP, nL) => this.g._withStr(value, (vP, vL) => this.ex().gp_set_radio(this.h, nP, nL, vP, vL))
526
+ ) === 0;
527
+ }
528
+ /** Set a choice field's selection (multi-select list boxes accept several values). */
529
+ setChoice(name, values) {
530
+ return this.g._withStr(
531
+ name,
532
+ (nP, nL) => this.g._withStr(values.join("\n"), (vP, vL) => this.ex().gp_set_choice(this.h, nP, nL, vP, vL))
533
+ ) === 0;
534
+ }
535
+ };
536
+ // Annotate the CommonJS export names for ESM import in node:
537
+ 0 && (module.exports = {
538
+ GigaPdfDoc,
539
+ GigaPdfEngine
540
+ });
541
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.15_typescript@6.0.3/node_modules/tsup/assets/cjs_shims.js"],"sourcesContent":["/**\n * @giga-pdf/wasm-engine — TypeScript SDK for the zero-dependency Rust→WASM PDF\n * engine (gigapdf-engine). Wraps the flat `extern \"C\"` `gp_*` ABI behind a typed,\n * ergonomic class. No third-party runtime deps; the `.wasm` is self-contained.\n *\n * Usage:\n * const giga = await GigaPdfEngine.load(wasmBytesOrUrl);\n * const doc = giga.open(pdfBytes);\n * const docx = doc.toDocx();\n * const png = doc.renderPage(1, 2);\n * doc.close();\n */\n\n// FFI boundary: the wasm exports are an untyped table of `gp_*` functions\n// (numbers in, numbers out) plus `memory`. `any` here is the documented FFI\n// exception — every public method below re-imposes precise types.\ntype Exports = {\n memory: WebAssembly.Memory;\n gp_alloc(len: number): number;\n gp_free(ptr: number, len: number): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [k: string]: any;\n};\n\nconst enc = new TextEncoder();\nconst dec = new TextDecoder();\n\n/** Loaded engine module. Create documents with {@link open} / {@link openEncrypted}. */\nexport class GigaPdfEngine {\n private constructor(private readonly ex: Exports) {}\n\n /** Instantiate from raw wasm bytes, a URL/path, or a Response. */\n static async load(source: ArrayBuffer | Uint8Array | string | Response): Promise<GigaPdfEngine> {\n let bytes: ArrayBuffer | Uint8Array;\n if (typeof source === \"string\") {\n const res = await fetch(source);\n bytes = await res.arrayBuffer();\n } else if (source instanceof Response) {\n bytes = await source.arrayBuffer();\n } else {\n bytes = source;\n }\n const { instance } = await WebAssembly.instantiate(\n bytes instanceof Uint8Array ? bytes.slice().buffer : bytes,\n {}\n );\n return new GigaPdfEngine(instance.exports as Exports);\n }\n\n /**\n * Convenience loader for Node: instantiate from the `gigapdf.wasm` shipped\n * inside this package (resolved relative to the built module). In the browser,\n * pass a URL or bytes to {@link load} instead.\n *\n * In Next.js `output: \"standalone\"`, add the asset to `outputFileTracingIncludes`\n * for the consuming route so the `.wasm` is copied into the standalone bundle.\n */\n static async loadDefault(): Promise<GigaPdfEngine> {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath } = await import(\"node:url\");\n const wasmPath = fileURLToPath(new URL(\"../gigapdf.wasm\", import.meta.url));\n return GigaPdfEngine.load(await readFile(wasmPath));\n }\n\n // ── linear-memory ABI helpers (internal) ─────────────────────────────────\n private u8() {\n return new Uint8Array(this.ex.memory.buffer);\n }\n private dv() {\n return new DataView(this.ex.memory.buffer);\n }\n /** Copy host bytes into wasm memory; returns the pointer (caller frees). */\n _toWasm(bytes: Uint8Array): number {\n const ptr = this.ex.gp_alloc(bytes.length);\n this.u8().set(bytes, ptr);\n return ptr;\n }\n _free(ptr: number, len: number) {\n this.ex.gp_free(ptr, len);\n }\n /** Call a buffer-returning export `(…, outLenPtr) -> dataPtr`; copies + frees. */\n _buffer(call: (outLenPtr: number) => number): Uint8Array {\n const lenPtr = this.ex.gp_alloc(4);\n const dataPtr = call(lenPtr);\n if (dataPtr === 0) {\n this.ex.gp_free(lenPtr, 4);\n return new Uint8Array(0);\n }\n const len = this.dv().getUint32(lenPtr, true);\n const out = this.u8().slice(dataPtr, dataPtr + len);\n this.ex.gp_free(dataPtr, len);\n this.ex.gp_free(lenPtr, 4);\n return out;\n }\n _str(call: (outLenPtr: number) => number): string {\n return dec.decode(this._buffer(call));\n }\n _json<T = unknown>(call: (outLenPtr: number) => number): T {\n const s = this._str(call);\n return (s ? JSON.parse(s) : []) as T;\n }\n /** Pass a string argument; runs `fn(ptr, len)` then frees. */\n _withStr<T>(s: string, fn: (ptr: number, len: number) => T): T {\n const b = enc.encode(s);\n const ptr = this._toWasm(b);\n try {\n return fn(ptr, b.length);\n } finally {\n this._free(ptr, b.length);\n }\n }\n /** Pass a bytes argument; runs `fn(ptr, len)` then frees. */\n _withBytes<T>(bytes: Uint8Array, fn: (ptr: number, len: number) => T): T {\n const ptr = this._toWasm(bytes);\n try {\n return fn(ptr, bytes.length);\n } finally {\n this._free(ptr, bytes.length);\n }\n }\n /** Pass a `u32[]` argument (e.g. page numbers); runs `fn(ptr, count)` then frees. */\n _withU32<T>(values: number[], fn: (ptr: number, count: number) => T): T {\n const ptr = this.ex.gp_alloc(values.length * 4);\n const dv = this.dv();\n for (const [i, v] of values.entries()) dv.setUint32(ptr + i * 4, v >>> 0, true);\n try {\n return fn(ptr, values.length);\n } finally {\n this._free(ptr, values.length * 4);\n }\n }\n /** Pass a flat `f64[]` argument (e.g. ink x,y pairs); runs `fn(ptr, count)` then frees. */\n _withF64<T>(values: number[], fn: (ptr: number, count: number) => T): T {\n const ptr = this.ex.gp_alloc(values.length * 8);\n const dv = this.dv();\n for (const [i, v] of values.entries()) dv.setFloat64(ptr + i * 8, v, true);\n try {\n return fn(ptr, values.length);\n } finally {\n this._free(ptr, values.length * 8);\n }\n }\n get raw(): Exports {\n return this.ex;\n }\n\n // ── documents ─────────────────────────────────────────────────────────────\n /** Open a PDF. Throws if it can't be parsed. */\n open(pdf: Uint8Array): GigaPdfDoc {\n const handle = this._withBytes(pdf, (p, l) => this.ex.gp_open(p, l));\n if (handle === 0) throw new Error(\"gigapdf: failed to open PDF\");\n return new GigaPdfDoc(this, handle);\n }\n /** Open an encrypted PDF with a password. Returns null if the password is wrong. */\n openEncrypted(pdf: Uint8Array, password: string): GigaPdfDoc | null {\n const b = enc.encode(password);\n const pwPtr = this._toWasm(b);\n const handle = this._withBytes(pdf, (p, l) => this.ex.gp_open_encrypted(p, l, pwPtr, b.length));\n this._free(pwPtr, b.length);\n return handle === 0 ? null : new GigaPdfDoc(this, handle);\n }\n\n // ── stateless <format> → PDF conversions ───────────────────────────────────\n txtToPdf(text: string): Uint8Array {\n return this._withStr(text, (p, l) => this._buffer((o) => this.ex.gp_txt_to_pdf(p, l, o)));\n }\n htmlToPdf(html: string): Uint8Array {\n return this._withStr(html, (p, l) => this._buffer((o) => this.ex.gp_html_to_pdf(p, l, o)));\n }\n rtfToPdf(rtf: string): Uint8Array {\n return this._withStr(rtf, (p, l) => this._buffer((o) => this.ex.gp_rtf_to_pdf(p, l, o)));\n }\n /** Office (DOCX/ODT/PPTX/XLSX/ODS) → PDF, auto-detected. Empty array if unrecognized. */\n officeToPdf(office: Uint8Array): Uint8Array {\n return this._withBytes(office, (p, l) =>\n this._buffer((o) => this.ex.gp_office_to_pdf(p, l, o))\n );\n }\n\n // ── fonts (catalog / Google Fonts URL — the host performs the fetch) ───────\n fontCatalog(): FontInfo[] {\n return this._json((o) => this.ex.gp_font_catalog_json(o));\n }\n /** Google Fonts CSS2 URL for a family/weight/italic (host fetches it). */\n fontRequestUrl(family: string, weight = 400, italic = false): string {\n return this._withStr(family, (p, l) =>\n this._str((o) => this.ex.gp_font_request_url(p, l, weight, italic ? 1 : 0, o))\n );\n }\n /** Extract the trusted gstatic font URL from a Google Fonts CSS2 response. */\n parseCssFontUrl(css: string): string {\n return this._withStr(css, (p, l) => this._str((o) => this.ex.gp_parse_css_font_url(p, l, o)));\n }\n}\n\nexport interface FontInfo {\n family: string;\n category: string;\n google: boolean;\n weights: number[];\n}\nexport interface Box {\n x: number;\n y: number;\n w: number;\n h: number;\n}\nexport interface Element extends Partial<Box> {\n index: number;\n kind: \"text\" | \"image\" | \"shape\";\n label: string;\n}\nexport interface TextLine extends Box {\n text: string;\n}\nexport interface SearchHit extends Box {\n page: number;\n text: string;\n}\nexport interface OcrWord extends Box {\n text: string;\n}\nexport interface TextRunInfo {\n index: number;\n operator: string;\n text: string;\n}\n/** A markup annotation (rect corners in PDF user space). */\nexport interface AnnotationInfo {\n index: number;\n subtype: string;\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n contents: string;\n}\n/** A hyperlink annotation; `kind` discriminates the target. */\nexport interface LinkInfo {\n index: number;\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n kind: \"uri\" | \"page\" | \"unknown\";\n uri?: string;\n page?: number;\n}\nexport type FieldKind =\n | \"text\"\n | \"checkbox\"\n | \"radio\"\n | \"pushbutton\"\n | \"combo\"\n | \"list\"\n | \"signature\"\n | \"unknown\";\n/** An AcroForm field with its flags and (for choices) options. */\nexport interface FieldInfo {\n name: string;\n type: string;\n kind: FieldKind;\n flags: number;\n readOnly: boolean;\n required: boolean;\n multiline: boolean;\n fillable: boolean;\n maxLen?: number;\n value: string;\n options: string[];\n}\n/** One outline (bookmark) entry; `level` is the nesting depth (0 = top). */\nexport interface OutlineEntry {\n level: number;\n title: string;\n page?: number;\n}\n/** An optional-content layer (calque): toggle `visible`/`locked` to persist in the PDF. */\nexport interface LayerInfo {\n id: number;\n name: string;\n visible: boolean;\n locked: boolean;\n order: number;\n}\n/** A page's geometry: size in points and `/Rotate` (0/90/180/270). */\nexport interface PageInfo {\n width: number;\n height: number;\n rotation: number;\n}\n\nconst RGB = (rgb: number) => rgb & 0xffffff;\n\n/** A live document handle. Call {@link close} when done. */\nexport class GigaPdfDoc {\n constructor(\n private readonly g: GigaPdfEngine,\n private readonly h: number\n ) {}\n private ex() {\n return this.g.raw;\n }\n\n close() {\n this.ex().gp_close(this.h);\n }\n pageCount(): number {\n return this.ex().gp_page_count(this.h);\n }\n save(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_save(this.h, o));\n }\n saveCompressed(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_save_compressed(this.h, o));\n }\n\n // text intelligence\n textRuns(page: number): TextRunInfo[] {\n return this.g._json((o) => this.ex().gp_text_runs_json(this.h, page, o));\n }\n elements(page: number): Element[] {\n return this.g._json((o) => this.ex().gp_elements_json(this.h, page, o));\n }\n structuredText(page: number): TextLine[] {\n return this.g._json((o) => this.ex().gp_structured_text_json(this.h, page, o));\n }\n search(query: string, caseInsensitive = true): SearchHit[] {\n return this.g._withStr(query, (p, l) =>\n this.g._json((o) => this.ex().gp_search_json(this.h, p, l, caseInsensitive ? 1 : 0, o))\n );\n }\n /** OCR a (scanned) page → words with PDF-space boxes. `scale` ≥ 2 for small text. */\n ocr(page: number, scale = 2): OcrWord[] {\n return this.g._json((o) => this.ex().gp_ocr_json(this.h, page, scale, o));\n }\n ocrText(page: number, scale = 2): string {\n return this.g._str((o) => this.ex().gp_ocr_text(this.h, page, scale, o));\n }\n\n // editing\n replaceText(page: number, index: number, text: string): boolean {\n return (\n this.g._withStr(text, (p, l) => this.ex().gp_replace_text(this.h, page, index, p, l)) === 0\n );\n }\n removeElement(page: number, index: number): boolean {\n return this.ex().gp_remove_element(this.h, page, index) === 0;\n }\n moveElement(page: number, index: number, dx: number, dy: number): boolean {\n return this.ex().gp_move_element(this.h, page, index, dx, dy) === 0;\n }\n duplicateElement(page: number, index: number): boolean {\n return this.ex().gp_duplicate_element(this.h, page, index) === 0;\n }\n /** Index of the element at page point `(x, y)`, or -1 if none. */\n elementAt(page: number, x: number, y: number): number {\n return this.ex().gp_element_at(this.h, page, x, y);\n }\n /**\n * Draw a vector rectangle. Pass an `0xRRGGBB` colour for `stroke`/`fill`, or\n * `null` to omit that paint. 0 → success.\n */\n addRectangle(\n page: number,\n x: number,\n y: number,\n w: number,\n h: number,\n stroke: number | null = null,\n fill: number | null = 0,\n lineWidth = 1\n ): boolean {\n return (\n this.ex().gp_add_rectangle(\n this.h,\n page,\n x,\n y,\n w,\n h,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth\n ) === 0\n );\n }\n /** True redaction: delete content intersecting the region (no opaque cover by default). */\n redact(\n page: number,\n x: number,\n y: number,\n w: number,\n h: number,\n coverRgb = 0,\n hasCover = false\n ): number {\n return this.ex().gp_redact_region(this.h, page, x, y, w, h, RGB(coverRgb), hasCover ? 1 : 0);\n }\n\n // pages\n rotatePage(page: number, degrees: number): boolean {\n return this.ex().gp_rotate_page(this.h, page, degrees) === 0;\n }\n deletePage(page: number): boolean {\n return this.ex().gp_delete_page(this.h, page) === 0;\n }\n movePage(from: number, to: number): boolean {\n return this.ex().gp_move_page(this.h, from, to) === 0;\n }\n appendPages(otherPdf: Uint8Array): boolean {\n return this.g._withBytes(otherPdf, (p, l) => this.ex().gp_append_pages(this.h, p, l)) === 0;\n }\n /** Extract the given 1-based page numbers into a NEW standalone PDF. */\n extractPages(pages: number[]): Uint8Array {\n return this.g._withU32(pages, (p, c) =>\n this.g._buffer((o) => this.ex().gp_extract_pages(this.h, p, c, o))\n );\n }\n /** Resize a page's MediaBox to `width`×`height` points. */\n resizePage(page: number, width: number, height: number): boolean {\n return this.ex().gp_resize_page(this.h, page, width, height) === 0;\n }\n /** Insert a blank page after the 1-based `after` page (0 = front); returns its id. */\n addPage(width: number, height: number, after = 0): number {\n return this.ex().gp_add_page(this.h, width, height, after);\n }\n /** Duplicate a page, inserting the copy right after it; returns the new page's id. */\n copyPage(page: number): number {\n return this.ex().gp_copy_page(this.h, page);\n }\n /** A page's size (points) and `/Rotate` (0/90/180/270). */\n pageInfo(page: number): PageInfo {\n return this.g._json((o) => this.ex().gp_page_info_json(this.h, page, o));\n }\n\n // render\n renderPage(page: number, scale = 1): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_render_page(this.h, page, scale, o));\n }\n\n // fonts — embed a downloaded TTF, then add real selectable text\n embedFont(family: string, ttf: Uint8Array): number {\n const b = enc.encode(family);\n const famPtr = this.g._toWasm(b);\n const obj = this.g._withBytes(ttf, (p, l) =>\n this.ex().gp_embed_font(this.h, famPtr, b.length, p, l)\n );\n this.g._free(famPtr, b.length);\n return obj;\n }\n addText(\n page: number,\n x: number,\n y: number,\n size: number,\n text: string,\n fontObj: number,\n rgb = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_text(this.h, page, x, y, size, p, l, fontObj, RGB(rgb))\n ) === 0\n );\n }\n neededFonts(): string[] {\n return this.g._json((o) => this.ex().gp_needed_fonts(this.h, o));\n }\n\n // convert PDF → X\n toText(): string {\n return this.g._str((o) => this.ex().gp_to_text(this.h, o));\n }\n toHtml(): string {\n return this.g._str((o) => this.ex().gp_to_html(this.h, o));\n }\n toDocx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_docx(this.h, o));\n }\n toPptx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_pptx(this.h, o));\n }\n toOdt(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_odt(this.h, o));\n }\n toXlsx(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_xlsx(this.h, o));\n }\n toOds(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_ods(this.h, o));\n }\n toRtf(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_rtf(this.h, o));\n }\n toPdfA(): Uint8Array {\n return this.g._buffer((o) => this.ex().gp_to_pdfa(this.h, o));\n }\n\n // security\n saveEncrypted(password: string, fileId: string, permissions = -44): Uint8Array {\n return this.g._withStr(password, (pwP, pwL) =>\n this.g._withStr(fileId, (idP, idL) =>\n this.g._buffer((o) =>\n this.ex().gp_save_encrypted(this.h, pwP, pwL, idP, idL, permissions, o)\n )\n )\n );\n }\n /** Self-signed digital signature. `random` ≥ 256 bytes from crypto.getRandomValues. */\n sign(fields: string, random: Uint8Array, keyBits = 2048): Uint8Array {\n const rPtr = this.g._toWasm(random);\n const out = this.g._withStr(fields, (fP, fL) =>\n this.g._buffer((o) => this.ex().gp_sign(this.h, fP, fL, rPtr, random.length, keyBits, o))\n );\n this.g._free(rPtr, random.length);\n return out;\n }\n\n // metadata\n getMetadata(key: string): string {\n return this.g._withStr(key, (p, l) =>\n this.g._str((o) => this.ex().gp_get_metadata(this.h, p, l, o))\n );\n }\n /** Set an Info-dictionary entry (e.g. \"Title\", \"Author\"). */\n setMetadata(key: string, value: string): boolean {\n return (\n this.g._withStr(key, (kP, kL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_metadata(this.h, kP, kL, vP, vL))\n ) === 0\n );\n }\n\n // annotations (Acrobat-style markup)\n annotations(page: number): AnnotationInfo[] {\n return this.g._json((o) => this.ex().gp_annotations_json(this.h, page, o));\n }\n removeAnnotation(page: number, index: number): boolean {\n return this.ex().gp_remove_annotation(this.h, page, index) === 0;\n }\n addSquare(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n stroke: number | null = 0,\n fill: number | null = null,\n lineWidth = 1\n ): boolean {\n return (\n this.ex().gp_add_square(\n this.h,\n page,\n x0,\n y0,\n x1,\n y1,\n RGB(stroke ?? 0),\n stroke === null ? 0 : 1,\n RGB(fill ?? 0),\n fill === null ? 0 : 1,\n lineWidth\n ) === 0\n );\n }\n addHighlight(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0xffff00): boolean {\n return this.ex().gp_add_highlight(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n addLineAnnotation(\n page: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n rgb = 0,\n lineWidth = 1\n ): boolean {\n return this.ex().gp_add_line(this.h, page, x1, y1, x2, y2, RGB(rgb), lineWidth) === 0;\n }\n addFreeText(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n text: string,\n fontSize = 12,\n rgb = 0\n ): boolean {\n return (\n this.g._withStr(text, (p, l) =>\n this.ex().gp_add_free_text(this.h, page, x0, y0, x1, y1, p, l, fontSize, RGB(rgb))\n ) === 0\n );\n }\n addUnderline(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0): boolean {\n return this.ex().gp_add_underline(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n addStrikeOut(page: number, x0: number, y0: number, x1: number, y1: number, rgb = 0): boolean {\n return this.ex().gp_add_strike_out(this.h, page, x0, y0, x1, y1, RGB(rgb)) === 0;\n }\n /** Freehand ink annotation from one polyline (`points` = flat [x0,y0,x1,y1,…]). */\n addInk(page: number, points: number[], rgb = 0, lineWidth = 1): boolean {\n return (\n this.g._withF64(points, (p, c) => this.ex().gp_add_ink(this.h, page, p, c, RGB(rgb), lineWidth)) ===\n 0\n );\n }\n addStamp(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n label: string,\n rgb = 0xc00000\n ): boolean {\n return (\n this.g._withStr(label, (p, l) =>\n this.ex().gp_add_stamp(this.h, page, x0, y0, x1, y1, p, l, RGB(rgb))\n ) === 0\n );\n }\n flattenAnnotations(page: number): number {\n return this.ex().gp_flatten_annotations(this.h, page);\n }\n\n // hyperlinks\n links(page: number): LinkInfo[] {\n return this.g._json((o) => this.ex().gp_links_json(this.h, page, o));\n }\n addUriLink(page: number, x0: number, y0: number, x1: number, y1: number, uri: string): boolean {\n return (\n this.g._withStr(uri, (p, l) => this.ex().gp_add_uri_link(this.h, page, x0, y0, x1, y1, p, l)) ===\n 0\n );\n }\n addGotoLink(\n page: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n targetPage: number\n ): boolean {\n return this.ex().gp_add_goto_link(this.h, page, x0, y0, x1, y1, targetPage) === 0;\n }\n\n // optional-content layers (calques): list + show/hide + lock/unlock + remove\n layers(): LayerInfo[] {\n return this.g._json((o) => this.ex().gp_layers_json(this.h, o));\n }\n /** Create a new (visible, unlocked) layer; returns its id (0 on error). */\n addLayer(name: string): number {\n return this.g._withStr(name, (p, l) => this.ex().gp_add_layer(this.h, p, l));\n }\n setLayerVisibility(id: number, visible: boolean): boolean {\n return this.ex().gp_set_layer_visibility(this.h, id, visible ? 1 : 0) === 0;\n }\n setLayerLocked(id: number, locked: boolean): boolean {\n return this.ex().gp_set_layer_locked(this.h, id, locked ? 1 : 0) === 0;\n }\n removeLayer(id: number): boolean {\n return this.ex().gp_remove_layer(this.h, id) === 0;\n }\n\n // outline (bookmarks)\n outline(): OutlineEntry[] {\n return this.g._json((o) => this.ex().gp_outline_json(this.h, o));\n }\n /** Replace the outline. Each entry: `{level, page?, title}` (page 0/undefined = no dest). */\n setOutline(entries: OutlineEntry[]): boolean {\n const text = entries.map((e) => `${e.level}\\t${e.page ?? 0}\\t${e.title}`).join(\"\\n\");\n return this.g._withStr(text, (p, l) => this.ex().gp_set_outline(this.h, p, l)) === 0;\n }\n\n // interactive forms (AcroForm)\n fields(): FieldInfo[] {\n return this.g._json((o) => this.ex().gp_fields_json(this.h, o));\n }\n setTextField(name: string, value: string): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_text_field(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n setCheckbox(name: string, checked: boolean): boolean {\n return (\n this.g._withStr(name, (p, l) => this.ex().gp_set_checkbox(this.h, p, l, checked ? 1 : 0)) === 0\n );\n }\n setRadio(name: string, value: string): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(value, (vP, vL) => this.ex().gp_set_radio(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n /** Set a choice field's selection (multi-select list boxes accept several values). */\n setChoice(name: string, values: string[]): boolean {\n return (\n this.g._withStr(name, (nP, nL) =>\n this.g._withStr(values.join(\"\\n\"), (vP, vL) => this.ex().gp_set_choice(this.h, nP, nL, vP, vL))\n ) === 0\n );\n }\n}\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n"],"mappings":"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","names":[]}