modern-pdf-lib 0.15.1 → 0.22.9

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 (95) hide show
  1. package/README.md +119 -9
  2. package/dist/batchOptimize-Ba_pWw71.cjs +427 -0
  3. package/dist/batchOptimize-CxyY4fZe.mjs +392 -0
  4. package/dist/{bridge-DpzMOnHd.mjs → bridge-DTH5LMAK.mjs} +3 -3
  5. package/dist/{bridge-DN7BOHRW.cjs → bridge-DYCQzxF7.cjs} +2 -2
  6. package/dist/browser.cjs +621 -0
  7. package/dist/browser.d.cts +190 -0
  8. package/dist/browser.d.cts.map +1 -0
  9. package/dist/browser.d.mts +190 -0
  10. package/dist/browser.d.mts.map +1 -0
  11. package/dist/browser.mjs +212 -0
  12. package/dist/cli/index.cjs +40 -18
  13. package/dist/cli/index.mjs +40 -18
  14. package/dist/compressionAnalysis-B84FPXaQ.cjs +1525 -0
  15. package/dist/compressionAnalysis-BBv4BkQP.d.mts +261 -0
  16. package/dist/compressionAnalysis-BBv4BkQP.d.mts.map +1 -0
  17. package/dist/compressionAnalysis-ChkscEa1.mjs +1490 -0
  18. package/dist/compressionAnalysis-CtJ2X9l2.d.cts +261 -0
  19. package/dist/compressionAnalysis-CtJ2X9l2.d.cts.map +1 -0
  20. package/dist/create.cjs +35 -0
  21. package/dist/create.d.cts +3 -0
  22. package/dist/create.d.mts +3 -0
  23. package/dist/create.mjs +5 -0
  24. package/dist/{deduplicateImages-BfpjHY9b.mjs → deduplicateImages-CmTeo6Tx.mjs} +3 -3
  25. package/dist/{deduplicateImages-BtJ5tlrr.cjs → deduplicateImages-cKsnD6Ep.cjs} +2 -2
  26. package/dist/{fflateAdapter-D2mv_ttM.mjs → fflateAdapter-CBQpGTlx.mjs} +2 -2
  27. package/dist/{fflateAdapter-cT4YeY_h.cjs → fflateAdapter-LTAeAhaD.cjs} +1 -1
  28. package/dist/fieldAppearance-C8PoLFSc.d.mts +136 -0
  29. package/dist/fieldAppearance-C8PoLFSc.d.mts.map +1 -0
  30. package/dist/fieldAppearance-CdiGFG5e.d.cts +136 -0
  31. package/dist/fieldAppearance-CdiGFG5e.d.cts.map +1 -0
  32. package/dist/fontEmbed-Dsu9fo4U.d.mts +636 -0
  33. package/dist/fontEmbed-Dsu9fo4U.d.mts.map +1 -0
  34. package/dist/fontEmbed-LID6yG6g.d.cts +636 -0
  35. package/dist/fontEmbed-LID6yG6g.d.cts.map +1 -0
  36. package/dist/{fontSubset-BxsF9Tu5.cjs → fontSubset-5SLWMmEw.cjs} +1 -1
  37. package/dist/{fontSubset-ClyTXlhY.mjs → fontSubset-DWpduoY2.mjs} +2 -2
  38. package/dist/forms.cjs +13 -0
  39. package/dist/forms.d.cts +3 -0
  40. package/dist/forms.d.mts +3 -0
  41. package/dist/forms.mjs +3 -0
  42. package/dist/grayscaleDetect-C2m-eEXR.cjs +96 -0
  43. package/dist/grayscaleDetect-C6kFF3dk.mjs +84 -0
  44. package/dist/imageExtract-Dnk_Ssv7.mjs +155 -0
  45. package/dist/imageExtract-zEb1gnkb.cjs +166 -0
  46. package/dist/index-BtYOx5wh.d.mts +4904 -0
  47. package/dist/index-BtYOx5wh.d.mts.map +1 -0
  48. package/dist/index-bpktKzCA.d.cts +4904 -0
  49. package/dist/index-bpktKzCA.d.cts.map +1 -0
  50. package/dist/index.cjs +274 -20704
  51. package/dist/index.d.cts +7 -9151
  52. package/dist/index.d.mts +7 -9151
  53. package/dist/index.mjs +17 -20532
  54. package/dist/layout-CuAVk_Or.cjs +563 -0
  55. package/dist/layout-DgX_0jfK.mjs +438 -0
  56. package/dist/{libdeflateWasm-Cg7cWHOq.cjs → libdeflateWasm-BdiDEJOj.cjs} +2 -2
  57. package/dist/{libdeflateWasm-Cmxa-yiS.mjs → libdeflateWasm-rLppXytE.mjs} +3 -3
  58. package/dist/loader-3u6Tw5T-.mjs +328 -0
  59. package/dist/loader-I4zdkoWc.cjs +393 -0
  60. package/dist/parse.cjs +24 -0
  61. package/dist/parse.d.cts +4 -0
  62. package/dist/parse.d.mts +4 -0
  63. package/dist/parse.mjs +7 -0
  64. package/dist/{pdfCatalog-BcOL6QF-.cjs → pdfCatalog-CYy4NXEY.cjs} +2 -2
  65. package/dist/{pdfCatalog-CnJRovvm.mjs → pdfCatalog-IImGcMbR.mjs} +3 -3
  66. package/dist/pdfDocument-BFxHD_2u.mjs +13755 -0
  67. package/dist/pdfDocument-BSiQdNZq.d.cts +4640 -0
  68. package/dist/pdfDocument-BSiQdNZq.d.cts.map +1 -0
  69. package/dist/pdfDocument-i6U5fQ91.d.mts +4640 -0
  70. package/dist/pdfDocument-i6U5fQ91.d.mts.map +1 -0
  71. package/dist/pdfDocument-pmRXryVI.cjs +14180 -0
  72. package/dist/pdfForm-9gd40uz9.cjs +1796 -0
  73. package/dist/pdfForm-BiyNtYem.d.mts +905 -0
  74. package/dist/pdfForm-BiyNtYem.d.mts.map +1 -0
  75. package/dist/pdfForm-Cn-cVicP.mjs +1695 -0
  76. package/dist/pdfForm-SOXJ72LW.d.cts +905 -0
  77. package/dist/pdfForm-SOXJ72LW.d.cts.map +1 -0
  78. package/dist/{pdfObjects-BrU4Xd0V.cjs → pdfObjects-1veop1_d.cjs} +2 -2
  79. package/dist/{pdfObjects-DZZ2GPRW.mjs → pdfObjects-uEsWlfzU.mjs} +2 -2
  80. package/dist/{pdfPage-Dm5XC_g_.mjs → pdfPage-Cd8e7flb.mjs} +3024 -5
  81. package/dist/{pdfPage-Dz_SVKUS.cjs → pdfPage-Cd8jOJp6.cjs} +3046 -3
  82. package/dist/{pngEmbed-I1hU3Y6m.mjs → pngEmbed-BLj2zi-5.mjs} +3 -3
  83. package/dist/{pngEmbed-C6M1eX6b.cjs → pngEmbed-D4X4ZN-3.cjs} +2 -2
  84. package/dist/src-6L07EQsi.cjs +11852 -0
  85. package/dist/src-Dm4aaZ8q.mjs +11103 -0
  86. package/dist/{imageExtract-vjyQyFcT.mjs → streamDecode-Bj568Nc9.mjs} +1646 -188
  87. package/dist/{imageExtract-BC7TMY98.cjs → streamDecode-CvgErkFu.cjs} +1645 -199
  88. package/package.json +33 -1
  89. package/dist/batchOptimize-ClXizv19.mjs +0 -306
  90. package/dist/batchOptimize-DYQOX1-7.cjs +0 -329
  91. package/dist/index.d.cts.map +0 -1
  92. package/dist/index.d.mts.map +0 -1
  93. package/dist/loader-B6VIrZOJ.mjs +0 -164
  94. package/dist/loader-DdB5Xo5D.cjs +0 -166
  95. package/dist/rolldown-runtime-95iHPtFO.mjs +0 -18
