modern-pdf-lib 0.12.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-95iHPtFO.mjs";
2
- import { a as formatPdfDate, f as PdfNumber, g as PdfString, h as PdfStream, l as PdfDict, s as PdfArray, u as PdfName } from "./pdfCatalog-CTfeeqtF.mjs";
2
+ import { a as formatPdfDate, c as PdfBool, f as PdfNumber, g as PdfString, h as PdfStream, l as PdfDict, s as PdfArray, u as PdfName } from "./pdfCatalog-CTfeeqtF.mjs";
3
3
 
4
4
  //#region src/core/operators/text.ts
5
5
  /**
@@ -2705,6 +2705,162 @@ function drawSvgOnPage(page, svgString, options) {
2705
2705
  page.pushOperators(ops);
2706
2706
  }
2707
2707
 
2708
+ //#endregion
2709
+ //#region src/core/pdfPageSvg.ts
2710
+ /** Format a number for PDF output. */
2711
+ function fmtN(value) {
2712
+ if (Number.isInteger(value)) return value.toString();
2713
+ const s = value.toFixed(6).replace(/\.?0+$/, "");
2714
+ return s === "-0" ? "0" : s;
2715
+ }
2716
+ /** Magic constant for circular arc approximation: 4*(sqrt(2)-1)/3. */
2717
+ const KAPPA = .5522847498;
2718
+ /**
2719
+ * Approximate an SVG arc command as cubic Bezier curve(s) (PDF operators).
2720
+ *
2721
+ * SVG arcs use endpoint parameterization; PDF has no native arc command.
2722
+ */
2723
+ function svgArcToPdfOps(fromX, fromY, rx0, ry0, rotationDeg, largeArcFlag, sweepFlag, toX, toY) {
2724
+ let rx = Math.abs(rx0);
2725
+ let ry = Math.abs(ry0);
2726
+ if (rx === 0 || ry === 0) return `${fmtN(toX)} ${fmtN(toY)} l\n`;
2727
+ const phi = rotationDeg * Math.PI / 180;
2728
+ const cosPhi = Math.cos(phi);
2729
+ const sinPhi = Math.sin(phi);
2730
+ const dx2 = (fromX - toX) / 2;
2731
+ const dy2 = (fromY - toY) / 2;
2732
+ const x1p = cosPhi * dx2 + sinPhi * dy2;
2733
+ const y1p = -sinPhi * dx2 + cosPhi * dy2;
2734
+ let rxSq = rx * rx;
2735
+ let rySq = ry * ry;
2736
+ const x1pSq = x1p * x1p;
2737
+ const y1pSq = y1p * y1p;
2738
+ const lambda = x1pSq / rxSq + y1pSq / rySq;
2739
+ if (lambda > 1) {
2740
+ const s = Math.sqrt(lambda);
2741
+ rx *= s;
2742
+ ry *= s;
2743
+ rxSq = rx * rx;
2744
+ rySq = ry * ry;
2745
+ }
2746
+ let sq = (rxSq * rySq - rxSq * y1pSq - rySq * x1pSq) / (rxSq * y1pSq + rySq * x1pSq);
2747
+ if (sq < 0) sq = 0;
2748
+ sq = Math.sqrt(sq);
2749
+ if (largeArcFlag === sweepFlag) sq = -sq;
2750
+ const cxp = sq * rx * y1p / ry;
2751
+ const cyp = -sq * ry * x1p / rx;
2752
+ const cx = cosPhi * cxp - sinPhi * cyp + (fromX + toX) / 2;
2753
+ const cy = sinPhi * cxp + cosPhi * cyp + (fromY + toY) / 2;
2754
+ function vecAngle(ux, uy, vx, vy) {
2755
+ const sign = ux * vy - uy * vx < 0 ? -1 : 1;
2756
+ let r = (ux * vx + uy * vy) / (Math.sqrt(ux * ux + uy * uy) * Math.sqrt(vx * vx + vy * vy));
2757
+ if (r < -1) r = -1;
2758
+ if (r > 1) r = 1;
2759
+ return sign * Math.acos(r);
2760
+ }
2761
+ const theta1 = vecAngle(1, 0, (x1p - cxp) / rx, (y1p - cyp) / ry);
2762
+ let dTheta = vecAngle((x1p - cxp) / rx, (y1p - cyp) / ry, (-x1p - cxp) / rx, (-y1p - cyp) / ry);
2763
+ if (sweepFlag === 0 && dTheta > 0) dTheta -= 2 * Math.PI;
2764
+ if (sweepFlag === 1 && dTheta < 0) dTheta += 2 * Math.PI;
2765
+ const segs = Math.ceil(Math.abs(dTheta) / (Math.PI / 2));
2766
+ const segAngle = dTheta / segs;
2767
+ let ops = "";
2768
+ let angle = theta1;
2769
+ for (let i = 0; i < segs; i++) {
2770
+ const a1 = angle;
2771
+ const a2 = angle + segAngle;
2772
+ const alpha = 4 / 3 * Math.tan((a2 - a1) / 4);
2773
+ const cos1 = Math.cos(a1), sin1 = Math.sin(a1);
2774
+ const cos2 = Math.cos(a2), sin2 = Math.sin(a2);
2775
+ const ep1x = cosPhi * rx * cos1 - sinPhi * ry * sin1 + cx;
2776
+ const ep1y = sinPhi * rx * cos1 + cosPhi * ry * sin1 + cy;
2777
+ const cp1x = ep1x + alpha * (-cosPhi * rx * sin1 - sinPhi * ry * cos1);
2778
+ const cp1y = ep1y + alpha * (-sinPhi * rx * sin1 + cosPhi * ry * cos1);
2779
+ const ep2x = cosPhi * rx * cos2 - sinPhi * ry * sin2 + cx;
2780
+ const ep2y = sinPhi * rx * cos2 + cosPhi * ry * sin2 + cy;
2781
+ const cp2x = ep2x - alpha * (-cosPhi * rx * sin2 - sinPhi * ry * cos2);
2782
+ const cp2y = ep2y - alpha * (-sinPhi * rx * sin2 + cosPhi * ry * cos2);
2783
+ ops += `${fmtN(cp1x)} ${fmtN(cp1y)} ${fmtN(cp2x)} ${fmtN(cp2y)} ${fmtN(ep2x)} ${fmtN(ep2y)} c\n`;
2784
+ angle = a2;
2785
+ }
2786
+ return ops;
2787
+ }
2788
+ /**
2789
+ * Convert parsed SVG draw commands into PDF path construction operators.
2790
+ *
2791
+ * Does **not** emit painting operators (fill / stroke) -- the caller
2792
+ * is responsible for that.
2793
+ */
2794
+ function svgCommandsToPdfOps(commands) {
2795
+ let ops = "";
2796
+ let curX = 0;
2797
+ let curY = 0;
2798
+ for (const cmd of commands) switch (cmd.type) {
2799
+ case "moveTo":
2800
+ curX = cmd.params[0];
2801
+ curY = cmd.params[1];
2802
+ ops += `${fmtN(curX)} ${fmtN(curY)} m\n`;
2803
+ break;
2804
+ case "lineTo":
2805
+ curX = cmd.params[0];
2806
+ curY = cmd.params[1];
2807
+ ops += `${fmtN(curX)} ${fmtN(curY)} l\n`;
2808
+ break;
2809
+ case "curveTo":
2810
+ ops += `${fmtN(cmd.params[0])} ${fmtN(cmd.params[1])} ${fmtN(cmd.params[2])} ${fmtN(cmd.params[3])} ${fmtN(cmd.params[4])} ${fmtN(cmd.params[5])} c\n`;
2811
+ curX = cmd.params[4];
2812
+ curY = cmd.params[5];
2813
+ break;
2814
+ case "quadCurveTo": {
2815
+ const cpx = cmd.params[0];
2816
+ const cpy = cmd.params[1];
2817
+ const toX = cmd.params[2];
2818
+ const toY = cmd.params[3];
2819
+ const cp1x = curX + 2 / 3 * (cpx - curX);
2820
+ const cp1y = curY + 2 / 3 * (cpy - curY);
2821
+ const cp2x = toX + 2 / 3 * (cpx - toX);
2822
+ const cp2y = toY + 2 / 3 * (cpy - toY);
2823
+ ops += `${fmtN(cp1x)} ${fmtN(cp1y)} ${fmtN(cp2x)} ${fmtN(cp2y)} ${fmtN(toX)} ${fmtN(toY)} c\n`;
2824
+ curX = toX;
2825
+ curY = toY;
2826
+ break;
2827
+ }
2828
+ case "closePath":
2829
+ ops += "h\n";
2830
+ break;
2831
+ case "rect":
2832
+ ops += `${fmtN(cmd.params[0])} ${fmtN(cmd.params[1])} ${fmtN(cmd.params[2])} ${fmtN(cmd.params[3])} re\n`;
2833
+ break;
2834
+ case "circle": {
2835
+ const ccx = cmd.params[0], ccy = cmd.params[1], r = cmd.params[2];
2836
+ const ox = r * KAPPA, oy = r * KAPPA;
2837
+ ops += `${fmtN(ccx)} ${fmtN(ccy + r)} m\n`;
2838
+ ops += `${fmtN(ccx + ox)} ${fmtN(ccy + r)} ${fmtN(ccx + r)} ${fmtN(ccy + oy)} ${fmtN(ccx + r)} ${fmtN(ccy)} c\n`;
2839
+ ops += `${fmtN(ccx + r)} ${fmtN(ccy - oy)} ${fmtN(ccx + ox)} ${fmtN(ccy - r)} ${fmtN(ccx)} ${fmtN(ccy - r)} c\n`;
2840
+ ops += `${fmtN(ccx - ox)} ${fmtN(ccy - r)} ${fmtN(ccx - r)} ${fmtN(ccy - oy)} ${fmtN(ccx - r)} ${fmtN(ccy)} c\n`;
2841
+ ops += `${fmtN(ccx - r)} ${fmtN(ccy + oy)} ${fmtN(ccx - ox)} ${fmtN(ccy + r)} ${fmtN(ccx)} ${fmtN(ccy + r)} c\n`;
2842
+ break;
2843
+ }
2844
+ case "ellipse": {
2845
+ const ecx = cmd.params[0], ecy = cmd.params[1];
2846
+ const erx = cmd.params[2], ery = cmd.params[3];
2847
+ const eox = erx * KAPPA, eoy = ery * KAPPA;
2848
+ ops += `${fmtN(ecx)} ${fmtN(ecy + ery)} m\n`;
2849
+ ops += `${fmtN(ecx + eox)} ${fmtN(ecy + ery)} ${fmtN(ecx + erx)} ${fmtN(ecy + eoy)} ${fmtN(ecx + erx)} ${fmtN(ecy)} c\n`;
2850
+ ops += `${fmtN(ecx + erx)} ${fmtN(ecy - eoy)} ${fmtN(ecx + eox)} ${fmtN(ecy - ery)} ${fmtN(ecx)} ${fmtN(ecy - ery)} c\n`;
2851
+ ops += `${fmtN(ecx - eox)} ${fmtN(ecy - ery)} ${fmtN(ecx - erx)} ${fmtN(ecy - eoy)} ${fmtN(ecx - erx)} ${fmtN(ecy)} c\n`;
2852
+ ops += `${fmtN(ecx - erx)} ${fmtN(ecy + eoy)} ${fmtN(ecx - eox)} ${fmtN(ecy + ery)} ${fmtN(ecx)} ${fmtN(ecy + ery)} c\n`;
2853
+ break;
2854
+ }
2855
+ case "arc":
2856
+ ops += svgArcToPdfOps(curX, curY, cmd.params[0], cmd.params[1], cmd.params[2], cmd.params[3], cmd.params[4], cmd.params[5], cmd.params[6]);
2857
+ curX = cmd.params[5];
2858
+ curY = cmd.params[6];
2859
+ break;
2860
+ }
2861
+ return ops;
2862
+ }
2863
+
2708
2864
  //#endregion
