@cj-tech-master/excelts 9.1.0 → 9.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +16 -1
  2. package/dist/browser/modules/archive/compression/crc32.js +1 -1
  3. package/dist/browser/modules/archive/crypto/aes.d.ts +0 -8
  4. package/dist/browser/modules/archive/crypto/aes.js +1 -20
  5. package/dist/browser/modules/archive/crypto/index.d.ts +2 -1
  6. package/dist/browser/modules/archive/crypto/index.js +3 -1
  7. package/dist/browser/modules/csv/parse/row-processor.d.ts +1 -1
  8. package/dist/browser/modules/csv/worker/worker-script.generated.js +1 -1
  9. package/dist/browser/modules/excel/utils/cell-matrix.js +1 -0
  10. package/dist/browser/modules/excel/utils/encryptor.browser.d.ts +4 -5
  11. package/dist/browser/modules/excel/utils/encryptor.browser.js +7 -12
  12. package/dist/browser/modules/excel/utils/encryptor.d.ts +1 -1
  13. package/dist/browser/modules/excel/utils/encryptor.js +4 -7
  14. package/dist/browser/modules/pdf/builder/document-builder.d.ts +517 -0
  15. package/dist/browser/modules/pdf/builder/document-builder.js +1493 -0
  16. package/dist/browser/modules/pdf/builder/form-appearance.d.ts +56 -0
  17. package/dist/browser/modules/pdf/builder/form-appearance.js +140 -0
  18. package/dist/browser/modules/pdf/builder/image-utils.d.ts +39 -0
  19. package/dist/browser/modules/pdf/builder/image-utils.js +129 -0
  20. package/dist/browser/modules/pdf/builder/pdf-editor.d.ts +230 -0
  21. package/dist/browser/modules/pdf/builder/pdf-editor.js +1574 -0
  22. package/dist/browser/modules/pdf/builder/resource-merger.d.ts +41 -0
  23. package/dist/browser/modules/pdf/builder/resource-merger.js +258 -0
  24. package/dist/browser/modules/pdf/core/digital-signature.d.ts +109 -0
  25. package/dist/browser/modules/pdf/core/digital-signature.js +659 -0
  26. package/dist/browser/modules/pdf/core/encryption.js +8 -7
  27. package/dist/browser/modules/pdf/core/pdf-object.d.ts +11 -0
  28. package/dist/browser/modules/pdf/core/pdf-object.js +38 -0
  29. package/dist/browser/modules/pdf/core/pdf-stream.d.ts +32 -0
  30. package/dist/browser/modules/pdf/core/pdf-stream.js +66 -0
  31. package/dist/browser/modules/pdf/core/pdf-writer.d.ts +55 -1
  32. package/dist/browser/modules/pdf/core/pdf-writer.js +271 -6
  33. package/dist/browser/modules/pdf/core/pdfa.d.ts +62 -0
  34. package/dist/browser/modules/pdf/core/pdfa.js +261 -0
  35. package/dist/browser/modules/pdf/index.d.ts +11 -0
  36. package/dist/browser/modules/pdf/index.js +9 -0
  37. package/dist/browser/modules/pdf/reader/bookmark-extractor.d.ts +35 -0
  38. package/dist/browser/modules/pdf/reader/bookmark-extractor.js +324 -0
  39. package/dist/browser/modules/pdf/reader/pdf-decrypt.js +6 -5
  40. package/dist/browser/modules/pdf/reader/pdf-reader.d.ts +17 -0
  41. package/dist/browser/modules/pdf/reader/pdf-reader.js +26 -2
  42. package/dist/browser/modules/pdf/reader/table-extractor.d.ts +69 -0
  43. package/dist/browser/modules/pdf/reader/table-extractor.js +365 -0
  44. package/dist/browser/modules/pdf/render/layout-engine.d.ts +21 -1
  45. package/dist/browser/modules/pdf/render/layout-engine.js +112 -5
  46. package/dist/browser/modules/pdf/render/page-renderer.d.ts +2 -9
  47. package/dist/browser/modules/pdf/render/page-renderer.js +62 -103
  48. package/dist/browser/modules/pdf/render/pdf-exporter.js +2 -61
  49. package/dist/browser/modules/pdf/render/style-converter.d.ts +4 -0
  50. package/dist/browser/modules/pdf/render/style-converter.js +1 -1
  51. package/dist/browser/modules/pdf/types.d.ts +14 -1
  52. package/dist/browser/modules/stream/browser/readable.js +8 -2
  53. package/dist/browser/utils/crypto.browser.d.ts +64 -0
  54. package/dist/browser/{modules/pdf/core/crypto.js → utils/crypto.browser.js} +91 -101
  55. package/dist/browser/utils/crypto.d.ts +97 -0
  56. package/dist/browser/utils/crypto.js +209 -0
  57. package/dist/cjs/modules/archive/compression/crc32.js +1 -1
  58. package/dist/cjs/modules/archive/crypto/aes.js +2 -23
  59. package/dist/cjs/modules/archive/crypto/index.js +3 -1
  60. package/dist/cjs/modules/csv/worker/worker-script.generated.js +1 -1
  61. package/dist/cjs/modules/excel/utils/cell-matrix.js +1 -0
  62. package/dist/cjs/modules/excel/utils/encryptor.browser.js +7 -12
  63. package/dist/cjs/modules/excel/utils/encryptor.js +4 -10
  64. package/dist/cjs/modules/pdf/builder/document-builder.js +1532 -0
  65. package/dist/cjs/modules/pdf/builder/form-appearance.js +145 -0
  66. package/dist/cjs/modules/pdf/builder/image-utils.js +135 -0
  67. package/dist/cjs/modules/pdf/builder/pdf-editor.js +1612 -0
  68. package/dist/cjs/modules/pdf/builder/resource-merger.js +263 -0
  69. package/dist/cjs/modules/pdf/core/digital-signature.js +667 -0
  70. package/dist/cjs/modules/pdf/core/encryption.js +8 -7
  71. package/dist/cjs/modules/pdf/core/pdf-object.js +38 -0
  72. package/dist/cjs/modules/pdf/core/pdf-stream.js +66 -0
  73. package/dist/cjs/modules/pdf/core/pdf-writer.js +272 -6
  74. package/dist/cjs/modules/pdf/core/pdfa.js +266 -0
  75. package/dist/cjs/modules/pdf/index.js +19 -1
  76. package/dist/cjs/modules/pdf/reader/bookmark-extractor.js +327 -0
  77. package/dist/cjs/modules/pdf/reader/pdf-decrypt.js +6 -5
  78. package/dist/cjs/modules/pdf/reader/pdf-reader.js +26 -2
  79. package/dist/cjs/modules/pdf/reader/table-extractor.js +368 -0
  80. package/dist/cjs/modules/pdf/render/layout-engine.js +113 -4
  81. package/dist/cjs/modules/pdf/render/page-renderer.js +63 -105
  82. package/dist/cjs/modules/pdf/render/pdf-exporter.js +3 -62
  83. package/dist/cjs/modules/pdf/render/style-converter.js +1 -0
  84. package/dist/cjs/modules/stream/browser/readable.js +8 -2
  85. package/dist/cjs/{modules/pdf/core/crypto.js → utils/crypto.browser.js} +95 -102
  86. package/dist/cjs/utils/crypto.js +228 -0
  87. package/dist/esm/modules/archive/compression/crc32.js +1 -1
  88. package/dist/esm/modules/archive/crypto/aes.js +1 -20
  89. package/dist/esm/modules/archive/crypto/index.js +3 -1
  90. package/dist/esm/modules/csv/worker/worker-script.generated.js +1 -1
  91. package/dist/esm/modules/excel/utils/cell-matrix.js +1 -0
  92. package/dist/esm/modules/excel/utils/encryptor.browser.js +7 -12
  93. package/dist/esm/modules/excel/utils/encryptor.js +4 -7
  94. package/dist/esm/modules/pdf/builder/document-builder.js +1493 -0
  95. package/dist/esm/modules/pdf/builder/form-appearance.js +140 -0
  96. package/dist/esm/modules/pdf/builder/image-utils.js +129 -0
  97. package/dist/esm/modules/pdf/builder/pdf-editor.js +1574 -0
  98. package/dist/esm/modules/pdf/builder/resource-merger.js +258 -0
  99. package/dist/esm/modules/pdf/core/digital-signature.js +659 -0
  100. package/dist/esm/modules/pdf/core/encryption.js +8 -7
  101. package/dist/esm/modules/pdf/core/pdf-object.js +38 -0
  102. package/dist/esm/modules/pdf/core/pdf-stream.js +66 -0
  103. package/dist/esm/modules/pdf/core/pdf-writer.js +271 -6
  104. package/dist/esm/modules/pdf/core/pdfa.js +261 -0
  105. package/dist/esm/modules/pdf/index.js +9 -0
  106. package/dist/esm/modules/pdf/reader/bookmark-extractor.js +324 -0
  107. package/dist/esm/modules/pdf/reader/pdf-decrypt.js +6 -5
  108. package/dist/esm/modules/pdf/reader/pdf-reader.js +26 -2
  109. package/dist/esm/modules/pdf/reader/table-extractor.js +365 -0
  110. package/dist/esm/modules/pdf/render/layout-engine.js +112 -5
  111. package/dist/esm/modules/pdf/render/page-renderer.js +62 -103
  112. package/dist/esm/modules/pdf/render/pdf-exporter.js +2 -61
  113. package/dist/esm/modules/pdf/render/style-converter.js +1 -1
  114. package/dist/esm/modules/stream/browser/readable.js +8 -2
  115. package/dist/esm/{modules/pdf/core/crypto.js → utils/crypto.browser.js} +91 -101
  116. package/dist/esm/utils/crypto.js +209 -0
  117. package/dist/iife/excelts.iife.js +1248 -1074
  118. package/dist/iife/excelts.iife.js.map +1 -1
  119. package/dist/iife/excelts.iife.min.js +53 -54
  120. package/dist/types/modules/archive/crypto/aes.d.ts +0 -8
  121. package/dist/types/modules/archive/crypto/index.d.ts +2 -1
  122. package/dist/types/modules/csv/parse/row-processor.d.ts +1 -1
  123. package/dist/types/modules/excel/utils/encryptor.browser.d.ts +4 -5
  124. package/dist/types/modules/excel/utils/encryptor.d.ts +1 -1
  125. package/dist/types/modules/pdf/builder/document-builder.d.ts +517 -0
  126. package/dist/types/modules/pdf/builder/form-appearance.d.ts +56 -0
  127. package/dist/types/modules/pdf/builder/image-utils.d.ts +39 -0
  128. package/dist/types/modules/pdf/builder/pdf-editor.d.ts +230 -0
  129. package/dist/types/modules/pdf/builder/resource-merger.d.ts +41 -0
  130. package/dist/types/modules/pdf/core/digital-signature.d.ts +109 -0
  131. package/dist/types/modules/pdf/core/pdf-object.d.ts +11 -0
  132. package/dist/types/modules/pdf/core/pdf-stream.d.ts +32 -0
  133. package/dist/types/modules/pdf/core/pdf-writer.d.ts +55 -1
  134. package/dist/types/modules/pdf/core/pdfa.d.ts +62 -0
  135. package/dist/types/modules/pdf/index.d.ts +11 -0
  136. package/dist/types/modules/pdf/reader/bookmark-extractor.d.ts +35 -0
  137. package/dist/types/modules/pdf/reader/pdf-reader.d.ts +17 -0
  138. package/dist/types/modules/pdf/reader/table-extractor.d.ts +69 -0
  139. package/dist/types/modules/pdf/render/layout-engine.d.ts +21 -1
  140. package/dist/types/modules/pdf/render/page-renderer.d.ts +2 -9
  141. package/dist/types/modules/pdf/render/style-converter.d.ts +4 -0
  142. package/dist/types/modules/pdf/types.d.ts +14 -1
  143. package/dist/types/utils/crypto.browser.d.ts +64 -0
  144. package/dist/types/utils/crypto.d.ts +97 -0
  145. package/package.json +110 -111
  146. package/dist/browser/modules/pdf/core/crypto.d.ts +0 -65
  147. package/dist/types/modules/pdf/core/crypto.d.ts +0 -65
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ /**
3
+ * Form field appearance stream generation.
4
+ *
5
+ * Generates visual appearance streams for PDF form fields so that field
6
+ * values are visible in all PDF viewers — even those that do not honor
7
+ * the `/NeedAppearances` flag.
8
+ *
9
+ * @see PDF Reference 1.7, §12.5.5 — Appearance Streams
10
+ * @see PDF Reference 1.7, §12.7.4 — Field Appearance
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.generateTextFieldAppearance = generateTextFieldAppearance;
14
+ exports.generateCheckboxAppearance = generateCheckboxAppearance;
15
+ exports.buildAppearanceBBox = buildAppearanceBBox;
16
+ const pdf_stream_1 = require("../core/pdf-stream");
17
+ const pdf_object_1 = require("../core/pdf-object");
18
+ // =============================================================================
19
+ // Text Field Appearance
20
+ // =============================================================================
21
+ /** Default padding inside the field rectangle (in points). */
22
+ const FIELD_PADDING = 2;
23
+ /**
24
+ * Generate an appearance stream for a text form field.
25
+ *
26
+ * Builds a minimal content stream that clips to the widget rect and
27
+ * draws the field value using the specified (or default) font.
28
+ *
29
+ * @returns The raw stream bytes and a resources dictionary string.
30
+ */
31
+ function generateTextFieldAppearance(options) {
32
+ const { value, rect, alignment = "left" } = options;
33
+ const fontName = options.fontName ?? "Helv";
34
+ // Derive bounding box dimensions from the widget rect
35
+ const x1 = rect[0] ?? 0;
36
+ const y1 = rect[1] ?? 0;
37
+ const x2 = rect[2] ?? x1;
38
+ const y2 = rect[3] ?? y1;
39
+ const width = Math.abs(x2 - x1);
40
+ const height = Math.abs(y2 - y1);
41
+ // Auto-size font: use ~70% of the field height, clamped to a reasonable range
42
+ let fontSize = options.fontSize ?? 0;
43
+ if (fontSize <= 0) {
44
+ fontSize = Math.max(4, Math.min(height * 0.7, 20));
45
+ }
46
+ // Approximate text width using 0.5 * fontSize per character (conservative estimate
47
+ // for Helvetica). This is intentionally simple — the appearance is a best-effort
48
+ // rendering; the authoritative value is in /V.
49
+ const approxCharWidth = fontSize * 0.5;
50
+ const textWidth = value.length * approxCharWidth;
51
+ // Compute horizontal offset based on alignment
52
+ let tx;
53
+ const usableWidth = width - 2 * FIELD_PADDING;
54
+ switch (alignment) {
55
+ case "center":
56
+ tx = FIELD_PADDING + Math.max(0, (usableWidth - textWidth) / 2);
57
+ break;
58
+ case "right":
59
+ tx = FIELD_PADDING + Math.max(0, usableWidth - textWidth);
60
+ break;
61
+ default:
62
+ tx = FIELD_PADDING;
63
+ break;
64
+ }
65
+ // Vertical centering: place baseline so the text is roughly centered
66
+ // Approximate ascent ≈ 0.75 * fontSize, descent ≈ -0.25 * fontSize
67
+ const ascent = fontSize * 0.75;
68
+ const descent = fontSize * 0.25;
69
+ const textHeight = ascent + descent;
70
+ const ty = (height - textHeight) / 2 + descent;
71
+ // Build the content stream
72
+ const cs = new pdf_stream_1.PdfContentStream();
73
+ // Clip to the bounding box (form XObject coordinate space: 0,0 to width,height)
74
+ cs.rect(0, 0, width, height).clip().endPath();
75
+ // Draw the text
76
+ cs.beginText().setFont(fontName, fontSize).moveText(tx, ty).showText(value).endText();
77
+ const stream = cs.toUint8Array();
78
+ // Build a minimal resources dict referencing a standard Helvetica font.
79
+ // The font is declared inline as a Type1 font so the appearance stream
80
+ // is self-contained (no dependency on the page's resources).
81
+ const resources = `<< /Font << /${fontName} << /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> >> >>`;
82
+ return { stream, resources };
83
+ }
84
+ // =============================================================================
85
+ // Checkbox Appearance
86
+ // =============================================================================
87
+ /**
88
+ * Generate appearance streams for a checkbox form field.
89
+ *
90
+ * Returns two streams:
91
+ * - `streamOn`: draws a checkmark (✓-like shape) inside the rect
92
+ * - `streamOff`: empty appearance (blank field)
93
+ *
94
+ * @param checked - Whether to generate the checked or unchecked variant
95
+ * (both are always returned; `checked` is ignored — both
96
+ * on and off streams are produced).
97
+ * @param rect - Widget annotation rectangle [x1, y1, x2, y2].
98
+ */
99
+ function generateCheckboxAppearance(_checked, rect) {
100
+ const x1 = rect[0] ?? 0;
101
+ const y1 = rect[1] ?? 0;
102
+ const x2 = rect[2] ?? x1;
103
+ const y2 = rect[3] ?? y1;
104
+ const width = Math.abs(x2 - x1);
105
+ const height = Math.abs(y2 - y1);
106
+ // --- "On" appearance: draw an X ---
107
+ const onCs = new pdf_stream_1.PdfContentStream();
108
+ const inset = Math.min(width, height) * 0.15;
109
+ onCs
110
+ .save()
111
+ .setStrokeColor({ r: 0, g: 0, b: 0 })
112
+ .setLineWidth(Math.max(1, Math.min(width, height) * 0.1))
113
+ // First stroke of the X: bottom-left to top-right
114
+ .moveTo(inset, inset)
115
+ .lineTo(width - inset, height - inset)
116
+ .stroke()
117
+ // Second stroke of the X: top-left to bottom-right
118
+ .moveTo(inset, height - inset)
119
+ .lineTo(width - inset, inset)
120
+ .stroke()
121
+ .restore();
122
+ // --- "Off" appearance: empty ---
123
+ const offCs = new pdf_stream_1.PdfContentStream();
124
+ // Intentionally empty — nothing to draw for unchecked state
125
+ return {
126
+ streamOn: onCs.toUint8Array(),
127
+ streamOff: offCs.toUint8Array()
128
+ };
129
+ }
130
+ // =============================================================================
131
+ // Helpers
132
+ // =============================================================================
133
+ /**
134
+ * Build the BBox array string for a form XObject appearance stream.
135
+ * The bounding box is in the widget's coordinate space: [0 0 width height].
136
+ */
137
+ function buildAppearanceBBox(rect) {
138
+ const x1 = rect[0] ?? 0;
139
+ const y1 = rect[1] ?? 0;
140
+ const x2 = rect[2] ?? x1;
141
+ const y2 = rect[3] ?? y1;
142
+ const width = Math.abs(x2 - x1);
143
+ const height = Math.abs(y2 - y1);
144
+ return `[0 0 ${(0, pdf_object_1.pdfNumber)(width)} ${(0, pdf_object_1.pdfNumber)(height)}]`;
145
+ }
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ /**
3
+ * Shared image utilities for PDF generation.
4
+ *
5
+ * Centralises JPEG/PNG dimension parsing and PDF XObject writing so that
6
+ * both the builder (`document-builder.ts`) and the exporter (`pdf-exporter.ts`)
7
+ * share a single implementation.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.parseImageDimensions = parseImageDimensions;
11
+ exports.parsePngDimensions = parsePngDimensions;
12
+ exports.parseJpegDimensions = parseJpegDimensions;
13
+ exports.writeImageXObject = writeImageXObject;
14
+ const pdf_object_1 = require("../core/pdf-object");
15
+ const png_decoder_1 = require("../render/png-decoder");
16
+ // =============================================================================
17
+ // Image Dimension Parsing
18
+ // =============================================================================
19
+ /**
20
+ * Parse image dimensions from raw bytes.
21
+ */
22
+ function parseImageDimensions(data, format) {
23
+ if (format === "png") {
24
+ return parsePngDimensions(data);
25
+ }
26
+ return parseJpegDimensions(data);
27
+ }
28
+ /**
29
+ * Read width/height from a PNG IHDR chunk (bytes 16-23).
30
+ */
31
+ function parsePngDimensions(data) {
32
+ // PNG header: 8 byte signature, then IHDR chunk: 4 byte length, 4 byte type, 4 byte width, 4 byte height
33
+ if (data.length >= 24 &&
34
+ data[12] === 0x49 &&
35
+ data[13] === 0x48 &&
36
+ data[14] === 0x44 &&
37
+ data[15] === 0x52) {
38
+ const width = (data[16] << 24) | (data[17] << 16) | (data[18] << 8) | data[19];
39
+ const height = (data[20] << 24) | (data[21] << 16) | (data[22] << 8) | data[23];
40
+ return { width, height };
41
+ }
42
+ return { width: 1, height: 1 };
43
+ }
44
+ /**
45
+ * Read width/height from JPEG SOF marker.
46
+ *
47
+ * Correctly excludes non-SOF markers in the 0xC0-0xCF range:
48
+ * - 0xC4 = DHT (Define Huffman Table)
49
+ * - 0xC8 = JPG (reserved)
50
+ * - 0xCC = DAC (Define Arithmetic Coding)
51
+ */
52
+ function parseJpegDimensions(data) {
53
+ let offset = 2; // skip SOI marker
54
+ while (offset < data.length - 1) {
55
+ // Skip padding 0xFF bytes
56
+ while (offset < data.length && data[offset] === 0xff && data[offset + 1] === 0xff) {
57
+ offset++;
58
+ }
59
+ if (offset >= data.length - 1 || data[offset] !== 0xff) {
60
+ break;
61
+ }
62
+ const marker = data[offset + 1];
63
+ const isSof = marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc;
64
+ if (isSof && offset + 8 < data.length) {
65
+ return {
66
+ width: (data[offset + 7] << 8) | data[offset + 8],
67
+ height: (data[offset + 5] << 8) | data[offset + 6]
68
+ };
69
+ }
70
+ if (offset + 3 >= data.length) {
71
+ break;
72
+ }
73
+ const segLen = (data[offset + 2] << 8) | data[offset + 3];
74
+ offset += 2 + segLen;
75
+ }
76
+ return { width: 1, height: 1 };
77
+ }
78
+ // =============================================================================
79
+ // PDF Image XObject Writing
80
+ // =============================================================================
81
+ /**
82
+ * Write an image XObject (JPEG or PNG) to the writer.
83
+ * Returns the allocated object number.
84
+ */
85
+ function writeImageXObject(writer, data, format) {
86
+ if (format === "png") {
87
+ return writePngImageXObject(writer, data);
88
+ }
89
+ return writeJpegImageXObject(writer, data);
90
+ }
91
+ /**
92
+ * Write a JPEG image using DCTDecode (raw JPEG data embedded directly).
93
+ */
94
+ function writeJpegImageXObject(writer, data) {
95
+ const objNum = writer.allocObject();
96
+ const dims = parseJpegDimensions(data);
97
+ const dict = new pdf_object_1.PdfDict()
98
+ .set("Type", "/XObject")
99
+ .set("Subtype", "/Image")
100
+ .set("Width", (0, pdf_object_1.pdfNumber)(dims.width))
101
+ .set("Height", (0, pdf_object_1.pdfNumber)(dims.height))
102
+ .set("ColorSpace", "/DeviceRGB")
103
+ .set("BitsPerComponent", "8")
104
+ .set("Filter", "/DCTDecode");
105
+ writer.addStreamObject(objNum, dict, data);
106
+ return objNum;
107
+ }
108
+ /**
109
+ * Write a PNG image: decode to raw RGB, create SMask for alpha if needed.
110
+ */
111
+ function writePngImageXObject(writer, data) {
112
+ const png = (0, png_decoder_1.decodePng)(data);
113
+ const objNum = writer.allocObject();
114
+ const dict = new pdf_object_1.PdfDict()
115
+ .set("Type", "/XObject")
116
+ .set("Subtype", "/Image")
117
+ .set("Width", (0, pdf_object_1.pdfNumber)(png.width))
118
+ .set("Height", (0, pdf_object_1.pdfNumber)(png.height))
119
+ .set("ColorSpace", "/DeviceRGB")
120
+ .set("BitsPerComponent", (0, pdf_object_1.pdfNumber)(png.bitsPerComponent));
121
+ if (png.alpha) {
122
+ const smaskObjNum = writer.allocObject();
123
+ const smaskDict = new pdf_object_1.PdfDict()
124
+ .set("Type", "/XObject")
125
+ .set("Subtype", "/Image")
126
+ .set("Width", (0, pdf_object_1.pdfNumber)(png.width))
127
+ .set("Height", (0, pdf_object_1.pdfNumber)(png.height))
128
+ .set("ColorSpace", "/DeviceGray")
129
+ .set("BitsPerComponent", "8");
130
+ writer.addStreamObject(smaskObjNum, smaskDict, png.alpha);
131
+ dict.set("SMask", (0, pdf_object_1.pdfRef)(smaskObjNum));
132
+ }
133
+ writer.addStreamObject(objNum, dict, png.pixels);
134
+ return objNum;
135
+ }