@@ -0,0 +1,212 @@
1
+ import { $ as translate, $t as setCharacterSpacing, A as buildAnnotationDict, At as curveToFinal, B as wrapInMarkedContent, Bt as rectangle, C as parseSvg, Ct as clip, D as AnnotationFlags, Dt as closeFillEvenOddAndStroke, E as parseSvgTransform, Et as closeFillAndStroke, F as beginMarkedContentSequence, Ft as fillAndStroke, G as radiansToDegrees, Gt as setLineWidth, H as degrees, Ht as setFlatness, I as beginMarkedContentWithProperties, It as fillEvenOdd, J as rotationMatrix, Jt as beginText, K as restoreState, Kt as setMiterLimit, L as createMarkedContentScope, Lt as fillEvenOddAndStroke, M as beginArtifact, Mt as ellipsePath, N as beginArtifactWithType, Nt as endPath, O as PdfAnnotation, Ot as closePath, P as beginMarkedContent, Pt as fill, Q as skew, Qt as nextLine, R as endArtifact, Rt as lineTo, S as svgToPdfOperators, St as circlePath, T as parseSvgPath, Tt as closeAndStroke, U as degreesToRadians, Ut as setLineCap, V as concatMatrix, Vt as setDashPattern, W as radians, Wt as setLineJoin, X as scale, Xt as moveText, Y as saveState, Yt as endText, Z as setGraphicsState, Zt as moveTextSetLeading, _ as PdfLayer, _t as setStrokeColorSpace, a as renderMultiPageTable, an as setTextRise, at as grayscale, b as endLayerContent, bt as drawImageXObject, c as qrCodeToOperators, cn as showTextArray, ct as setFillColor, d as linearGradient, dn as showTextWithSpacing, dt as setFillColorRgb, en as setFont, et as applyFillColor, f as radialGradient, ft as setFillingColor, g as markForRedaction, gt as setStrokeColorRgb, h as getRedactionMarks, ht as setStrokeColorGray, in as setTextRenderingMode, it as componentsToColor, j as createAnnotation, jt as curveToInitial, k as annotationFromDict, kt as curveTo, l as buildGradientObjects, ln as showTextHex, lt as setFillColorCmyk, m as applyRedactions, mt as setStrokeColorCmyk, n as PdfPage, nn as setLeading, nt as cmyk, o as renderTable, on as setWordSpacing, ot as rgb, p as tilingPattern, pt as setStrokeColor, q as rotate, qt as stroke, rn as setTextMatrix, rt as colorToComponents, s as encodeQrCode, sn as showText, st as setColorSpace, t as PageSizes, tn as setFontSize, tt as applyStrokeColor, u as buildPatternObjects, un as showTextNextLine, ut as setFillColorGray, v as PdfLayerManager, vt as setStrokingColor, w as parseSvgColor, wt as clipEvenOdd, x as drawSvgOnPage, xt as drawXObject, y as beginLayerContent, yt as drawImageWithMatrix, z as endMarkedContent, zt as moveTo } from "./pdfPage-Cd8e7flb.mjs";
2
+ import { a as PdfNull, c as PdfRef, i as PdfName, l as PdfStream, n as PdfBool, o as PdfNumber, r as PdfDict, s as PdfObjectRegistry, t as PdfArray, u as PdfString } from "./pdfObjects-uEsWlfzU.mjs";
3
+ import { a as formatPdfDate, i as buildPageTree, n as buildDocumentStructure, r as buildInfoDict, t as buildCatalog } from "./pdfCatalog-IImGcMbR.mjs";
4
+ import { $ as sha384, A as prepareForSigning, B as buildViewerPreferencesDict, C as encodeSet, D as computeSignatureHash, F as isAccessible, G as PdfOutlineItem, H as buildXmpMetadata, I as summarizeIssues, J as PdfEncryptionHandler, K as PdfOutlineTree, L as PdfStructureElement, M as mergePdfs, N as splitPdf, O as embedSignature, P as checkAccessibility, Q as sha256, R as PdfStructureTree, S as encodeSequence, T as encodeUtf8String, U as createXmpStream, V as parseViewerPreferences, W as parseXmpMetadata, X as verifyOwnerPassword, Y as computeFileEncryptionKey, Z as verifyUserPassword, _ as encodeInteger, _t as serializePdf, a as addWatermark, at as rc4, b as encodeOctetString, c as buildEmbeddedFilesNameTree, ct as base64Encode, d as verifySignatures, dt as isOpenTypeCFF, et as sha512, f as getSignatures, ft as isTrueType, g as encodeContextTag, gt as PdfWriter, ht as PdfStreamWriter, i as embedPageAsFormXObject, it as aesEncryptCBC, j as copyPages, k as findSignatures, l as getAttachments, lt as PdfParseError, m as buildPkcs7Signature, mt as extractMetrics, n as StandardFonts, nt as encodePermissions, o as addWatermarkToPage, ot as md5, p as signPdf, pt as EmbeddedFont, q as loadPdf, r as createPdf, rt as aesDecryptCBC, s as attachFile, st as base64Decode, t as PdfDocument, tt as decodePermissions, u as verifySignature, ut as formatHexContext, v as encodeLength, w as encodeUTCTime, x as encodePrintableString, y as encodeOID, z as PdfViewerPreferences } from "./pdfDocument-BFxHD_2u.mjs";
5
+ import { _ as PdfField, a as PdfDropdownField, c as PdfTextField, d as generateDropdownAppearance, f as generateListboxAppearance, g as FieldFlags, h as generateTextAppearance, i as PdfListboxField, l as generateButtonAppearance, m as generateSignatureAppearance, n as PdfSignatureField, o as PdfRadioGroup, p as generateRadioAppearance, r as PdfButtonField, s as PdfCheckboxField, t as PdfForm, u as generateCheckboxAppearance } from "./pdfForm-Cn-cVicP.mjs";
6
+ import { t as decodeStream } from "./streamDecode-Bj568Nc9.mjs";
7
+ import { $ as encodeCode128Values, $t as PdfFreeTextAnnotation, A as readEan13, At as flattenTransparency, B as upcAToOperators, Bt as PdfPopupAnnotation, C as borderedPreset, Ct as generateWinAnsiToUnicodeCmap, D as readBarcode, Dt as SRGB_ICC_PROFILE, E as stripedPreset, Et as buildOutputIntent, F as pdf417ToOperators, Ft as buildTimestampRequest, G as encodeEan8, Gt as PdfLineAnnotation, H as ean13ToOperators, Ht as PdfInkAnnotation, I as dataMatrixToOperators, It as parseTimestampResponse, J as code39ToOperators, Jt as PdfSquareAnnotation, K as encodeItf, Kt as PdfPolyLineAnnotation, L as encodeDataMatrix, Lt as requestTimestamp, M as calculateBarcodeDimensions, Mt as validatePdfA, N as renderStyledBarcode, Nt as isLinearized, O as readCode128, Ot as generateSrgbIccProfile, P as encodePdf417, Pt as linearizePdf, Q as encodeCode128, Qt as PdfUnderlineAnnotation, R as calculateUpcCheckDigit, Rt as PdfFileAttachmentAnnotation, S as applyTablePreset, St as generateSymbolToUnicodeCmap, T as professionalPreset, Tt as getToUnicodeCmap, U as ean8ToOperators, Ut as PdfStampAnnotation, V as calculateEanCheckDigit, Vt as PdfRedactAnnotation, W as encodeEan13, Wt as PdfCircleAnnotation, X as encodeCode39, Xt as PdfSquigglyAnnotation, Y as computeCode39CheckDigit, Yt as PdfHighlightAnnotation, Z as code128ToOperators, Zt as PdfStrikeOutAnnotation, _ as estimateTextWidth, _n as asPDFNumber, _t as parseXmpMetadata$1, a as FieldAlreadyExistsError, an as generateSquareAppearance, at as downscaleImage, b as wrapText, bt as getSupportedLevels, c as ForeignPageError, cn as generateUnderlineAppearance, ct as recompressImage, d as NoSuchFieldError, dn as PDFOperator, dt as generatePdfAXmpBytes, en as generateCircleAppearance, et as valuesToModules, f as RemovePageFromEmptyDocumentError, fn as ChangeTracker, ft as countOccurrences, g as ellipsisText, gn as asPDFName, gt as extractXmpMetadata, h as applyOverflow, hn as asNumber, ht as createAssociatedFile, i as ExceededMaxLengthError, in as generateLineAppearance, it as analyzeJpegMarkers, j as readEan8, jt as enforcePdfA, k as readCode39, kt as detectTransparency, l as InvalidFieldNamePartError, ln as PdfLinkAnnotation, lt as enforcePdfAFull, m as UnexpectedFieldTypeError, mn as saveIncremental, mt as buildAfArray, n as CombedTextLayoutError, nn as generateHighlightAppearance, nt as extractJpegMetadata, o as FieldExistsAsNonTerminalError, on as generateSquigglyAppearance, ot as estimateJpegQuality, p as RichTextFieldReadError, pn as saveDocumentIncremental, pt as stripProhibitedFeatures, q as itfToOperators, qt as PdfPolygonAnnotation, r as EncryptedPdfError, rn as generateInkAppearance, rt as injectJpegMetadata, s as FontNotEmbeddedError, sn as generateStrikeOutAppearance, st as optimizeImage, t as initWasm, tn as generateFreeTextAppearance, tt as PdfWorker, u as MissingOnValueCheckError, un as PdfTextAnnotation, ut as generatePdfAXmp, v as shrinkFontSize, vt as validateXmpMetadata, w as minimalPreset, wt as generateZapfDingbatsToUnicodeCmap, x as applyPreset, xt as isValidLevel, y as truncateText, yt as getProfile, z as encodeUpcA, zt as PdfCaretAnnotation } from "./src-Dm4aaZ8q.mjs";
8
+ import { _ as LineCapStyle, a as cropPage, b as TextAlignment, c as movePage, d as resizePage, f as reversePages, g as ImageAlignment, h as BlendMode, i as layoutSinglelineText, l as removePage, m as rotatePage, n as layoutCombedText, o as getPageSize, p as rotateAllPages, r as layoutMultilineText, s as insertPage, t as computeFontSize, u as removePages, v as LineJoinStyle, x as TextRenderingMode, y as ParseSpeeds } from "./layout-DgX_0jfK.mjs";
9
+ import { a as extractText, i as parseContentStream, n as computeImageDpi, o as extractTextWithPositions, r as computeTargetDimensions, t as analyzeImages } from "./compressionAnalysis-ChkscEa1.mjs";
10
+ import { a as isJpegWasmReady, i as initJpegWasm, n as decodeJpegWasm, r as encodeJpegWasm } from "./bridge-DTH5LMAK.mjs";
11
+ import { n as extractImages, t as decodeImageStream } from "./imageExtract-Dnk_Ssv7.mjs";
12
+ import { n as isGrayscaleImage, t as convertToGrayscale } from "./grayscaleDetect-C6kFF3dk.mjs";
13
+ import { a as parseIccColorSpace, i as extractIccProfile, n as optimizeAllImages, o as parseIccDescription, r as embedIccProfile } from "./batchOptimize-CxyY4fZe.mjs";
14
+ import { t as deduplicateImages } from "./deduplicateImages-CmTeo6Tx.mjs";
15
+ import { a as isWasmDisabled, c as loadWasmModuleStreaming, d as resetWasmLoader, i as instantiateWasmModuleStreaming, n as configureWasmLoader, o as isWasmModuleCached, r as detectRuntime, s as loadWasmModule, t as clearWasmCache, u as provideWasmBytes } from "./loader-3u6Tw5T-.mjs";
16
+
17
+ //#region src/browser/serviceWorker.ts
18
+ /**
19
+ * Handle a fetch request by generating a PDF and returning it as a
20
+ * {@link Response} with appropriate headers.
21
+ *
22
+ * This is a convenience wrapper that catches errors from the handler
23
+ * and returns a 500 response with the error message instead of
24
+ * letting the Service Worker fail silently.
25
+ *
26
+ * @param request - The incoming {@link Request} (used for context;
27
+ * currently informational).
28
+ * @param handler - An async function that receives the `modern-pdf-lib`
29
+ * module and returns PDF bytes.
30
+ * @returns A {@link Response} with `content-type: application/pdf`.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * self.addEventListener('fetch', (event) => {
35
+ * event.respondWith(
36
+ * handlePdfRequest(event.request, async (pdf) => {
37
+ * const doc = pdf.createPdf();
38
+ * doc.addPage();
39
+ * return doc.save();
40
+ * }),
41
+ * );
42
+ * });
43
+ * ```
44
+ */
45
+ async function handlePdfRequest(_request, handler) {
46
+ try {
47
+ return createPdfResponse(await handler(await import("./index.mjs")));
48
+ } catch (err) {
49
+ const message = err instanceof Error ? err.message : String(err);
50
+ return new Response(`PDF generation failed: ${message}`, {
51
+ status: 500,
52
+ headers: { "content-type": "text/plain; charset=utf-8" }
53
+ });
54
+ }
55
+ }
56
+ /**
57
+ * Wrap raw PDF bytes in a {@link Response} with the correct
58
+ * `Content-Type` and optional `Content-Disposition` headers.
59
+ *
60
+ * @param bytes - The PDF file contents as a `Uint8Array`.
61
+ * @param filename - If provided, a `Content-Disposition: attachment`
62
+ * header is added so browsers prompt a download.
63
+ * @returns A ready-to-send {@link Response}.
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * const bytes = doc.save();
68
+ * const response = createPdfResponse(bytes, 'invoice.pdf');
69
+ * ```
70
+ */
71
+ function createPdfResponse(bytes, filename) {
72
+ const headers = {
73
+ "content-type": "application/pdf",
74
+ "content-length": String(bytes.byteLength)
75
+ };
76
+ if (filename) headers["content-disposition"] = `attachment; filename="${filename}"`;
77
+ return new Response(bytes, {
78
+ status: 200,
79
+ headers
80
+ });
81
+ }
82
+ /**
83
+ * Check whether the Cache API is available in the current context.
84
+ *
85
+ * In Service Workers the Cache API (`caches`) is typically available,
86
+ * but this helper guards against edge cases (e.g., opaque origins,
87
+ * disabled storage, or running outside a Service Worker).
88
+ *
89
+ * @returns `true` if `caches` is defined and accessible.
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * if (isCacheAvailable()) {
94
+ * const cache = await caches.open('pdf-cache');
95
+ * await cache.put(request, response.clone());
96
+ * }
97
+ * ```
98
+ */
99
+ function isCacheAvailable() {
100
+ try {
101
+ return typeof caches !== "undefined" && typeof caches.open === "function";
102
+ } catch {
103
+ return false;
104
+ }
105
+ }
106
+
107
+ //#endregion
108
+ //#region src/browser/download.ts
109
+ /**
110
+ * Browser utilities for saving and displaying PDF documents.
111
+ *
112
+ * These helpers convert raw PDF bytes into browser-native formats
113
+ * for downloading, embedding, and previewing.
114
+ *
115
+ * @module browser/download
116
+ */
117
+ /**
118
+ * Trigger a browser file download for PDF bytes.
119
+ *
120
+ * Creates a temporary `<a>` element with a Blob URL and clicks it
121
+ * to start the download. The Blob URL is revoked after the download
122
+ * starts.
123
+ *
124
+ * @param bytes - The PDF document bytes.
125
+ * @param filename - Download filename (defaults to `'document.pdf'`).
126
+ *
127
+ * @example
128
+ * ```ts
129
+ * import { createPdf, saveAsDownload } from 'modern-pdf-lib/browser';
130
+ *
131
+ * const doc = createPdf();
132
+ * doc.addPage().drawText('Hello!', { x: 50, y: 750, size: 24 });
133
+ * const bytes = await doc.save();
134
+ * saveAsDownload(bytes, 'hello.pdf');
135
+ * ```
136
+ */
137
+ function saveAsDownload(bytes, filename = "document.pdf") {
138
+ const blob = new Blob([bytes], { type: "application/pdf" });
139
+ const url = URL.createObjectURL(blob);
140
+ const a = document.createElement("a");
141
+ a.href = url;
142
+ a.download = filename;
143
+ document.body.appendChild(a);
144
+ a.click();
145
+ document.body.removeChild(a);
146
+ queueMicrotask(() => URL.revokeObjectURL(url));
147
+ }
148
+ /**
149
+ * Convert PDF bytes to a Blob.
150
+ *
151
+ * Useful for uploading PDFs via `fetch()` or `FormData`, or for
152
+ * passing to other browser APIs that accept Blobs.
153
+ *
154
+ * @param bytes - The PDF document bytes.
155
+ * @returns A Blob with MIME type `application/pdf`.
156
+ *
157
+ * @example
158
+ * ```ts
159
+ * const blob = saveAsBlob(bytes);
160
+ * const formData = new FormData();
161
+ * formData.append('document', blob, 'report.pdf');
162
+ * await fetch('/upload', { method: 'POST', body: formData });
163
+ * ```
164
+ */
165
+ function saveAsBlob(bytes) {
166
+ return new Blob([bytes], { type: "application/pdf" });
167
+ }
168
+ /**
169
+ * Create an object URL for PDF bytes.
170
+ *
171
+ * The returned URL can be used as the `src` of an `<iframe>` or
172
+ * `<embed>` element to preview the PDF in the browser.
173
+ *
174
+ * **Important:** Call `URL.revokeObjectURL(url)` when you're done
175
+ * with the URL to free memory.
176
+ *
177
+ * @param bytes - The PDF document bytes.
178
+ * @returns A `blob:` URL string.
179
+ *
180
+ * @example
181
+ * ```ts
182
+ * const url = saveAsDataUrl(bytes);
183
+ * const iframe = document.getElementById('preview') as HTMLIFrameElement;
184
+ * iframe.src = url;
185
+ * // Later: URL.revokeObjectURL(url);
186
+ * ```
187
+ */
188
+ function saveAsDataUrl(bytes) {
189
+ return URL.createObjectURL(new Blob([bytes], { type: "application/pdf" }));
190
+ }
191
+ /**
192
+ * Open a PDF in a new browser tab/window.
193
+ *
194
+ * @param bytes - The PDF document bytes.
195
+ * @param target - Window target (defaults to `'_blank'`).
196
+ * @returns The opened window reference, or `null` if blocked by popup blocker.
197
+ *
198
+ * @example
199
+ * ```ts
200
+ * openInNewTab(bytes);
201
+ * ```
202
+ */
203
+ function openInNewTab(bytes, target = "_blank") {
204
+ const url = URL.createObjectURL(new Blob([bytes], { type: "application/pdf" }));
205
+ const win = globalThis.open(url, target);
206
+ setTimeout(() => URL.revokeObjectURL(url), 6e4);
207
+ return win;
208
+ }
209
+
210
+ //#endregion
211
+ export { AnnotationFlags, BlendMode, ChangeTracker, CombedTextLayoutError, EmbeddedFont, EncryptedPdfError, ExceededMaxLengthError, FieldAlreadyExistsError, FieldExistsAsNonTerminalError, FieldFlags, FontNotEmbeddedError, ForeignPageError, ImageAlignment, InvalidFieldNamePartError, LineCapStyle, LineJoinStyle, MissingOnValueCheckError, NoSuchFieldError, PDFOperator, PageSizes, ParseSpeeds, PdfAnnotation, PdfArray, PdfBool, PdfButtonField, PdfCaretAnnotation, PdfCheckboxField, PdfCircleAnnotation, PdfDict, PdfDocument, PdfDropdownField, PdfEncryptionHandler, PdfField, PdfFileAttachmentAnnotation, PdfForm, PdfFreeTextAnnotation, PdfHighlightAnnotation, PdfInkAnnotation, PdfLayer, PdfLayerManager, PdfLineAnnotation, PdfLinkAnnotation, PdfListboxField, PdfName, PdfNull, PdfNumber, PdfObjectRegistry, PdfOutlineItem, PdfOutlineTree, PdfPage, PdfParseError, PdfPolyLineAnnotation, PdfPolygonAnnotation, PdfPopupAnnotation, PdfRadioGroup, PdfRedactAnnotation, PdfRef, PdfSignatureField, PdfSquareAnnotation, PdfSquigglyAnnotation, PdfStampAnnotation, PdfStream, PdfStreamWriter, PdfStrikeOutAnnotation, PdfString, PdfStructureElement, PdfStructureTree, PdfTextAnnotation, PdfTextField, PdfUnderlineAnnotation, PdfViewerPreferences, PdfWorker, PdfWriter, RemovePageFromEmptyDocumentError, RichTextFieldReadError, SRGB_ICC_PROFILE, StandardFonts, TextAlignment, TextRenderingMode, UnexpectedFieldTypeError, addWatermark, addWatermarkToPage, aesDecryptCBC, aesEncryptCBC, analyzeImages, analyzeJpegMarkers, annotationFromDict, applyFillColor, applyOverflow, applyPreset, applyRedactions, applyStrokeColor, applyTablePreset, asNumber, asPDFName, asPDFNumber, attachFile, base64Decode, base64Encode, beginArtifact, beginArtifactWithType, beginLayerContent, beginMarkedContent, beginMarkedContentSequence, beginMarkedContentWithProperties, beginText, borderedPreset, buildAfArray, buildAnnotationDict, buildCatalog, buildDocumentStructure, buildEmbeddedFilesNameTree, buildGradientObjects, buildInfoDict, buildOutputIntent, buildPageTree, buildPatternObjects, buildPkcs7Signature, buildTimestampRequest, buildViewerPreferencesDict, buildXmpMetadata, calculateBarcodeDimensions, calculateEanCheckDigit, calculateUpcCheckDigit, checkAccessibility, circlePath, clearWasmCache, clipEvenOdd, clip as clipOp, closeAndStroke, closeFillAndStroke, closeFillEvenOddAndStroke, closePath as closePathOp, cmyk, code128ToOperators, code39ToOperators, colorToComponents, componentsToColor, computeCode39CheckDigit, computeFileEncryptionKey, computeFontSize, computeImageDpi, computeSignatureHash, computeTargetDimensions, concatMatrix, concatMatrix as concatTransformationMatrix, configureWasmLoader, convertToGrayscale, copyPages, countOccurrences, createAnnotation, createAssociatedFile, createMarkedContentScope, createPdf, createPdfResponse, createXmpStream, cropPage, curveToFinal, curveToInitial, curveTo as curveToOp, dataMatrixToOperators, decodeImageStream, decodeJpegWasm, decodePermissions, decodeStream, deduplicateImages, degrees, degreesToRadians, detectRuntime, detectTransparency, downscaleImage, drawImageWithMatrix, drawImageXObject, drawXObject as drawObject, drawXObject, drawSvgOnPage, ean13ToOperators, ean8ToOperators, ellipsePath, ellipsisText, embedIccProfile, embedPageAsFormXObject, embedSignature, encodeCode128, encodeCode128Values, encodeCode39, encodeContextTag, encodeDataMatrix, encodeEan13, encodeEan8, encodeInteger, encodeItf, encodeJpegWasm, encodeLength, encodeOID, encodeOctetString, encodePdf417, encodePermissions, encodePrintableString, encodeQrCode, encodeSequence, encodeSet, encodeUTCTime, encodeUpcA, encodeUtf8String, endArtifact, endLayerContent, endMarkedContent, endPath as endPathOp, endText, enforcePdfA, enforcePdfAFull, estimateJpegQuality, estimateTextWidth, extractIccProfile, extractImages, extractJpegMetadata, extractMetrics, extractText, extractTextWithPositions, extractXmpMetadata, fillAndStroke as fillAndStrokeOp, fillEvenOdd, fillEvenOddAndStroke, fill as fillOp, findSignatures, flattenTransparency, formatHexContext, formatPdfDate, generateButtonAppearance, generateCheckboxAppearance, generateCircleAppearance, generateDropdownAppearance, generateFreeTextAppearance, generateHighlightAppearance, generateInkAppearance, generateLineAppearance, generateListboxAppearance, generatePdfAXmp, generatePdfAXmpBytes, generateRadioAppearance, generateSignatureAppearance, generateSquareAppearance, generateSquigglyAppearance, generateSrgbIccProfile, generateStrikeOutAppearance, generateSymbolToUnicodeCmap, generateTextAppearance, generateUnderlineAppearance, generateWinAnsiToUnicodeCmap, generateZapfDingbatsToUnicodeCmap, getAttachments, getPageSize, getProfile, getRedactionMarks, getSignatures, getSupportedLevels, getToUnicodeCmap, grayscale, handlePdfRequest, initJpegWasm, initWasm, injectJpegMetadata, insertPage, instantiateWasmModuleStreaming, isAccessible, isCacheAvailable, isGrayscaleImage, isJpegWasmReady, isLinearized, isOpenTypeCFF, isTrueType, isValidLevel, isWasmDisabled, isWasmModuleCached, itfToOperators, layoutCombedText, layoutMultilineText, layoutSinglelineText, lineTo as lineToOp, linearGradient, linearizePdf, loadPdf, loadWasmModule, loadWasmModuleStreaming, markForRedaction, md5, mergePdfs, minimalPreset, movePage, moveText as moveTextOp, moveTextSetLeading, moveTo as moveToOp, nextLine as nextLineOp, openInNewTab, optimizeAllImages, optimizeImage, parseContentStream, parseIccColorSpace, parseIccDescription, parseSvg, parseSvgColor, parseSvgPath, parseSvgTransform, parseTimestampResponse, parseViewerPreferences, parseXmpMetadata, parseXmpMetadata$1 as parseXmpPdfAMetadata, pdf417ToOperators, restoreState as popGraphicsState, restoreState, prepareForSigning, professionalPreset, provideWasmBytes, saveState as pushGraphicsState, saveState, qrCodeToOperators, radialGradient, radians, radiansToDegrees, rc4, readBarcode, readCode128, readCode39, readEan13, readEan8, recompressImage, rectangle as rectangleOp, removePage, removePages, renderMultiPageTable, renderStyledBarcode, renderTable, requestTimestamp, resetWasmLoader, resizePage, reversePages, rgb, rotateAllPages, rotate as rotateOp, rotatePage, rotationMatrix, saveAsBlob, saveAsDataUrl, saveAsDownload, saveDocumentIncremental, saveIncremental, scale as scaleOp, serializePdf, setCharacterSpacing as setCharacterSpacingOp, setCharacterSpacing as setCharacterSqueeze, setColorSpace, setDashPattern as setDashPatternOp, setFillColor, setFillColorCmyk, setFillColorGray, setFillColorRgb, setFillingColor, setFlatness, setFont as setFontAndSize, setFont as setFontOp, setFontSize as setFontSizeOp, setGraphicsState as setGraphicsStateOp, setLeading as setLeadingOp, setLeading as setLineHeight, setLineCap as setLineCapOp, setLineJoin as setLineJoinOp, setLineWidth as setLineWidthOp, setMiterLimit, setStrokeColor, setStrokeColorCmyk, setStrokeColorGray, setStrokeColorRgb, setStrokeColorSpace, setStrokingColor, setTextMatrix as setTextMatrixOp, setTextRenderingMode as setTextRenderingModeOp, setTextRise as setTextRiseOp, setWordSpacing as setWordSpacingOp, sha256, sha384, sha512, showTextArray, showTextHex, showTextNextLine, showText as showTextOp, showTextWithSpacing, shrinkFontSize, signPdf, skew as skewOp, splitPdf, stripProhibitedFeatures, stripedPreset, stroke as strokeOp, summarizeIssues, svgToPdfOperators, tilingPattern, translate as translateOp, truncateText, upcAToOperators, validatePdfA, validateXmpMetadata, valuesToModules, verifyOwnerPassword, verifySignature, verifySignatures, verifyUserPassword, wrapInMarkedContent, wrapText };
212
+ //# sourceMappingURL=browser.mjs.map
@@ -25,9 +25,9 @@ async function optimizeCommand(args) {
25
25
  process.exit(1);
26
26
  }