2709
2865
  //#region src/layers/optionalContent.ts
2710
2866
  /**
@@ -3009,66 +3165,238 @@ function getRedactionMarks(page) {
3009
3165
  }
3010
3166
 
3011
3167
  //#endregion
3012
- //#region src/core/pdfPage.ts
3013
- var pdfPage_exports = /* @__PURE__ */ __exportAll({
3014
- PageSizes: () => PageSizes,
3015
- PdfPage: () => PdfPage,
3016
- wrapText: () => wrapText
3017
- });
3018
- /** Pre-defined page sizes as `[width, height]` tuples in PDF points. */
3019
- const PageSizes = {
3020
- "4A0": [4767.87, 6740.79],
3021
- "2A0": [3370.39, 4767.87],
3022
- A0: [2383.94, 3370.39],
3023
- A1: [1683.78, 2383.94],
3024
- A2: [1190.55, 1683.78],
3025
- A3: [841.89, 1190.55],
3026
- A4: [595.28, 841.89],
3027
- A5: [419.53, 595.28],
3028
- A6: [297.64, 419.53],
3029
- A7: [209.76, 297.64],
3030
- A8: [147.4, 209.76],
3031
- A9: [104.88, 147.4],
3032
- A10: [73.7, 104.88],
3033
- B0: [2834.65, 4008.19],
3034
- B1: [2004.09, 2834.65],
3035
- B2: [1417.32, 2004.09],
3036
- B3: [1000.63, 1417.32],
3037
- B4: [708.66, 1000.63],
3038
- B5: [498.9, 708.66],
3039
- B6: [354.33, 498.9],
3040
- B7: [249.45, 354.33],
3041
- B8: [175.75, 249.45],
3042
- B9: [124.72, 175.75],
3043
- B10: [87.87, 124.72],
3044
- Letter: [612, 792],
3045
- Legal: [612, 1008],
3046
- Tabloid: [792, 1224],
3047
- Ledger: [1224, 792],
3048
- Executive: [521.86, 756],
3049
- Folio: [612, 936],
3050
- C0: [2599.37, 3676.54],
3051
- C1: [1836.85, 2599.37],
3052
- C2: [1298.27, 1836.85],
3053
- C3: [918.43, 1298.27],
3054
- C4: [649.13, 918.43],
3055
- C5: [459.21, 649.13],
3056
- C6: [323.15, 459.21],
3057
- C7: [229.61, 323.15],
3058
- C8: [161.57, 229.61],
3059
- C9: [113.39, 161.57],
3060
- C10: [79.37, 113.39],
3061
- RA0: [2437.8, 3458.27],
3062
- RA1: [1729.13, 2437.8],
3063
- RA2: [1218.9, 1729.13],
3064
- RA3: [864.57, 1218.9],
3065
- RA4: [609.45, 864.57],
3066
- SRA0: [2551.18, 3628.35],
3067
- SRA1: [1814.17, 2551.18],
3068
- SRA2: [1275.59, 1814.17],
3069
- SRA3: [907.09, 1275.59],
3070
- SRA4: [637.8, 907.09]
3071
- };
3168
+ //#region src/core/patterns.ts
3169
+ /** Convert a Color to RGB components (0..1). CMYK/gray are converted. */
3170
+ function colorToRgb(c) {
3171
+ switch (c.type) {
3172
+ case "rgb": return {
3173
+ r: c.r,
3174
+ g: c.g,
3175
+ b: c.b
3176
+ };
3177
+ case "grayscale": return {
3178
+ r: c.gray,
3179
+ g: c.gray,
3180
+ b: c.gray
3181
+ };
3182
+ case "cmyk": return {
3183
+ r: (1 - c.c) * (1 - c.k),
3184
+ g: (1 - c.m) * (1 - c.k),
3185
+ b: (1 - c.y) * (1 - c.k)
3186
+ };
3187
+ }
3188
+ }
3189
+ /** Check if a stop is a ColorStop (has `offset` property). */
3190
+ function isColorStop(stop) {
3191
+ return "offset" in stop && "color" in stop;
3192
+ }
3193
+ /**
3194
+ * Normalise an array of stops into sorted, explicit-offset RGB stops.
3195
+ * Bare Color values get evenly-distributed offsets.
3196
+ */
3197
+ function normalizeStops(stops) {
3198
+ if (stops.length < 2) throw new Error("Gradient requires at least 2 colour stops");
3199
+ const result = [];
3200
+ for (let i = 0; i < stops.length; i++) {
3201
+ const stop = stops[i];
3202
+ let offset;
3203
+ let color;
3204
+ if (isColorStop(stop)) {
3205
+ offset = stop.offset;
3206
+ color = stop.color;
3207
+ } else {
3208
+ offset = i / (stops.length - 1);
3209
+ color = stop;
3210
+ }
3211
+ const { r, g, b } = colorToRgb(color);
3212
+ result.push({
3213
+ offset,
3214
+ r,
3215
+ g,
3216
+ b
3217
+ });
3218
+ }
3219
+ result.sort((a, b) => a.offset - b.offset);
3220
+ return result;
3221
+ }
3222
+ /**
3223
+ * Create a linear (axial) gradient descriptor.
3224
+ *
3225
+ * The gradient runs from `(x1, y1)` to `(x2, y2)` through the given
3226
+ * colour stops. By default the gradient extends beyond its endpoints.
3227
+ *
3228
+ * @param options Gradient parameters.
3229
+ * @returns A {@link GradientFill} descriptor.
3230
+ */
3231
+ function linearGradient(options) {
3232
+ const normalizedStops = normalizeStops(options.stops);
3233
+ return {
3234
+ kind: "gradient",
3235
+ shadingType: 2,
3236
+ coords: [
3237
+ options.x1,
3238
+ options.y1,
3239
+ options.x2,
3240
+ options.y2
3241
+ ],
3242
+ normalizedStops,
3243
+ extend: options.extend ?? true
3244
+ };
3245
+ }
3246
+ /**
3247
+ * Create a radial gradient descriptor.
3248
+ *
3249
+ * The gradient interpolates between two circles: the start circle at
3250
+ * `(x0, y0)` with radius `r0` and the end circle at `(x1, y1)` with
3251
+ * radius `r1`.
3252
+ *
3253
+ * @param options Gradient parameters.
3254
+ * @returns A {@link GradientFill} descriptor (with `shadingType: 3`).
3255
+ */
3256
+ function radialGradient(options) {
3257
+ const normalizedStops = normalizeStops(options.stops);
3258
+ return {
3259
+ kind: "gradient",
3260
+ shadingType: 3,
3261
+ coords: [
3262
+ options.x0,
3263
+ options.y0,
3264
+ options.r0,
3265
+ options.x1,
3266
+ options.y1,
3267
+ options.r1
3268
+ ],
3269
+ normalizedStops,
3270
+ extend: options.extend ?? true
3271
+ };
3272
+ }
3273
+ /**
3274
+ * Create a tiling pattern descriptor.
3275
+ *
3276
+ * @param options Pattern parameters including the tile content stream.
3277
+ * @returns A {@link PatternFill} descriptor.
3278
+ */
3279
+ function tilingPattern(options) {
3280
+ return {
3281
+ kind: "pattern",
3282
+ width: options.width,
3283
+ height: options.height,
3284
+ paintType: options.paintType ?? 1,
3285
+ tilingType: options.tilingType ?? 1,
3286
+ ops: options.ops
3287
+ };
3288
+ }
3289
+ /**
3290
+ * Build a Type 2 (exponential interpolation) function for a single
3291
+ * colour-transition segment between two RGB stops.
3292
+ */
3293
+ function buildType2Function(c0, c1) {
3294
+ const fn = new PdfDict();
3295
+ fn.set("/FunctionType", PdfNumber.of(2));
3296
+ fn.set("/Domain", PdfArray.fromNumbers([0, 1]));
3297
+ fn.set("/C0", PdfArray.fromNumbers([
3298
+ c0.r,
3299
+ c0.g,
3300
+ c0.b
3301
+ ]));
3302
+ fn.set("/C1", PdfArray.fromNumbers([
3303
+ c1.r,
3304
+ c1.g,
3305
+ c1.b
3306
+ ]));
3307
+ fn.set("/N", PdfNumber.of(1));
3308
+ return fn;
3309
+ }
3310
+ /**
3311
+ * Build the shading function for a gradient.
3312
+ *
3313
+ * - 2 stops → single Type 2 (exponential interpolation) function.
3314
+ * - 3+ stops → Type 3 (stitching) function wrapping one Type 2 per segment.
3315
+ */
3316
+ function buildShadingFunction(stops, registry) {
3317
+ if (stops.length === 2) {
3318
+ const fn = buildType2Function(stops[0], stops[1]);
3319
+ return registry.register(fn);
3320
+ }
3321
+ const stitchDict = new PdfDict();
3322
+ stitchDict.set("/FunctionType", PdfNumber.of(3));
3323
+ stitchDict.set("/Domain", PdfArray.fromNumbers([0, 1]));
3324
+ const subFunctions = [];
3325
+ const bounds = [];
3326
+ const encode = [];
3327
+ for (let i = 0; i < stops.length - 1; i++) {
3328
+ const fn = buildType2Function(stops[i], stops[i + 1]);
3329
+ subFunctions.push(registry.register(fn));
3330
+ if (i > 0) bounds.push(stops[i].offset);
3331
+ encode.push(0, 1);
3332
+ }
3333
+ stitchDict.set("/Functions", PdfArray.of(subFunctions));
3334
+ stitchDict.set("/Bounds", PdfArray.fromNumbers(bounds));
3335
+ stitchDict.set("/Encode", PdfArray.fromNumbers(encode));
3336
+ return registry.register(stitchDict);
3337
+ }
3338
+ /**
3339
+ * Materialise a {@link GradientFill} descriptor into actual PDF objects
3340
+ * in the given registry.
3341
+ *
3342
+ * @param gradient The gradient descriptor.
3343
+ * @param registry The document's object registry.
3344
+ * @returns An object with the pattern's indirect reference and a unique
3345
+ * resource name.
3346
+ */
3347
+ function buildGradientObjects(gradient, registry) {
3348
+ const fnRef = buildShadingFunction(gradient.normalizedStops, registry);
3349
+ const shadingDict = new PdfDict();
3350
+ shadingDict.set("/ShadingType", PdfNumber.of(gradient.shadingType));
3351
+ shadingDict.set("/ColorSpace", PdfName.of("DeviceRGB"));
3352
+ shadingDict.set("/Coords", PdfArray.fromNumbers([...gradient.coords]));
3353
+ shadingDict.set("/Function", fnRef);
3354
+ shadingDict.set("/Extend", PdfArray.of([PdfBool.of(gradient.extend), PdfBool.of(gradient.extend)]));
3355
+ const shadingRef = registry.register(shadingDict);
3356
+ const patternDict = new PdfDict();
3357
+ patternDict.set("/Type", PdfName.of("Pattern"));
3358
+ patternDict.set("/PatternType", PdfNumber.of(2));
3359
+ patternDict.set("/Shading", shadingRef);
3360
+ const patternRef = registry.register(patternDict);
3361
+ return {
3362
+ patternRef,
3363
+ patternName: `Pat${patternRef.objectNumber}`
3364
+ };
3365
+ }
3366
+ /**
3367
+ * Materialise a {@link PatternFill} descriptor into actual PDF objects
3368
+ * in the given registry.
3369
+ *
3370
+ * @param pattern The tiling pattern descriptor.
3371
+ * @param registry The document's object registry.
3372
+ * @returns An object with the pattern's indirect reference and a unique
3373
+ * resource name.
3374
+ */
3375
+ function buildPatternObjects(pattern, registry) {
3376
+ const dict = new PdfDict();
3377
+ dict.set("/Type", PdfName.of("Pattern"));
3378
+ dict.set("/PatternType", PdfNumber.of(1));
3379
+ dict.set("/PaintType", PdfNumber.of(pattern.paintType));
3380
+ dict.set("/TilingType", PdfNumber.of(pattern.tilingType));
3381
+ dict.set("/BBox", PdfArray.fromNumbers([
3382
+ 0,
3383
+ 0,
3384
+ pattern.width,
3385
+ pattern.height
3386
+ ]));
3387
+ dict.set("/XStep", PdfNumber.of(pattern.width));
3388
+ dict.set("/YStep", PdfNumber.of(pattern.height));
3389
+ dict.set("/Resources", new PdfDict());
3390
+ const stream = PdfStream.fromString(pattern.ops, dict);
3391
+ const patternRef = registry.register(stream);
3392
+ return {
3393
+ patternRef,
3394
+ patternName: `Pat${patternRef.objectNumber}`
3395
+ };
3396
+ }
3397
+
3398
+ //#endregion
3399
+ //#region src/core/pdfPageText.ts
3072
3400
  /**
3073
3401
  * Break a single line of text into multiple lines that fit within `maxWidth`.
3074
3402
  *
@@ -3153,6 +3481,67 @@ function breakWord(word, maxWidth, font, size) {
3153
3481
  if (current !== "") fragments.push(current);
3154
3482
  return fragments;
3155
3483
  }
3484
+
3485
+ //#endregion
3486
+ //#region src/core/pdfPage.ts
3487
+ var pdfPage_exports = /* @__PURE__ */ __exportAll({
3488
+ PageSizes: () => PageSizes,
3489
+ PdfPage: () => PdfPage
3490
+ });
3491
+ /** Pre-defined page sizes as `[width, height]` tuples in PDF points. */
3492
+ const PageSizes = {
3493
+ "4A0": [4767.87, 6740.79],
3494
+ "2A0": [3370.39, 4767.87],
3495
+ A0: [2383.94, 3370.39],
3496
+ A1: [1683.78, 2383.94],
3497
+ A2: [1190.55, 1683.78],
3498
+ A3: [841.89, 1190.55],
3499
+ A4: [595.28, 841.89],
3500
+ A5: [419.53, 595.28],
3501
+ A6: [297.64, 419.53],
3502
+ A7: [209.76, 297.64],
3503
+ A8: [147.4, 209.76],
3504
+ A9: [104.88, 147.4],
3505
+ A10: [73.7, 104.88],
3506
+ B0: [2834.65, 4008.19],
3507
+ B1: [2004.09, 2834.65],
3508
+ B2: [1417.32, 2004.09],
3509
+ B3: [1000.63, 1417.32],
3510
+ B4: [708.66, 1000.63],
3511
+ B5: [498.9, 708.66],
3512
+ B6: [354.33, 498.9],
3513
+ B7: [249.45, 354.33],
3514
+ B8: [175.75, 249.45],
3515
+ B9: [124.72, 175.75],
3516
+ B10: [87.87, 124.72],
3517
+ Letter: [612, 792],
3518
+ Legal: [612, 1008],
3519
+ Tabloid: [792, 1224],
3520
+ Ledger: [1224, 792],
3521
+ Executive: [521.86, 756],
3522
+ Folio: [612, 936],
3523
+ C0: [2599.37, 3676.54],
3524
+ C1: [1836.85, 2599.37],
3525
+ C2: [1298.27, 1836.85],
3526
+ C3: [918.43, 1298.27],
3527
+ C4: [649.13, 918.43],
3528
+ C5: [459.21, 649.13],
3529
+ C6: [323.15, 459.21],
3530
+ C7: [229.61, 323.15],
3531
+ C8: [161.57, 229.61],
3532
+ C9: [113.39, 161.57],
3533
+ C10: [79.37, 113.39],
3534
+ RA0: [2437.8, 3458.27],
3535
+ RA1: [1729.13, 2437.8],
3536
+ RA2: [1218.9, 1729.13],
3537
+ RA3: [864.57, 1218.9],
3538
+ RA4: [609.45, 864.57],
3539
+ SRA0: [2551.18, 3628.35],
3540
+ SRA1: [1814.17, 2551.18],
3541
+ SRA2: [1275.59, 1814.17],
3542
+ SRA3: [907.09, 1275.59],
3543
+ SRA4: [637.8, 907.09]
3544
+ };
3156
3545
  /**
3157
3546
  * A single page in a PDF document.
3158
3547
  *
@@ -3180,10 +3569,25 @@ var PdfPage = class PdfPage {
3180
3569
  */
