modern-pdf-lib 0.26.0 → 0.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +33 -16
  2. package/dist/{batchOptimize-C1W3O68Q.cjs → batchOptimize-Ba5ehwoI.cjs} +55 -55
  3. package/dist/{batchOptimize-BCJEEN8J.mjs → batchOptimize-KB1k9LFg.mjs} +25 -25
  4. package/dist/{bridge-DaS-gzEd.mjs → bridge-7dhURZj7.mjs} +4 -5
  5. package/dist/{bridge-DMEuGtfn.cjs → bridge-ByvzPu5h.cjs} +29 -31
  6. package/dist/browser.cjs +291 -154
  7. package/dist/browser.d.cts +166 -166
  8. package/dist/browser.d.cts.map +1 -1
  9. package/dist/browser.d.mts +166 -166
  10. package/dist/browser.d.mts.map +1 -1
  11. package/dist/browser.mjs +15 -19
  12. package/dist/cli/index.cjs +7 -7
  13. package/dist/cli/index.mjs +8 -8
  14. package/dist/{compressionAnalysis-CwknBtqx.mjs → compressionAnalysis-BEd_745I.mjs} +55 -69
  15. package/dist/{compressionAnalysis-Ch7t-HXn.d.mts → compressionAnalysis-CyBVhRU5.d.cts} +136 -136
  16. package/dist/compressionAnalysis-CyBVhRU5.d.cts.map +1 -0
  17. package/dist/{compressionAnalysis-B-FPzgzw.cjs → compressionAnalysis-DwxVCe4E.cjs} +85 -99
  18. package/dist/{compressionAnalysis-Dgv1TtHJ.d.cts → compressionAnalysis-InMeGrqw.d.mts} +136 -136
  19. package/dist/compressionAnalysis-InMeGrqw.d.mts.map +1 -0
  20. package/dist/create.cjs +21 -23
  21. package/dist/create.d.cts +2 -2
  22. package/dist/create.d.mts +2 -2
  23. package/dist/create.mjs +3 -5
  24. package/dist/{deduplicateImages-DIon68zB.mjs → deduplicateImages-Ba7RZ_sx.mjs} +4 -5
  25. package/dist/{deduplicateImages-cKsnD6Ep.cjs → deduplicateImages-CYFpiEch.cjs} +14 -15
  26. package/dist/{fieldAppearance-C8PoLFSc.d.mts → fieldAppearance-Df1262CT.d.cts} +44 -44
  27. package/dist/fieldAppearance-Df1262CT.d.cts.map +1 -0
  28. package/dist/{fieldAppearance-CdiGFG5e.d.cts → fieldAppearance-_CZdoUCD.d.mts} +44 -44
  29. package/dist/fieldAppearance-_CZdoUCD.d.mts.map +1 -0
  30. package/dist/fontEmbed-DxtdZxUj.d.cts +677 -0
  31. package/dist/fontEmbed-DxtdZxUj.d.cts.map +1 -0
  32. package/dist/fontEmbed-N-VWoZ0F.d.mts +677 -0
  33. package/dist/fontEmbed-N-VWoZ0F.d.mts.map +1 -0
  34. package/dist/forms.cjs +3 -4
  35. package/dist/forms.d.cts +2 -2
  36. package/dist/forms.d.mts +2 -2
  37. package/dist/forms.mjs +2 -3
  38. package/dist/{grayscaleDetect-C6kFF3dk.mjs → grayscaleDetect-6GJrgBRT.mjs} +3 -3
  39. package/dist/{grayscaleDetect-C2m-eEXR.cjs → grayscaleDetect-DAUqxjgR.cjs} +13 -14
  40. package/dist/{imageExtract-zEb1gnkb.cjs → imageExtract-DQomHJiA.cjs} +13 -14
  41. package/dist/{imageExtract-Dnk_Ssv7.mjs → imageExtract-DV-zq4h3.mjs} +3 -4
  42. package/dist/index-5Fv1-Z-p.d.mts +10238 -0
  43. package/dist/index-5Fv1-Z-p.d.mts.map +1 -0
  44. package/dist/index-_Onej9Wy.d.cts +10238 -0
  45. package/dist/index-_Onej9Wy.d.cts.map +1 -0
  46. package/dist/index.cjs +291 -153
  47. package/dist/index.d.cts +7 -7
  48. package/dist/index.d.mts +7 -7
  49. package/dist/index.mjs +14 -17
  50. package/dist/{layout-CrqeJBMI.mjs → layout-D035GpU8.mjs} +50 -12
  51. package/dist/{layout-DQh05VP-.cjs → layout-DiO_3JLh.cjs} +184 -134
  52. package/dist/{loader-DYCH3n7d.cjs → loader-DR7H0XOf.cjs} +332 -66
  53. package/dist/{loader-CVB-c_3Z.mjs → loader-DkrXz-h4.mjs} +248 -12
  54. package/dist/parse.cjs +7 -8
  55. package/dist/parse.d.cts +3 -3
  56. package/dist/parse.d.mts +3 -3
  57. package/dist/parse.mjs +6 -7
  58. package/dist/pdfDocument-5Do0LKQh.d.cts +5181 -0
  59. package/dist/pdfDocument-5Do0LKQh.d.cts.map +1 -0
  60. package/dist/{pdfDocument-D7aFSQEY.mjs → pdfDocument-B6czyaVI.mjs} +10874 -871
  61. package/dist/pdfDocument-B_0VSUHL.d.mts +5181 -0
  62. package/dist/pdfDocument-B_0VSUHL.d.mts.map +1 -0
  63. package/dist/{pdfDocument-D9uYNSb-.cjs → pdfDocument-BaQlOkYr.cjs} +20665 -9846
  64. package/dist/{pdfForm-BpqDGp29.cjs → pdfForm-BVS_do95.cjs} +112 -107
  65. package/dist/pdfForm-Ca86NDWn.d.cts +897 -0
  66. package/dist/pdfForm-Ca86NDWn.d.cts.map +1 -0
  67. package/dist/pdfForm-Ca86NDWn.d.mts +897 -0
  68. package/dist/pdfForm-Ca86NDWn.d.mts.map +1 -0
  69. package/dist/{pdfForm-C3mC9FoQ.mjs → pdfForm-CfLnlsj-.mjs} +22 -17
  70. package/dist/{pdfObjects-1veop1_d.cjs → pdfObjects-BcPlSI0a.cjs} +62 -53
  71. package/dist/{pdfObjects-uEsWlfzU.mjs → pdfObjects-CB7TEdbW.mjs} +12 -2
  72. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  73. package/dist/rolldown-runtime-ak5kbic3.cjs +18 -0
  74. package/dist/src-BOzRFaEE.mjs +27888 -0
  75. package/dist/src-vNbsqoIy.cjs +29669 -0
  76. package/dist/{streamDecode-Bj568Nc9.mjs → streamDecode-DCpgTocN.mjs} +143 -151
  77. package/dist/{streamDecode-CvgErkFu.cjs → streamDecode-kQ-REV7v.cjs} +164 -160
  78. package/package.json +33 -24
  79. package/dist/compressionAnalysis-Ch7t-HXn.d.mts.map +0 -1
  80. package/dist/compressionAnalysis-Dgv1TtHJ.d.cts.map +0 -1
  81. package/dist/fflateAdapter-DuNiByKx.mjs +0 -196
  82. package/dist/fflateAdapter-LTAeAhaD.cjs +0 -207
  83. package/dist/fieldAppearance-C8PoLFSc.d.mts.map +0 -1
  84. package/dist/fieldAppearance-CdiGFG5e.d.cts.map +0 -1
  85. package/dist/fontEmbed-3YhUPLFj.d.cts +0 -659
  86. package/dist/fontEmbed-3YhUPLFj.d.cts.map +0 -1
  87. package/dist/fontEmbed-DlVnVCZU.d.mts +0 -659
  88. package/dist/fontEmbed-DlVnVCZU.d.mts.map +0 -1
  89. package/dist/fontSubset-5SLWMmEw.cjs +0 -518
  90. package/dist/fontSubset-BGFDIMmT.mjs +0 -495
  91. package/dist/index-B4S61WjK.d.mts +0 -6507
  92. package/dist/index-B4S61WjK.d.mts.map +0 -1
  93. package/dist/index-xfJP6Ycm.d.cts +0 -6507
  94. package/dist/index-xfJP6Ycm.d.cts.map +0 -1
  95. package/dist/libdeflateWasm-CcA1W04G.mjs +0 -220
  96. package/dist/libdeflateWasm-DLw-I1CY.cjs +0 -237
  97. package/dist/pdfCatalog-Bqq4FiLn.cjs +0 -174
  98. package/dist/pdfCatalog-CnKMAtIo.mjs +0 -139
  99. package/dist/pdfDocument-Bc_vAO74.d.cts +0 -4758
  100. package/dist/pdfDocument-Bc_vAO74.d.cts.map +0 -1
  101. package/dist/pdfDocument-Bi-NoyXv.d.mts +0 -4758
  102. package/dist/pdfDocument-Bi-NoyXv.d.mts.map +0 -1
  103. package/dist/pdfForm-BiyNtYem.d.mts +0 -905
  104. package/dist/pdfForm-BiyNtYem.d.mts.map +0 -1
  105. package/dist/pdfForm-SOXJ72LW.d.cts +0 -905
  106. package/dist/pdfForm-SOXJ72LW.d.cts.map +0 -1
  107. package/dist/pdfPage-BJIE5hc6.mjs +0 -8180
  108. package/dist/pdfPage-C_tjEjj1.cjs +0 -8893
  109. package/dist/pngEmbed-CGi7cym7.mjs +0 -552
  110. package/dist/pngEmbed-CTn9IeNB.cjs +0 -563
  111. package/dist/rolldown-runtime-CKhH4XqG.cjs +0 -24
  112. package/dist/src-QZWP21qF.mjs +0 -16243
  113. package/dist/src-lFqJHb1C.cjs +0 -17274