27
27
  const { loadPdf } = await Promise.resolve().then(() => require("../index.cjs"));
28
- const { initJpegWasm } = await Promise.resolve().then(() => require("../bridge-DN7BOHRW.cjs")).then((n) => n.bridge_exports);
29
- const { optimizeAllImages } = await Promise.resolve().then(() => require("../batchOptimize-DYQOX1-7.cjs")).then((n) => n.batchOptimize_exports);
30
- const { deduplicateImages } = await Promise.resolve().then(() => require("../deduplicateImages-BtJ5tlrr.cjs")).then((n) => n.deduplicateImages_exports);
28
+ const { initJpegWasm } = await Promise.resolve().then(() => require("../bridge-DYCQzxF7.cjs")).then((n) => n.bridge_exports);
29
+ const { optimizeAllImages } = await Promise.resolve().then(() => require("../batchOptimize-Ba_pWw71.cjs")).then((n) => n.batchOptimize_exports);
30
+ const { deduplicateImages } = await Promise.resolve().then(() => require("../deduplicateImages-cKsnD6Ep.cjs")).then((n) => n.deduplicateImages_exports);
31
31
  const inputBytes = new Uint8Array(await (0, node_fs_promises.readFile)(parsed.input));
32
32
  const inputSize = inputBytes.length;