3181
3570
  extGStates = /* @__PURE__ */ new Map();
3182
3571
  /**
3572
+ * Pattern resources referenced by this page.
3573
+ * Maps a resource name (e.g. `Pat5`) to its indirect reference.
3574
+ * Used for gradient fills and tiling patterns.
3575
+ */
3576
+ patterns = /* @__PURE__ */ new Map();
3577
+ /**
3183
3578
  * Counter for ExtGState resource names (`GS1`, `GS2`, ...).
3184
3579
  */
3185
3580
  extGStateCounter = 0;
3186
3581
  /**
3582
+ * Counter for transparency group XObject resource names (`TG1`, `TG2`, ...).
3583
+ */
3584
+ transparencyGroupCounter = 0;
3585
+ /**
3586
+ * Stack of transparency group state. Each entry records the ops length
3587
+ * at the time `beginTransparencyGroup()` was called, plus the options.
3588
+ */
3589
+ transparencyGroupStack = [];
3590
+ /**
3187
3591
  * Cache mapping composite keys (opacity + blend mode) to their ExtGState
3188
3592
  * resource names, so the same combination reuses the same graphics state
3189
3593
  * dictionary.
@@ -3323,6 +3727,10 @@ var PdfPage = class PdfPage {
3323
3727
  registerExtGState(name, ref) {
3324
3728
  this.extGStates.set(name, ref);
3325
3729
  }
3730
+ /** @internal Register a Pattern resource on this page. */
3731
+ registerPattern(name, ref) {
3732
+ this.patterns.set(name, ref);
3733
+ }
3326
3734
  /**
3327
3735
  * Set the default font used by {@link drawText} when the `font` option
3328
3736
  * is not provided.
@@ -4224,6 +4632,51 @@ var PdfPage = class PdfPage {
4224
4632
  this.ops += restoreState();
4225
4633
  }
4226
4634
  /**
4635
+ * Draw a gradient fill (linear or radial) clipped to a rectangle.
4636
+ *
4637
+ * The gradient is registered as a `/Pattern` resource on this page
4638
+ * and painted within the specified rectangular region.
4639
+ *
4640
+ * @param gradient A gradient descriptor from {@link linearGradient}
4641
+ * or {@link radialGradient}.
4642
+ * @param rect The rectangle to fill.
4643
+ */
4644
+ drawGradient(gradient, rect) {
4645
+ const { patternRef, patternName } = buildGradientObjects(gradient, this.registry);
4646
+ this.patterns.set(patternName, patternRef);
4647
+ this.ops += saveState();
4648
+ this.ops += rectangle(rect.x, rect.y, rect.width, rect.height);
4649
+ this.ops += clip();
4650
+ this.ops += endPath();
4651
+ this.ops += setColorSpace("Pattern");
4652
+ this.ops += `/${patternName} scn\n`;
4653
+ this.ops += rectangle(rect.x, rect.y, rect.width, rect.height);
4654
+ this.ops += fill();
4655
+ this.ops += restoreState();
4656
+ }
4657
+ /**
4658
+ * Draw a tiling pattern fill clipped to a rectangle.
4659
+ *
4660
+ * The pattern is registered as a `/Pattern` resource on this page
4661
+ * and painted within the specified rectangular region.
4662
+ *
4663
+ * @param pattern A pattern descriptor from {@link tilingPattern}.
4664
+ * @param rect The rectangle to fill.
4665
+ */
4666
+ drawPattern(pattern, rect) {
4667
+ const { patternRef, patternName } = buildPatternObjects(pattern, this.registry);
4668
+ this.patterns.set(patternName, patternRef);
4669
+ this.ops += saveState();
4670
+ this.ops += rectangle(rect.x, rect.y, rect.width, rect.height);
4671
+ this.ops += clip();
4672
+ this.ops += endPath();
4673
+ this.ops += setColorSpace("Pattern");
4674
+ this.ops += `/${patternName} scn\n`;
4675
+ this.ops += rectangle(rect.x, rect.y, rect.width, rect.height);
4676
+ this.ops += fill();
4677
+ this.ops += restoreState();
4678
+ }
4679
+ /**
4227
4680
  * Begin layer-specific content.
4228
4681
  *
4229
4682
  * Content drawn after this call and before {@link endLayer} will be
@@ -4244,6 +4697,120 @@ var PdfPage = class PdfPage {
4244
4697
  this.ops += endLayerContent();
4245
4698
  }
4246
4699
  /**
4700
+ * Begin a transparency group. All drawing operations until
4701
+ * {@link endTransparencyGroup} will be captured and composited as a
4702
+ * single Form XObject with a `/Group` transparency dictionary.
4703
+ *
4704
+ * Transparency groups enable isolated and knockout compositing effects
4705
+ * that are not possible with simple opacity settings.
4706
+ *
4707
+ * Groups can be nested — each call must be paired with a matching
4708
+ * {@link endTransparencyGroup}.
4709
+ *
4710
+ * @param options Isolation, knockout, and color-space settings.
4711
+ *
4712
+ * @example
4713
+ * ```ts
4714
+ * page.beginTransparencyGroup({ isolated: true });
4715
+ * page.drawRectangle({ x: 50, y: 50, width: 100, height: 100, opacity: 0.5 });
4716
+ * page.drawCircle({ x: 100, y: 100, size: 60, opacity: 0.5 });
4717
+ * page.endTransparencyGroup();
4718
+ * ```
4719
+ */
4720
+ beginTransparencyGroup(options) {
4721
+ this.transparencyGroupStack.push({
4722
+ opsStart: this.ops.length,
4723
+ options: options ?? {}
4724
+ });
4725
+ }
4726
+ /**
4727
+ * End the current transparency group and composite it onto the page
4728
+ * as a Form XObject.
4729
+ *
4730
+ * @throws {Error} If there is no matching {@link beginTransparencyGroup}.
4731
+ */
4732
+ endTransparencyGroup() {
4733
+ const group = this.transparencyGroupStack.pop();
4734
+ if (!group) throw new Error("No transparency group to end — call beginTransparencyGroup() first");
4735
+ const groupOps = this.ops.slice(group.opsStart);
4736
+ this.ops = this.ops.slice(0, group.opsStart);
4737
+ const colorSpace = group.options.colorSpace ?? "DeviceRGB";
4738
+ const groupDict = new PdfDict();
4739
+ groupDict.set("/S", PdfName.of("Transparency"));
4740
+ groupDict.set("/I", PdfBool.of(group.options.isolated ?? true));
4741
+ groupDict.set("/K", PdfBool.of(group.options.knockout ?? false));
4742
+ groupDict.set("/CS", PdfName.of(colorSpace));
4743
+ const bbox = PdfArray.fromNumbers([
4744
+ this.mediaX,
4745
+ this.mediaY,
4746
+ this.mediaX + this.mediaWidth,
4747
+ this.mediaY + this.mediaHeight
4748
+ ]);
4749
+ const formDict = new PdfDict();
4750
+ formDict.set("/Type", PdfName.of("XObject"));
4751
+ formDict.set("/Subtype", PdfName.of("Form"));
4752
+ formDict.set("/BBox", bbox);
4753
+ formDict.set("/Group", groupDict);
4754
+ const formStream = PdfStream.fromString(groupOps, formDict);
4755
+ const formRef = this.registry.register(formStream);
4756
+ this.transparencyGroupCounter++;
4757
+ const name = `TG${this.transparencyGroupCounter}`;
4758
+ this.registerXObject(name, formRef);
4759
+ this.ops += saveState();
4760
+ this.ops += drawXObject(name);
4761
+ this.ops += restoreState();
4762
+ }
4763
+ /**
4764
+ * Apply a soft mask (luminosity-based) for subsequent drawing operations.
4765
+ *
4766
+ * White regions in the mask are fully opaque; black regions are fully
4767
+ * transparent. The mask stays active until {@link clearSoftMask} is
4768
+ * called or the graphics state is restored.
4769
+ *
4770
+ * @param mask A soft mask reference created by
4771
+ * {@link PdfDocument.createSoftMask}.
4772
+ *
4773
+ * @example
4774
+ * ```ts
4775
+ * const mask = doc.createSoftMask(200, 200, (b) => {
4776
+ * b.drawRectangle(0, 0, 200, 200, 1); // white = opaque
4777
+ * b.drawCircle(100, 100, 80, 0); // black = transparent
4778
+ * });
4779
+ * page.applySoftMask(mask);
4780
+ * page.drawImage(image, { x: 50, y: 50, width: 200, height: 200 });
4781
+ * page.clearSoftMask();
4782
+ * ```
4783
+ */
4784
+ applySoftMask(mask) {
4785
+ const smaskDict = new PdfDict();
4786
+ smaskDict.set("/S", PdfName.of("Luminosity"));
4787
+ smaskDict.set("/G", mask.ref);
4788
+ const gsDict = new PdfDict();
4789
+ gsDict.set("/Type", PdfName.of("ExtGState"));
4790
+ gsDict.set("/SMask", smaskDict);
4791
+ const gsRef = this.registry.register(gsDict);
4792
+ this.extGStateCounter++;
4793
+ const gsName = `GS${this.extGStateCounter}`;
4794
+ this.extGStates.set(gsName, gsRef);
4795
+ this.ops += setGraphicsState(gsName);
4796
+ }
4797
+ /**
4798
+ * Clear the current soft mask, resetting to no masking.
4799
+ *
4800
+ * This emits an ExtGState with `/SMask /None`, which removes any
4801
+ * previously applied soft mask for subsequent drawing operations.
4802
+ */
4803
+ clearSoftMask() {
4804
+ const gsDict = new PdfDict();
4805
+ gsDict.set("/Type", PdfName.of("ExtGState"));
4806
+ gsDict.set("/SMask", PdfName.of("None"));
4807
+ const gsRef = this.registry.register(gsDict);
4808
+ this.extGStateCounter++;
4809
+ const gsName = `GS${this.extGStateCounter}`;
4810
+ this.extGStates.set(gsName, gsRef);
4811
+ this.ops += setGraphicsState(gsName);
4812
+ }
4813
+ /**
4247
4814
  * Mark a rectangular region on this page for redaction.
4248
4815
  *
4249
4816
  * The mark is stored but not applied until `doc.applyRedactions()`
@@ -4296,6 +4863,11 @@ var PdfPage = class PdfPage {
4296
4863
  for (const [name, ref] of this.extGStates) gsDict.set(name, ref);
4297
4864
  resources.set("/ExtGState", gsDict);
4298
4865
  }
4866
+ if (this.patterns.size > 0) {
4867
+ const patDict = new PdfDict();
4868
+ for (const [name, ref] of this.patterns) patDict.set(name, ref);
4869
+ resources.set("/Pattern", patDict);
4870
+ }
4299
4871
  resources.set("/ProcSet", PdfArray.of([
4300
4872
  PdfName.of("PDF"),
4301
4873
  PdfName.of("Text"),
@@ -4341,6 +4913,15 @@ var PdfPage = class PdfPage {
4341
4913
  const gsDict = gsObj;
4342
4914
  for (const [name, ref] of this.extGStates) gsDict.set(name, ref);
4343
4915
  }
4916
+ if (this.patterns.size > 0) {
4917
+ let patObj = resources.get("/Pattern");
4918
+ if (patObj === void 0 || patObj.kind !== "dict") {
4919
+ patObj = new PdfDict();
4920
+ resources.set("/Pattern", patObj);
4921
+ }
4922
+ const patDict = patObj;
4923
+ for (const [name, ref] of this.patterns) patDict.set(name, ref);
4924
+ }
4344
4925
  return resources;
4345
4926
  }
4346
4927
  /**
@@ -4385,160 +4966,7 @@ var PdfPage = class PdfPage {
4385
4966
  };
4386
4967
  }
4387
4968
  };
4388
- /** Format a number for PDF output. */
4389
- function fmtN(value) {
4390
- if (Number.isInteger(value)) return value.toString();
4391
- const s = value.toFixed(6).replace(/\.?0+$/, "");
4392
- return s === "-0" ? "0" : s;
4393
- }
4394
- /** Magic constant for circular arc approximation: 4*(sqrt(2)-1)/3. */
4395
- const KAPPA = .5522847498;
4396
- /**
4397
- * Approximate an SVG arc command as cubic Bezier curve(s) (PDF operators).
4398
- *
4399
- * SVG arcs use endpoint parameterization; PDF has no native arc command.
4400
- */
4401
- function svgArcToPdfOps(fromX, fromY, rx0, ry0, rotationDeg, largeArcFlag, sweepFlag, toX, toY) {
4402
- let rx = Math.abs(rx0);
4403
- let ry = Math.abs(ry0);
4404
- if (rx === 0 || ry === 0) return `${fmtN(toX)} ${fmtN(toY)} l\n`;
4405
- const phi = rotationDeg * Math.PI / 180;
4406
- const cosPhi = Math.cos(phi);
4407
- const sinPhi = Math.sin(phi);
4408
- const dx2 = (fromX - toX) / 2;
4409
- const dy2 = (fromY - toY) / 2;
4410
- const x1p = cosPhi * dx2 + sinPhi * dy2;
4411
- const y1p = -sinPhi * dx2 + cosPhi * dy2;
4412
- let rxSq = rx * rx;
4413
- let rySq = ry * ry;
4414
- const x1pSq = x1p * x1p;
4415
- const y1pSq = y1p * y1p;
4416
- const lambda = x1pSq / rxSq + y1pSq / rySq;
4417
- if (lambda > 1) {
4418
- const s = Math.sqrt(lambda);
4419
- rx *= s;
4420
- ry *= s;
4421
- rxSq = rx * rx;
4422
- rySq = ry * ry;
4423
- }
4424
- let sq = (rxSq * rySq - rxSq * y1pSq - rySq * x1pSq) / (rxSq * y1pSq + rySq * x1pSq);
4425
- if (sq < 0) sq = 0;
4426
- sq = Math.sqrt(sq);
4427
- if (largeArcFlag === sweepFlag) sq = -sq;
4428
- const cxp = sq * rx * y1p / ry;
4429
- const cyp = -sq * ry * x1p / rx;
4430
- const cx = cosPhi * cxp - sinPhi * cyp + (fromX + toX) / 2;
4431
- const cy = sinPhi * cxp + cosPhi * cyp + (fromY + toY) / 2;
4432
- function vecAngle(ux, uy, vx, vy) {
4433
- const sign = ux * vy - uy * vx < 0 ? -1 : 1;
4434
- let r = (ux * vx + uy * vy) / (Math.sqrt(ux * ux + uy * uy) * Math.sqrt(vx * vx + vy * vy));
4435
- if (r < -1) r = -1;
4436
- if (r > 1) r = 1;
4437
- return sign * Math.acos(r);
4438
- }
4439
- const theta1 = vecAngle(1, 0, (x1p - cxp) / rx, (y1p - cyp) / ry);
4440
- let dTheta = vecAngle((x1p - cxp) / rx, (y1p - cyp) / ry, (-x1p - cxp) / rx, (-y1p - cyp) / ry);
4441
- if (sweepFlag === 0 && dTheta > 0) dTheta -= 2 * Math.PI;
4442
- if (sweepFlag === 1 && dTheta < 0) dTheta += 2 * Math.PI;
4443
- const segs = Math.ceil(Math.abs(dTheta) / (Math.PI / 2));
4444
- const segAngle = dTheta / segs;
4445
- let ops = "";
4446
- let angle = theta1;
4447
- for (let i = 0; i < segs; i++) {
4448
- const a1 = angle;
4449
- const a2 = angle + segAngle;
4450
- const alpha = 4 / 3 * Math.tan((a2 - a1) / 4);
4451
- const cos1 = Math.cos(a1), sin1 = Math.sin(a1);
4452
- const cos2 = Math.cos(a2), sin2 = Math.sin(a2);
4453
- const ep1x = cosPhi * rx * cos1 - sinPhi * ry * sin1 + cx;
4454
- const ep1y = sinPhi * rx * cos1 + cosPhi * ry * sin1 + cy;
4455
- const cp1x = ep1x + alpha * (-cosPhi * rx * sin1 - sinPhi * ry * cos1);
4456
- const cp1y = ep1y + alpha * (-sinPhi * rx * sin1 + cosPhi * ry * cos1);
4457
- const ep2x = cosPhi * rx * cos2 - sinPhi * ry * sin2 + cx;
4458
- const ep2y = sinPhi * rx * cos2 + cosPhi * ry * sin2 + cy;
4459
- const cp2x = ep2x - alpha * (-cosPhi * rx * sin2 - sinPhi * ry * cos2);
4460
- const cp2y = ep2y - alpha * (-sinPhi * rx * sin2 + cosPhi * ry * cos2);
4461
- ops += `${fmtN(cp1x)} ${fmtN(cp1y)} ${fmtN(cp2x)} ${fmtN(cp2y)} ${fmtN(ep2x)} ${fmtN(ep2y)} c\n`;
4462
- angle = a2;
4463
- }
4464
- return ops;
4465
- }
4466
- /**
4467
- * Convert parsed SVG draw commands into PDF path construction operators.
4468
- *
4469
- * Does **not** emit painting operators (fill / stroke) -- the caller
4470
- * is responsible for that.
4471
- */
4472
- function svgCommandsToPdfOps(commands) {
4473
- let ops = "";
4474
- let curX = 0;
4475
- let curY = 0;
4476
- for (const cmd of commands) switch (cmd.type) {
4477
- case "moveTo":
4478
- curX = cmd.params[0];
4479
- curY = cmd.params[1];
4480
- ops += `${fmtN(curX)} ${fmtN(curY)} m\n`;
4481
- break;
4482
- case "lineTo":
4483
- curX = cmd.params[0];
4484
- curY = cmd.params[1];
4485
- ops += `${fmtN(curX)} ${fmtN(curY)} l\n`;
4486
- break;
4487
- case "curveTo":
4488
- ops += `${fmtN(cmd.params[0])} ${fmtN(cmd.params[1])} ${fmtN(cmd.params[2])} ${fmtN(cmd.params[3])} ${fmtN(cmd.params[4])} ${fmtN(cmd.params[5])} c\n`;
4489
- curX = cmd.params[4];
4490
- curY = cmd.params[5];
4491
- break;
4492
- case "quadCurveTo": {
4493
- const cpx = cmd.params[0];
4494
- const cpy = cmd.params[1];
4495
- const toX = cmd.params[2];
4496
- const toY = cmd.params[3];
4497
- const cp1x = curX + 2 / 3 * (cpx - curX);
4498
- const cp1y = curY + 2 / 3 * (cpy - curY);
4499
- const cp2x = toX + 2 / 3 * (cpx - toX);
4500
- const cp2y = toY + 2 / 3 * (cpy - toY);
4501
- ops += `${fmtN(cp1x)} ${fmtN(cp1y)} ${fmtN(cp2x)} ${fmtN(cp2y)} ${fmtN(toX)} ${fmtN(toY)} c\n`;
4502
- curX = toX;
4503
- curY = toY;
4504
- break;
4505
- }
4506
- case "closePath":
4507
- ops += "h\n";
4508
- break;
4509
- case "rect":
4510
- ops += `${fmtN(cmd.params[0])} ${fmtN(cmd.params[1])} ${fmtN(cmd.params[2])} ${fmtN(cmd.params[3])} re\n`;
4511
- break;
4512
- case "circle": {
4513
- const ccx = cmd.params[0], ccy = cmd.params[1], r = cmd.params[2];
4514
- const ox = r * KAPPA, oy = r * KAPPA;
4515
- ops += `${fmtN(ccx)} ${fmtN(ccy + r)} m\n`;
4516
- ops += `${fmtN(ccx + ox)} ${fmtN(ccy + r)} ${fmtN(ccx + r)} ${fmtN(ccy + oy)} ${fmtN(ccx + r)} ${fmtN(ccy)} c\n`;
4517
- ops += `${fmtN(ccx + r)} ${fmtN(ccy - oy)} ${fmtN(ccx + ox)} ${fmtN(ccy - r)} ${fmtN(ccx)} ${fmtN(ccy - r)} c\n`;
4518
- ops += `${fmtN(ccx - ox)} ${fmtN(ccy - r)} ${fmtN(ccx - r)} ${fmtN(ccy - oy)} ${fmtN(ccx - r)} ${fmtN(ccy)} c\n`;
4519
- ops += `${fmtN(ccx - r)} ${fmtN(ccy + oy)} ${fmtN(ccx - ox)} ${fmtN(ccy + r)} ${fmtN(ccx)} ${fmtN(ccy + r)} c\n`;
4520
- break;
4521
- }
4522
- case "ellipse": {
4523
- const ecx = cmd.params[0], ecy = cmd.params[1];
4524
- const erx = cmd.params[2], ery = cmd.params[3];
4525
- const eox = erx * KAPPA, eoy = ery * KAPPA;
4526
- ops += `${fmtN(ecx)} ${fmtN(ecy + ery)} m\n`;
4527
- ops += `${fmtN(ecx + eox)} ${fmtN(ecy + ery)} ${fmtN(ecx + erx)} ${fmtN(ecy + eoy)} ${fmtN(ecx + erx)} ${fmtN(ecy)} c\n`;
4528
- ops += `${fmtN(ecx + erx)} ${fmtN(ecy - eoy)} ${fmtN(ecx + eox)} ${fmtN(ecy - ery)} ${fmtN(ecx)} ${fmtN(ecy - ery)} c\n`;
4529
- ops += `${fmtN(ecx - eox)} ${fmtN(ecy - ery)} ${fmtN(ecx - erx)} ${fmtN(ecy - eoy)} ${fmtN(ecx - erx)} ${fmtN(ecy)} c\n`;
4530
- ops += `${fmtN(ecx - erx)} ${fmtN(ecy + eoy)} ${fmtN(ecx - eox)} ${fmtN(ecy + ery)} ${fmtN(ecx)} ${fmtN(ecy + ery)} c\n`;
4531
- break;
4532
- }
4533
- case "arc":
4534
- ops += svgArcToPdfOps(curX, curY, cmd.params[0], cmd.params[1], cmd.params[2], cmd.params[3], cmd.params[4], cmd.params[5], cmd.params[6]);
4535
- curX = cmd.params[5];
4536
- curY = cmd.params[6];
4537
- break;
4538
- }
4539
- return ops;
4540
- }
4541
4969
 