package/README.md CHANGED
@@ -15,8 +15,8 @@ Create, parse, fill, merge, sign, and manipulate PDF documents<br />in Node, Den
15
15
 
16
16
  [![npm version](https://img.shields.io/npm/v/modern-pdf-lib?style=flat-square&color=cb3837)](https://www.npmjs.com/package/modern-pdf-lib)
17
17
  [![bundle size](https://img.shields.io/badge/gzip-36kb_core-blue?style=flat-square)](https://bundlephobia.com/package/modern-pdf-lib)
18
- [![tests](https://img.shields.io/badge/tests-5%2C135_passing-brightgreen?style=flat-square)](#)
19
- [![TypeScript](https://img.shields.io/badge/TypeScript-6.0-3178c6?style=flat-square&logo=typescript&logoColor=white)](#)
18
+ [![tests](https://img.shields.io/badge/tests-6%2C302_passing-brightgreen?style=flat-square)](#)
19
+ [![TypeScript](https://img.shields.io/badge/TypeScript-7.0-3178c6?style=flat-square&logo=typescript&logoColor=white)](#)
20
20
  [![License: MIT](https://img.shields.io/badge/license-MIT-yellow?style=flat-square)](LICENSE)
21
21
 
22
22
  <br />
@@ -107,9 +107,11 @@ For environments without ES module support, use the IIFE bundle which exposes a
107
107
  - Automatic font subsetting
108
108
  - JPEG / PNG image embedding
109
109
  - Image optimization (JPEG recompression, dedup, grayscale)
110
- - RGB, CMYK, grayscale colors
110
+ - RGB, CMYK, grayscale, spot, DeviceN colors
111
111
  - Linear & radial gradients, tiling patterns
112
112
  - Text layout (multiline, combed, auto-size)
113
+ - Header/footer engine with templates
114
+ - Advanced text layout (Knuth-Plass, hyphenation)
113
115
 
114
116
  </td>
115
117
  <td width="50%" valign="top">
@@ -137,7 +139,8 @@ For environments without ES module support, use the IIFE bundle which exposes a
137
139
  - PDF/A-1b through PDF/A-3u validation
138
140
  - Tagged PDF / PDF/UA accessibility
139
141
  - Structure tree & marked content
140
- - Redaction with content removal
142
+ - Redaction with content removal & overlay
143
+ - PDF/UA validation & auto-enforcement
141
144
 
142
145
  </td>
143
146
  <td width="50%" valign="top">
@@ -156,6 +159,8 @@ For environments without ES module support, use the IIFE bundle which exposes a
156
159
  - Linearization (fast web view)
157
160
  - Browser helpers (download, blob, data URL)
158
161
  - Service Worker & Web Worker support
162
+ - Batch processing with memory pressure handling
163
+ - Spot colors (Separation) & DeviceN
159
164
  - CLI: `npx modern-pdf optimize`
160
165
 
161
166
  </td>
@@ -182,7 +187,7 @@ For environments without ES module support, use the IIFE bundle which exposes a
182
187
  <td align="center">CJS (with ESM wrapper)</td></tr>
183
188
 
184
189
  <tr><td><strong>TypeScript</strong></td>
185
- <td align="center">6.0 strict</td>
190
+ <td align="center">7.0 strict</td>
186
191
  <td align="center">3.x</td></tr>
187
192
 
188
193
  <tr><td><strong>Parse existing PDFs</strong></td>
@@ -269,6 +274,14 @@ For environments without ES module support, use the IIFE bundle which exposes a
269
274
  <td align="center">9 formats (QR, EAN, Code 128, PDF417…)</td>
270
275
  <td align="center">No</td></tr>
271
276
 
277
+ <tr><td><strong>Spot / DeviceN colors</strong></td>
278
+ <td align="center">Separation, multi-ink, conversion</td>
279
+ <td align="center">No</td></tr>
280
+
281
+ <tr><td><strong>Header / footer engine</strong></td>
282
+ <td align="center">Templates, page numbers, dates</td>
283
+ <td align="center">No</td></tr>
284
+
272
285
  <tr><td><strong>Table layout</strong></td>
273
286
  <td align="center">Spanning, pagination, presets, overflow</td>
274
287
  <td align="center">No</td></tr>
@@ -301,7 +314,7 @@ For environments without ES module support, use the IIFE bundle which exposes a
301
314
 
302
315
  | Runtime | Version | Status |
303
316
  |:---|:---|:---:|
304
- | **Node.js** | 25.7+ | Fully supported |
317
+ | **Node.js** | 26.4+ | Fully supported |
305
318
  | **Deno** | 1.40+ | Fully supported |
306
319
  | **Bun** | 1.0+ | Fully supported |
307
320
  | **Cloudflare Workers** | &mdash; | Fully supported |
@@ -380,10 +393,11 @@ form.flatten(); // Burn values into page content
380
393
  <summary><strong>Merge & Split</strong></summary>
381
394
 
382
395
  ```ts
383
- import { mergePdfs, splitPdf, copyPages } from 'modern-pdf-lib';
396
+ import { loadPdf, mergePdfs, splitPdf } from 'modern-pdf-lib';
384
397
 
385
- const merged = await mergePdfs([pdf1Bytes, pdf2Bytes]);
386
- const pages = await splitPdf(pdfBytes, [
398
+ // mergePdfs / splitPdf operate on PdfDocument objects — load the bytes first.
399
+ const merged = await mergePdfs([await loadPdf(pdf1Bytes), await loadPdf(pdf2Bytes)]);
400
+ const pages = await splitPdf(await loadPdf(pdfBytes), [
387
401
  { start: 0, end: 4 }, // Pages 1-5
388
402
  { start: 5, end: 9 }, // Pages 6-10
389
403
  ]);
@@ -394,11 +408,13 @@ const pages = await splitPdf(pdfBytes, [
394
408
  <summary><strong>Encryption</strong> &mdash; AES-256, RC4, permissions</summary>
395
409
 
396
410
  ```ts
397
- const bytes = await doc.save({
411
+ // Configure encryption with doc.encrypt(), then save().
412
+ await doc.encrypt({
398
413
  userPassword: 'reader',
399
414
  ownerPassword: 'admin',
400
415
  permissions: { printing: true, copying: false },
401
416
  });
417
+ const bytes = await doc.save();
402
418
  ```
403
419
  </details>
404
420
 
@@ -426,11 +442,12 @@ const results = await verifySignatures(signed);
426
442
  <summary><strong>Text Extraction</strong></summary>
427
443
 
428
444
  ```ts
429
- import { loadPdf, extractTextWithPositions } from 'modern-pdf-lib';
445
+ import { loadPdf, parseContentStream, extractTextWithPositions } from 'modern-pdf-lib';
430
446
 
431
447
  const doc = await loadPdf(pdfBytes);
432
448
  const page = doc.getPage(0);
433
- const items = extractTextWithPositions(page.getOperators(), page.getResources());
449
+ const operators = parseContentStream(page.getContentStream());
450
+ const items = extractTextWithPositions(operators);
434
451
 
435
452
  for (const item of items) {
436
453
  console.log(`"${item.text}" at (${item.x}, ${item.y})`);
@@ -511,7 +528,7 @@ page.drawQrCode('https://example.com', { x: 50, y: 700, size: 120 });
511
528
  import { encodeCode128, encodeEan13, renderStyledBarcode } from 'modern-pdf-lib';
512
529
 
513
530
  const barcode = encodeCode128('ABC-12345');
514
- const ops = renderStyledBarcode(barcode, { x: 50, y: 500, height: 60 });
531
+ const ops = renderStyledBarcode(barcode, 50, 500, 'ABC-12345', { height: 60 });
515
532
  ```
516
533
  </details>
517
534
 
@@ -604,7 +621,7 @@ modern-pdf-lib/
604
621
  metadata/ XMP metadata, viewer preferences
605
622
  wasm/ Rust crate sources (6 modules)
606
623
  cli/ CLI tool (modern-pdf optimize)
607
- tests/ 4,282 tests across 199 suites
624
+ tests/ 6,302 tests across 265 suites
608
625
  docs/ VitePress documentation
609
626
  ```
610
627
 
@@ -616,8 +633,8 @@ modern-pdf-lib/
616
633
  git clone https://github.com/ABCrimson/modern-pdf-lib.git
617
634
  cd modern-pdf-lib
618
635
  npm install
619
- npm test # 4,282 tests
620
- npm run typecheck # TypeScript 6.0 strict
636
+ npm test # 6,302 tests
637
+ npm run typecheck # TypeScript 7.0 strict
621
638
  npm run build # ESM + CJS + declarations
622
639
  ```
623
640
 
@@ -1,8 +1,7 @@
1
- const require_rolldown_runtime = require('./rolldown-runtime-CKhH4XqG.cjs');
2
- const require_pdfObjects = require('./pdfObjects-1veop1_d.cjs');
3
- const require_imageExtract = require('./imageExtract-zEb1gnkb.cjs');
4
- const require_grayscaleDetect = require('./grayscaleDetect-C2m-eEXR.cjs');
5
-
1
+ const require_rolldown_runtime = require("./rolldown-runtime-ak5kbic3.cjs");
2
+ const require_pdfObjects = require("./pdfObjects-BcPlSI0a.cjs");
3
+ const require_imageExtract = require("./imageExtract-DQomHJiA.cjs");
4
+ const require_grayscaleDetect = require("./grayscaleDetect-DAUqxjgR.cjs");
6
5
  //#region src/assets/image/iccProfile.ts
7
6
  /**
8
7
  * @module assets/image/iccProfile
@@ -90,13 +89,14 @@ function parseIccDescription(data) {
90
89
  if (descLen === 0) return void 0;
91
90
  const strEnd = Math.min(tagOffset + 12 + descLen - 1, tagOffset + tagSize);
92
91
  if (strEnd <= tagOffset + 12) return void 0;
93
- const chars = [];
94
- for (let j = tagOffset + 12; j < strEnd; j++) {
95
- const c = data[j];
96
- if (c === 0) break;
97
- chars.push(String.fromCharCode(c));
92
+ let nullIdx = strEnd;
93
+ for (let j = tagOffset + 12; j < strEnd; j++) if (data[j] === 0) {
94
+ nullIdx = j;
95
+ break;
98
96
  }
99
- return chars.length > 0 ? chars.join("") : void 0;
97
+ const strBytes = data.subarray(tagOffset + 12, nullIdx);
98
+ if (strBytes.length === 0) return void 0;
99
+ return new TextDecoder("ascii").decode(strBytes);
100
100
  }
101
101
  }
102
102
  /**
@@ -197,7 +197,6 @@ function embedIccProfile(profile, registry) {
197
197
  const stream = new require_pdfObjects.PdfStream(dict, profile.data);
198
198
  return registry.register(stream);
199
199
  }
200
-
201
200
  //#endregion
202
201
  //#region src/assets/image/batchOptimize.ts
203
202
  var batchOptimize_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({ optimizeAllImages: () => optimizeAllImages });
@@ -255,8 +254,8 @@ async function optimizeAllImages(doc, options = {}) {
255
254
  const chromaSubsampling = options.chromaSubsampling ?? "4:2:0";
256
255
  const concurrency = Math.max(1, options.concurrency ?? 1);
257
256
  const { pageRange, minImageSize, colorSpaces, namePattern } = options;
258
- const { encodeJpegWasm, isJpegWasmReady } = await Promise.resolve().then(() => require("./bridge-DMEuGtfn.cjs")).then((n) => n.bridge_exports);
259
- const { decodeJpegWasm } = await Promise.resolve().then(() => require("./bridge-DMEuGtfn.cjs")).then((n) => n.bridge_exports);
257
+ const { encodeJpegWasm, isJpegWasmReady } = await Promise.resolve().then(() => require("./bridge-ByvzPu5h.cjs")).then((n) => n.bridge_exports);
258
+ const { decodeJpegWasm } = await Promise.resolve().then(() => require("./bridge-ByvzPu5h.cjs")).then((n) => n.bridge_exports);
260
259
  const images = require_imageExtract.extractImages(doc);
261
260
  const registry = doc.getRegistry();
262
261
  const results = new Array(images.length);
@@ -302,15 +301,16 @@ async function optimizeAllImages(doc, options = {}) {
302
301
  const expectedLen = img.width * img.height * channels;
303
302
  if (pixels.length !== expectedLen) return skip(false, `Pixel data length mismatch: got ${pixels.length}, expected ${expectedLen}`);
304
303
  if (channels === 4 && img.colorSpace === "DeviceCMYK") {
305
- const rgb = new Uint8Array(img.width * img.height * 3);
306
- for (let i = 0; i < img.width * img.height; i++) {
307
- const c = pixels[i * 4] / 255;
308
- const m = pixels[i * 4 + 1] / 255;
309
- const y = pixels[i * 4 + 2] / 255;
310
- const k = pixels[i * 4 + 3] / 255;
311
- rgb[i * 3] = Math.round(255 * (1 - c) * (1 - k));
312
- rgb[i * 3 + 1] = Math.round(255 * (1 - m) * (1 - k));
313
- rgb[i * 3 + 2] = Math.round(255 * (1 - y) * (1 - k));
304
+ const pixelCount = img.width * img.height;
305
+ const rgb = new Uint8Array(pixelCount * 3);
306
+ for (let i = 0; i < pixelCount; i++) {
307
+ const ci = 255 - pixels[i * 4];
308
+ const mi = 255 - pixels[i * 4 + 1];
309
+ const yi = 255 - pixels[i * 4 + 2];
310
+ const ki = 255 - pixels[i * 4 + 3];
311
+ rgb[i * 3] = (ci * ki + 127) / 255 | 0;
312
+ rgb[i * 3 + 1] = (mi * ki + 127) / 255 | 0;
313
+ rgb[i * 3 + 2] = (yi * ki + 127) / 255 | 0;
314
314
  }
315
315
  pixels = rgb;
316
316
  channels = 3;
@@ -386,42 +386,42 @@ async function optimizeAllImages(doc, options = {}) {
386
386
  perImage: results
387
387
  };
388
388
  }
389
-
390
389
  //#endregion
391
- Object.defineProperty(exports, 'batchOptimize_exports', {
392
- enumerable: true,
393
- get: function () {
394
- return batchOptimize_exports;
395
- }
390
+ Object.defineProperty(exports, "batchOptimize_exports", {
391
+ enumerable: true,
392
+ get: function() {
393
+ return batchOptimize_exports;
394
+ }
396
395
  });
397
- Object.defineProperty(exports, 'embedIccProfile', {
398
- enumerable: true,
399
- get: function () {
400
- return embedIccProfile;
401
- }
396
+ Object.defineProperty(exports, "embedIccProfile", {
397
+ enumerable: true,
398
+ get: function() {
399
+ return embedIccProfile;
400
+ }
402
401
  });
403
- Object.defineProperty(exports, 'extractIccProfile', {
404
- enumerable: true,
405
- get: function () {
406
- return extractIccProfile;
407
- }
402
+ Object.defineProperty(exports, "extractIccProfile", {
403
+ enumerable: true,
404
+ get: function() {
405
+ return extractIccProfile;
406
+ }
408
407
  });
409
- Object.defineProperty(exports, 'optimizeAllImages', {
410
- enumerable: true,
411
- get: function () {
412
- return optimizeAllImages;
413
- }
408
+ Object.defineProperty(exports, "optimizeAllImages", {
409
+ enumerable: true,
410
+ get: function() {
411
+ return optimizeAllImages;
412
+ }
414
413
  });
415
- Object.defineProperty(exports, 'parseIccColorSpace', {
416
- enumerable: true,
417
- get: function () {
418
- return parseIccColorSpace;
419
- }
414
+ Object.defineProperty(exports, "parseIccColorSpace", {
415
+ enumerable: true,
416
+ get: function() {
417
+ return parseIccColorSpace;
418
+ }
420
419
  });
421
- Object.defineProperty(exports, 'parseIccDescription', {
422
- enumerable: true,
423
- get: function () {
424
- return parseIccDescription;
425
- }
420
+ Object.defineProperty(exports, "parseIccDescription", {
421
+ enumerable: true,
422
+ get: function() {
423
+ return parseIccDescription;
424
+ }
426
425
  });
427
- //# sourceMappingURL=batchOptimize-C1W3O68Q.cjs.map
426
+
427
+ //# sourceMappingURL=batchOptimize-Ba5ehwoI.cjs.map
@@ -1,8 +1,7 @@
1
- import { Gs as __exportAll } from "./index-B4S61WjK.d.mts";
2
- import { i as PdfName, l as PdfStream, o as PdfNumber, r as PdfDict, t as PdfArray } from "./pdfObjects-uEsWlfzU.mjs";
3
- import { n as extractImages, t as decodeImageStream } from "./imageExtract-Dnk_Ssv7.mjs";
4
- import { n as isGrayscaleImage, t as convertToGrayscale } from "./grayscaleDetect-C6kFF3dk.mjs";
5
-
1
+ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
2
+ import { i as PdfName, l as PdfStream, o as PdfNumber, r as PdfDict, t as PdfArray } from "./pdfObjects-CB7TEdbW.mjs";
3
+ import { n as extractImages, t as decodeImageStream } from "./imageExtract-DV-zq4h3.mjs";
4
+ import { n as isGrayscaleImage, t as convertToGrayscale } from "./grayscaleDetect-6GJrgBRT.mjs";
6
5
  //#region src/assets/image/iccProfile.ts
7
6
  /**
8
7
  * @module assets/image/iccProfile
@@ -90,13 +89,14 @@ function parseIccDescription(data) {
90
89
  if (descLen === 0) return void 0;
91
90
  const strEnd = Math.min(tagOffset + 12 + descLen - 1, tagOffset + tagSize);
92
91
  if (strEnd <= tagOffset + 12) return void 0;
93
- const chars = [];
94
- for (let j = tagOffset + 12; j < strEnd; j++) {
95
- const c = data[j];
96
- if (c === 0) break;
97
- chars.push(String.fromCharCode(c));
92
+ let nullIdx = strEnd;
93
+ for (let j = tagOffset + 12; j < strEnd; j++) if (data[j] === 0) {
94
+ nullIdx = j;
95
+ break;
98
96
  }
99
- return chars.length > 0 ? chars.join("") : void 0;
97
+ const strBytes = data.subarray(tagOffset + 12, nullIdx);
98
+ if (strBytes.length === 0) return void 0;
99
+ return new TextDecoder("ascii").decode(strBytes);
100
100
  }
101
101
  }
102
102
  /**
@@ -197,7 +197,6 @@ function embedIccProfile(profile, registry) {
197
197
  const stream = new PdfStream(dict, profile.data);
198
198
  return registry.register(stream);
199
199
  }
200
-
201
200
  //#endregion
202
201
  //#region src/assets/image/batchOptimize.ts
203
202
  var batchOptimize_exports = /* @__PURE__ */ __exportAll({ optimizeAllImages: () => optimizeAllImages });
@@ -255,8 +254,8 @@ async function optimizeAllImages(doc, options = {}) {
255
254
  const chromaSubsampling = options.chromaSubsampling ?? "4:2:0";
256
255
  const concurrency = Math.max(1, options.concurrency ?? 1);
257
256
  const { pageRange, minImageSize, colorSpaces, namePattern } = options;
258
- const { encodeJpegWasm, isJpegWasmReady } = await import("./bridge-DaS-gzEd.mjs").then((n) => n.t);
259
- const { decodeJpegWasm } = await import("./bridge-DaS-gzEd.mjs").then((n) => n.t);
257
+ const { encodeJpegWasm, isJpegWasmReady } = await import("./bridge-7dhURZj7.mjs").then((n) => n.t);
258
+ const { decodeJpegWasm } = await import("./bridge-7dhURZj7.mjs").then((n) => n.t);
260
259
  const images = extractImages(doc);
261
260
  const registry = doc.getRegistry();
262
261
  const results = new Array(images.length);
@@ -302,15 +301,16 @@ async function optimizeAllImages(doc, options = {}) {
302
301
  const expectedLen = img.width * img.height * channels;
303
302
  if (pixels.length !== expectedLen) return skip(false, `Pixel data length mismatch: got ${pixels.length}, expected ${expectedLen}`);
304
303
  if (channels === 4 && img.colorSpace === "DeviceCMYK") {
305
- const rgb = new Uint8Array(img.width * img.height * 3);
306
- for (let i = 0; i < img.width * img.height; i++) {
307
- const c = pixels[i * 4] / 255;
308
- const m = pixels[i * 4 + 1] / 255;
309
- const y = pixels[i * 4 + 2] / 255;
310
- const k = pixels[i * 4 + 3] / 255;
311
- rgb[i * 3] = Math.round(255 * (1 - c) * (1 - k));
312
- rgb[i * 3 + 1] = Math.round(255 * (1 - m) * (1 - k));
313
- rgb[i * 3 + 2] = Math.round(255 * (1 - y) * (1 - k));
304
+ const pixelCount = img.width * img.height;
305
+ const rgb = new Uint8Array(pixelCount * 3);
306
+ for (let i = 0; i < pixelCount; i++) {
307
+ const ci = 255 - pixels[i * 4];
308
+ const mi = 255 - pixels[i * 4 + 1];
309
+ const yi = 255 - pixels[i * 4 + 2];
310
+ const ki = 255 - pixels[i * 4 + 3];
311
+ rgb[i * 3] = (ci * ki + 127) / 255 | 0;
312
+ rgb[i * 3 + 1] = (mi * ki + 127) / 255 | 0;
313
+ rgb[i * 3 + 2] = (yi * ki + 127) / 255 | 0;
314
314
  }
315
315
  pixels = rgb;
316
316
  channels = 3;
@@ -386,7 +386,7 @@ async function optimizeAllImages(doc, options = {}) {
386
386
  perImage: results
387
387
  };
388
388
  }
389
-
390
389
  //#endregion
391
390
  export { parseIccColorSpace as a, extractIccProfile as i, optimizeAllImages as n, parseIccDescription as o, embedIccProfile as r, batchOptimize_exports as t };
392
- //# sourceMappingURL=batchOptimize-BCJEEN8J.mjs.map
391
+
392
+ //# sourceMappingURL=batchOptimize-KB1k9LFg.mjs.map
@@ -1,5 +1,4 @@
1
- import { Gs as __exportAll } from "./index-B4S61WjK.d.mts";
2
-
1
+ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
3
2
  //#region src/wasm/jpeg/bridge.ts
4
3
  var bridge_exports = /* @__PURE__ */ __exportAll({
5
4
  decodeJpegWasm: () => decodeJpegWasm,
@@ -22,7 +21,7 @@ async function initJpegWasm(wasmSource) {
22
21
  wasmModule = wasmSource;
23
22
  return;
24
23
  }
25
- const { loadWasmModule: loadWasm } = await import("./loader-CVB-c_3Z.mjs").then((n) => n.l);
24
+ const { loadWasmModule: loadWasm } = await import("./loader-DkrXz-h4.mjs").then((n) => n.l);
26
25
  const wasmBytes = await loadWasm("jpeg");
27
26
  wasmModule = (await WebAssembly.instantiate(wasmBytes.buffer, { env: {} })).instance.exports;
28
27
  } catch {
@@ -97,7 +96,7 @@ function decodeJpegWasm(jpegBytes) {
97
96
  return;
98
97
  }
99
98
  }
100
-
101
99
  //#endregion
102
100
  export { isJpegWasmReady as a, initJpegWasm as i, decodeJpegWasm as n, encodeJpegWasm as r, bridge_exports as t };
103
- //# sourceMappingURL=bridge-DaS-gzEd.mjs.map
101
+
102
+ //# sourceMappingURL=bridge-7dhURZj7.mjs.map
@@ -1,7 +1,5 @@
1
- const require_rolldown_runtime = require('./rolldown-runtime-CKhH4XqG.cjs');
2
-
3
1
  //#region src/wasm/jpeg/bridge.ts
4
- var bridge_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
2
+ var bridge_exports = /* @__PURE__ */ require("./rolldown-runtime-ak5kbic3.cjs").__exportAll({
5
3
  decodeJpegWasm: () => decodeJpegWasm,
6
4
  encodeJpegWasm: () => encodeJpegWasm,
7
5
  initJpegWasm: () => initJpegWasm,
@@ -22,7 +20,7 @@ async function initJpegWasm(wasmSource) {
22
20
  wasmModule = wasmSource;
23
21
  return;
24
22
  }
25
- const { loadWasmModule: loadWasm } = await Promise.resolve().then(() => require("./loader-DYCH3n7d.cjs")).then((n) => n.loader_exports);
23
+ const { loadWasmModule: loadWasm } = await Promise.resolve().then(() => require("./loader-DR7H0XOf.cjs")).then((n) => n.loader_exports);
26
24
  const wasmBytes = await loadWasm("jpeg");
27
25
  wasmModule = (await WebAssembly.instantiate(wasmBytes.buffer, { env: {} })).instance.exports;
28
26
  } catch {
@@ -97,36 +95,36 @@ function decodeJpegWasm(jpegBytes) {
97
95
  return;
98
96
  }
99
97
  }
100
-
101
98
  //#endregion
102
- Object.defineProperty(exports, 'bridge_exports', {
103
- enumerable: true,
104
- get: function () {
105
- return bridge_exports;
106
- }
99
+ Object.defineProperty(exports, "bridge_exports", {
100
+ enumerable: true,
101
+ get: function() {
102
+ return bridge_exports;
103
+ }
107
104
  });
108
- Object.defineProperty(exports, 'decodeJpegWasm', {
109
- enumerable: true,
110
- get: function () {
111
- return decodeJpegWasm;
112
- }
105
+ Object.defineProperty(exports, "decodeJpegWasm", {
106
+ enumerable: true,
107
+ get: function() {
108
+ return decodeJpegWasm;
109
+ }
113
110
  });
114
- Object.defineProperty(exports, 'encodeJpegWasm', {
115
- enumerable: true,
116
- get: function () {
117
- return encodeJpegWasm;
118
- }
111
+ Object.defineProperty(exports, "encodeJpegWasm", {
112
+ enumerable: true,
113
+ get: function() {
114
+ return encodeJpegWasm;
115
+ }
119
116
  });
120
- Object.defineProperty(exports, 'initJpegWasm', {
121
- enumerable: true,
122
- get: function () {
123
- return initJpegWasm;
124
- }
117
+ Object.defineProperty(exports, "initJpegWasm", {
118
+ enumerable: true,
119
+ get: function() {
120
+ return initJpegWasm;
121
+ }
125
122
  });
126
- Object.defineProperty(exports, 'isJpegWasmReady', {
127
- enumerable: true,
128
- get: function () {
129
- return isJpegWasmReady;
130
- }
123
+ Object.defineProperty(exports, "isJpegWasmReady", {
124
+ enumerable: true,
125
+ get: function() {
126
+ return isJpegWasmReady;
127
+ }
131
128
  });
132
- //# sourceMappingURL=bridge-DMEuGtfn.cjs.map
129
+
130
+ //# sourceMappingURL=bridge-ByvzPu5h.cjs.map