33
33
  if (parsed.verbose) {
@@ -45,29 +45,51 @@ async function optimizeCommand(args) {
45
45
  const dedupReport = deduplicateImages(doc);
46
46
  if (parsed.verbose && dedupReport.duplicatesRemoved > 0) console.log(`Deduplication: removed ${dedupReport.duplicatesRemoved} duplicate(s), ~${formatBytes(dedupReport.bytesSaved)} saved`);
47
47
  }
48
+ const startTime = Date.now();
49
+ const onProgress = (info) => {
50
+ const elapsed = ((Date.now() - startTime) / 1e3).toFixed(1);
51
+ const pct = Math.round(info.current / info.total * 100);
52
+ const barWidth = 40;
53
+ const filled = Math.round(info.current / info.total * barWidth);
54
+ const empty = barWidth - filled;
55
+ const line = `\r ${"█".repeat(filled) + "░".repeat(empty)} ${pct}% ${info.current}/${info.total} ${info.imageName} saved:${formatBytes(info.totalSavedBytes)} ${elapsed}s`;
56
+ process.stderr.write(line.padEnd(100) + "\r");
57
+ if (parsed.verbose) {
58
+ let detail;
59
+ if (info.skipped) detail = ` ${info.imageName} (p${info.pageIndex}): SKIP`;
60
+ else {
61
+ const savedSign = info.savedBytes >= 0 ? "-" : "+";
62
+ detail = ` ${info.imageName} (p${info.pageIndex}): ${savedSign}${formatBytes(Math.abs(info.savedBytes))}`;
63
+ }
64
+ process.stderr.write("\n");
65
+ console.log(detail);
66
+ }
67
+ };
48
68
  const report = await optimizeAllImages(doc, {
49
69
  quality: parsed.quality,
50
70
  progressive: parsed.progressive,
51
71
  chromaSubsampling: parsed.chroma,
52
72
  autoGrayscale: parsed.grayscale,
53
73
  skipSmallImages: true,
54
- minSavingsPercent: 10
74
+ minSavingsPercent: 10,
75
+ onProgress
55
76
  });
56
- if (parsed.verbose) {
77
+ process.stderr.write("\r" + " ".repeat(100) + "\r");
78
+ const elapsedTotal = ((Date.now() - startTime) / 1e3).toFixed(1);
79
+ console.log("");
80
+ console.log(`Images found: ${report.totalImages}`);
81
+ console.log(`Images optimized: ${report.optimizedImages}`);
82
+ console.log(`Original size: ${formatBytes(report.originalTotalBytes)}`);
83
+ console.log(`Optimized size: ${formatBytes(report.optimizedTotalBytes)}`);
84
+ console.log(`Savings: ${report.savings.toFixed(1)}%`);
85
+ console.log(`Elapsed: ${elapsedTotal}s`);
86
+ if (parsed.verbose && report.perImage.length > 0) {
57
87
  console.log("");
58
- console.log(`Images found: ${report.totalImages}`);
59
- console.log(`Images optimized: ${report.optimizedImages}`);
60
- console.log(`Original size: ${formatBytes(report.originalTotalBytes)}`);
61
- console.log(`Optimized size: ${formatBytes(report.optimizedTotalBytes)}`);
62
- console.log(`Savings: ${report.savings.toFixed(1)}%`);
63
- if (report.perImage.length > 0) {
64
- console.log("");
65
- console.log("Per-image details:");
66
- for (const entry of report.perImage) if (entry.skipped) console.log(` ${entry.name} (p${entry.pageIndex}): SKIP — ${entry.reason}`);
67
- else {
68
- const pct = ((entry.originalSize - entry.newSize) / entry.originalSize * 100).toFixed(1);
69
- console.log(` ${entry.name} (p${entry.pageIndex}): ${formatBytes(entry.originalSize)} → ${formatBytes(entry.newSize)} (−${pct}%)`);
70
- }
88
+ console.log("Per-image details:");
89
+ for (const entry of report.perImage) if (entry.skipped) console.log(` ${entry.name} (p${entry.pageIndex}): SKIP -- ${entry.reason}`);
90
+ else {
91
+ const pct = ((entry.originalSize - entry.newSize) / entry.originalSize * 100).toFixed(1);
92
+ console.log(` ${entry.name} (p${entry.pageIndex}): ${formatBytes(entry.originalSize)} -> ${formatBytes(entry.newSize)} (-${pct}%)`);
71
93
  }
72
94
  }
73
95
  const outputBytes = await doc.save();
@@ -25,9 +25,9 @@ async function optimizeCommand(args) {
25
25
  process.exit(1);
26
26
  }
27
27
  const { loadPdf } = await import("../index.mjs");
28
- const { initJpegWasm } = await import("../bridge-DpzMOnHd.mjs").then((n) => n.t);
29
- const { optimizeAllImages } = await import("../batchOptimize-ClXizv19.mjs").then((n) => n.t);
30
- const { deduplicateImages } = await import("../deduplicateImages-BfpjHY9b.mjs").then((n) => n.n);
28
+ const { initJpegWasm } = await import("../bridge-DTH5LMAK.mjs").then((n) => n.t);
29
+ const { optimizeAllImages } = await import("../batchOptimize-CxyY4fZe.mjs").then((n) => n.t);
30
+ const { deduplicateImages } = await import("../deduplicateImages-CmTeo6Tx.mjs").then((n) => n.n);
31
31
  const inputBytes = new Uint8Array(await readFile(parsed.input));
32
32
  const inputSize = inputBytes.length;
33
33
  if (parsed.verbose) {
@@ -45,29 +45,51 @@ async function optimizeCommand(args) {
45
45
  const dedupReport = deduplicateImages(doc);
46
46
  if (parsed.verbose && dedupReport.duplicatesRemoved > 0) console.log(`Deduplication: removed ${dedupReport.duplicatesRemoved} duplicate(s), ~${formatBytes(dedupReport.bytesSaved)} saved`);
47
47
  }
48
+ const startTime = Date.now();
49
+ const onProgress = (info) => {
50
+ const elapsed = ((Date.now() - startTime) / 1e3).toFixed(1);
51
+ const pct = Math.round(info.current / info.total * 100);
52
+ const barWidth = 40;
53
+ const filled = Math.round(info.current / info.total * barWidth);
54
+ const empty = barWidth - filled;
55
+ const line = `\r ${"█".repeat(filled) + "░".repeat(empty)} ${pct}% ${info.current}/${info.total} ${info.imageName} saved:${formatBytes(info.totalSavedBytes)} ${elapsed}s`;
56
+ process.stderr.write(line.padEnd(100) + "\r");
57
+ if (parsed.verbose) {
58
+ let detail;
59
+ if (info.skipped) detail = ` ${info.imageName} (p${info.pageIndex}): SKIP`;
60
+ else {
61
+ const savedSign = info.savedBytes >= 0 ? "-" : "+";
62
+ detail = ` ${info.imageName} (p${info.pageIndex}): ${savedSign}${formatBytes(Math.abs(info.savedBytes))}`;
63
+ }
64
+ process.stderr.write("\n");
65
+ console.log(detail);
66
+ }
67
+ };
48
68
  const report = await optimizeAllImages(doc, {
49
69
  quality: parsed.quality,
50
70
  progressive: parsed.progressive,
51
71
  chromaSubsampling: parsed.chroma,
52
72
  autoGrayscale: parsed.grayscale,
53
73
  skipSmallImages: true,
54
- minSavingsPercent: 10
74
+ minSavingsPercent: 10,
75
+ onProgress
55
76
  });
56
- if (parsed.verbose) {
77
+ process.stderr.write("\r" + " ".repeat(100) + "\r");
78
+ const elapsedTotal = ((Date.now() - startTime) / 1e3).toFixed(1);
79
+ console.log("");
80
+ console.log(`Images found: ${report.totalImages}`);
81
+ console.log(`Images optimized: ${report.optimizedImages}`);
82
+ console.log(`Original size: ${formatBytes(report.originalTotalBytes)}`);
83
+ console.log(`Optimized size: ${formatBytes(report.optimizedTotalBytes)}`);
84
+ console.log(`Savings: ${report.savings.toFixed(1)}%`);
85
+ console.log(`Elapsed: ${elapsedTotal}s`);
86
+ if (parsed.verbose && report.perImage.length > 0) {
57
87
  console.log("");
58
- console.log(`Images found: ${report.totalImages}`);
59
- console.log(`Images optimized: ${report.optimizedImages}`);
60
- console.log(`Original size: ${formatBytes(report.originalTotalBytes)}`);
61
- console.log(`Optimized size: ${formatBytes(report.optimizedTotalBytes)}`);
62
- console.log(`Savings: ${report.savings.toFixed(1)}%`);
63
- if (report.perImage.length > 0) {
64
- console.log("");
65
- console.log("Per-image details:");
66
- for (const entry of report.perImage) if (entry.skipped) console.log(` ${entry.name} (p${entry.pageIndex}): SKIP — ${entry.reason}`);
67
- else {
68
- const pct = ((entry.originalSize - entry.newSize) / entry.originalSize * 100).toFixed(1);
69
- console.log(` ${entry.name} (p${entry.pageIndex}): ${formatBytes(entry.originalSize)} → ${formatBytes(entry.newSize)} (−${pct}%)`);
70
- }
88
+ console.log("Per-image details:");
89
+ for (const entry of report.perImage) if (entry.skipped) console.log(` ${entry.name} (p${entry.pageIndex}): SKIP -- ${entry.reason}`);
90
+ else {
91
+ const pct = ((entry.originalSize - entry.newSize) / entry.originalSize * 100).toFixed(1);
92
+ console.log(` ${entry.name} (p${entry.pageIndex}): ${formatBytes(entry.originalSize)} -> ${formatBytes(entry.newSize)} (-${pct}%)`);
71
93
  }
72
94
  }
73
95
  const outputBytes = await doc.save();