@reportwright/pdf 0.1.0-beta.0 → 0.1.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ var __export = (target, all) => {
13
13
  __defProp(target, name, { get: all[name], enumerable: true });
14
14
  };
15
15
 
16
- // src/core/sink.js
16
+ // packages/pdf/src/core/sink.js
17
17
  function raced(p, signal) {
18
18
  if (!signal) return p;
19
19
  if (signal.aborted) {
@@ -112,11 +112,11 @@ function openSink(sink) {
112
112
  };
113
113
  }
114
114
  var init_sink = __esm({
115
- "src/core/sink.js"() {
115
+ "packages/pdf/src/core/sink.js"() {
116
116
  }
117
117
  });
118
118
 
119
- // src/core/serialize.js
119
+ // packages/pdf/src/core/serialize.js
120
120
  function latin1(s) {
121
121
  const B = (
122
122
  /** @type {any} */
@@ -129,7 +129,7 @@ function latin1(s) {
129
129
  }
130
130
  var num, hex4, utf16, text, ascii, pdfName, UTF8, DELIM, fontName, pdfDate, esc;
131
131
  var init_serialize = __esm({
132
- "src/core/serialize.js"() {
132
+ "packages/pdf/src/core/serialize.js"() {
133
133
  num = (v) => {
134
134
  if (typeof v !== "number" || !(Math.abs(v) < 1e9)) throw new RangeError(`Not a usable number: ${v}`);
135
135
  const r = Math.round(v * 1e3) / 1e3;
@@ -166,7 +166,7 @@ var init_serialize = __esm({
166
166
  }
167
167
  });
168
168
 
169
- // ../../../reportwright/node_modules/fflate/esm/browser.js
169
+ // ../reportwright/node_modules/fflate/esm/browser.js
170
170
  function deflateSync(data, opts) {
171
171
  return dopt(data, opts || {}, 0, 0);
172
172
  }
@@ -183,7 +183,7 @@ function zlibSync(data, opts) {
183
183
  }
184
184
  var u8, u16, i32, fleb, fdeb, clim, freb, _a, fl, revfl, _b, fd, revfd, rev, x, i, hMap, flt, i, i, i, i, fdt, i, flm, flrm, fdm, fdrm, max, bits, bits16, shft, slc, ec, err, inflt, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, deo, et, dflt, adler, dopt, wbytes, zlh, zls, Inflate, Unzlib, td, tds;
185
185
  var init_browser = __esm({
186
- "../../../reportwright/node_modules/fflate/esm/browser.js"() {
186
+ "../reportwright/node_modules/fflate/esm/browser.js"() {
187
187
  u8 = Uint8Array;
188
188
  u16 = Uint16Array;
189
189
  i32 = Int32Array;
@@ -956,7 +956,7 @@ var init_browser = __esm({
956
956
  }
957
957
  });
958
958
 
959
- // src/core/deflate.js
959
+ // packages/pdf/src/core/deflate.js
960
960
  async function deflate(bytes) {
961
961
  if (slots.free > 0) slots.free--;
962
962
  else await new Promise((ok) => slots.wait.push(
@@ -1044,7 +1044,7 @@ function deflateStream() {
1044
1044
  }
1045
1045
  var NODE_ZLIB, slots;
1046
1046
  var init_deflate = __esm({
1047
- "src/core/deflate.js"() {
1047
+ "packages/pdf/src/core/deflate.js"() {
1048
1048
  init_browser();
1049
1049
  NODE_ZLIB = /** @type {any} */
1050
1050
  globalThis.process?.getBuiltinModule?.("node:zlib");
@@ -1055,7 +1055,7 @@ var init_deflate = __esm({
1055
1055
  }
1056
1056
  });
1057
1057
 
1058
- // src/core/objects.js
1058
+ // packages/pdf/src/core/objects.js
1059
1059
  function createObjects(out, o) {
1060
1060
  let pos = 0, nextNum = 0;
1061
1061
  const blocks = [];
@@ -1335,7 +1335,7 @@ ${xref}
1335
1335
  }
1336
1336
  var CHUNK, OBJSTM, XBITS, XB, BYTERANGE;
1337
1337
  var init_objects = __esm({
1338
- "src/core/objects.js"() {
1338
+ "packages/pdf/src/core/objects.js"() {
1339
1339
  init_serialize();
1340
1340
  init_deflate();
1341
1341
  init_sink();
@@ -1347,7 +1347,7 @@ var init_objects = __esm({
1347
1347
  }
1348
1348
  });
1349
1349
 
1350
- // src/standards/xmp.js
1350
+ // packages/pdf/src/standards/xmp.js
1351
1351
  function checkExt(x2) {
1352
1352
  if (!NAME.test(x2.prefix)) throw new TypeError(`XMP: the schema prefix ${JSON.stringify(x2.prefix)} is not an XML name`);
1353
1353
  if (typeof x2.ns !== "string" || !/^[A-Za-z][A-Za-z0-9+.-]*:[^\s<>"'&]{1,256}$/.test(x2.ns)) throw new TypeError(`XMP: the namespace ${JSON.stringify(x2.ns)} is not a URI`);
@@ -1379,7 +1379,7 @@ ${pdfa ? `<rdf:Description rdf:about="" xmlns:pdfaid="http://www.aiim.org/pdfa/n
1379
1379
  }
1380
1380
  var PRODUCER, xml, NAME, PDFUA;
1381
1381
  var init_xmp = __esm({
1382
- "src/standards/xmp.js"() {
1382
+ "packages/pdf/src/standards/xmp.js"() {
1383
1383
  PRODUCER = "@reportwright/pdf";
1384
1384
  xml = (s) => String(s).replace(/[\0-\x08\x0b\x0c\x0e-\x1f￾￿]|[\ud800-\udbff](?![\udc00-\udfff])|(?<![\ud800-\udbff])[\udc00-\udfff]/g, "").replace(/[<>&"']/g, (c) => (
1385
1385
  /** @type {any} */
@@ -1396,7 +1396,7 @@ var init_xmp = __esm({
1396
1396
  }
1397
1397
  });
1398
1398
 
1399
- // src/core/brand.js
1399
+ // packages/pdf/src/core/brand.js
1400
1400
  function brand(obj, kind, doc, data) {
1401
1401
  brands.set(obj, { kind, doc, data });
1402
1402
  return obj;
@@ -1457,14 +1457,14 @@ function guarded(api) {
1457
1457
  }
1458
1458
  var brands, kindOf, MAX_SNAPSHOT;
1459
1459
  var init_brand = __esm({
1460
- "src/core/brand.js"() {
1460
+ "packages/pdf/src/core/brand.js"() {
1461
1461
  brands = /* @__PURE__ */ new WeakMap();
1462
1462
  kindOf = (v) => v !== null && typeof v === "object" ? brands.get(v)?.kind : void 0;
1463
1463
  MAX_SNAPSHOT = 16e6;
1464
1464
  }
1465
1465
  });
1466
1466
 
1467
- // src/document.js
1467
+ // packages/pdf/src/document.js
1468
1468
  function createDoc(out, o) {
1469
1469
  const level = o.pdfaLevel ?? (o.pdfa ? { part: 2, conformance: "b", unicode: false } : null);
1470
1470
  const objs = createObjects(out, { compress: o.compress, signal: o.signal, encrypt: o.encrypt, hash: o.hash, classic: level?.part === 1 });
@@ -1663,14 +1663,14 @@ function createDoc(out, o) {
1663
1663
  }
1664
1664
  await writeNodes(level2);
1665
1665
  const I = o.info, when = I.creationDate;
1666
- const xmp = doc.xmp ?? new TextEncoder().encode(xmpPacket({ title: I.title, author: I.author, subject: I.subject, keywords: I.keywords, stamp: when.toISOString().replace(/\.\d+Z$/, "Z"), pdfa: doc.pdfaLevel, ua: o.tagged, extensions: doc.xmpExtensions }));
1667
- const meta = objs.reserve();
1668
- await objs.write(meta, "<< /Type /Metadata /Subtype /XML >>", xmp);
1666
+ const xmp = o.metadata === false ? null : doc.xmp ?? new TextEncoder().encode(xmpPacket({ title: I.title, author: I.author, subject: I.subject, keywords: I.keywords, stamp: when.toISOString().replace(/\.\d+Z$/, "Z"), pdfa: doc.pdfaLevel, ua: o.tagged, extensions: doc.xmpExtensions }));
1667
+ const meta = xmp ? objs.reserve() : 0;
1668
+ if (xmp) await objs.write(meta, "<< /Type /Metadata /Subtype /XML >>", xmp);
1669
1669
  const info = objs.reserve();
1670
1670
  if (doc.info != null) await objs.write(info, doc.info);
1671
1671
  else await objs.write(info, `<< /Producer ${text(PRODUCER)} /Creator ${text(PRODUCER)}${I.title != null ? ` /Title ${text(I.title)}` : ""}${I.author != null ? ` /Author ${text(I.author)}` : ""}${I.subject != null ? ` /Subject ${text(I.subject)}` : ""}${I.keywords != null ? ` /Keywords ${text(I.keywords)}` : ""} /CreationDate ${pdfDate(when)} /ModDate ${pdfDate(when)} >>`);
1672
1672
  const root = objs.reserve();
1673
- let cat = `<< /Type /Catalog /Pages ${level2[0].ref} 0 R /Metadata ${meta} 0 R`;
1673
+ let cat = `<< /Type /Catalog /Pages ${level2[0].ref} 0 R${meta ? ` /Metadata ${meta} 0 R` : ""}`;
1674
1674
  for (const [k, v] of catalog) cat += ` ${pdfName(k)} ${v}`;
1675
1675
  await objs.write(root, cat + " >>");
1676
1676
  const r = await objs.finish({ root, info, id: o.id, last: doc.last });
@@ -1682,7 +1682,7 @@ function createDoc(out, o) {
1682
1682
  }
1683
1683
  var LEAF, IN_FLIGHT;
1684
1684
  var init_document = __esm({
1685
- "src/document.js"() {
1685
+ "packages/pdf/src/document.js"() {
1686
1686
  init_objects();
1687
1687
  init_deflate();
1688
1688
  init_serialize();
@@ -1693,10 +1693,10 @@ var init_document = __esm({
1693
1693
  }
1694
1694
  });
1695
1695
 
1696
- // src/content/content.js
1696
+ // packages/pdf/src/content/content.js
1697
1697
  var Content;
1698
1698
  var init_content = __esm({
1699
- "src/content/content.js"() {
1699
+ "packages/pdf/src/content/content.js"() {
1700
1700
  init_serialize();
1701
1701
  Content = class {
1702
1702
  constructor() {
@@ -1855,7 +1855,7 @@ var init_content = __esm({
1855
1855
  }
1856
1856
  });
1857
1857
 
1858
- // src/standards/icc.js
1858
+ // packages/pdf/src/standards/icc.js
1859
1859
  function parseIcc(bytes, what) {
1860
1860
  const b = toBytes(bytes, what);
1861
1861
  const bad = (m) => new TypeError(`${what}: not a usable ICC profile (${m})`);
@@ -1887,14 +1887,14 @@ function toBytes(v, what) {
1887
1887
  }
1888
1888
  var MAX_ICC, SPACES, tag;
1889
1889
  var init_icc = __esm({
1890
- "src/standards/icc.js"() {
1890
+ "packages/pdf/src/standards/icc.js"() {
1891
1891
  MAX_ICC = 32 << 20;
1892
1892
  SPACES = /* @__PURE__ */ new Map([["GRAY", 1], ["RGB ", 3], ["CMYK", 4]]);
1893
1893
  tag = (b, i2) => String.fromCharCode(b[i2], b[i2 + 1], b[i2 + 2], b[i2 + 3]);
1894
1894
  }
1895
1895
  });
1896
1896
 
1897
- // src/graphics/color.js
1897
+ // packages/pdf/src/graphics/color.js
1898
1898
  function cmyk(c, m, y, k) {
1899
1899
  const v = [c, m, y, k];
1900
1900
  if (!v.every(unit)) throw new RangeError(`cmyk(c, m, y, k): each is 0–1, not ${v.join(", ")}`);
@@ -1977,7 +1977,7 @@ async function iccColorSpace(doc, bytes) {
1977
1977
  }
1978
1978
  var DEVICE, unit, CSS_RGB, base, spots;
1979
1979
  var init_color = __esm({
1980
- "src/graphics/color.js"() {
1980
+ "packages/pdf/src/graphics/color.js"() {
1981
1981
  init_serialize();
1982
1982
  init_brand();
1983
1983
  init_icc();
@@ -1989,7 +1989,7 @@ var init_color = __esm({
1989
1989
  }
1990
1990
  });
1991
1991
 
1992
- // src/text/runs.js
1992
+ // packages/pdf/src/text/runs.js
1993
1993
  function spacing(o) {
1994
1994
  const tc = o?.characterSpacing ?? 0, tw = o?.wordSpacing ?? 0, tz = o?.horizontalScaling ?? 100;
1995
1995
  num(tc);
@@ -2028,13 +2028,12 @@ function segments(str3, fonts, o) {
2028
2028
  }
2029
2029
  function runWidth(run2, size, sp) {
2030
2030
  let a = 0, n = 0, s = 0;
2031
- if (Array.isArray(run2)) {
2032
- n = run2.length;
2033
- for (const it of run2) {
2034
- a += it.a;
2035
- if (it.sp) s++;
2036
- }
2037
- } else ({ a, n, sp: s } = run2);
2031
+ if (Array.isArray(run2)) for (const it of run2) {
2032
+ a += it.a;
2033
+ if (it.sp) s++;
2034
+ if (!it.c) n++;
2035
+ }
2036
+ else ({ a, n, sp: s } = run2);
2038
2037
  return (a * size / 1e3 + n * sp.tc + s * sp.tw) * sp.tz / 100;
2039
2038
  }
2040
2039
  function measure(impl, str3, size, o) {
@@ -2042,11 +2041,11 @@ function measure(impl, str3, size, o) {
2042
2041
  const sp = spacing(o);
2043
2042
  return runWidth(impl.items(str3, { kerning: o?.kerning, rtl: o?.direction === "rtl", ws: sp.tw, measure: true }), size, sp);
2044
2043
  }
2045
- function runOps(run2, size, rise, tw, standard) {
2044
+ function runOps(run2, size, rise, tw, standard, tc = 0) {
2046
2045
  if (!Array.isArray(run2)) return run2.body ? `(${run2.body}) Tj
2047
2046
  ` : "";
2048
- const wsT = standard ? 0 : tw * 1e3 / size;
2049
- let s = "", arr = "", lit = "", cur = 0, pos = 0, r = rise, left = 0, adjusted = false;
2047
+ const wsT = standard ? 0 : tw * 1e3 / size, tcT = tc * 1e3 / size;
2048
+ let s = "", arr = "", lit = "", cur = 0, pos = 0, r = rise, left = 0, adjusted = false, out = false;
2050
2049
  const endLit = () => {
2051
2050
  if (lit) {
2052
2051
  arr += `(${lit})`;
@@ -2063,13 +2062,7 @@ function runOps(run2, size, rise, tw, standard) {
2063
2062
  adjusted = false;
2064
2063
  }
2065
2064
  };
2066
- for (const it of run2) {
2067
- if (it.at !== void 0) {
2068
- flush();
2069
- s += `/Span << /ActualText ${text(it.at)} >> BDC
2070
- `;
2071
- left = it.n || 1;
2072
- }
2065
+ const put = (it) => {
2073
2066
  const want = rise + it.dy * size / 1e3;
2074
2067
  if (Math.abs(want - r) >= 5e-4) {
2075
2068
  flush();
@@ -2087,6 +2080,20 @@ function runOps(run2, size, rise, tw, standard) {
2087
2080
  }
2088
2081
  lit += it.b;
2089
2082
  cur += it.w;
2083
+ };
2084
+ for (const it of run2) {
2085
+ if (it.c) {
2086
+ pos += it.a;
2087
+ out = true;
2088
+ continue;
2089
+ }
2090
+ if (it.at !== void 0) {
2091
+ flush();
2092
+ s += `/Span << /ActualText ${text(it.at)} >> BDC
2093
+ `;
2094
+ left = it.n || 1;
2095
+ }
2096
+ put(it);
2090
2097
  pos += it.a + (it.sp ? wsT : 0);
2091
2098
  if (left && --left === 0) {
2092
2099
  flush();
@@ -2094,13 +2101,30 @@ function runOps(run2, size, rise, tw, standard) {
2094
2101
  }
2095
2102
  }
2096
2103
  flush();
2104
+ if (out) {
2105
+ s += `/Span << /ActualText ${text("")} >> BDC
2106
+ 0 0 Td
2107
+ `;
2108
+ cur = pos = 0;
2109
+ for (const it of run2) {
2110
+ if (!it.c) {
2111
+ pos += it.a + (it.sp ? wsT : 0) + tcT;
2112
+ continue;
2113
+ }
2114
+ put(it);
2115
+ cur += tcT;
2116
+ pos += it.a;
2117
+ }
2118
+ flush();
2119
+ s += "EMC\n";
2120
+ }
2097
2121
  if (r !== rise) s += `${num(rise)} Ts
2098
2122
  `;
2099
2123
  return s;
2100
2124
  }
2101
2125
  var WS, RTL_RANGES, dirOf, maybeRtl, RTL, LTR;
2102
2126
  var init_runs = __esm({
2103
- "src/text/runs.js"() {
2127
+ "packages/pdf/src/text/runs.js"() {
2104
2128
  init_serialize();
2105
2129
  WS = /^\s$/u;
2106
2130
  RTL_RANGES = "֐-ࣿיִ-﷿ﹰ-\uFEFF";
@@ -2114,7 +2138,7 @@ var init_runs = __esm({
2114
2138
  }
2115
2139
  });
2116
2140
 
2117
- // src/text/text.js
2141
+ // packages/pdf/src/text/text.js
2118
2142
  function fontsOf(page, o, who) {
2119
2143
  const font = o?.font;
2120
2144
  if (!font || typeof font.encode !== "function") throw new TypeError(`${who}: options.font is required (pdf.standardFont(name) or await pdf.embedFont(bytes))`);
@@ -2148,7 +2172,7 @@ function drawLine(page, fonts, str3, x2, base3, size, ts, o) {
2148
2172
  }
2149
2173
  let at = x2;
2150
2174
  for (const s of segs) {
2151
- const ops = runOps(s.run, size, ts.rise, ts.sp.tw, s.impl.standard);
2175
+ const ops = runOps(s.run, size, ts.rise, ts.sp.tw, s.impl.standard, ts.sp.tc);
2152
2176
  if (ops) c.run(s.font.name, size, at, page.height - base3, ops, ts === PLAIN ? PLAIN_STATE : { Tc: ts.sp.tc, Tw: s.impl.standard ? ts.sp.tw : 0, Tz: ts.sp.tz, Ts: ts.rise, Tr: ts.Tr });
2153
2177
  if (segs.length > 1) at += runWidth(s.run, size, ts.sp);
2154
2178
  }
@@ -2183,7 +2207,7 @@ function text2(str3, o) {
2183
2207
  }
2184
2208
  var MAX_TEXT, MODES, PLAIN, PLAIN_STATE;
2185
2209
  var init_text = __esm({
2186
- "src/text/text.js"() {
2210
+ "packages/pdf/src/text/text.js"() {
2187
2211
  init_color();
2188
2212
  init_serialize();
2189
2213
  init_brand();
@@ -2195,7 +2219,7 @@ var init_text = __esm({
2195
2219
  }
2196
2220
  });
2197
2221
 
2198
- // src/text/box.js
2222
+ // packages/pdf/src/text/box.js
2199
2223
  function textBox(str3, o) {
2200
2224
  const fonts = fontsOf(this, o, "page.textBox");
2201
2225
  const size = o.size ?? 12, x2 = o.x ?? 0, y = o.y ?? 0, W = o.width;
@@ -2319,7 +2343,7 @@ function textBox(str3, o) {
2319
2343
  }
2320
2344
  var MAX_LINES;
2321
2345
  var init_box = __esm({
2322
- "src/text/box.js"() {
2346
+ "packages/pdf/src/text/box.js"() {
2323
2347
  init_serialize();
2324
2348
  init_runs();
2325
2349
  init_text();
@@ -2327,7 +2351,7 @@ var init_box = __esm({
2327
2351
  }
2328
2352
  });
2329
2353
 
2330
- // src/graphics/svg.js
2354
+ // packages/pdf/src/graphics/svg.js
2331
2355
  function parseSvgPath(d, path2) {
2332
2356
  if (typeof d !== "string") throw new TypeError("svgPath: the path data is a string");
2333
2357
  if (d.length > MAX_SVG) throw new RangeError(`svgPath: the path data is ${d.length} characters; at most ${MAX_SVG} (10 MB)`);
@@ -2491,7 +2515,7 @@ function arc(path2, x0, y0, rx, ry, phi, large, sweep, x2, y) {
2491
2515
  }
2492
2516
  var MAX_SVG, ARGS;
2493
2517
  var init_svg = __esm({
2494
- "src/graphics/svg.js"() {
2518
+ "packages/pdf/src/graphics/svg.js"() {
2495
2519
  init_path();
2496
2520
  MAX_SVG = 10 * 1024 * 1024;
2497
2521
  ARGS = /** @type {Record<string, number>} */
@@ -2499,14 +2523,14 @@ var init_svg = __esm({
2499
2523
  }
2500
2524
  });
2501
2525
 
2502
- // src/graphics/path.js
2526
+ // packages/pdf/src/graphics/path.js
2503
2527
  function coord(v, what) {
2504
2528
  if (typeof v !== "number" || !(Math.abs(v) < 1e9)) throw new RangeError(`${what}: ${v} is not a usable number (finite, under 1e9 in size)`);
2505
2529
  return v;
2506
2530
  }
2507
2531
  var MAX_SEGMENTS, TAU, Path;
2508
2532
  var init_path = __esm({
2509
- "src/graphics/path.js"() {
2533
+ "packages/pdf/src/graphics/path.js"() {
2510
2534
  init_serialize();
2511
2535
  init_svg();
2512
2536
  MAX_SEGMENTS = 1e6;
@@ -2719,7 +2743,7 @@ var init_path = __esm({
2719
2743
  }
2720
2744
  });
2721
2745
 
2722
- // src/graphics/paint.js
2746
+ // packages/pdf/src/graphics/paint.js
2723
2747
  function oneSpace(cols, doc) {
2724
2748
  const r = cols.map((c) => resolve(c, doc));
2725
2749
  if (r.every((x2) => x2.cs === DEVICE[1] || x2.cs === DEVICE[3]) && r.some((x2) => x2.cs === DEVICE[3])) {
@@ -2825,7 +2849,7 @@ function tilingPattern(o, draw) {
2825
2849
  }
2826
2850
  var MAX_STOPS, shading, base2;
2827
2851
  var init_paint = __esm({
2828
- "src/graphics/paint.js"() {
2852
+ "packages/pdf/src/graphics/paint.js"() {
2829
2853
  init_serialize();
2830
2854
  init_color();
2831
2855
  init_draw();
@@ -2836,7 +2860,7 @@ var init_paint = __esm({
2836
2860
  }
2837
2861
  });
2838
2862
 
2839
- // src/standards/level.js
2863
+ // packages/pdf/src/standards/level.js
2840
2864
  function pdfaLevel(pdfa, tagged) {
2841
2865
  if (pdfa == null || pdfa === false) return null;
2842
2866
  if (pdfa === true) return { part: 2, conformance: "b", unicode: false };
@@ -2853,11 +2877,11 @@ function refuseInA1(doc, what, why) {
2853
2877
  if (d.pdfaLevel?.part === 1) throw new TypeError(`${what}: PDF/A-1 (ISO 19005-1) ${why}; use PDF/A-2 or 3 (pdfa: { part: 2 })`);
2854
2878
  }
2855
2879
  var init_level = __esm({
2856
- "src/standards/level.js"() {
2880
+ "packages/pdf/src/standards/level.js"() {
2857
2881
  }
2858
2882
  });
2859
2883
 
2860
- // src/graphics/draw.js
2884
+ // packages/pdf/src/graphics/draw.js
2861
2885
  function state(page) {
2862
2886
  let s = states.get(page);
2863
2887
  if (!s) states.set(page, s = { m: [1, 0, 0, 1, 0, 0], stack: [], transparent: false, watched: false });
@@ -3042,7 +3066,7 @@ function figure(o, fn) {
3042
3066
  }
3043
3067
  var MAX_DEPTH, MAX_DEPTH_PDFA, MAX_DASH, BLEND_MODES, BLEND, CAPS, JOINS, GROUP, states, mul, flip, num6, matrix, rule;
3044
3068
  var init_draw = __esm({
3045
- "src/graphics/draw.js"() {
3069
+ "packages/pdf/src/graphics/draw.js"() {
3046
3070
  init_serialize();
3047
3071
  init_path();
3048
3072
  init_paint();
@@ -3074,7 +3098,7 @@ var init_draw = __esm({
3074
3098
  }
3075
3099
  });
3076
3100
 
3077
- // src/graphics/shapes.js
3101
+ // packages/pdf/src/graphics/shapes.js
3078
3102
  function line(x1, y1, x2, y2, o = {}) {
3079
3103
  const c = this.content, H = this.height;
3080
3104
  const gs = gstate(this, o);
@@ -3114,14 +3138,14 @@ function rect(x2, y, w, h, o = {}) {
3114
3138
  return this;
3115
3139
  }
3116
3140
  var init_shapes = __esm({
3117
- "src/graphics/shapes.js"() {
3141
+ "packages/pdf/src/graphics/shapes.js"() {
3118
3142
  init_serialize();
3119
3143
  init_color();
3120
3144
  init_draw();
3121
3145
  }
3122
3146
  });
3123
3147
 
3124
- // src/nav/trees.js
3148
+ // packages/pdf/src/nav/trees.js
3125
3149
  async function writeTree(doc, kind, entries) {
3126
3150
  let level = [];
3127
3151
  for (let i2 = 0; i2 < entries.length; i2 += LEAF2) {
@@ -3149,14 +3173,14 @@ function setNames(doc, key, ref) {
3149
3173
  }
3150
3174
  var LEAF2, names;
3151
3175
  var init_trees = __esm({
3152
- "src/nav/trees.js"() {
3176
+ "packages/pdf/src/nav/trees.js"() {
3153
3177
  init_serialize();
3154
3178
  LEAF2 = 64;
3155
3179
  names = /* @__PURE__ */ new WeakMap();
3156
3180
  }
3157
3181
  });
3158
3182
 
3159
- // src/nav/dest.js
3183
+ // packages/pdf/src/nav/dest.js
3160
3184
  function pageIndex(doc, page, who) {
3161
3185
  if (typeof page === "number") {
3162
3186
  if (!(Number.isInteger(page) && page >= 1)) throw new RangeError(`${who}: page is a whole number from 1`);
@@ -3250,7 +3274,7 @@ function create(doc) {
3250
3274
  }
3251
3275
  var FITS, MAX_NAMES, MAX_NAME_BYTES, UTF82, hexOf, registries;
3252
3276
  var init_dest = __esm({
3253
- "src/nav/dest.js"() {
3277
+ "packages/pdf/src/nav/dest.js"() {
3254
3278
  init_serialize();
3255
3279
  init_brand();
3256
3280
  init_trees();
@@ -3267,7 +3291,7 @@ var init_dest = __esm({
3267
3291
  }
3268
3292
  });
3269
3293
 
3270
- // src/nav/links.js
3294
+ // packages/pdf/src/nav/links.js
3271
3295
  function checkUrl(raw, allow, who) {
3272
3296
  if (typeof raw !== "string") throw new TypeError(`${who}: url is a string`);
3273
3297
  if (raw.length > MAX_URL) throw new RangeError(`${who}: a URL is at most ${MAX_URL} characters`);
@@ -3391,7 +3415,7 @@ function dashArray(d, who) {
3391
3415
  }
3392
3416
  var NEVER, DEFAULT_SCHEMES, ACTIVE, NAMED, MAX_URL, MAX_QUADS, HIGHLIGHT, BORDER;
3393
3417
  var init_links = __esm({
3394
- "src/nav/links.js"() {
3418
+ "packages/pdf/src/nav/links.js"() {
3395
3419
  init_serialize();
3396
3420
  init_color();
3397
3421
  init_dest();
@@ -3406,7 +3430,7 @@ var init_links = __esm({
3406
3430
  }
3407
3431
  });
3408
3432
 
3409
- // src/images/png.js
3433
+ // packages/pdf/src/images/png.js
3410
3434
  function crc32(b, from, to) {
3411
3435
  if (!CRC_TABLE) {
3412
3436
  CRC_TABLE = new Uint32Array(256);
@@ -3465,6 +3489,7 @@ function readPng(b) {
3465
3489
  return png;
3466
3490
  }
3467
3491
  async function inflateExact(idat, size, onData, drain = null) {
3492
+ if (NODE_ZLIB2 && size <= SYNC_MAX) return inflateNode(idat, size, onData, drain);
3468
3493
  let n = 0, done = false, total = 0;
3469
3494
  const z = new Unzlib((chunk, final) => {
3470
3495
  if (n + chunk.length > size) throw new TypeError(`PNG: the image data inflates past the ${size.toLocaleString("en")} bytes its header allows (corrupt, or a zip bomb)`);
@@ -3497,6 +3522,37 @@ async function inflateExact(idat, size, onData, drain = null) {
3497
3522
  if (!(rest instanceof Uint8Array) || typeof bit !== "number") throw new Error("PNG: internal: the inflater does not report where the zlib stream ends");
3498
3523
  return total - rest.length + (bit ? 1 : 0);
3499
3524
  }
3525
+ async function inflateNode(idat, size, onData, drain = null) {
3526
+ let total = 0;
3527
+ for (const d of idat) total += d.length;
3528
+ let src = idat[0];
3529
+ if (idat.length > 1) {
3530
+ src = new Uint8Array(total);
3531
+ let at = 0;
3532
+ for (const d of idat) {
3533
+ src.set(d, at);
3534
+ at += d.length;
3535
+ }
3536
+ }
3537
+ let r;
3538
+ try {
3539
+ r = NODE_ZLIB2.inflateSync(src, { info: true, maxOutputLength: Math.max(1, size) });
3540
+ } catch (e) {
3541
+ const code = (
3542
+ /** @type {any} */
3543
+ e.code
3544
+ );
3545
+ if (code === "ERR_BUFFER_TOO_LARGE") throw new TypeError(`PNG: the image data inflates past the ${size.toLocaleString("en")} bytes its header allows (corrupt, or a zip bomb)`);
3546
+ if (code === "Z_BUF_ERROR") throw new TypeError(`PNG: truncated image data (the zlib stream ends early)`);
3547
+ throw new TypeError(`PNG: corrupt image data (${/** @type {Error} */
3548
+ e.message})`);
3549
+ }
3550
+ const out = new Uint8Array(r.buffer.buffer, r.buffer.byteOffset, r.buffer.length);
3551
+ if (out.length !== size) throw new TypeError(`PNG: truncated image data (${out.length.toLocaleString("en")} of ${size.toLocaleString("en")} bytes)`);
3552
+ if (onData) onData(out, 0);
3553
+ if (drain) await drain();
3554
+ return r.engine.bytesWritten;
3555
+ }
3500
3556
  function unfilterRow(f, c, p, bpp) {
3501
3557
  const rb = c.length;
3502
3558
  if (f > 4) throw new TypeError(`PNG: unknown row filter ${f}`);
@@ -3521,29 +3577,58 @@ function unfilterRow(f, c, p, bpp) {
3521
3577
  }
3522
3578
  }
3523
3579
  function filterRow(x2, up, bpp, out, o, t) {
3524
- const rb = x2.length;
3525
- let bestSum = Infinity;
3526
- for (let f = 0; f <= 4; f++) {
3527
- if (f === 3) continue;
3528
- let sum = 0;
3529
- for (let i2 = 0; i2 < rb; i2++) {
3530
- const a = i2 >= bpp ? x2[i2 - bpp] : 0, u = up ? up[i2] : 0, c = up && i2 >= bpp ? up[i2 - bpp] : 0;
3531
- let p = 0;
3532
- if (f === 1) p = a;
3533
- else if (f === 2) p = u;
3534
- else if (f === 4) {
3535
- const pp = a + u - c, pa = Math.abs(pp - a), pb = Math.abs(pp - u), pc = Math.abs(pp - c);
3536
- p = pa <= pb && pa <= pc ? a : pb <= pc ? u : c;
3537
- }
3538
- const v = x2[i2] - p & 255;
3539
- t[i2] = v;
3540
- sum += v < 128 ? v : 256 - v;
3541
- }
3542
- if (sum < bestSum) {
3543
- bestSum = sum;
3544
- out.set(t, o + 1);
3545
- out[o] = f;
3546
- }
3580
+ const rb = x2.length, m = Math.min(bpp, rb);
3581
+ let best = 0, sum = 0;
3582
+ for (let i2 = 0; i2 < rb; i2++) {
3583
+ const v = x2[i2];
3584
+ sum += v < 128 ? v : 256 - v;
3585
+ }
3586
+ out[o] = 0;
3587
+ out.set(x2, o + 1);
3588
+ best = sum;
3589
+ sum = 0;
3590
+ for (let i2 = 0; i2 < m; i2++) {
3591
+ const v = x2[i2];
3592
+ t[i2] = v;
3593
+ sum += v < 128 ? v : 256 - v;
3594
+ }
3595
+ for (let i2 = m; i2 < rb; i2++) {
3596
+ const v = x2[i2] - x2[i2 - bpp] & 255;
3597
+ t[i2] = v;
3598
+ sum += v < 128 ? v : 256 - v;
3599
+ }
3600
+ if (sum < best) {
3601
+ best = sum;
3602
+ out[o] = 1;
3603
+ out.set(t, o + 1);
3604
+ }
3605
+ if (!up) return;
3606
+ sum = 0;
3607
+ for (let i2 = 0; i2 < rb; i2++) {
3608
+ const v = x2[i2] - up[i2] & 255;
3609
+ t[i2] = v;
3610
+ sum += v < 128 ? v : 256 - v;
3611
+ }
3612
+ if (sum < best) {
3613
+ best = sum;
3614
+ out[o] = 2;
3615
+ out.set(t, o + 1);
3616
+ }
3617
+ sum = 0;
3618
+ for (let i2 = 0; i2 < m; i2++) {
3619
+ const v = x2[i2] - up[i2] & 255;
3620
+ t[i2] = v;
3621
+ sum += v < 128 ? v : 256 - v;
3622
+ }
3623
+ for (let i2 = m; i2 < rb; i2++) {
3624
+ const a = x2[i2 - bpp], u = up[i2], c = up[i2 - bpp], pa = Math.abs(u - c), pb = Math.abs(a - c), pc = Math.abs(a + u - c - c);
3625
+ const v = x2[i2] - (pa <= pb && pa <= pc ? a : pb <= pc ? u : c) & 255;
3626
+ t[i2] = v;
3627
+ sum += v < 128 ? v : 256 - v;
3628
+ }
3629
+ if (sum < best) {
3630
+ out[o] = 4;
3631
+ out.set(t, o + 1);
3547
3632
  }
3548
3633
  }
3549
3634
  async function decodePng(p, maxDecoded = MAX_DECODED) {
@@ -3661,14 +3746,17 @@ async function decodePng(p, maxDecoded = MAX_DECODED) {
3661
3746
  };
3662
3747
  return { ...head, filtered: false, alpha: hasAlpha, rows };
3663
3748
  }
3664
- var MAX_SIDE, MAX_PIXELS, MAX_DECODED, STEP, DEPTHS, CHANNELS, ADAM7, CRC_TABLE, isPng, rawSize, filterBytes;
3749
+ var MAX_SIDE, MAX_PIXELS, MAX_DECODED, STEP, NODE_ZLIB2, SYNC_MAX, DEPTHS, CHANNELS, ADAM7, CRC_TABLE, isPng, rawSize, filterBytes;
3665
3750
  var init_png = __esm({
3666
- "src/images/png.js"() {
3751
+ "packages/pdf/src/images/png.js"() {
3667
3752
  init_browser();
3668
3753
  MAX_SIDE = 65535;
3669
3754
  MAX_PIXELS = 1e8;
3670
3755
  MAX_DECODED = 64 << 20;
3671
3756
  STEP = 1024;
3757
+ NODE_ZLIB2 = /** @type {any} */
3758
+ globalThis.process?.getBuiltinModule?.("node:zlib");
3759
+ SYNC_MAX = 32 << 20;
3672
3760
  DEPTHS = { 0: [1, 2, 4, 8, 16], 2: [8, 16], 3: [1, 2, 4, 8], 4: [8, 16], 6: [8, 16] };
3673
3761
  CHANNELS = { 0: 1, 2: 3, 3: 1, 4: 2, 6: 4 };
3674
3762
  ADAM7 = [[0, 0, 8, 8], [4, 0, 8, 8], [0, 4, 4, 8], [2, 0, 4, 4], [0, 2, 2, 4], [1, 0, 2, 2], [0, 1, 1, 2]];
@@ -3685,7 +3773,7 @@ var init_png = __esm({
3685
3773
  }
3686
3774
  });
3687
3775
 
3688
- // src/images/jpeg.js
3776
+ // packages/pdf/src/images/jpeg.js
3689
3777
  function readJpeg(b) {
3690
3778
  const bad = (m) => new TypeError(`JPEG: ${m}`);
3691
3779
  if (!isJpeg(b)) throw bad("no JPEG signature (FF D8)");
@@ -3756,22 +3844,47 @@ function exifOrientation(b, t, end) {
3756
3844
  }
3757
3845
  var isJpeg;
3758
3846
  var init_jpeg = __esm({
3759
- "src/images/jpeg.js"() {
3847
+ "packages/pdf/src/images/jpeg.js"() {
3760
3848
  init_png();
3761
3849
  isJpeg = (b) => b.length >= 3 && b[0] === 255 && b[1] === 216 && b[2] === 255;
3762
3850
  }
3763
3851
  });
3764
3852
 
3765
- // src/images/image.js
3853
+ // packages/pdf/src/images/image.js
3766
3854
  async function embedImage(doc, bytes, opt = {}) {
3767
3855
  const b = toBytes(bytes, "embedImage");
3768
- const own2 = (k) => opt != null && Object.hasOwn(opt, k) ? (
3856
+ const own2 = (k2) => opt != null && Object.hasOwn(opt, k2) ? (
3769
3857
  /** @type {any} */
3770
- opt[k]
3858
+ opt[k2]
3771
3859
  ) : void 0;
3772
3860
  const o = { colorSpace: own2("colorSpace"), maxDecodedBytes: own2("maxDecodedBytes") ?? MAX_DECODED };
3773
3861
  if (!(Number.isSafeInteger(o.maxDecodedBytes) && o.maxDecodedBytes > 0)) throw new TypeError("embedImage: maxDecodedBytes is a whole number of bytes > 0");
3774
3862
  if (b.length > MAX_INPUT) throw new RangeError(`embedImage: at most ${MAX_INPUT >> 20} MB`);
3863
+ let seen = SEEN.get(doc);
3864
+ if (!seen) SEEN.set(doc, seen = /* @__PURE__ */ new Map());
3865
+ const { key, copy } = await digest(b);
3866
+ const k = `${key} ${o.colorSpace == null ? "-" : idOf(o.colorSpace)} ${o.maxDecodedBytes}`;
3867
+ const hit = seen.get(k);
3868
+ if (hit && (!hit.copy || same(hit.copy, b))) return hit.img;
3869
+ const img = embed(doc, b, o);
3870
+ if (!hit) seen.set(k, { img, copy });
3871
+ img.catch(() => {
3872
+ if (seen.get(k)?.img === img) seen.delete(k);
3873
+ });
3874
+ return img;
3875
+ }
3876
+ async function digest(b) {
3877
+ if (NODE_CRYPTO) return { key: NODE_CRYPTO.createHash("sha256").update(b).digest("hex"), copy: null };
3878
+ const subtle = globalThis.crypto?.subtle;
3879
+ if (subtle) return { key: Array.from(new Uint8Array(await subtle.digest("SHA-256", b.slice())), (x2) => x2.toString(16).padStart(2, "0")).join(""), copy: null };
3880
+ let h1 = 2166136261, h2 = 2538058380;
3881
+ for (let i2 = 0; i2 < b.length; i2++) {
3882
+ h1 = Math.imul(h1 ^ b[i2], 16777619);
3883
+ h2 = Math.imul(h2 ^ b[i2], 1540483477) ^ h2 >>> 15;
3884
+ }
3885
+ return { key: `f${b.length}:${(h1 >>> 0).toString(16)}${(h2 >>> 0).toString(16)}`, copy: b.slice() };
3886
+ }
3887
+ async function embed(doc, b, o) {
3775
3888
  const space = (n) => {
3776
3889
  if (o.colorSpace != null) {
3777
3890
  const icc = unbrand(o.colorSpace, "icc", doc, "ICC colour space (pdf.iccColorSpace)");
@@ -3902,9 +4015,9 @@ function image(img, o = {}) {
3902
4015
  else draw();
3903
4016
  return page;
3904
4017
  }
3905
- var MAX_INPUT, ORIENT;
4018
+ var MAX_INPUT, ORIENT, SEEN, IDS, nextId, idOf, NODE_CRYPTO, same;
3906
4019
  var init_image = __esm({
3907
- "src/images/image.js"() {
4020
+ "packages/pdf/src/images/image.js"() {
3908
4021
  init_serialize();
3909
4022
  init_deflate();
3910
4023
  init_brand();
@@ -3926,10 +4039,23 @@ var init_image = __esm({
3926
4039
  [0, 1, 1, 0, 0, 0],
3927
4040
  [0, 1, -1, 0, 1, 0]
3928
4041
  ];
4042
+ SEEN = /** @type {WeakMap<any, Map<string, { img: Promise<any>, copy: Uint8Array | null }>>} */
4043
+ /* @__PURE__ */ new WeakMap();
4044
+ IDS = /** @type {WeakMap<object, number>} */
4045
+ /* @__PURE__ */ new WeakMap();
4046
+ nextId = 0;
4047
+ idOf = (v) => v !== null && typeof v === "object" ? IDS.get(v) ?? (IDS.set(v, ++nextId), nextId) : `?${String(v)}`;
4048
+ NODE_CRYPTO = /** @type {any} */
4049
+ globalThis.process?.getBuiltinModule?.("node:crypto");
4050
+ same = (a, b) => {
4051
+ if (a.length !== b.length) return false;
4052
+ for (let i2 = 0; i2 < a.length; i2++) if (a[i2] !== b[i2]) return false;
4053
+ return true;
4054
+ };
3929
4055
  }
3930
4056
  });
3931
4057
 
3932
- // src/annotations/annot.js
4058
+ // packages/pdf/src/annotations/annot.js
3933
4059
  function dateOf(d, who) {
3934
4060
  if (!(d instanceof Date) || isNaN(+d)) throw new TypeError(`${who}: a date is a valid Date`);
3935
4061
  return pdfDate(d);
@@ -4000,7 +4126,7 @@ function addAnnot(page, subtype, box, own2, common, draw) {
4000
4126
  }
4001
4127
  var FLAGS, MAX_CONTENTS, no;
4002
4128
  var init_annot = __esm({
4003
- "src/annotations/annot.js"() {
4129
+ "packages/pdf/src/annotations/annot.js"() {
4004
4130
  init_serialize();
4005
4131
  init_brand();
4006
4132
  init_content();
@@ -4013,7 +4139,7 @@ var init_annot = __esm({
4013
4139
  }
4014
4140
  });
4015
4141
 
4016
- // src/annotations/markup.js
4142
+ // packages/pdf/src/annotations/markup.js
4017
4143
  function boxOf(o, who) {
4018
4144
  const b = [o?.x ?? 0, o?.y ?? 0, o?.width, o?.height];
4019
4145
  for (const v of b) if (typeof v !== "number") throw new TypeError(`${who}: x, y, width and height are numbers`);
@@ -4216,7 +4342,7 @@ function stamp(o) {
4216
4342
  }
4217
4343
  var NOTE_ICONS, STAMPS, LINE_ENDINGS, MAX_POINTS, MAX_STROKES, dflt2, highlight, underline, strikeOut, squiggly, asciiHex;
4218
4344
  var init_markup = __esm({
4219
- "src/annotations/markup.js"() {
4345
+ "packages/pdf/src/annotations/markup.js"() {
4220
4346
  init_serialize();
4221
4347
  init_brand();
4222
4348
  init_color();
@@ -4240,7 +4366,7 @@ var init_markup = __esm({
4240
4366
  }
4241
4367
  });
4242
4368
 
4243
- // src/core/filename.js
4369
+ // packages/pdf/src/core/filename.js
4244
4370
  function checkFileName(raw, o, who, again = false) {
4245
4371
  if (typeof raw !== "string") throw new TypeError(`${who}: name (the file name) is a string`);
4246
4372
  if (raw.length > MAX_IN) throw new RangeError(`${who}: a file name is at most ${MAX_BYTES} bytes (UTF-8)`);
@@ -4299,7 +4425,7 @@ function check(name, allow, risky, o, who) {
4299
4425
  }
4300
4426
  var MAX_IN, MAX_BYTES, BAD, SPACES2, SLASHES, DOTS, DEVICE2, PASSIVE, MIMES, UTF83;
4301
4427
  var init_filename = __esm({
4302
- "src/core/filename.js"() {
4428
+ "packages/pdf/src/core/filename.js"() {
4303
4429
  MAX_IN = 4096;
4304
4430
  MAX_BYTES = 255;
4305
4431
  BAD = /[\p{Cc}\p{Cf}\p{Zl}\p{Zp}\p{Cs}<>:"|?*]/u;
@@ -4337,7 +4463,7 @@ var init_filename = __esm({
4337
4463
  }
4338
4464
  });
4339
4465
 
4340
- // src/core/md5.js
4466
+ // packages/pdf/src/core/md5.js
4341
4467
  function md5(bytes) {
4342
4468
  const n = bytes.length, total = (n + 8 >>> 6) + 1 << 6;
4343
4469
  const tail = new Uint8Array(total - (n & ~63));
@@ -4388,7 +4514,7 @@ function md5(bytes) {
4388
4514
  }
4389
4515
  var S, K;
4390
4516
  var init_md5 = __esm({
4391
- "src/core/md5.js"() {
4517
+ "packages/pdf/src/core/md5.js"() {
4392
4518
  S = [
4393
4519
  7,
4394
4520
  12,
@@ -4459,7 +4585,7 @@ var init_md5 = __esm({
4459
4585
  }
4460
4586
  });
4461
4587
 
4462
- // src/annotations/attach.js
4588
+ // packages/pdf/src/annotations/attach.js
4463
4589
  function attachFile(bytes, o = (
4464
4590
  /** @type {any} */
4465
4591
  {}
@@ -4495,7 +4621,7 @@ function attachFile(bytes, o = (
4495
4621
  }
4496
4622
  var FILE_ICONS, MAX_FILE;
4497
4623
  var init_attach = __esm({
4498
- "src/annotations/attach.js"() {
4624
+ "packages/pdf/src/annotations/attach.js"() {
4499
4625
  init_serialize();
4500
4626
  init_filename();
4501
4627
  init_md5();
@@ -4505,7 +4631,7 @@ var init_attach = __esm({
4505
4631
  }
4506
4632
  });
4507
4633
 
4508
- // src/standards/layers.js
4634
+ // packages/pdf/src/standards/layers.js
4509
4635
  function createLayers(doc) {
4510
4636
  const all = [];
4511
4637
  doc.onFinish(async () => {
@@ -4567,7 +4693,7 @@ function pageLayer(layer, fn) {
4567
4693
  }
4568
4694
  var MAX_LAYERS, MAX_NEST, depth;
4569
4695
  var init_layers = __esm({
4570
- "src/standards/layers.js"() {
4696
+ "packages/pdf/src/standards/layers.js"() {
4571
4697
  init_serialize();
4572
4698
  init_brand();
4573
4699
  init_level();
@@ -4578,7 +4704,7 @@ var init_layers = __esm({
4578
4704
  }
4579
4705
  });
4580
4706
 
4581
- // src/tags/tags.js
4707
+ // packages/pdf/src/tags/tags.js
4582
4708
  function createTagger(doc, opt) {
4583
4709
  const rootRef = doc.reserve(), docRef = doc.reserve();
4584
4710
  const docKids = [];
@@ -4749,12 +4875,12 @@ function checkOptions(type, o) {
4749
4875
  k
4750
4876
  );
4751
4877
  if (o.lang != null && (typeof o.lang !== "string" || !/^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8}){0,8}$/.test(o.lang))) throw new TypeError(`page.tag: lang is a language tag like "en" or "fr-CA", not ${JSON.stringify(o.lang)}`);
4752
- if (o.id != null) idOf(o.id);
4878
+ if (o.id != null) idOf2(o.id);
4753
4879
  if (o.scope != null && type !== "TH") throw new TypeError("page.tag: scope is for TH");
4754
4880
  if (o.headers != null) {
4755
4881
  if (type !== "TH" && type !== "TD") throw new TypeError("page.tag: headers is for TD and TH");
4756
4882
  if (!Array.isArray(o.headers) || !o.headers.length || o.headers.length > 64) throw new TypeError("page.tag: headers is an array of 1–64 TH ids");
4757
- o.headers.forEach(idOf);
4883
+ o.headers.forEach(idOf2);
4758
4884
  }
4759
4885
  for (
4760
4886
  const k of
@@ -4785,9 +4911,9 @@ function artifact(o, fn) {
4785
4911
  if (typeof fn !== "function") throw new TypeError("page.artifact: fn is a function that draws");
4786
4912
  return this.doc.tags ? this.doc.tags.artifact(this, o, fn) : fn();
4787
4913
  }
4788
- var STRUCTURE_TYPES, ART, PARENTS, NUMBERING, ARTIFACT_TYPES, ARTIFACT_SUBTYPES, MAX_TEXT2, MAX_IDS, str, idOf;
4914
+ var STRUCTURE_TYPES, ART, PARENTS, NUMBERING, ARTIFACT_TYPES, ARTIFACT_SUBTYPES, MAX_TEXT2, MAX_IDS, str, idOf2;
4789
4915
  var init_tags = __esm({
4790
- "src/tags/tags.js"() {
4916
+ "packages/pdf/src/tags/tags.js"() {
4791
4917
  init_serialize();
4792
4918
  init_trees();
4793
4919
  init_brand();
@@ -4870,14 +4996,14 @@ var init_tags = __esm({
4870
4996
  if (typeof v !== "string" || v.length > MAX_TEXT2) throw new TypeError(`page.tag: ${k} is a string of at most ${MAX_TEXT2} characters`);
4871
4997
  return v;
4872
4998
  };
4873
- idOf = (v) => {
4999
+ idOf2 = (v) => {
4874
5000
  if (typeof v !== "string" || !/^[A-Za-z0-9_.:-]{1,64}$/.test(v)) throw new TypeError(`page.tag: an id is 1–64 letters, digits, _ . : or -, not ${JSON.stringify(v)}`);
4875
5001
  return v;
4876
5002
  };
4877
5003
  }
4878
5004
  });
4879
5005
 
4880
- // src/page.js
5006
+ // packages/pdf/src/page.js
4881
5007
  function install(methods) {
4882
5008
  for (const [name, f] of Object.entries(methods)) {
4883
5009
  Page.prototype[name] = function(...a) {
@@ -4888,7 +5014,7 @@ function install(methods) {
4888
5014
  }
4889
5015
  var MAX_ANNOTS, Page;
4890
5016
  var init_page = __esm({
4891
- "src/page.js"() {
5017
+ "packages/pdf/src/page.js"() {
4892
5018
  init_content();
4893
5019
  init_brand();
4894
5020
  init_text();
@@ -4965,10 +5091,10 @@ var init_page = __esm({
4965
5091
  }
4966
5092
  });
4967
5093
 
4968
- // src/fonts/standard-metrics.js
5094
+ // packages/pdf/src/fonts/standard-metrics.js
4969
5095
  var ENCODINGS, METRICS;
4970
5096
  var init_standard_metrics = __esm({
4971
- "src/fonts/standard-metrics.js"() {
5097
+ "packages/pdf/src/fonts/standard-metrics.js"() {
4972
5098
  ENCODINGS = {
4973
5099
  WinAnsi: [
4974
5100
  32,
@@ -9990,7 +10116,7 @@ var init_standard_metrics = __esm({
9990
10116
  }
9991
10117
  });
9992
10118
 
9993
- // src/fonts/standard.js
10119
+ // packages/pdf/src/fonts/standard.js
9994
10120
  function standardFont(doc, key) {
9995
10121
  const m = typeof key === "string" && Object.hasOwn(METRICS, key) ? (
9996
10122
  /** @type {any} */
@@ -10009,6 +10135,13 @@ function standardFont(doc, key) {
10009
10135
  /** @type {number[]} */
10010
10136
  m.widths
10011
10137
  );
10138
+ const W8 = new Float64Array(256), SAME = new Uint8Array(256);
10139
+ for (let c = 0; c < 256; c++) {
10140
+ const code = codeOf.get(c);
10141
+ W8[c] = code === void 0 ? -1 : widths[code] || 0;
10142
+ SAME[c] = code === c && esc(code) === String.fromCharCode(c) ? 1 : 0;
10143
+ }
10144
+ const SP32 = codeOf.get(32) === 32;
10012
10145
  const ref = doc.reserve();
10013
10146
  const missing = /* @__PURE__ */ new Set();
10014
10147
  const memo2 = /* @__PURE__ */ new Map();
@@ -10068,8 +10201,31 @@ function standardFont(doc, key) {
10068
10201
  lineHeight: 1.2,
10069
10202
  has: (cp) => codeOf.has(cp),
10070
10203
  items(text3, o) {
10071
- let body = "", a = 0, n = 0, sp = 0;
10072
10204
  const draw = !o.measure;
10205
+ if (!o.rtl) {
10206
+ let a2 = 0, n2 = 0, sp2 = 0, same2 = true;
10207
+ for (let i2 = 0; i2 < text3.length; i2++) {
10208
+ const c = text3.charCodeAt(i2);
10209
+ if (c > 255) {
10210
+ same2 = false;
10211
+ break;
10212
+ }
10213
+ const w = W8[c];
10214
+ if (w < 0) {
10215
+ same2 = false;
10216
+ break;
10217
+ }
10218
+ a2 += w;
10219
+ n2++;
10220
+ if (c === 32 && SP32) sp2++;
10221
+ if (!SAME[c]) {
10222
+ same2 = false;
10223
+ break;
10224
+ }
10225
+ }
10226
+ if (same2) return { body: draw ? text3 : "", a: a2, n: n2, sp: sp2 };
10227
+ }
10228
+ let body = "", a = 0, n = 0, sp = 0;
10073
10229
  for (const ch of o.rtl ? [...text3].reverse() : text3) {
10074
10230
  const b = byte(ch);
10075
10231
  if (!b) {
@@ -10090,7 +10246,7 @@ function standardFont(doc, key) {
10090
10246
  }
10091
10247
  var STANDARD_NAMES, CODE;
10092
10248
  var init_standard = __esm({
10093
- "src/fonts/standard.js"() {
10249
+ "packages/pdf/src/fonts/standard.js"() {
10094
10250
  init_brand();
10095
10251
  init_standard_metrics();
10096
10252
  init_serialize();
@@ -10101,7 +10257,7 @@ var init_standard = __esm({
10101
10257
  }
10102
10258
  });
10103
10259
 
10104
- // src/fonts/truetype.js
10260
+ // packages/pdf/src/fonts/truetype.js
10105
10261
  function sfntTables(bytes) {
10106
10262
  if (bytes.length < 12) throw new TypeError("Not a font: too short");
10107
10263
  const v = tagOf(bytes, 0);
@@ -10278,14 +10434,14 @@ function cmapLookup(dv) {
10278
10434
  }
10279
10435
  var broken, tagOf, view;
10280
10436
  var init_truetype = __esm({
10281
- "src/fonts/truetype.js"() {
10437
+ "packages/pdf/src/fonts/truetype.js"() {
10282
10438
  broken = (why) => new TypeError(`Broken font: ${why}`);
10283
10439
  tagOf = (b, p) => String.fromCharCode(b[p], b[p + 1], b[p + 2], b[p + 3]);
10284
10440
  view = (b) => new DataView(b.buffer, b.byteOffset, b.byteLength);
10285
10441
  }
10286
10442
  });
10287
10443
 
10288
- // src/fonts/subset.js
10444
+ // packages/pdf/src/fonts/subset.js
10289
10445
  function subsetGlyf(bytes, glyphs2) {
10290
10446
  const t = sfntTables(bytes);
10291
10447
  const head = t.get("head"), loca = t.get("loca"), glyf = t.get("glyf"), maxp = t.get("maxp");
@@ -10381,7 +10537,7 @@ function buildSfnt(tables, version = [0, 1, 0, 0]) {
10381
10537
  }
10382
10538
  var KEEP, tableSum;
10383
10539
  var init_subset = __esm({
10384
- "src/fonts/subset.js"() {
10540
+ "packages/pdf/src/fonts/subset.js"() {
10385
10541
  init_truetype();
10386
10542
  KEEP = ["head", "hhea", "hmtx", "maxp", "cvt ", "fpgm", "prep", "OS/2", "name", "gasp"];
10387
10543
  tableSum = (b, o, len) => {
@@ -10393,7 +10549,7 @@ var init_subset = __esm({
10393
10549
  }
10394
10550
  });
10395
10551
 
10396
- // src/fonts/cff.js
10552
+ // packages/pdf/src/fonts/cff.js
10397
10553
  function readIndex(t, p, what) {
10398
10554
  if (p + 2 > t.length) throw broken2(`the CFF ${what} INDEX lies outside the table`);
10399
10555
  const count = t[p] << 8 | t[p + 1];
@@ -10656,7 +10812,7 @@ function identityCharset(t, n) {
10656
10812
  }
10657
10813
  var broken2, MAX_STACK, MAX_DEPTH2, MAX_CS, BUDGET, FONT_BUDGET, bias;
10658
10814
  var init_cff = __esm({
10659
- "src/fonts/cff.js"() {
10815
+ "packages/pdf/src/fonts/cff.js"() {
10660
10816
  broken2 = (why) => new TypeError(`Broken font: ${why}`);
10661
10817
  MAX_STACK = 48;
10662
10818
  MAX_DEPTH2 = 10;
@@ -10667,7 +10823,7 @@ var init_cff = __esm({
10667
10823
  }
10668
10824
  });
10669
10825
 
10670
- // src/fonts/kern.js
10826
+ // packages/pdf/src/fonts/kern.js
10671
10827
  function kerning(tables, numGlyphs, warn) {
10672
10828
  const gpos = tables.get("GPOS"), kern = tables.get("kern");
10673
10829
  if (gpos) {
@@ -10902,7 +11058,7 @@ function kernTable(t, numGlyphs) {
10902
11058
  }
10903
11059
  var broken3, MAX_SUBTABLES, BUDGET2, vsize;
10904
11060
  var init_kern = __esm({
10905
- "src/fonts/kern.js"() {
11061
+ "packages/pdf/src/fonts/kern.js"() {
10906
11062
  broken3 = (why) => new TypeError(`Broken font: ${why}`);
10907
11063
  MAX_SUBTABLES = 64;
10908
11064
  BUDGET2 = 4e6;
@@ -10914,7 +11070,7 @@ var init_kern = __esm({
10914
11070
  }
10915
11071
  });
10916
11072
 
10917
- // src/fonts/embed.js
11073
+ // packages/pdf/src/fonts/embed.js
10918
11074
  function embedFont(doc, input, opt = {}) {
10919
11075
  const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
10920
11076
  const f = parseFont(bytes);
@@ -10938,9 +11094,15 @@ function embedFont(doc, input, opt = {}) {
10938
11094
  use(0);
10939
11095
  const two = (g) => esc(g >> 8) + esc(g & 255);
10940
11096
  const kern = kerning(f.tables, f.numGlyphs, (m) => doc.warn(`${f.postscriptName.slice(0, 63)}: ${m}`));
11097
+ const axes = variation(f.tables.get("fvar"));
11098
+ if (axes) doc.warn(`${f.postscriptName.slice(0, 63)} is a variable font: it is drawn at its default instance (${axes}); to draw another weight or width, embed a static instance of it (fonttools varLib.instancer, or HarfBuzz's hb-subset --instance)`);
10941
11099
  const k = 1e3 / f.unitsPerEm;
10942
11100
  const ref = doc.reserve();
10943
- const glyphs2 = /* @__PURE__ */ new Map();
11101
+ const codes = /* @__PURE__ */ new Map();
11102
+ const codeOf = /* @__PURE__ */ new Map();
11103
+ const copies = !f.cff;
11104
+ const EXACT = [];
11105
+ let next = f.numGlyphs;
10944
11106
  const missing = /* @__PURE__ */ new Set();
10945
11107
  const memo2 = /* @__PURE__ */ new Map();
10946
11108
  const strict = doc.pdfa || doc.tagged;
@@ -10957,24 +11119,31 @@ function embedFont(doc, input, opt = {}) {
10957
11119
  );
10958
11120
  if (!g) lack(ch);
10959
11121
  if (!g && missing.size < 100) missing.add(ch);
10960
- if (!glyphs2.has(g) && (g || !strict)) {
10961
- use(g);
10962
- glyphs2.set(g, g ? ch : "");
10963
- }
10964
- memo2.set(ch, b = !g && strict ? "" : two(g));
11122
+ memo2.set(ch, b = !g && strict ? "" : two(code(g, ch)[0]));
10965
11123
  }
10966
11124
  return b;
10967
11125
  };
10968
- const record = (g, t) => {
11126
+ const code = (g, t) => {
10969
11127
  const m = t.length <= 32 ? t : String.fromCodePoint(
10970
11128
  /** @type {number} */
10971
11129
  t.codePointAt(0)
10972
11130
  );
10973
- if (!glyphs2.has(g)) {
10974
- use(g);
10975
- glyphs2.set(g, g ? m : "");
11131
+ if (codes.get(g)?.t === m) return m === t ? EXACT[g] ??= [g, true] : [g, false];
11132
+ let c = codeOf.get(`${g}:${m}`);
11133
+ if (c === void 0) {
11134
+ if (!codes.has(g)) {
11135
+ use(g);
11136
+ c = g;
11137
+ } else if (copies && next <= 65535) c = next++;
11138
+ else return [
11139
+ g,
11140
+ /** @type {any} */
11141
+ codes.get(g).t === t
11142
+ ];
11143
+ codes.set(c, { g, t: m });
11144
+ codeOf.set(`${g}:${m}`, c);
10976
11145
  }
10977
- return glyphs2.get(g) === t;
11146
+ return [c, m === t];
10978
11147
  };
10979
11148
  let handle;
10980
11149
  const items = (text3, o) => {
@@ -11025,9 +11194,9 @@ function embedFont(doc, input, opt = {}) {
11025
11194
  if (missing.size < 100 && !o.measure) missing.add(ch);
11026
11195
  if (strict) continue;
11027
11196
  }
11028
- const ok = o.measure || record(g, ch), w = W(g);
11197
+ const [c, ok] = o.measure ? [g, true] : code(g, ch), w = W(g);
11029
11198
  if (kerned && prev >= 0) out[out.length - 1].a += kern(prev, g) * k;
11030
- out.push({ b: two(g), w, a: w, dx: 0, dy: 0, sp: ch === " ", at: ok ? void 0 : ch, n: 1 });
11199
+ out.push({ b: two(c), w, a: w, dx: 0, dy: 0, sp: ch === " ", at: ok ? void 0 : ch, n: 1 });
11031
11200
  prev = g;
11032
11201
  }
11033
11202
  return out;
@@ -11051,33 +11220,63 @@ function embedFont(doc, input, opt = {}) {
11051
11220
  });
11052
11221
  const starts = [...new Set(gl.map((x2) => x2.cl))].sort((a, b) => a - b);
11053
11222
  const end = new Map(starts.map((c, i2) => [c, starts[i2 + 1] ?? text3.length]));
11054
- const out = [];
11223
+ const out = [], said = /* @__PURE__ */ new Set();
11224
+ const at = (a) => {
11225
+ let b = a;
11226
+ while (b < gl.length && gl[b].cl === gl[a].cl) b++;
11227
+ return [b, said.has(gl[a].cl) ? "" : text3.slice(gl[a].cl, end.get(gl[a].cl))];
11228
+ };
11229
+ let glued = null;
11055
11230
  for (let i2 = 0; i2 < gl.length; ) {
11056
- let j = i2;
11057
- while (j < gl.length && gl[j].cl === gl[i2].cl) j++;
11058
- const t = text3.slice(gl[i2].cl, end.get(gl[i2].cl)), first = out.length;
11059
- let ok = j - i2 === 1;
11231
+ const [j, t0] = at(i2), cl = gl[i2].cl, first = out.length;
11232
+ if (glued && t0 === " " && j - i2 === 1) {
11233
+ const { g, ax, dx, dy } = gl[i2];
11234
+ out.push({ b: two(o.measure ? g : code(g, "⁠")[0]), w: W(g), a: ax * k, dx: dx * k, dy: dy * k, sp: true });
11235
+ if (glued.n) glued.n++;
11236
+ glued = null;
11237
+ said.add(cl);
11238
+ i2 = j;
11239
+ continue;
11240
+ }
11241
+ glued = null;
11242
+ const glue = !o.rtl && !!t0 && t0 !== " " && j < gl.length && at(j)[1] === " " && at(j)[0] - j === 1 && at(j)[0] < gl.length && MN.test(at(at(j)[0])[1]);
11243
+ const t = glue ? `${t0} ` : t0;
11244
+ let lead = -1, li = -1, span = glue;
11245
+ if (t0) {
11246
+ for (let q = i2; q < j; q++) if ((gl[q].g || !strict) && (lead < 0 || gl[q].ax > gl[lead].ax)) lead = q;
11247
+ }
11060
11248
  for (let q = i2; q < j; q++) {
11061
11249
  const { g, ax, dx, dy } = gl[q];
11062
11250
  if (!g) {
11063
11251
  if (!o.measure) lack(t);
11064
- if (missing.size < 100 && !o.measure) missing.add(t);
11252
+ if (missing.size < 100 && !o.measure && t) missing.add(t);
11065
11253
  if (strict) {
11066
11254
  if (out.length > first) out[out.length - 1].a += ax * k;
11067
11255
  continue;
11068
11256
  }
11069
11257
  }
11070
- ok = (o.measure || record(g, t)) && ok;
11071
- out.push({ b: two(g), w: W(g), a: ax * k, dx: dx * k, dy: dy * k, sp: t === " " });
11072
- }
11073
- if (out.length > first && !ok) {
11074
- out[first].at = t;
11075
- out[first].n = out.length - first;
11258
+ const [c, exact] = o.measure ? [g, true] : code(g, q !== lead ? "⁠" : o.rtl && RTL3.test(t) ? [...t].reverse().join("") : t);
11259
+ if (!exact) span = true;
11260
+ if (q === lead) li = out.length;
11261
+ if (q !== lead && Math.abs(ax * k) >= 1) span ||= !o.rtl;
11262
+ out.push({ b: two(c), w: W(g), a: ax * k, dx: dx * k, dy: dy * k, sp: q === lead && t === " ", c: q !== lead && Math.abs(ax * k) < 1 || void 0 });
11076
11263
  }
11264
+ if (out.length > first) said.add(cl);
11265
+ if (span && !o.measure) {
11266
+ const flow = out.slice(first).filter((x2) => !x2.c);
11267
+ if (flow.length) {
11268
+ flow[0].at = t;
11269
+ flow[0].n = flow.length;
11270
+ if (glue) glued = flow[0];
11271
+ }
11272
+ if (li >= 0 && !out[li].c) out[li].b = two(code(gl[lead].g, "⁠")[0]);
11273
+ } else if (glue) glued = /** @type {any} */
11274
+ {};
11077
11275
  i2 = j;
11078
11276
  }
11079
11277
  return out;
11080
11278
  };
11279
+ const MN = /\p{Mn}/u, RTL3 = /[\u0590-\u08ff\ufb1d-\ufdff\ufe70-\ufeff]/;
11081
11280
  const impl = {
11082
11281
  standard: false,
11083
11282
  items,
@@ -11114,12 +11313,12 @@ function embedFont(doc, input, opt = {}) {
11114
11313
  return s;
11115
11314
  },
11116
11315
  async write() {
11117
- if (!glyphs2.size) glyphs2.set(0, "");
11118
- const used = [...glyphs2.keys()].sort((a, b) => a - b);
11119
- const cps = [...glyphs2.values()].filter(Boolean).flatMap((t) => [...t].map((c) => (
11316
+ const cids = [...codes.keys()].sort((a, b) => a - b);
11317
+ const used = [.../* @__PURE__ */ new Set([0, ...[...codes.values()].map((x2) => x2.g)])].sort((a, b) => a - b);
11318
+ const cps = [...new Set([...codes.values()].flatMap((x2) => [...x2.t].map((c) => (
11120
11319
  /** @type {number} */
11121
11320
  c.codePointAt(0)
11122
- )));
11321
+ ))))];
11123
11322
  let file = bytes;
11124
11323
  if (sub && !(f.fsType & 256)) {
11125
11324
  if (typeof sub === "function") {
@@ -11144,8 +11343,8 @@ function embedFont(doc, input, opt = {}) {
11144
11343
  ) : file);
11145
11344
  let cidSet = "";
11146
11345
  if (subset && doc.pdfaLevel?.part === 1) {
11147
- const bits2 = new Uint8Array((used[used.length - 1] >> 3) + 1), n = doc.reserve();
11148
- for (const g of used) bits2[g >> 3] |= 128 >> (g & 7);
11346
+ const all = [.../* @__PURE__ */ new Set([...used, ...cids])], bits2 = new Uint8Array((Math.max(...all) >> 3) + 1), n = doc.reserve();
11347
+ for (const g of all) bits2[g >> 3] |= 128 >> (g & 7);
11149
11348
  await doc.writeStream(n, "<< >>", bits2);
11150
11349
  cidSet = ` /CIDSet ${n} 0 R`;
11151
11350
  }
@@ -11153,16 +11352,27 @@ function embedFont(doc, input, opt = {}) {
11153
11352
  const flags = (f.fixedPitch ? 1 : 0) | 4 | (f.italicAngle ? 64 : 0);
11154
11353
  const [x0, y0, x1, y1] = f.bbox;
11155
11354
  await doc.write(desc, `<< /Type /FontDescriptor /FontName ${base3} /Flags ${flags} /FontBBox [${s(x0)} ${s(y0)} ${s(x1)} ${s(y1)}] /ItalicAngle ${num(f.italicAngle)} /Ascent ${s(f.ascent)} /Descent ${s(f.descent)} /CapHeight ${s(f.capHeight)} /XHeight ${s(f.xHeight)} /StemV 0 /${cff ? "FontFile3" : "FontFile2"} ${fileRef} 0 R${cidSet} >>`);
11156
- const codes = used.map((g) => [g, g]);
11355
+ const wc = (cids.length ? cids : [0]).map((c) => [c, codes.get(c)?.g ?? 0]);
11157
11356
  let Wa = "";
11158
- for (let i2 = 0; i2 < codes.length; ) {
11357
+ for (let i2 = 0; i2 < wc.length; ) {
11159
11358
  let j = i2;
11160
- while (j + 1 < codes.length && codes[j + 1][0] === codes[j][0] + 1) j++;
11161
- Wa += `${codes[i2][0]} [${codes.slice(i2, j + 1).map(([, g]) => s(f.advance(g))).join(" ")}] `;
11359
+ while (j + 1 < wc.length && wc[j + 1][0] === wc[j][0] + 1) j++;
11360
+ Wa += `${wc[i2][0]} [${wc.slice(i2, j + 1).map(([, g]) => s(f.advance(g))).join(" ")}] `;
11162
11361
  i2 = j + 1;
11163
11362
  }
11164
- await doc.write(cid, `<< /Type /Font /Subtype /${cff ? "CIDFontType0" : "CIDFontType2"} /BaseFont ${base3} /CIDSystemInfo << /Registry ${ascii("Adobe")} /Ordering ${ascii("Identity")} /Supplement 0 >> /FontDescriptor ${desc} 0 R /W [${Wa}]${cff ? "" : " /CIDToGIDMap /Identity"} >>`);
11165
- await doc.writeStream(cmap, "<< >>", latin1(toUnicode(glyphs2)));
11363
+ let c2g = " /CIDToGIDMap /Identity";
11364
+ if (!cff && next > f.numGlyphs) {
11365
+ const m = new Uint8Array(2 * next), r = doc.reserve();
11366
+ for (let c = 0; c < next; c++) {
11367
+ const g = c < f.numGlyphs ? c : codes.get(c)?.g ?? 0;
11368
+ m[2 * c] = g >> 8;
11369
+ m[2 * c + 1] = g & 255;
11370
+ }
11371
+ await doc.writeStream(r, "<< >>", m);
11372
+ c2g = ` /CIDToGIDMap ${r} 0 R`;
11373
+ }
11374
+ await doc.write(cid, `<< /Type /Font /Subtype /${cff ? "CIDFontType0" : "CIDFontType2"} /BaseFont ${base3} /CIDSystemInfo << /Registry ${ascii("Adobe")} /Ordering ${ascii("Identity")} /Supplement 0 >> /FontDescriptor ${desc} 0 R /W [${Wa}]${cff ? "" : c2g} >>`);
11375
+ await doc.writeStream(cmap, "<< >>", latin1(toUnicode(codes)));
11166
11376
  await doc.write(ref, `<< /Type /Font /Subtype /Type0 /BaseFont ${base3} /Encoding /Identity-H /DescendantFonts [${cid} 0 R] /ToUnicode ${cmap} 0 R >>`);
11167
11377
  }
11168
11378
  };
@@ -11193,8 +11403,11 @@ function subsetOtf(bytes, n, used, seac) {
11193
11403
  out.set("CFF ", cff);
11194
11404
  return buildSfnt(out, [79, 84, 84, 79]);
11195
11405
  }
11196
- function toUnicode(glyphs2) {
11197
- const entries = [...glyphs2].filter(([, t]) => t).sort((a, b) => a[0] - b[0]);
11406
+ function toUnicode(codes) {
11407
+ const entries = [...codes].map(([c, x2]) => (
11408
+ /** @type {[number, string]} */
11409
+ [c, x2.t]
11410
+ )).sort((a, b) => a[0] - b[0]);
11198
11411
  let body = "";
11199
11412
  for (let i2 = 0; i2 < entries.length; i2 += 100) {
11200
11413
  const chunk = entries.slice(i2, i2 + 100);
@@ -11218,6 +11431,16 @@ end
11218
11431
  end
11219
11432
  `;
11220
11433
  }
11434
+ function variation(t) {
11435
+ if (!t || t.length < 16) return "";
11436
+ const dv = new DataView(t.buffer, t.byteOffset, t.byteLength), off = dv.getUint16(4), n = dv.getUint16(8), size = dv.getUint16(10);
11437
+ const out = [];
11438
+ for (let i2 = 0; i2 < Math.min(n, 16) && size >= 20 && off + i2 * size + 20 <= t.length; i2++) {
11439
+ const p = off + i2 * size;
11440
+ out.push(`${String.fromCharCode(...t.subarray(p, p + 4)).replace(/[^\x20-\x7e]/g, "?")} ${Math.round(dv.getInt32(p + 8) / 655.36) / 100}`);
11441
+ }
11442
+ return out.join(", ") || "no axes read";
11443
+ }
11221
11444
  function tag2(bytes) {
11222
11445
  let h = 2166136261;
11223
11446
  for (let i2 = 0; i2 < bytes.length; i2++) h = Math.imul(h ^ bytes[i2], 16777619);
@@ -11230,7 +11453,7 @@ function tag2(bytes) {
11230
11453
  }
11231
11454
  var OTF_KEEP;
11232
11455
  var init_embed = __esm({
11233
- "src/fonts/embed.js"() {
11456
+ "packages/pdf/src/fonts/embed.js"() {
11234
11457
  init_brand();
11235
11458
  init_truetype();
11236
11459
  init_subset();
@@ -11242,7 +11465,7 @@ var init_embed = __esm({
11242
11465
  }
11243
11466
  });
11244
11467
 
11245
- // src/nav/outline.js
11468
+ // packages/pdf/src/nav/outline.js
11246
11469
  function colorOf(c) {
11247
11470
  if (c == null) return "";
11248
11471
  const d = device(c);
@@ -11323,7 +11546,7 @@ function createOutline(doc) {
11323
11546
  }
11324
11547
  var MAX_ENTRIES, MAX_LEVEL, MAX_TITLE;
11325
11548
  var init_outline = __esm({
11326
- "src/nav/outline.js"() {
11549
+ "packages/pdf/src/nav/outline.js"() {
11327
11550
  init_serialize();
11328
11551
  init_color();
11329
11552
  init_dest();
@@ -11333,7 +11556,7 @@ var init_outline = __esm({
11333
11556
  }
11334
11557
  });
11335
11558
 
11336
- // src/nav/labels.js
11559
+ // packages/pdf/src/nav/labels.js
11337
11560
  function createPageLabels(doc) {
11338
11561
  let ranges = null;
11339
11562
  doc.onFinish(async () => {
@@ -11364,7 +11587,7 @@ function createPageLabels(doc) {
11364
11587
  }
11365
11588
  var STYLES, MAX_RANGES, MAX_PREFIX;
11366
11589
  var init_labels = __esm({
11367
- "src/nav/labels.js"() {
11590
+ "packages/pdf/src/nav/labels.js"() {
11368
11591
  init_serialize();
11369
11592
  init_trees();
11370
11593
  STYLES = ["D", "r", "R", "a", "A"];
@@ -11373,7 +11596,7 @@ var init_labels = __esm({
11373
11596
  }
11374
11597
  });
11375
11598
 
11376
- // src/nav/viewer.js
11599
+ // packages/pdf/src/nav/viewer.js
11377
11600
  function createViewer(doc) {
11378
11601
  const set2 = /* @__PURE__ */ new Map();
11379
11602
  let registered = false;
@@ -11426,7 +11649,7 @@ function createViewer(doc) {
11426
11649
  }
11427
11650
  var BOOLS, NAMES, PREF;
11428
11651
  var init_viewer = __esm({
11429
- "src/nav/viewer.js"() {
11652
+ "packages/pdf/src/nav/viewer.js"() {
11430
11653
  init_dest();
11431
11654
  BOOLS = { hideToolbar: "HideToolbar", hideMenubar: "HideMenubar", hideWindowUI: "HideWindowUI", fitWindow: "FitWindow", centerWindow: "CenterWindow", displayDocTitle: "DisplayDocTitle", pickTrayByPDFSize: "PickTrayByPDFSize" };
11432
11655
  NAMES = {
@@ -11440,7 +11663,7 @@ var init_viewer = __esm({
11440
11663
  }
11441
11664
  });
11442
11665
 
11443
- // src/standards/pdfa.js
11666
+ // packages/pdf/src/standards/pdfa.js
11444
11667
  function addOutputIntent(doc, opt) {
11445
11668
  const custom = opt && typeof opt === "object" && opt.outputIntent != null ? parseIcc(opt.outputIntent, "pdfa.outputIntent") : null;
11446
11669
  if (custom && custom.n === 1) throw new TypeError("pdfa.outputIntent: an RGB or CMYK profile (not gray)");
@@ -11456,7 +11679,7 @@ function addOutputIntent(doc, opt) {
11456
11679
  }
11457
11680
  var SRGB, unbase64;
11458
11681
  var init_pdfa = __esm({
11459
- "src/standards/pdfa.js"() {
11682
+ "packages/pdf/src/standards/pdfa.js"() {
11460
11683
  init_icc();
11461
11684
  init_serialize();
11462
11685
  SRGB = "AAAC4GxjbXMCEAAAbW50clJHQiBYWVogB+IAAwAUAAkADgAdYWNzcE1TRlQAAAAAc2F3c2N0cmwAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1oYW5kk7I0qQ6wIoqY/Zqvo2eJmwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJZGVzYwAAAPAAAABfY3BydAAAAQwAAAAMd3RwdAAAARgAAAAUclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUclRSQwAAAWgAAAF4Z1RSQwAAAWgAAAF4YlRSQwAAAWgAAAF4ZGVzYwAAAAAAAAAFc1JHQgAAAAAAAAAAAAAAAHRleHQAAAAAQ0MwAFhZWiAAAAAAAADzVAABAAAAARbJWFlaIAAAAAAAAG+gAAA48gAAA49YWVogAAAAAAAAYpYAALeJAAAY2lhZWiAAAAAAAAAkoAAAD4UAALbEY3VydgAAAAAAAAC2AAAAHAA4AFQAcACMAKgAxADhAQABIgFGAW0BlQHBAfACIAJVAosCxAMBAz8DggPGBA4EWQSnBPkFTAWkBf4GXAa+ByEHigf0CGMI1QlJCcMKPwq/C0ILyQxUDOENdA4JDqIPQA/gEIURLRHaEooTPhP2FLIVcRY2Fv0XyhiZGW4aRhsiHAMc5x3QHr0friCkIZ4inCOfJKUlsSbAJ9Uo7SoKKyssUS18Lqov3jEWMlIzlDTZNiQ3czjGOiA7fDzfPkU/sEEhQpZEEEWPRxJIm0ooS7tNUU7uUI9SNVPgVZBXRVkAWr5chF5MYBth72PHZaZniWlxa19tUW9KcUZzSnVRd155cXuIfaZ/yIHwhB6GUIiJisWNCY9RkZ+T85ZLmKubDp14n+eiW6TWp1ap26xnrvexj7Qqtsy5dLwhvtXBjcRMxxDJ2syrz3/SXNU92CTbEt4E4P7j/OcB6gztHPA081D2c/mb/Mr//w==";
@@ -11468,7 +11691,7 @@ var init_pdfa = __esm({
11468
11691
  }
11469
11692
  });
11470
11693
 
11471
- // src/standards/files.js
11694
+ // packages/pdf/src/standards/files.js
11472
11695
  function createFiles(doc, when) {
11473
11696
  const tree = /* @__PURE__ */ new Map();
11474
11697
  const af = [];
@@ -11514,7 +11737,7 @@ function createFiles(doc, when) {
11514
11737
  }
11515
11738
  var RELATIONSHIPS, MAX_FILE2, MAX_FILES, MIME;
11516
11739
  var init_files = __esm({
11517
- "src/standards/files.js"() {
11740
+ "packages/pdf/src/standards/files.js"() {
11518
11741
  init_serialize();
11519
11742
  init_filename();
11520
11743
  init_md5();
@@ -11527,7 +11750,7 @@ var init_files = __esm({
11527
11750
  }
11528
11751
  });
11529
11752
 
11530
- // src/standards/facturx.js
11753
+ // packages/pdf/src/standards/facturx.js
11531
11754
  function readInvoice(b) {
11532
11755
  if (b.length > MAX_XML) throw new RangeError(`pdf.facturX: the XML is ${b.length} bytes, over ${MAX_XML >> 20} MB`);
11533
11756
  let s;
@@ -11608,7 +11831,7 @@ function createFacturX(doc, attach) {
11608
11831
  }
11609
11832
  var MAX_XML, PROFILES, FX_NS;
11610
11833
  var init_facturx = __esm({
11611
- "src/standards/facturx.js"() {
11834
+ "packages/pdf/src/standards/facturx.js"() {
11612
11835
  MAX_XML = 10 << 20;
11613
11836
  PROFILES = /** @type {Record<string, [string, 'Data' | 'Alternative']>} */
11614
11837
  {
@@ -11623,7 +11846,7 @@ var init_facturx = __esm({
11623
11846
  }
11624
11847
  });
11625
11848
 
11626
- // src/standards/boxes.js
11849
+ // packages/pdf/src/standards/boxes.js
11627
11850
  function pageBoxes(page, o) {
11628
11851
  const W = page.width, H = page.height, who = "addPage";
11629
11852
  const got = {};
@@ -11661,7 +11884,7 @@ function pageBoxes(page, o) {
11661
11884
  }
11662
11885
  var BOXES, EPS;
11663
11886
  var init_boxes = __esm({
11664
- "src/standards/boxes.js"() {
11887
+ "packages/pdf/src/standards/boxes.js"() {
11665
11888
  init_serialize();
11666
11889
  init_level();
11667
11890
  BOXES = /** @type {const} */
@@ -11670,7 +11893,7 @@ var init_boxes = __esm({
11670
11893
  }
11671
11894
  });
11672
11895
 
11673
- // src/forms/draw.js
11896
+ // packages/pdf/src/forms/draw.js
11674
11897
  function frame(ap, w, h, f, bg = f.bg) {
11675
11898
  if (bg != null) ap.fill(ap.path().rect(0, 0, w, h), { fill: bg });
11676
11899
  if (f.bw > 0) ap.stroke(ap.path().rect(f.bw / 2, f.bw / 2, w - f.bw, h - f.bw), { stroke: f.bc, width: f.bw });
@@ -11796,7 +12019,7 @@ function buttonFace(ap, w, h, f, bg, t, label, icon) {
11796
12019
  }
11797
12020
  var MARKS, PLAIN2, AUTO_MAX, AUTO_MIN, widthOf2;
11798
12021
  var init_draw2 = __esm({
11799
- "src/forms/draw.js"() {
12022
+ "packages/pdf/src/forms/draw.js"() {
11800
12023
  init_content();
11801
12024
  init_text();
11802
12025
  init_runs();
@@ -11812,7 +12035,7 @@ var init_draw2 = __esm({
11812
12035
  }
11813
12036
  });
11814
12037
 
11815
- // src/forms/form.js
12038
+ // packages/pdf/src/forms/form.js
11816
12039
  function keys(o, allowed, who) {
11817
12040
  if (o == null || typeof o !== "object") throw new TypeError(`${who}: options are an object`);
11818
12041
  for (const k of Object.keys(o)) {
@@ -12196,7 +12419,7 @@ function createForm(doc, opt = {}) {
12196
12419
  }
12197
12420
  var MAX_FIELDS, MAX_BUTTONS, MAX_OPTIONS, MAX_OPTION_CHARS, MAX_WIDGETS, MAX_VALUE, MAX_NAME, MAX_DEPTH3, MAX_TOOLTIP, MAX_COMB, NAMED2, ACTIVE2, FF, BOX, LOOK, TEXT, BAD_CHAR, hexAscii;
12198
12421
  var init_form = __esm({
12199
- "src/forms/form.js"() {
12422
+ "packages/pdf/src/forms/form.js"() {
12200
12423
  init_serialize();
12201
12424
  init_brand();
12202
12425
  init_annot();
@@ -12244,7 +12467,7 @@ var init_form = __esm({
12244
12467
  }
12245
12468
  });
12246
12469
 
12247
- // src/security/crypto.js
12470
+ // packages/pdf/src/security/crypto.js
12248
12471
  function concat(parts) {
12249
12472
  let n = 0;
12250
12473
  for (const p of parts) n += p.length;
@@ -12305,7 +12528,7 @@ function aesCbcDecryptSync(key, iv, data, strip = true) {
12305
12528
  }
12306
12529
  var NODE, WEB, random, HASHES, nodeName, hex, unhex;
12307
12530
  var init_crypto = __esm({
12308
- "src/security/crypto.js"() {
12531
+ "packages/pdf/src/security/crypto.js"() {
12309
12532
  init_md5();
12310
12533
  NODE = /** @type {any} */
12311
12534
  globalThis.process?.getBuiltinModule?.("node:crypto");
@@ -12327,7 +12550,7 @@ var init_crypto = __esm({
12327
12550
  }
12328
12551
  });
12329
12552
 
12330
- // src/security/encrypt.js
12553
+ // packages/pdf/src/security/encrypt.js
12331
12554
  function permBits(p) {
12332
12555
  let P = 4294963392;
12333
12556
  for (const [k, bit] of Object.entries(PERMS)) if (p[k]) P |= 1 << bit - 1;
@@ -12520,7 +12743,7 @@ function encryptor(opt, doc) {
12520
12743
  }
12521
12744
  var MAX_PASSWORD, PERMS, PAD, UTF84;
12522
12745
  var init_encrypt = __esm({
12523
- "src/security/encrypt.js"() {
12746
+ "packages/pdf/src/security/encrypt.js"() {
12524
12747
  init_crypto();
12525
12748
  MAX_PASSWORD = 1024;
12526
12749
  PERMS = { print: 3, modify: 4, copy: 5, annotate: 6, fillForms: 9, accessibility: 10, assemble: 11, printHighQuality: 12 };
@@ -12529,7 +12752,7 @@ var init_encrypt = __esm({
12529
12752
  }
12530
12753
  });
12531
12754
 
12532
- // src/security/der.js
12755
+ // packages/pdf/src/security/der.js
12533
12756
  function oid(s) {
12534
12757
  const a = s.split(".").map(Number), out = [40 * a[0] + a[1]];
12535
12758
  for (const v of a.slice(2)) {
@@ -12575,7 +12798,7 @@ function kids(b, v) {
12575
12798
  }
12576
12799
  var lenBytes, tlv, seq, set, ctx, octets, NULL, int;
12577
12800
  var init_der = __esm({
12578
- "src/security/der.js"() {
12801
+ "packages/pdf/src/security/der.js"() {
12579
12802
  init_crypto();
12580
12803
  lenBytes = (n) => n < 128 ? [n] : n < 256 ? [129, n] : n < 65536 ? [130, n >> 8, n & 255] : n < 16777216 ? [131, n >> 16, n >> 8 & 255, n & 255] : [132, n >>> 24, n >> 16 & 255, n >> 8 & 255, n & 255];
12581
12804
  tlv = (tag3, ...parts) => {
@@ -12599,7 +12822,7 @@ var init_der = __esm({
12599
12822
  }
12600
12823
  });
12601
12824
 
12602
- // src/security/cms.js
12825
+ // packages/pdf/src/security/cms.js
12603
12826
  function readCerts(certs, who) {
12604
12827
  const list = Array.isArray(certs) ? certs : [certs];
12605
12828
  const out = [];
@@ -12702,7 +12925,7 @@ function nodeSigner(o) {
12702
12925
  }
12703
12926
  var NODE2, MAX_CERTS, MAX_CERT, MAX_SIGNATURE, MAX_TOKEN, DIGEST, RSA, ECDSA, SIGNED_DATA, DATA, attr, algId, eq;
12704
12927
  var init_cms = __esm({
12705
- "src/security/cms.js"() {
12928
+ "packages/pdf/src/security/cms.js"() {
12706
12929
  init_der();
12707
12930
  init_crypto();
12708
12931
  NODE2 = /** @type {any} */
@@ -12725,7 +12948,7 @@ var init_cms = __esm({
12725
12948
  }
12726
12949
  });
12727
12950
 
12728
- // src/security/sign.js
12951
+ // packages/pdf/src/security/sign.js
12729
12952
  function createSigning(doc, form, o) {
12730
12953
  let used = false;
12731
12954
  return function sign(field, opt) {
@@ -12777,8 +13000,8 @@ function createSigning(doc, form, o) {
12777
13000
  head: `<< /Type /Sig /Filter /Adobe.PPKLite /SubFilter /${sf} ${BYTERANGE} /Contents `,
12778
13001
  after: ` /M ${pdfDate(date)}${s}${ref} >>`,
12779
13002
  /** @param {Uint8Array} digest */
12780
- async sign(digest) {
12781
- const cms = await raced(Promise.resolve().then(() => signer({ digest, hash: o.hash, subFilter: sf, date, timestamp: timestamp ?? void 0, signal: doc.signal })), doc.signal);
13003
+ async sign(digest2) {
13004
+ const cms = await raced(Promise.resolve().then(() => signer({ digest: digest2, hash: o.hash, subFilter: sf, date, timestamp: timestamp ?? void 0, signal: doc.signal })), doc.signal);
12782
13005
  if (cms instanceof Uint8Array && cms.length > size) throw new RangeError(`${who}: the signer's CMS is ${cms.length} bytes, more than the ${size} reserved: pass a larger reserve (at most ${MAX_RESERVE})`);
12783
13006
  checkContentInfo(cms, size, `${who}: the signer's CMS`);
12784
13007
  if (timestamp && !has(cms, TST_OID)) throw new Error(`${who}: a timestamp was asked for but the signer's CMS has no id-aa-timeStampToken (nodeSigner and cmsSigner add it; a custom signer must call r.timestamp)`);
@@ -12790,7 +13013,7 @@ function createSigning(doc, form, o) {
12790
13013
  }
12791
13014
  var DEFAULT_RESERVE, MAX_RESERVE, TST_OID, has, KEYS;
12792
13015
  var init_sign = __esm({
12793
- "src/security/sign.js"() {
13016
+ "packages/pdf/src/security/sign.js"() {
12794
13017
  init_brand();
12795
13018
  init_serialize();
12796
13019
  init_sink();
@@ -12810,7 +13033,7 @@ var init_sign = __esm({
12810
13033
  }
12811
13034
  });
12812
13035
 
12813
- // src/reader/budget.js
13036
+ // packages/pdf/src/reader/budget.js
12814
13037
  function createBudget(o = {}) {
12815
13038
  const pos = (v, d, k) => {
12816
13039
  if (v == null) return d;
@@ -12871,7 +13094,7 @@ function createBudget(o = {}) {
12871
13094
  }
12872
13095
  var PdfReadError, fail, DEFAULTS;
12873
13096
  var init_budget = __esm({
12874
- "src/reader/budget.js"() {
13097
+ "packages/pdf/src/reader/budget.js"() {
12875
13098
  PdfReadError = class extends Error {
12876
13099
  /** @param {Code} code @param {string} message */
12877
13100
  constructor(code, message) {
@@ -12883,11 +13106,11 @@ var init_budget = __esm({
12883
13106
  fail = (code, msg) => {
12884
13107
  throw new PdfReadError(code, msg);
12885
13108
  };
12886
- DEFAULTS = { maxDecoded: 512 << 20, maxStream: 128 << 20, maxSteps: 2e8, maxObjects: 5e6, maxTextItems: 2e6 };
13109
+ DEFAULTS = { maxDecoded: 512 << 20, maxStream: 128 << 20, maxSteps: 2e8, maxObjects: 5e6, maxTextItems: 1e6 };
12887
13110
  }
12888
13111
  });
12889
13112
 
12890
- // src/reader/lexer.js
13113
+ // packages/pdf/src/reader/lexer.js
12891
13114
  function latin12(b) {
12892
13115
  if (b.length < 64) {
12893
13116
  let s2 = "";
@@ -13015,7 +13238,7 @@ function lastIndexOf(buf, needle, to, span = to) {
13015
13238
  }
13016
13239
  var MAX_DEPTH4, MAX_ITEMS, Ref, PdfString, PdfStream, Op, CLASS, T, HEX, Lexer, parseValueEnd;
13017
13240
  var init_lexer = __esm({
13018
- "src/reader/lexer.js"() {
13241
+ "packages/pdf/src/reader/lexer.js"() {
13019
13242
  init_budget();
13020
13243
  MAX_DEPTH4 = 256;
13021
13244
  MAX_ITEMS = 4e6;
@@ -13226,7 +13449,7 @@ var init_lexer = __esm({
13226
13449
  }
13227
13450
  });
13228
13451
 
13229
- // src/reader/filters.js
13452
+ // packages/pdf/src/reader/filters.js
13230
13453
  function sinkOf(budget) {
13231
13454
  const parts = [];
13232
13455
  let n = 0;
@@ -13482,7 +13705,7 @@ function decode(data, filters, parms, budget, resolve2) {
13482
13705
  }
13483
13706
  var PASS, CHUNK2, MAX_FILTERS, num2, clamp;
13484
13707
  var init_filters = __esm({
13485
- "src/reader/filters.js"() {
13708
+ "packages/pdf/src/reader/filters.js"() {
13486
13709
  init_browser();
13487
13710
  init_budget();
13488
13711
  PASS = /* @__PURE__ */ new Set(["DCTDecode", "DCT", "JPXDecode", "JBIG2Decode", "CCITTFaxDecode", "CCF"]);
@@ -13493,7 +13716,7 @@ var init_filters = __esm({
13493
13716
  }
13494
13717
  });
13495
13718
 
13496
- // src/reader/crypt.js
13719
+ // packages/pdf/src/reader/crypt.js
13497
13720
  function pad322(pw) {
13498
13721
  const b = [...pw].every((c) => (
13499
13722
  /** @type {number} */
@@ -13628,7 +13851,7 @@ async function openSecurity(E, id0, password, resolve2) {
13628
13851
  }
13629
13852
  var PERMS2, bytesOf, le32, eq2;
13630
13853
  var init_crypt = __esm({
13631
- "src/reader/crypt.js"() {
13854
+ "packages/pdf/src/reader/crypt.js"() {
13632
13855
  init_encrypt();
13633
13856
  init_crypto();
13634
13857
  init_lexer();
@@ -13644,13 +13867,49 @@ var init_crypt = __esm({
13644
13867
  }
13645
13868
  });
13646
13869
 
13647
- // src/reader/source.js
13870
+ // packages/pdf/src/reader/source.js
13648
13871
  async function openSource(bytes, budget, o = {}) {
13649
13872
  const size = bytes.length;
13650
13873
  let xref = /* @__PURE__ */ new Map();
13651
- const cache = /* @__PURE__ */ new Map();
13874
+ let young = /* @__PURE__ */ new Map(), old = /* @__PURE__ */ new Map();
13875
+ const weak = /* @__PURE__ */ new Map();
13876
+ const cache = {
13877
+ /** @param {number} n @returns {any} undefined: not cached */
13878
+ get(n) {
13879
+ let v = young.get(n);
13880
+ if (v !== void 0) return v;
13881
+ v = old.get(n);
13882
+ if (v === void 0) {
13883
+ v = weak.get(n)?.deref();
13884
+ if (v === void 0) {
13885
+ weak.delete(n);
13886
+ return void 0;
13887
+ }
13888
+ weak.delete(n);
13889
+ }
13890
+ cache.set(n, v);
13891
+ return v;
13892
+ },
13893
+ /**
13894
+ * Held strongly for two turns of CACHE_N (a cheap LRU: no reordering per hit), then weakly
13895
+ * @param {number} n @param {any} v
13896
+ */
13897
+ set(n, v) {
13898
+ young.set(n, v);
13899
+ if (young.size < CACHE_N) return;
13900
+ for (const [k, o2] of old) if (o2 !== null && typeof o2 === "object" && !young.has(k)) weak.set(k, new WeakRef(o2));
13901
+ old = young;
13902
+ young = /* @__PURE__ */ new Map();
13903
+ },
13904
+ clear() {
13905
+ young.clear();
13906
+ old.clear();
13907
+ weak.clear();
13908
+ }
13909
+ };
13652
13910
  const loading = /* @__PURE__ */ new Set();
13653
13911
  const objstms = /* @__PURE__ */ new Map();
13912
+ let objstmBytes = 0;
13654
13913
  let endstreams = null;
13655
13914
  let recovered = false;
13656
13915
  let security = null, encryptRef = -1;
@@ -13768,12 +14027,17 @@ async function openSource(bytes, budget, o = {}) {
13768
14027
  if (lx2.next() !== T.NUM) break;
13769
14028
  offs[k] = lx2.val;
13770
14029
  }
13771
- os = { data, nums: nums.subarray(0, k), offs: offs.subarray(0, k), first };
13772
- if (objstms.size >= OBJSTM_CACHE) objstms.delete(
13773
- /** @type {number} */
13774
- objstms.keys().next().value
13775
- );
14030
+ os = { data, nums: nums.slice(0, k), offs: offs.slice(0, k), first };
14031
+ while (objstms.size && (objstms.size >= OBJSTM_CACHE || objstmBytes + data.length > OBJSTM_BYTES)) {
14032
+ const [k0, o0] = (
14033
+ /** @type {[number, any]} */
14034
+ objstms.entries().next().value
14035
+ );
14036
+ objstms.delete(k0);
14037
+ objstmBytes -= o0.data.length;
14038
+ }
13776
14039
  objstms.set(s, os);
14040
+ objstmBytes += data.length;
13777
14041
  }
13778
14042
  let j = os.nums[i2] === n ? i2 : -1;
13779
14043
  if (j < 0) {
@@ -13792,7 +14056,8 @@ async function openSource(bytes, budget, o = {}) {
13792
14056
  return v === void 0 || v instanceof Op ? null : v;
13793
14057
  }
13794
14058
  function get(n) {
13795
- if (cache.has(n)) return cache.get(n);
14059
+ const c = cache.get(n);
14060
+ if (c !== void 0) return c;
13796
14061
  if (loading.has(n)) return null;
13797
14062
  loading.add(n);
13798
14063
  try {
@@ -14046,6 +14311,7 @@ async function openSource(bytes, budget, o = {}) {
14046
14311
  }
14047
14312
  cache.clear();
14048
14313
  objstms.clear();
14314
+ objstmBytes = 0;
14049
14315
  }
14050
14316
  function recoverDeep() {
14051
14317
  const found = xref, tr = trailer;
@@ -14116,6 +14382,7 @@ async function openSource(bytes, budget, o = {}) {
14116
14382
  const keep = encryptRef >= 0 ? cache.get(encryptRef) : void 0;
14117
14383
  cache.clear();
14118
14384
  objstms.clear();
14385
+ objstmBytes = 0;
14119
14386
  if (keep !== void 0) cache.set(encryptRef, keep);
14120
14387
  }
14121
14388
  }
@@ -14124,7 +14391,13 @@ async function openSource(bytes, budget, o = {}) {
14124
14391
  recover();
14125
14392
  recoverDeep();
14126
14393
  }
14127
- const root = resolveSafe(trailer.get("Root"));
14394
+ let root = null;
14395
+ try {
14396
+ root = resolve2(trailer.get("Root"));
14397
+ } catch (e) {
14398
+ if (!(e instanceof PdfReadError) || e.code === "E_TIMEOUT" || e.code === "E_ABORTED" || e.code === "E_BUDGET") throw e;
14399
+ if (e.code === "E_DEPTH") fail("E_DEPTH", `The document catalog cannot be read: ${e.message}`);
14400
+ }
14128
14401
  if (!(root instanceof Map)) fail("E_MALFORMED", "The PDF has no document catalog (/Root)");
14129
14402
  return {
14130
14403
  bytes,
@@ -14305,9 +14578,9 @@ function inRegion(regions, budget) {
14305
14578
  return reach > off;
14306
14579
  };
14307
14580
  }
14308
- var MAX_SECTIONS, MAX_RESOLVE, MAX_OBJSTM_N, OBJSTM_CACHE, P48, P16, pack, unpack;
14581
+ var MAX_SECTIONS, MAX_RESOLVE, MAX_OBJSTM_N, OBJSTM_CACHE, OBJSTM_BYTES, CACHE_N, P48, P16, pack, unpack;
14309
14582
  var init_source = __esm({
14310
- "src/reader/source.js"() {
14583
+ "packages/pdf/src/reader/source.js"() {
14311
14584
  init_lexer();
14312
14585
  init_filters();
14313
14586
  init_budget();
@@ -14316,6 +14589,8 @@ var init_source = __esm({
14316
14589
  MAX_RESOLVE = 32;
14317
14590
  MAX_OBJSTM_N = 1e6;
14318
14591
  OBJSTM_CACHE = 32;
14592
+ OBJSTM_BYTES = 8 << 20;
14593
+ CACHE_N = 1024;
14319
14594
  P48 = 2 ** 48;
14320
14595
  P16 = 2 ** 16;
14321
14596
  pack = (t, a, b) => t * P48 + a * P16 + b;
@@ -14323,7 +14598,7 @@ var init_source = __esm({
14323
14598
  }
14324
14599
  });
14325
14600
 
14326
- // src/reader/text.js
14601
+ // packages/pdf/src/reader/text.js
14327
14602
  function decodeText(v) {
14328
14603
  if (!(v instanceof PdfString)) return typeof v === "string" ? v : v == null ? "" : String(v);
14329
14604
  const b = v.bytes;
@@ -14432,7 +14707,10 @@ function parseCMap(data, budget, held = { n: 0 }) {
14432
14707
  }
14433
14708
  return { map, spaces };
14434
14709
  }
14435
- function fontOf(src, font, held = { n: 0 }) {
14710
+ function fontOf(src, font, held = (
14711
+ /** @type {Held} */
14712
+ { n: 0, cmaps: /* @__PURE__ */ new Map() }
14713
+ )) {
14436
14714
  const R = src.resolve;
14437
14715
  const sub = R(font.get("Subtype"));
14438
14716
  let toU = null, spaces = (
@@ -14489,6 +14767,26 @@ function fontOf(src, font, held = { n: 0 }) {
14489
14767
  }
14490
14768
  }
14491
14769
  const lens = spaces.length ? [...new Set(spaces.map((s) => s[0]))].sort() : [2];
14770
+ let back;
14771
+ const fromFont = (c) => {
14772
+ if (back === void 0) back = fontCmap(src, cid, held);
14773
+ if (!back) return void 0;
14774
+ const m = cid instanceof Map ? R(cid.get("CIDToGIDMap")) : null;
14775
+ let g = c;
14776
+ if (m instanceof PdfStream) {
14777
+ if (!gidMap) {
14778
+ try {
14779
+ gidMap = src.decodeStream(m).data.slice(0, 131072);
14780
+ } catch (e) {
14781
+ if (stops(e)) throw e;
14782
+ gidMap = new Uint8Array(0);
14783
+ }
14784
+ }
14785
+ g = 2 * c + 1 < gidMap.length ? gidMap[2 * c] << 8 | gidMap[2 * c + 1] : 0;
14786
+ }
14787
+ return back.get(g);
14788
+ };
14789
+ let gidMap;
14492
14790
  return {
14493
14791
  /** each glyph to emit, none held (a 16 MB string is not 16 M objects) @param {Uint8Array} b @param {Emit} emit */
14494
14792
  decode(b, emit) {
@@ -14504,7 +14802,7 @@ function fontOf(src, font, held = { n: 0 }) {
14504
14802
  }
14505
14803
  for (let k = 0; k < L && i2 + k < b.length; k++) c = c * 256 + b[i2 + k];
14506
14804
  i2 += L;
14507
- emit(toU?.get(c) ?? "", W.get(c) ?? dw, false);
14805
+ emit(toU?.get(c) ?? fromFont(c) ?? (toU ? "" : NONE), W.get(c) ?? dw, false);
14508
14806
  }
14509
14807
  }
14510
14808
  };
@@ -14527,7 +14825,7 @@ function fontOf(src, font, held = { n: 0 }) {
14527
14825
  for (const x0 of d.slice(0, 4096)) {
14528
14826
  const x2 = R(x0);
14529
14827
  if (typeof x2 === "number") c = x2;
14530
- else if (typeof x2 === "string") diff.set(c++ & 255, glyphText(x2));
14828
+ else if (typeof x2 === "string") diff.set(c++ & 255, x2 === ".notdef" ? "" : glyphText(x2) || (toU ? "" : NONE));
14531
14829
  }
14532
14830
  }
14533
14831
  const symbolic = base3 === "Symbol" || base3 === "ZapfDingbats";
@@ -14547,7 +14845,7 @@ function fontOf(src, font, held = { n: 0 }) {
14547
14845
  if (t === void 0) t = diff.get(c);
14548
14846
  if (t === void 0) {
14549
14847
  const u = symMap ? symMap.get(c) : baseFn(c);
14550
- t = u === void 0 ? "" : String.fromCodePoint(u);
14848
+ t = u === void 0 ? toU ? "" : NONE : String.fromCodePoint(u);
14551
14849
  }
14552
14850
  let w = Array.isArray(widths) && typeof fc === "number" && c >= fc && c - fc < widths.length ? R(widths[c - fc]) : std ? std.widths[c] : 500;
14553
14851
  if (typeof w !== "number" || !Number.isFinite(w)) w = 0;
@@ -14556,6 +14854,34 @@ function fontOf(src, font, held = { n: 0 }) {
14556
14854
  }
14557
14855
  };
14558
14856
  }
14857
+ function fontCmap(src, cid, held) {
14858
+ const R = src.resolve;
14859
+ if (!(cid instanceof Map) || R(cid.get("Subtype")) !== "CIDFontType2") return null;
14860
+ const fd2 = R(cid.get("FontDescriptor")), ff = fd2 instanceof Map ? R(fd2.get("FontFile2")) : null;
14861
+ if (!(ff instanceof PdfStream)) return null;
14862
+ const was = held.cmaps.get(ff);
14863
+ if (was !== void 0) return was;
14864
+ if (held.cmaps.size >= MAX_CMAP_FONTS) fail("E_BUDGET", `A page's text reads the character maps of more than ${MAX_CMAP_FONTS} embedded fonts (fonts with no ToUnicode)`);
14865
+ held.cmaps.set(ff, null);
14866
+ let f;
14867
+ try {
14868
+ f = parseFont(src.decodeStream(ff).data);
14869
+ } catch (e) {
14870
+ if (stops(e)) throw e;
14871
+ return null;
14872
+ }
14873
+ src.budget.tick(65536);
14874
+ const back = /* @__PURE__ */ new Map();
14875
+ for (let cp = 32; cp <= 65535; cp++) {
14876
+ if (cp === 55296) cp = 63744;
14877
+ const g = f.glyphFor(cp);
14878
+ if (g && !back.has(g)) back.set(g, String.fromCharCode(cp));
14879
+ }
14880
+ held.n += 9 * back.size;
14881
+ if (held.n > MAX_HELD) fail("E_BUDGET", `A page's fonts hold more than ${MAX_HELD.toLocaleString("en")} units of code mappings (an entry 8, a character 1)`);
14882
+ held.cmaps.set(ff, back);
14883
+ return back;
14884
+ }
14559
14885
  function contentBytes(src, contents) {
14560
14886
  const c = src.resolve(contents);
14561
14887
  const list = Array.isArray(c) ? c.slice(0, 1e4).map(src.resolve) : [c];
@@ -14582,6 +14908,36 @@ function contentBytes(src, contents) {
14582
14908
  }
14583
14909
  return out;
14584
14910
  }
14911
+ function logical(parts) {
14912
+ if (!parts.some((t) => RTL2.test(t))) return parts;
14913
+ const kind = (t) => RTL2.test(t) ? "R" : NUM.test(t) ? "N" : STRONG_L.test(t) ? "L" : "N";
14914
+ const k = parts.map(kind), res = parts.slice();
14915
+ for (let i2 = 0; i2 < parts.length; ) {
14916
+ if (k[i2] !== "R") {
14917
+ i2++;
14918
+ continue;
14919
+ }
14920
+ let j = i2, e = i2;
14921
+ while (j < parts.length && k[j] !== "L") {
14922
+ if (k[j] === "R") e = j;
14923
+ j++;
14924
+ }
14925
+ const run2 = parts.slice(i2, e + 1).reverse().map(rev2);
14926
+ for (let a = 0; a < run2.length; ) {
14927
+ if (!NUM.test(run2[a])) {
14928
+ a++;
14929
+ continue;
14930
+ }
14931
+ let b = a;
14932
+ while (b < run2.length && NUM.test(run2[b])) b++;
14933
+ run2.splice(a, b - a, ...run2.slice(a, b).reverse().map(rev2));
14934
+ a = b;
14935
+ }
14936
+ res.splice(i2, run2.length, ...run2);
14937
+ i2 = e + 1;
14938
+ }
14939
+ return res;
14940
+ }
14585
14941
  function skipInline(lx) {
14586
14942
  const b = lx.buf;
14587
14943
  let i2 = lx.pos + 1;
@@ -14611,9 +14967,31 @@ function textPieces(src, pageDict, resources, o = {}) {
14611
14967
  }
14612
14968
  function pageText(src, pageDict, resources, raw = false) {
14613
14969
  const R = src.resolve, budget = src.budget;
14614
- const pieces = [];
14970
+ const PX = [], PY = [], PE = [], PS = [], PG = [];
14971
+ const PA = [], PAE = [], PC = [], PD = [];
14972
+ const PT = [];
14973
+ let chars2 = 0;
14974
+ let moved = true;
14615
14975
  const fonts = /* @__PURE__ */ new Map();
14616
- const held = { n: 0 };
14976
+ const add2 = (x2, y, end, size, text3, dir) => {
14977
+ if (PT.length >= budget.maxTextItems) throw new PdfReadError("E_BUDGET", `A page has more than ${budget.maxTextItems.toLocaleString("en")} pieces of text (budget.maxTextItems)`);
14978
+ if ((chars2 += text3.length) > MAX_TEXT_CHARS) throw new PdfReadError("E_BUDGET", `A page makes more than ${MAX_TEXT_CHARS.toLocaleString("en")} characters of text`);
14979
+ PX.push(x2);
14980
+ PY.push(y);
14981
+ PE.push(end);
14982
+ PS.push(size);
14983
+ PT.push(text3);
14984
+ PG.push(moved ? 2 : 0);
14985
+ moved = false;
14986
+ PA.push(dir[0]);
14987
+ PAE.push(dir[1]);
14988
+ PC.push(dir[2]);
14989
+ PD.push(dir[3]);
14990
+ };
14991
+ const held = (
14992
+ /** @type {Held} */
14993
+ { n: 0, cmaps: /* @__PURE__ */ new Map() }
14994
+ );
14617
14995
  const fontFor = (res, name) => {
14618
14996
  const fd2 = R(res instanceof Map ? R(res.get("Font")) instanceof Map ? R(res.get("Font")).get(name) : null : null);
14619
14997
  const key = fd2 instanceof Map ? fd2 : null;
@@ -14632,6 +15010,11 @@ function pageText(src, pageDict, resources, raw = false) {
14632
15010
  ), size: 0, Tc: 0, Tw: 0, Th: 1, TL: 0, Ts: 0 };
14633
15011
  const tsStack = [];
14634
15012
  let Tm = ID, Tlm = ID, dos = 0;
15013
+ const marks = [];
15014
+ let deep = 0, actual = (
15015
+ /** @type {any} */
15016
+ null
15017
+ );
14635
15018
  let args = [];
14636
15019
  const show = (b, ctm) => {
14637
15020
  if (!ts.font) return;
@@ -14642,10 +15025,21 @@ function pageText(src, pageDict, resources, raw = false) {
14642
15025
  const x2 = M0[4], y = M0[5], size = Math.hypot(M0[2], M0[3]) || ts.size;
14643
15026
  const tx = (w / 1e3 * ts.size + ts.Tc + (space ? ts.Tw : 0)) * ts.Th;
14644
15027
  Tm = mul2([1, 0, 0, 1, tx, 0], Tm);
14645
- const end = mul2([ts.size * ts.Th, 0, 0, ts.size, 0, ts.Ts], mul2(Tm, ctm))[4];
14646
- if (text3) {
14647
- if (pieces.length >= budget.maxTextItems) throw new PdfReadError("E_BUDGET", `A page has more than ${budget.maxTextItems.toLocaleString("en")} pieces of text (budget.maxTextItems)`);
14648
- pieces.push({ x: x2, y, end, size, text: text3, gap: false });
15028
+ const M1 = mul2([ts.size * ts.Th, 0, 0, ts.size, 0, ts.Ts], mul2(Tm, ctm)), end = M1[4];
15029
+ const L = Math.hypot(M0[0], M0[1]), ux = L ? M0[0] / L : 1, uy = L ? M0[1] / L : 0;
15030
+ const dir = [x2 * ux + y * uy, M1[4] * ux + M1[5] * uy, y * ux - x2 * uy, Math.round(Math.atan2(uy, ux) * 180 / Math.PI)];
15031
+ if (actual) {
15032
+ if (!actual.seen) Object.assign(actual, { x: x2, y, size, dir, seen: true });
15033
+ actual.end = end;
15034
+ actual.dir[1] = dir[1];
15035
+ return;
15036
+ }
15037
+ const n = PT.length - 1;
15038
+ if (text3.includes("⁠")) text3 = text3.replaceAll("⁠", "");
15039
+ if (text3) add2(x2, y, end, size, text3, dir);
15040
+ else if (n >= 0 && PAE[n] < dir[1] && PD[n] === dir[3] && Math.abs(PC[n] - dir[2]) < 0.01) {
15041
+ PE[n] = end;
15042
+ PAE[n] = dir[1];
14649
15043
  }
14650
15044
  });
14651
15045
  budget.tick(1 + (k & 1023));
@@ -14686,6 +15080,7 @@ function pageText(src, pageDict, resources, raw = false) {
14686
15080
  }
14687
15081
  case "BT":
14688
15082
  Tm = Tlm = ID;
15083
+ moved = true;
14689
15084
  break;
14690
15085
  case "Tf":
14691
15086
  ts = { ...ts, font: typeof a[0] === "string" ? fontFor(f.res, a[0]) : null, size: typeof a[1] === "number" ? a[1] : 0 };
@@ -14710,19 +15105,23 @@ function pageText(src, pageDict, resources, raw = false) {
14710
15105
  // falls through
14711
15106
  case "Td":
14712
15107
  if (typeof a[0] === "number" && typeof a[1] === "number") Tm = Tlm = mul2([1, 0, 0, 1, a[0], a[1]], Tlm);
15108
+ moved = true;
14713
15109
  break;
14714
15110
  case "Tm": {
14715
15111
  const m = matrixOf(a);
14716
15112
  if (m) Tm = Tlm = m;
15113
+ moved = true;
14717
15114
  break;
14718
15115
  }
14719
15116
  case "T*":
14720
15117
  Tm = Tlm = mul2([1, 0, 0, 1, 0, -ts.TL], Tlm);
15118
+ moved = true;
14721
15119
  break;
14722
15120
  case "Tj":
14723
15121
  if (a[0] instanceof PdfString) show(a[0].bytes, f.ctm);
14724
15122
  break;
14725
15123
  case "'":
15124
+ moved = true;
14726
15125
  Tm = Tlm = mul2([1, 0, 0, 1, 0, -ts.TL], Tlm);
14727
15126
  if (a[0] instanceof PdfString) show(a[0].bytes, f.ctm);
14728
15127
  break;
@@ -14730,6 +15129,7 @@ function pageText(src, pageDict, resources, raw = false) {
14730
15129
  if (typeof a[0] === "number") ts = { ...ts, Tw: a[0] };
14731
15130
  if (typeof a[1] === "number") ts = { ...ts, Tc: a[1] };
14732
15131
  Tm = Tlm = mul2([1, 0, 0, 1, 0, -ts.TL], Tlm);
15132
+ moved = true;
14733
15133
  if (a[2] instanceof PdfString) show(a[2].bytes, f.ctm);
14734
15134
  break;
14735
15135
  case "TJ":
@@ -14737,10 +15137,38 @@ function pageText(src, pageDict, resources, raw = false) {
14737
15137
  if (x2 instanceof PdfString) show(x2.bytes, f.ctm);
14738
15138
  else if (typeof x2 === "number") {
14739
15139
  Tm = mul2([1, 0, 0, 1, -x2 / 1e3 * ts.size * ts.Th, 0], Tm);
14740
- if (x2 < -180 && pieces.length) pieces[pieces.length - 1].gap = true;
15140
+ if (x2 < -180 && PT.length) PG[PT.length - 1] |= 1;
14741
15141
  }
14742
15142
  }
14743
15143
  break;
15144
+ case "BMC":
15145
+ case "BDC": {
15146
+ if (marks.length >= MAX_MARKS) {
15147
+ deep++;
15148
+ break;
15149
+ }
15150
+ let at = null;
15151
+ if (op === "BDC" && !actual) {
15152
+ const pr = a[1] instanceof Map ? a[1] : typeof a[1] === "string" && f.res instanceof Map ? R(R(f.res.get("Properties")) instanceof Map ? R(f.res.get("Properties")).get(a[1]) : null) : null;
15153
+ const t = pr instanceof Map ? R(pr.get("ActualText")) : null;
15154
+ if (t instanceof PdfString && t.bytes.length > 2 * MAX_ACTUAL + 2) src.warn(`an /ActualText longer than ${MAX_ACTUAL} characters was ignored`);
15155
+ else if (t instanceof PdfString) at = actual = { at: decodeText(t), x: 0, y: 0, end: 0, size: 0, dir: [0, 0, 0, 0], seen: false };
15156
+ }
15157
+ marks.push(at);
15158
+ break;
15159
+ }
15160
+ case "EMC": {
15161
+ if (deep) {
15162
+ deep--;
15163
+ break;
15164
+ }
15165
+ const m = marks.pop();
15166
+ if (m && m === actual) {
15167
+ actual = null;
15168
+ if (m.seen && m.at) add2(m.x, m.y, m.end, m.size, m.at, m.dir);
15169
+ }
15170
+ break;
15171
+ }
14744
15172
  case "BI": {
14745
15173
  for (let k = 0; k < 4096; k++) {
14746
15174
  const t = parseValue(f.lx);
@@ -14774,30 +15202,44 @@ function pageText(src, pageDict, resources, raw = false) {
14774
15202
  default:
14775
15203
  }
14776
15204
  }
14777
- if (raw) return pieces;
15205
+ if (raw) return PT.map((text3, i2) => ({ x: PX[i2], y: PY[i2], end: PE[i2], size: PS[i2], text: text3, gap: !!(PG[i2] & 1) }));
14778
15206
  const out = [];
14779
- let ly = NaN, lend = 0, lsize = 0, lgap = false, last = "";
14780
- for (const p of pieces) {
14781
- const tol = Math.max(p.size, lsize, 1) * 0.5;
14782
- if (out.length && Math.abs(p.y - ly) > tol) out.push("\n");
14783
- else if (out.length && last !== " " && !p.text.startsWith(" ") && (lgap || p.x - lend > Math.max(p.size, 1) * 0.25 || p.x < lend - Math.max(p.size, 1) * 2)) out.push(" ");
14784
- out.push(p.text);
14785
- last = p.text[p.text.length - 1];
14786
- ly = p.y;
14787
- lend = p.end;
14788
- lsize = p.size;
14789
- lgap = p.gap;
15207
+ for (let i2 = 0; i2 < PT.length; ) {
15208
+ let j = i2 + 1;
15209
+ while (j < PT.length && PD[j] === PD[j - 1] && Math.abs(PC[j] - PC[j - 1]) <= Math.max(PS[j], PS[j - 1], 1) * 0.5) j++;
15210
+ const ix = [];
15211
+ for (let k = i2; k < j; k++) ix.push(k);
15212
+ let sorted = true;
15213
+ for (let k = i2 + 1; k < j && sorted; k++) if (PA[k] < PA[k - 1] - 0.01) sorted = false;
15214
+ if (!sorted) ix.sort((a, b) => PA[a] - PA[b]);
15215
+ const line3 = [];
15216
+ let lend = 0, lgap = false, last = "";
15217
+ for (const k of ix) {
15218
+ const text3 = PT[k], size = Math.max(PS[k], 1);
15219
+ if (line3.length && last !== " " && !text3.startsWith(" ") && (lgap || PA[k] - lend > size * (PG[k] & 2 ? 0.07 : 0.25))) line3.push(" ");
15220
+ line3.push(text3);
15221
+ last = text3[text3.length - 1];
15222
+ lend = Math.max(PAE[k], line3.length > 1 ? lend : -Infinity);
15223
+ lgap = !!(PG[k] & 1);
15224
+ }
15225
+ if (out.length) out.push("\n");
15226
+ out.push(logical(line3).join(""));
15227
+ i2 = j;
14790
15228
  }
14791
15229
  return out.join("");
14792
15230
  }
14793
- var MAX_FORMS, MAX_CMAP, MAX_DST, MAX_CMAP_CHARS, MAX_HELD, MAX_W, MAX_DO, TEXT_TIMEOUT_MS, DOC, WIN, MAC_HIGH, BASE, STD_HIGH, NAMES2, ACCENT, own, STD_ALIAS, stops, mul2, ID, matrixOf;
15231
+ var MAX_FORMS, MAX_CMAP, MAX_MARKS, MAX_ACTUAL, MAX_TEXT_CHARS, MAX_DST, MAX_CMAP_CHARS, MAX_HELD, MAX_W, MAX_DO, TEXT_TIMEOUT_MS, DOC, WIN, MAC_HIGH, BASE, STD_HIGH, NAMES2, ACCENT, own, STD_ALIAS, NONE, stops, MAX_CMAP_FONTS, mul2, ID, matrixOf, RTL2, STRONG_L, NUM, rev2;
14794
15232
  var init_text2 = __esm({
14795
- "src/reader/text.js"() {
15233
+ "packages/pdf/src/reader/text.js"() {
14796
15234
  init_lexer();
14797
15235
  init_standard_metrics();
14798
15236
  init_budget();
15237
+ init_truetype();
14799
15238
  MAX_FORMS = 16;
14800
15239
  MAX_CMAP = 1e6;
15240
+ MAX_MARKS = 1e3;
15241
+ MAX_ACTUAL = 4096;
15242
+ MAX_TEXT_CHARS = 16e6;
14801
15243
  MAX_DST = 128;
14802
15244
  MAX_CMAP_CHARS = 4e6;
14803
15245
  MAX_HELD = 16e6;
@@ -15002,7 +15444,9 @@ var init_text2 = __esm({
15002
15444
  t[k]
15003
15445
  ) : void 0;
15004
15446
  STD_ALIAS = { Arial: "Helvetica", "Arial-BoldMT": "Helvetica-Bold", ArialMT: "Helvetica", TimesNewRoman: "Times-Roman", TimesNewRomanPSMT: "Times-Roman", CourierNew: "Courier" };
15447
+ NONE = "�";
15005
15448
  stops = (e) => e?.code === "E_TIMEOUT" || e?.code === "E_ABORTED" || e?.code === "E_BUDGET";
15449
+ MAX_CMAP_FONTS = 100;
15006
15450
  mul2 = (A, B) => (
15007
15451
  /** @type {M} */
15008
15452
  [A[0] * B[0] + A[1] * B[2], A[0] * B[1] + A[1] * B[3], A[2] * B[0] + A[3] * B[2], A[2] * B[1] + A[3] * B[3], A[4] * B[0] + A[5] * B[2] + B[4], A[4] * B[1] + A[5] * B[3] + B[5]]
@@ -15013,10 +15457,14 @@ var init_text2 = __esm({
15013
15457
  /** @type {M} */
15014
15458
  a.slice(0, 6)
15015
15459
  ) : null;
15460
+ RTL2 = /[\u0590-\u05ff\u0600-\u065f\u066a-\u06ef\u06fa-\u08ff\ufb1d-\ufdff\ufe70-\ufeff]/;
15461
+ STRONG_L = /[\p{L}]/u;
15462
+ NUM = /^[\p{Nd}.,٫٬]+$/u;
15463
+ rev2 = (t) => [...t].reverse().join("");
15016
15464
  }
15017
15465
  });
15018
15466
 
15019
- // src/reader/policy.js
15467
+ // packages/pdf/src/reader/policy.js
15020
15468
  function attributesOnly(a, R) {
15021
15469
  const one = (x2) => {
15022
15470
  const d = R(x2);
@@ -15128,7 +15576,7 @@ function utf16be(s) {
15128
15576
  }
15129
15577
  var KEEP_ACTIONS, NAMED_ACTIONS, ACTION_TYPES, KEEP_ANNOTS, ACTION_KEYS, DANGEROUS_KEYS, NAME_KEYS, isAction, isAnnot, STRUCT_TYPES, isFilespec, REWRITTEN_NAME, sameObject, refuseFile;
15130
15578
  var init_policy = __esm({
15131
- "src/reader/policy.js"() {
15579
+ "packages/pdf/src/reader/policy.js"() {
15132
15580
  init_lexer();
15133
15581
  init_links();
15134
15582
  init_filename();
@@ -15212,7 +15660,7 @@ var init_policy = __esm({
15212
15660
  }
15213
15661
  });
15214
15662
 
15215
- // src/reader/copy.js
15663
+ // packages/pdf/src/reader/copy.js
15216
15664
  function nameText(s) {
15217
15665
  let o = "/";
15218
15666
  for (let i2 = 0; i2 < s.length; i2++) {
@@ -15254,7 +15702,7 @@ function createCopier(t) {
15254
15702
  let t0 = trees.get(owner);
15255
15703
  if (t0) return t0;
15256
15704
  const src = owner.r.src, R = src.resolve;
15257
- t0 = { objs: /* @__PURE__ */ new WeakSet(), nums: /* @__PURE__ */ new Set(), types: new Set(STRUCT_TYPES) };
15705
+ t0 = { objs: /* @__PURE__ */ new Set(), nums: /* @__PURE__ */ new Set(), types: new Set(STRUCT_TYPES) };
15258
15706
  trees.set(owner, t0);
15259
15707
  const root = R(owner.r.root.get("StructTreeRoot"));
15260
15708
  if (!(root instanceof Map)) return t0;
@@ -15476,6 +15924,7 @@ function createCopier(t) {
15476
15924
  continue;
15477
15925
  }
15478
15926
  const rep = t.replace?.(owner, f.n);
15927
+ f.rep = rep;
15479
15928
  f.v = rep !== void 0 ? rep : owner.r.src.get(f.n);
15480
15929
  if (!t.keepActive && f.v instanceof Map) {
15481
15930
  const r = judge(f.v, owner.r.src.resolve);
@@ -15500,7 +15949,7 @@ function createCopier(t) {
15500
15949
  continue;
15501
15950
  }
15502
15951
  stack.pop();
15503
- const v = f.v;
15952
+ const v = f.v, rep0 = f.rep;
15504
15953
  let open = false;
15505
15954
  const refText = (o, r) => {
15506
15955
  if (mapOf(o).get(r.n) === GRAY) open = true;
@@ -15515,9 +15964,9 @@ function createCopier(t) {
15515
15964
  let key = "";
15516
15965
  const raw = v instanceof PdfStream ? owner.r.src.rawStream(v) : null;
15517
15966
  if (t.dedupe && early === void 0 && !open && shareable(v)) {
15518
- key = hex(await (t.hash ?? sha256)(raw ? concat2(dict, raw) : new TextEncoder().encode(dict)));
15967
+ key = `${dict.length} ${fnv(dict)} ${raw ? `${raw.length} ${fnv(raw)}` : ""}`;
15519
15968
  const hit = seen.get(key);
15520
- if (hit && hit.dict === dict && same(hit.raw(), raw)) {
15969
+ if (hit && hit.dict === dict && same2(hit.raw(), raw)) {
15521
15970
  m.set(f.n, hit.n);
15522
15971
  continue;
15523
15972
  }
@@ -15526,13 +15975,16 @@ function createCopier(t) {
15526
15975
  const n = early ?? t.reserve();
15527
15976
  await t.write(n, dict, data, v instanceof PdfStream ? v.dict : v instanceof Map ? v : null);
15528
15977
  if (key) {
15529
- const o2 = owner, v2 = v;
15530
- seen.set(key, { n, dict, raw: () => v2 instanceof PdfStream ? o2.r.src.rawStream(v2) : null });
15978
+ const o2 = owner, n2 = f.n, mine = rep0 === void 0 ? null : v;
15979
+ seen.set(key, { n, dict, raw: () => {
15980
+ const v2 = mine ?? o2.r.src.get(n2);
15981
+ return v2 instanceof PdfStream ? o2.r.src.rawStream(v2) : null;
15982
+ } });
15531
15983
  }
15532
15984
  m.set(f.n, n);
15533
15985
  }
15534
15986
  }
15535
- const same = (a, b) => {
15987
+ const same2 = (a, b) => {
15536
15988
  if (a === b) return true;
15537
15989
  if (!a || !b || a.length !== b.length) return false;
15538
15990
  for (let i2 = 0; i2 < a.length; i2++) if (a[i2] !== b[i2]) return false;
@@ -15547,13 +15999,11 @@ function createCopier(t) {
15547
15999
  }
15548
16000
  return typeof v !== "object" || v === null || v instanceof PdfString;
15549
16001
  };
15550
- const concat2 = (s, b) => {
15551
- const a = new TextEncoder().encode(s);
15552
- const o = new Uint8Array(a.length + b.length + 1);
15553
- o.set(a);
15554
- o[a.length] = 0;
15555
- o.set(b, a.length + 1);
15556
- return o;
16002
+ const fnv = (x2) => {
16003
+ let h = 2166136261;
16004
+ if (typeof x2 === "string") for (let i2 = 0; i2 < x2.length; i2++) h = Math.imul(h ^ x2.charCodeAt(i2), 16777619);
16005
+ else for (let i2 = 0; i2 < x2.length; i2++) h = Math.imul(h ^ x2[i2], 16777619);
16006
+ return (h >>> 0).toString(36);
15557
16007
  };
15558
16008
  function streamDict(owner, s) {
15559
16009
  const R = owner.r.src.resolve;
@@ -15622,16 +16072,14 @@ function createCopier(t) {
15622
16072
  }
15623
16073
  };
15624
16074
  }
15625
- var sha256, SHARE, GRAY, HEXD, Raw, Foreign, OPEN_A, CLOSE_A, OPEN_D, CLOSE_D;
16075
+ var SHARE, GRAY, HEXD, Raw, Foreign, OPEN_A, CLOSE_A, OPEN_D, CLOSE_D;
15626
16076
  var init_copy = __esm({
15627
- "src/reader/copy.js"() {
16077
+ "packages/pdf/src/reader/copy.js"() {
15628
16078
  init_lexer();
15629
16079
  init_pdf();
15630
- init_crypto();
15631
16080
  init_policy();
15632
16081
  init_deflate();
15633
16082
  init_policy();
15634
- sha256 = (b) => sha("SHA-256", b);
15635
16083
  SHARE = /* @__PURE__ */ new Set(["Font", "FontDescriptor", "ExtGState", "Encoding", "Pattern", "Shading", "Halftone", "Function", "XObject", "Mask", "CMap", "OutputIntent", "Filespec", "EmbeddedFile"]);
15636
16084
  GRAY = -2;
15637
16085
  HEXD = "0123456789abcdef";
@@ -15655,7 +16103,7 @@ var init_copy = __esm({
15655
16103
  }
15656
16104
  });
15657
16105
 
15658
- // src/reader/fill.js
16106
+ // packages/pdf/src/reader/fill.js
15659
16107
  function utf162(s) {
15660
16108
  const b = new Uint8Array(2 + s.length * 2);
15661
16109
  b[0] = 254;
@@ -15823,7 +16271,7 @@ async function fillReplacements(self, o) {
15823
16271
  }
15824
16272
  var ALIAS;
15825
16273
  var init_fill = __esm({
15826
- "src/reader/fill.js"() {
16274
+ "packages/pdf/src/reader/fill.js"() {
15827
16275
  init_index();
15828
16276
  init_standard();
15829
16277
  init_lexer();
@@ -15835,7 +16283,7 @@ var init_fill = __esm({
15835
16283
  }
15836
16284
  });
15837
16285
 
15838
- // src/reader/save.js
16286
+ // packages/pdf/src/reader/save.js
15839
16287
  var save_exports = {};
15840
16288
  __export(save_exports, {
15841
16289
  MAX_OPEN: () => MAX_OPEN,
@@ -15926,7 +16374,8 @@ async function run(self, sink, o) {
15926
16374
  const keepStruct = single && o.keepStructure !== false && !self.edits.flatten;
15927
16375
  const info = self.info();
15928
16376
  const edited = !!self.edits.info || level?.conformance !== self.pdfa()?.conformance;
15929
- const srcXmp = self.edits.xmp ?? (edited || !level && self.pdfa() ? null : self.xmp());
16377
+ const uaLost = !keepStruct && /pdfuaid:part/.test(self.xmp() ?? "");
16378
+ const srcXmp = self.edits.xmp ?? (edited || uaLost || !level && self.pdfa() ? null : self.xmp());
15930
16379
  const created = o.creationDate ?? (info.creationDate instanceof Date ? info.creationDate : /* @__PURE__ */ new Date());
15931
16380
  let intentOpt = null;
15932
16381
  if (level && profile) {
@@ -16006,7 +16455,8 @@ async function run(self, sink, o) {
16006
16455
  }
16007
16456
  }
16008
16457
  for (let k = 0; k < plan.length; k++) {
16009
- const p = plan[k], owner = p.owner, src = owner.r.src, OR = src.resolve, pg = owner.r.pages[p.index], d = pg.dict;
16458
+ const p = plan[k], owner = p.owner, src = owner.r.src, OR = src.resolve, pg = pageAt(owner.r, p.index), d = pg.dict;
16459
+ if (pg.emptied) warn(pg.emptied);
16010
16460
  const b = owner.boxes(p.index);
16011
16461
  const W = b.mediaBox[2] - b.mediaBox[0], H = b.mediaBox[3] - b.mediaBox[1];
16012
16462
  const page = (
@@ -16130,7 +16580,7 @@ async function run(self, sink, o) {
16130
16580
  };
16131
16581
  for (const k of ["ViewerPreferences", "PageMode", "PageLayout", "OCProperties", "Collection", "URI"]) await cat(k);
16132
16582
  if (keepStruct) for (const k of ["StructTreeRoot", "MarkInfo", "Lang"]) await cat(k);
16133
- else if (root.has("StructTreeRoot")) warn("the structure tree (tags) was dropped: the pages come from several documents, or the form was flattened");
16583
+ else if (root.has("StructTreeRoot")) warn("the structure tree (tags) was dropped: the pages come from several documents, the form was flattened, or keepStructure is false; the result is not tagged (no longer PDF/UA; PDF/A-a is claimed as PDF/A-b)");
16134
16584
  if (level && level.part === 3) await cat("AF");
16135
16585
  if (single && plan.length === self.r.pages.length && plan.every((p, i2) => p.index === i2)) await cat("PageLabels");
16136
16586
  const oa = R(root.get("OpenAction"));
@@ -16260,7 +16710,7 @@ function sameBytes(a, b) {
16260
16710
  }
16261
16711
  var MAX_OPEN, KEYS2, OWN;
16262
16712
  var init_save = __esm({
16263
- "src/reader/save.js"() {
16713
+ "packages/pdf/src/reader/save.js"() {
16264
16714
  init_index();
16265
16715
  init_page();
16266
16716
  init_annot();
@@ -16278,7 +16728,7 @@ var init_save = __esm({
16278
16728
  }
16279
16729
  });
16280
16730
 
16281
- // src/reader/active.js
16731
+ // packages/pdf/src/reader/active.js
16282
16732
  function findActive(self, each) {
16283
16733
  const found = /* @__PURE__ */ new Map();
16284
16734
  const audit = createCopier({
@@ -16304,12 +16754,12 @@ function findActive(self, each) {
16304
16754
  return [...found].map(([what, count]) => ({ what, count }));
16305
16755
  }
16306
16756
  var init_active = __esm({
16307
- "src/reader/active.js"() {
16757
+ "packages/pdf/src/reader/active.js"() {
16308
16758
  init_copy();
16309
16759
  }
16310
16760
  });
16311
16761
 
16312
- // src/reader/incremental.js
16762
+ // packages/pdf/src/reader/incremental.js
16313
16763
  var incremental_exports = {};
16314
16764
  __export(incremental_exports, {
16315
16765
  MAX_WIDGET_SHARE: () => MAX_WIDGET_SHARE,
@@ -16578,8 +17028,8 @@ ${xrefAt}
16578
17028
  const H = hasher(sig.hash);
16579
17029
  H.update(bytes.subarray(0, a));
16580
17030
  H.update(bytes.subarray(b));
16581
- const digest = await H.digest();
16582
- const cms = await Promise.resolve().then(() => sig.signer({ digest, hash: sig.hash, subFilter: sig.subFilter, date: sig.date, timestamp: sig.timestamp ?? void 0 }));
17031
+ const digest2 = await H.digest();
17032
+ const cms = await Promise.resolve().then(() => sig.signer({ digest: digest2, hash: sig.hash, subFilter: sig.subFilter, date: sig.date, timestamp: sig.timestamp ?? void 0 }));
16583
17033
  checkContentInfo(cms, size, `${who}: the signer's CMS`);
16584
17034
  if (sig.timestamp && !has(cms, TST_OID)) throw new Error(`${who}: a timestamp was asked for but the signer's CMS has no id-aa-timeStampToken`);
16585
17035
  bytes.set(latin1(hex(cms).padEnd(2 * size, "0")), a + 1);
@@ -16813,7 +17263,7 @@ function checkSigned(self, sig, o, objects, who) {
16813
17263
  }
16814
17264
  var SIGN_KEYS, MAX_WIDGET_SHARE, TRANSFORMS, isSigDict;
16815
17265
  var init_incremental = __esm({
16816
- "src/reader/incremental.js"() {
17266
+ "packages/pdf/src/reader/incremental.js"() {
16817
17267
  init_lexer();
16818
17268
  init_copy();
16819
17269
  init_active();
@@ -16833,7 +17283,7 @@ var init_incremental = __esm({
16833
17283
  }
16834
17284
  });
16835
17285
 
16836
- // src/reader/pdf.js
17286
+ // packages/pdf/src/reader/pdf.js
16837
17287
  function internal(v, who) {
16838
17288
  const d = v !== null && typeof v === "object" ? inside2.get(v) : void 0;
16839
17289
  if (!d) throw new TypeError(`${who}: not a document from loadPdf`);
@@ -16943,6 +17393,26 @@ function flatTree(rootNode, src, kind = "Names") {
16943
17393
  }
16944
17394
  return out;
16945
17395
  }
17396
+ function pageAt(r, i2) {
17397
+ const pg = r.pages[i2];
17398
+ if (pg.checked) return pg;
17399
+ pg.checked = true;
17400
+ const R = r.src.resolve;
17401
+ try {
17402
+ const c = R(pg.dict.get("Contents"));
17403
+ if (Array.isArray(c)) {
17404
+ r.src.budget.tick(Math.min(c.length, 1e4));
17405
+ for (const x2 of c.slice(0, 1e4)) R(x2);
17406
+ }
17407
+ } catch (e) {
17408
+ if (!(e instanceof PdfReadError) || e.code !== "E_CYCLE") throw e;
17409
+ pg.emptied = `page ${i2 + 1}'s /Contents has a reference loop; the page is read as empty`;
17410
+ r.src.warn(pg.emptied);
17411
+ pg.dict = new Map(pg.dict);
17412
+ pg.dict.delete("Contents");
17413
+ }
17414
+ return pg;
17415
+ }
16946
17416
  function makeDoc(r, plan, edits) {
16947
17417
  const { src, root, pages, pageIndex: pageIndex2 } = r;
16948
17418
  const R = src.resolve;
@@ -17029,7 +17499,7 @@ function makeDoc(r, plan, edits) {
17029
17499
  * document's timeoutMs when sooner) @param {{ timeoutMs?: number }} [o]
17030
17500
  */
17031
17501
  extractText: (o) => {
17032
- const pg = owner.r.pages[p.index];
17502
+ const pg = pageAt(owner.r, p.index);
17033
17503
  return extractText(owner.r.src, pg.dict, owner.r.src.resolve(pg.inh.Resources), o);
17034
17504
  },
17035
17505
  /** the annotations: subtype, rect, contents, uri, the page index a link goes to */
@@ -17215,7 +17685,7 @@ function makeDoc(r, plan, edits) {
17215
17685
  const contents = R(v.get("Contents"));
17216
17686
  const end = range ? range[2] + range[3] : 0;
17217
17687
  const ok = !!range && range[0] === 0 && range[1] <= range[2] && end <= src.size;
17218
- const rev2 = ok ? src.revisions.findIndex((e) => e >= end) : -1;
17688
+ const rev3 = ok ? src.revisions.findIndex((e) => e >= end) : -1;
17219
17689
  out.push({
17220
17690
  field: f.name,
17221
17691
  subFilter: typeof R(v.get("SubFilter")) === "string" ? R(v.get("SubFilter")) : null,
@@ -17229,7 +17699,7 @@ function makeDoc(r, plan, edits) {
17229
17699
  /** the signature covers every byte of the file but its /Contents (no change after it) */
17230
17700
  coversWholeFile: ok && end === src.size,
17231
17701
  /** the revision (0 first) whose end it covers, -1 when none */
17232
- revision: rev2,
17702
+ revision: rev3,
17233
17703
  /** the bytes after it: an incremental update was appended after signing */
17234
17704
  bytesAfter: ok ? src.size - end : null,
17235
17705
  cms: contents instanceof PdfString ? contents.bytes : null,
@@ -17520,7 +17990,7 @@ function checkValue(f, v) {
17520
17990
  }
17521
17991
  var MAX_PAGES, MAX_OUTLINE, MAX_FIELDS2, MAX_NAMES2, inside2, ACTIVE_FT;
17522
17992
  var init_pdf = __esm({
17523
- "src/reader/pdf.js"() {
17993
+ "packages/pdf/src/reader/pdf.js"() {
17524
17994
  init_budget();
17525
17995
  init_source();
17526
17996
  init_lexer();
@@ -17535,7 +18005,7 @@ var init_pdf = __esm({
17535
18005
  }
17536
18006
  });
17537
18007
 
17538
- // src/index.js
18008
+ // packages/pdf/src/index.js
17539
18009
  async function mergePdfs(docs, o) {
17540
18010
  if (!Array.isArray(docs) || !docs.length) throw new TypeError("mergePdfs: an array of documents from loadPdf");
17541
18011
  return docs[0].fork().merge(docs.slice(1)).save(o);
@@ -17551,6 +18021,8 @@ function createPdf(sink, options2 = {}) {
17551
18021
  /** @type {const} */
17552
18022
  ["title", "author", "subject", "keywords"]
17553
18023
  ) if (o[k] != null && (typeof o[k] !== "string" || o[k].length > 65536)) throw new TypeError(`createPdf: ${k} is a string of at most 65,536 characters`);
18024
+ if (o.metadata != null && typeof o.metadata !== "boolean") throw new TypeError("createPdf: metadata is true (the default: an XMP stream) or false (Info only)");
18025
+ if (o.metadata === false && (o.pdfa || o.tagged)) throw new TypeError("createPdf: metadata: false cannot be combined with pdfa or tagged: PDF/A and PDF/UA require the XMP metadata stream");
17554
18026
  const level = pdfaLevel(o.pdfa, o.tagged);
17555
18027
  o.signal?.throwIfAborted();
17556
18028
  const ctl = new AbortController();
@@ -17575,6 +18047,7 @@ function createPdf(sink, options2 = {}) {
17575
18047
  pdfa: !!o.pdfa,
17576
18048
  pdfaLevel: level,
17577
18049
  tagged: !!o.tagged,
18050
+ metadata: o.metadata !== false,
17578
18051
  signal: ctl.signal,
17579
18052
  encrypt: enc,
17580
18053
  hash: signHash ? hasher(
@@ -17722,7 +18195,7 @@ async function toBytes2(build, options2) {
17722
18195
  return all;
17723
18196
  }
17724
18197
  var init_index = __esm({
17725
- "src/index.js"() {
18198
+ "packages/pdf/src/index.js"() {
17726
18199
  init_sink();
17727
18200
  init_document();
17728
18201
  init_brand();