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.
- package/README.md +33 -16
- package/dist/{batchOptimize-C1W3O68Q.cjs → batchOptimize-Ba5ehwoI.cjs} +55 -55
- package/dist/{batchOptimize-BCJEEN8J.mjs → batchOptimize-KB1k9LFg.mjs} +25 -25
- package/dist/{bridge-DaS-gzEd.mjs → bridge-7dhURZj7.mjs} +4 -5
- package/dist/{bridge-DMEuGtfn.cjs → bridge-ByvzPu5h.cjs} +29 -31
- package/dist/browser.cjs +291 -154
- package/dist/browser.d.cts +166 -166
- package/dist/browser.d.cts.map +1 -1
- package/dist/browser.d.mts +166 -166
- package/dist/browser.d.mts.map +1 -1
- package/dist/browser.mjs +15 -19
- package/dist/cli/index.cjs +7 -7
- package/dist/cli/index.mjs +8 -8
- package/dist/{compressionAnalysis-CwknBtqx.mjs → compressionAnalysis-BEd_745I.mjs} +55 -69
- package/dist/{compressionAnalysis-Ch7t-HXn.d.mts → compressionAnalysis-CyBVhRU5.d.cts} +136 -136
- package/dist/compressionAnalysis-CyBVhRU5.d.cts.map +1 -0
- package/dist/{compressionAnalysis-B-FPzgzw.cjs → compressionAnalysis-DwxVCe4E.cjs} +85 -99
- package/dist/{compressionAnalysis-Dgv1TtHJ.d.cts → compressionAnalysis-InMeGrqw.d.mts} +136 -136
- package/dist/compressionAnalysis-InMeGrqw.d.mts.map +1 -0
- package/dist/create.cjs +21 -23
- package/dist/create.d.cts +2 -2
- package/dist/create.d.mts +2 -2
- package/dist/create.mjs +3 -5
- package/dist/{deduplicateImages-DIon68zB.mjs → deduplicateImages-Ba7RZ_sx.mjs} +4 -5
- package/dist/{deduplicateImages-cKsnD6Ep.cjs → deduplicateImages-CYFpiEch.cjs} +14 -15
- package/dist/{fieldAppearance-C8PoLFSc.d.mts → fieldAppearance-Df1262CT.d.cts} +44 -44
- package/dist/fieldAppearance-Df1262CT.d.cts.map +1 -0
- package/dist/{fieldAppearance-CdiGFG5e.d.cts → fieldAppearance-_CZdoUCD.d.mts} +44 -44
- package/dist/fieldAppearance-_CZdoUCD.d.mts.map +1 -0
- package/dist/fontEmbed-DxtdZxUj.d.cts +677 -0
- package/dist/fontEmbed-DxtdZxUj.d.cts.map +1 -0
- package/dist/fontEmbed-N-VWoZ0F.d.mts +677 -0
- package/dist/fontEmbed-N-VWoZ0F.d.mts.map +1 -0
- package/dist/forms.cjs +3 -4
- package/dist/forms.d.cts +2 -2
- package/dist/forms.d.mts +2 -2
- package/dist/forms.mjs +2 -3
- package/dist/{grayscaleDetect-C6kFF3dk.mjs → grayscaleDetect-6GJrgBRT.mjs} +3 -3
- package/dist/{grayscaleDetect-C2m-eEXR.cjs → grayscaleDetect-DAUqxjgR.cjs} +13 -14
- package/dist/{imageExtract-zEb1gnkb.cjs → imageExtract-DQomHJiA.cjs} +13 -14
- package/dist/{imageExtract-Dnk_Ssv7.mjs → imageExtract-DV-zq4h3.mjs} +3 -4
- package/dist/index-5Fv1-Z-p.d.mts +10238 -0
- package/dist/index-5Fv1-Z-p.d.mts.map +1 -0
- package/dist/index-_Onej9Wy.d.cts +10238 -0
- package/dist/index-_Onej9Wy.d.cts.map +1 -0
- package/dist/index.cjs +291 -153
- package/dist/index.d.cts +7 -7
- package/dist/index.d.mts +7 -7
- package/dist/index.mjs +14 -17
- package/dist/{layout-CrqeJBMI.mjs → layout-D035GpU8.mjs} +50 -12
- package/dist/{layout-DQh05VP-.cjs → layout-DiO_3JLh.cjs} +184 -134
- package/dist/{loader-DYCH3n7d.cjs → loader-DR7H0XOf.cjs} +332 -66
- package/dist/{loader-CVB-c_3Z.mjs → loader-DkrXz-h4.mjs} +248 -12
- package/dist/parse.cjs +7 -8
- package/dist/parse.d.cts +3 -3
- package/dist/parse.d.mts +3 -3
- package/dist/parse.mjs +6 -7
- package/dist/pdfDocument-5Do0LKQh.d.cts +5181 -0
- package/dist/pdfDocument-5Do0LKQh.d.cts.map +1 -0
- package/dist/{pdfDocument-D7aFSQEY.mjs → pdfDocument-B6czyaVI.mjs} +10874 -871
- package/dist/pdfDocument-B_0VSUHL.d.mts +5181 -0
- package/dist/pdfDocument-B_0VSUHL.d.mts.map +1 -0
- package/dist/{pdfDocument-D9uYNSb-.cjs → pdfDocument-BaQlOkYr.cjs} +20665 -9846
- package/dist/{pdfForm-BpqDGp29.cjs → pdfForm-BVS_do95.cjs} +112 -107
- package/dist/pdfForm-Ca86NDWn.d.cts +897 -0
- package/dist/pdfForm-Ca86NDWn.d.cts.map +1 -0
- package/dist/pdfForm-Ca86NDWn.d.mts +897 -0
- package/dist/pdfForm-Ca86NDWn.d.mts.map +1 -0
- package/dist/{pdfForm-C3mC9FoQ.mjs → pdfForm-CfLnlsj-.mjs} +22 -17
- package/dist/{pdfObjects-1veop1_d.cjs → pdfObjects-BcPlSI0a.cjs} +62 -53
- package/dist/{pdfObjects-uEsWlfzU.mjs → pdfObjects-CB7TEdbW.mjs} +12 -2
- package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
- package/dist/rolldown-runtime-ak5kbic3.cjs +18 -0
- package/dist/src-BOzRFaEE.mjs +27888 -0
- package/dist/src-vNbsqoIy.cjs +29669 -0
- package/dist/{streamDecode-Bj568Nc9.mjs → streamDecode-DCpgTocN.mjs} +143 -151
- package/dist/{streamDecode-CvgErkFu.cjs → streamDecode-kQ-REV7v.cjs} +164 -160
- package/package.json +33 -24
- package/dist/compressionAnalysis-Ch7t-HXn.d.mts.map +0 -1
- package/dist/compressionAnalysis-Dgv1TtHJ.d.cts.map +0 -1
- package/dist/fflateAdapter-DuNiByKx.mjs +0 -196
- package/dist/fflateAdapter-LTAeAhaD.cjs +0 -207
- package/dist/fieldAppearance-C8PoLFSc.d.mts.map +0 -1
- package/dist/fieldAppearance-CdiGFG5e.d.cts.map +0 -1
- package/dist/fontEmbed-3YhUPLFj.d.cts +0 -659
- package/dist/fontEmbed-3YhUPLFj.d.cts.map +0 -1
- package/dist/fontEmbed-DlVnVCZU.d.mts +0 -659
- package/dist/fontEmbed-DlVnVCZU.d.mts.map +0 -1
- package/dist/fontSubset-5SLWMmEw.cjs +0 -518
- package/dist/fontSubset-BGFDIMmT.mjs +0 -495
- package/dist/index-B4S61WjK.d.mts +0 -6507
- package/dist/index-B4S61WjK.d.mts.map +0 -1
- package/dist/index-xfJP6Ycm.d.cts +0 -6507
- package/dist/index-xfJP6Ycm.d.cts.map +0 -1
- package/dist/libdeflateWasm-CcA1W04G.mjs +0 -220
- package/dist/libdeflateWasm-DLw-I1CY.cjs +0 -237
- package/dist/pdfCatalog-Bqq4FiLn.cjs +0 -174
- package/dist/pdfCatalog-CnKMAtIo.mjs +0 -139
- package/dist/pdfDocument-Bc_vAO74.d.cts +0 -4758
- package/dist/pdfDocument-Bc_vAO74.d.cts.map +0 -1
- package/dist/pdfDocument-Bi-NoyXv.d.mts +0 -4758
- package/dist/pdfDocument-Bi-NoyXv.d.mts.map +0 -1
- package/dist/pdfForm-BiyNtYem.d.mts +0 -905
- package/dist/pdfForm-BiyNtYem.d.mts.map +0 -1
- package/dist/pdfForm-SOXJ72LW.d.cts +0 -905
- package/dist/pdfForm-SOXJ72LW.d.cts.map +0 -1
- package/dist/pdfPage-BJIE5hc6.mjs +0 -8180
- package/dist/pdfPage-C_tjEjj1.cjs +0 -8893
- package/dist/pngEmbed-CGi7cym7.mjs +0 -552
- package/dist/pngEmbed-CTn9IeNB.cjs +0 -563
- package/dist/rolldown-runtime-CKhH4XqG.cjs +0 -24
- package/dist/src-QZWP21qF.mjs +0 -16243
- 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
|
[](https://www.npmjs.com/package/modern-pdf-lib)
|
|
17
17
|
[](https://bundlephobia.com/package/modern-pdf-lib)
|
|
18
|
-
[](#)
|
|
19
|
+
[](#)
|
|
20
20
|
[](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">
|
|
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** |
|
|
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** | — | 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
|
|
396
|
+
import { loadPdf, mergePdfs, splitPdf } from 'modern-pdf-lib';
|
|
384
397
|
|
|
385
|
-
|
|
386
|
-
const
|
|
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> — AES-256, RC4, permissions</summary>
|
|
395
409
|
|
|
396
410
|
```ts
|
|
397
|
-
|
|
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
|
|
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,
|
|
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/
|
|
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 #
|
|
620
|
-
npm run typecheck # TypeScript
|
|
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(
|
|
2
|
-
const require_pdfObjects = require(
|
|
3
|
-
const require_imageExtract = require(
|
|
4
|
-
const require_grayscaleDetect = require(
|
|
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
|
-
|
|
94
|
-
for (let j = tagOffset + 12; j < strEnd; j++) {
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
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-
|
|
259
|
-
const { decodeJpegWasm } = await Promise.resolve().then(() => require("./bridge-
|
|
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
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
const
|
|
309
|
-
const
|
|
310
|
-
const
|
|
311
|
-
|
|
312
|
-
rgb[i * 3
|
|
313
|
-
rgb[i * 3 +
|
|
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,
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
390
|
+
Object.defineProperty(exports, "batchOptimize_exports", {
|
|
391
|
+
enumerable: true,
|
|
392
|
+
get: function() {
|
|
393
|
+
return batchOptimize_exports;
|
|
394
|
+
}
|
|
396
395
|
});
|
|
397
|
-
Object.defineProperty(exports,
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
396
|
+
Object.defineProperty(exports, "embedIccProfile", {
|
|
397
|
+
enumerable: true,
|
|
398
|
+
get: function() {
|
|
399
|
+
return embedIccProfile;
|
|
400
|
+
}
|
|
402
401
|
});
|
|
403
|
-
Object.defineProperty(exports,
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
402
|
+
Object.defineProperty(exports, "extractIccProfile", {
|
|
403
|
+
enumerable: true,
|
|
404
|
+
get: function() {
|
|
405
|
+
return extractIccProfile;
|
|
406
|
+
}
|
|
408
407
|
});
|
|
409
|
-
Object.defineProperty(exports,
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
408
|
+
Object.defineProperty(exports, "optimizeAllImages", {
|
|
409
|
+
enumerable: true,
|
|
410
|
+
get: function() {
|
|
411
|
+
return optimizeAllImages;
|
|
412
|
+
}
|
|
414
413
|
});
|
|
415
|
-
Object.defineProperty(exports,
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
414
|
+
Object.defineProperty(exports, "parseIccColorSpace", {
|
|
415
|
+
enumerable: true,
|
|
416
|
+
get: function() {
|
|
417
|
+
return parseIccColorSpace;
|
|
418
|
+
}
|
|
420
419
|
});
|
|
421
|
-
Object.defineProperty(exports,
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
420
|
+
Object.defineProperty(exports, "parseIccDescription", {
|
|
421
|
+
enumerable: true,
|
|
422
|
+
get: function() {
|
|
423
|
+
return parseIccDescription;
|
|
424
|
+
}
|
|
426
425
|
});
|
|
427
|
-
|
|
426
|
+
|
|
427
|
+
//# sourceMappingURL=batchOptimize-Ba5ehwoI.cjs.map
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { i as PdfName, l as PdfStream, o as PdfNumber, r as PdfDict, t as PdfArray } from "./pdfObjects-
|
|
3
|
-
import { n as extractImages, t as decodeImageStream } from "./imageExtract-
|
|
4
|
-
import { n as isGrayscaleImage, t as convertToGrayscale } from "./grayscaleDetect-
|
|
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
|
-
|
|
94
|
-
for (let j = tagOffset + 12; j < strEnd; j++) {
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
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-
|
|
259
|
-
const { decodeJpegWasm } = await import("./bridge-
|
|
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
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
const
|
|
309
|
-
const
|
|
310
|
-
const
|
|
311
|
-
|
|
312
|
-
rgb[i * 3
|
|
313
|
-
rgb[i * 3 +
|
|
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
|
-
|
|
391
|
+
|
|
392
|
+
//# sourceMappingURL=batchOptimize-KB1k9LFg.mjs.map
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
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-
|
|
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
|
-
|
|
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__ */
|
|
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-
|
|
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,
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
99
|
+
Object.defineProperty(exports, "bridge_exports", {
|
|
100
|
+
enumerable: true,
|
|
101
|
+
get: function() {
|
|
102
|
+
return bridge_exports;
|
|
103
|
+
}
|
|
107
104
|
});
|
|
108
|
-
Object.defineProperty(exports,
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
105
|
+
Object.defineProperty(exports, "decodeJpegWasm", {
|
|
106
|
+
enumerable: true,
|
|
107
|
+
get: function() {
|
|
108
|
+
return decodeJpegWasm;
|
|
109
|
+
}
|
|
113
110
|
});
|
|
114
|
-
Object.defineProperty(exports,
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
111
|
+
Object.defineProperty(exports, "encodeJpegWasm", {
|
|
112
|
+
enumerable: true,
|
|
113
|
+
get: function() {
|
|
114
|
+
return encodeJpegWasm;
|
|
115
|
+
}
|
|
119
116
|
});
|
|
120
|
-
Object.defineProperty(exports,
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
117
|
+
Object.defineProperty(exports, "initJpegWasm", {
|
|
118
|
+
enumerable: true,
|
|
119
|
+
get: function() {
|
|
120
|
+
return initJpegWasm;
|
|
121
|
+
}
|
|
125
122
|
});
|
|
126
|
-
Object.defineProperty(exports,
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
123
|
+
Object.defineProperty(exports, "isJpegWasmReady", {
|
|
124
|
+
enumerable: true,
|
|
125
|
+
get: function() {
|
|
126
|
+
return isJpegWasmReady;
|
|
127
|
+
}
|
|
131
128
|
});
|
|
132
|
-
|
|
129
|
+
|
|
130
|
+
//# sourceMappingURL=bridge-ByvzPu5h.cjs.map
|