4542
4970
  //#endregion
4543
- export { setFillColor as $, showTextArray as $t, endMarkedContent as A, moveTo as At, saveState as B, endText as Bt, beginArtifact as C, ellipsePath as Ct, beginMarkedContentWithProperties as D, fillEvenOdd as Dt, beginMarkedContentSequence as E, fillAndStroke as Et, radians as F, setLineJoin as Ft, applyFillColor as G, setFont as Gt, setGraphicsState as H, moveTextSetLeading as Ht, radiansToDegrees as I, setLineWidth as It, colorToComponents as J, setTextMatrix as Jt, applyStrokeColor as K, setFontSize as Kt, restoreState as L, setMiterLimit as Lt, concatMatrix as M, setDashPattern as Mt, degrees as N, setFlatness as Nt, createMarkedContentScope as O, fillEvenOddAndStroke as Ot, degreesToRadians as P, setLineCap as Pt, setColorSpace as Q, showText as Qt, rotate as R, stroke as Rt, createAnnotation as S, curveToInitial as St, beginMarkedContent as T, fill as Tt, skew as U, nextLine as Ut, scale as V, moveText as Vt, translate as W, setCharacterSpacing as Wt, grayscale as X, setTextRise as Xt, componentsToColor as Y, setTextRenderingMode as Yt, rgb as Z, setWordSpacing as Zt, parseSvgTransform as _, closeFillAndStroke as _t, applyRedactions as a, setStrokeColorCmyk as at, annotationFromDict as b, curveTo as bt, PdfLayer as c, setStrokeColorSpace as ct, endLayerContent as d, drawImageXObject as dt, showTextHex as en, setFillColorCmyk as et, drawSvgOnPage as f, drawXObject as ft, parseSvgPath as g, closeAndStroke as gt, parseSvgColor as h, clipEvenOdd as ht, wrapText as i, setStrokeColor as it, wrapInMarkedContent as j, rectangle as jt, endArtifact as k, lineTo as kt, PdfLayerManager as l, setStrokingColor as lt, parseSvg as m, clip as mt, PdfPage as n, showTextWithSpacing as nn, setFillColorRgb as nt, getRedactionMarks as o, setStrokeColorGray as ot, svgToPdfOperators as p, circlePath as pt, cmyk as q, setLeading as qt, pdfPage_exports as r, setFillingColor as rt, markForRedaction as s, setStrokeColorRgb as st, PageSizes as t, showTextNextLine as tn, setFillColorGray as tt, beginLayerContent as u, drawImageWithMatrix as ut, AnnotationFlags as v, closeFillEvenOddAndStroke as vt, beginArtifactWithType as w, endPath as wt, buildAnnotationDict as x, curveToFinal as xt, PdfAnnotation as y, closePath as yt, rotationMatrix as z, beginText as zt };
4544
- //# sourceMappingURL=pdfPage-JiCJLV3x.mjs.map
4971
+ export { colorToComponents as $, setTextMatrix as $t, beginMarkedContent as A, fill as At, radians as B, setLineJoin as Bt, AnnotationFlags as C, closeFillEvenOddAndStroke as Ct, createAnnotation as D, curveToInitial as Dt, buildAnnotationDict as E, curveToFinal as Et, endMarkedContent as F, moveTo as Ft, saveState as G, endText as Gt, restoreState as H, setMiterLimit as Ht, wrapInMarkedContent as I, rectangle as It, skew as J, nextLine as Jt, scale as K, moveText as Kt, concatMatrix as L, setDashPattern as Lt, beginMarkedContentWithProperties as M, fillEvenOdd as Mt, createMarkedContentScope as N, fillEvenOddAndStroke as Nt, beginArtifact as O, ellipsePath as Ot, endArtifact as P, lineTo as Pt, cmyk as Q, setLeading as Qt, degrees as R, setFlatness as Rt, parseSvgTransform as S, closeFillAndStroke as St, annotationFromDict as T, curveTo as Tt, rotate as U, stroke as Ut, radiansToDegrees as V, setLineWidth as Vt, rotationMatrix as W, beginText as Wt, applyFillColor as X, setFont as Xt, translate as Y, setCharacterSpacing as Yt, applyStrokeColor as Z, setFontSize as Zt, drawSvgOnPage as _, drawXObject as _t, buildGradientObjects as a, showTextHex as an, setFillColorCmyk as at, parseSvgColor as b, clipEvenOdd as bt, radialGradient as c, setFillingColor as ct, getRedactionMarks as d, setStrokeColorGray as dt, setTextRenderingMode as en, componentsToColor as et, markForRedaction as f, setStrokeColorRgb as ft, endLayerContent as g, drawImageXObject as gt, beginLayerContent as h, drawImageWithMatrix as ht, wrapText as i, showTextArray as in, setFillColor as it, beginMarkedContentSequence as j, fillAndStroke as jt, beginArtifactWithType as k, endPath as kt, tilingPattern as l, setStrokeColor as lt, PdfLayerManager as m, setStrokingColor as mt, PdfPage as n, setWordSpacing as nn, rgb as nt, buildPatternObjects as o, showTextNextLine as on, setFillColorGray as ot, PdfLayer as p, setStrokeColorSpace as pt, setGraphicsState as q, moveTextSetLeading as qt, pdfPage_exports as r, showText as rn, setColorSpace as rt, linearGradient as s, showTextWithSpacing as sn, setFillColorRgb as st, PageSizes as t, setTextRise as tn, grayscale as tt, applyRedactions as u, setStrokeColorCmyk as ut, svgToPdfOperators as v, circlePath as vt, PdfAnnotation as w, closePath as wt, parseSvgPath as x, closeAndStroke as xt, parseSvg as y, clip as yt, degreesToRadians as z, setLineCap as zt };
4972
+ //# sourceMappingURL=pdfPage-B7vA518n.mjs.map