pdf-codec 1.3.0 → 1.4.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 (198) hide show
  1. package/README.md +38 -0
  2. package/dist/afm-widths-BoeTOK2r.cjs +826 -0
  3. package/dist/afm-widths-Dxucrg7D.js +779 -0
  4. package/dist/afm-widths-DyDq56Ph.d.cts +19 -0
  5. package/dist/afm-widths-DyDq56Ph.d.ts +19 -0
  6. package/dist/afm-widths.cjs +4 -0
  7. package/dist/afm-widths.d.cts +2 -0
  8. package/dist/afm-widths.d.ts +2 -0
  9. package/dist/afm-widths.js +2 -0
  10. package/dist/assets/stix-two-math-font.cjs +5 -0
  11. package/dist/assets/stix-two-math-font.d.cts +4 -0
  12. package/dist/assets/stix-two-math-font.d.ts +4 -0
  13. package/dist/assets/stix-two-math-font.js +4 -0
  14. package/dist/bytes/crc32.cjs +21 -0
  15. package/dist/bytes/crc32.d.cts +4 -0
  16. package/dist/bytes/crc32.d.ts +4 -0
  17. package/dist/bytes/crc32.js +20 -0
  18. package/dist/bytes/flate.cjs +53 -0
  19. package/dist/bytes/flate.d.cts +12 -0
  20. package/dist/bytes/flate.d.ts +12 -0
  21. package/dist/bytes/flate.js +49 -0
  22. package/dist/bytes/reader.cjs +60 -0
  23. package/dist/bytes/reader.d.cts +20 -0
  24. package/dist/bytes/reader.d.ts +20 -0
  25. package/dist/bytes/reader.js +58 -0
  26. package/dist/bytes/writer.cjs +37 -0
  27. package/dist/bytes/writer.d.cts +13 -0
  28. package/dist/bytes/writer.d.ts +13 -0
  29. package/dist/bytes/writer.js +35 -0
  30. package/dist/cmap.cjs +110 -0
  31. package/dist/cmap.d.cts +8 -0
  32. package/dist/cmap.d.ts +8 -0
  33. package/dist/cmap.js +109 -0
  34. package/dist/codec.cjs +34 -0
  35. package/dist/codec.d.cts +167 -0
  36. package/dist/codec.d.ts +167 -0
  37. package/dist/codec.js +32 -0
  38. package/dist/content-read.cjs +126 -0
  39. package/dist/content-read.d.cts +21 -0
  40. package/dist/content-read.d.ts +21 -0
  41. package/dist/content-read.js +125 -0
  42. package/dist/content-write.cjs +138 -0
  43. package/dist/content-write.d.cts +24 -0
  44. package/dist/content-write.d.ts +24 -0
  45. package/dist/content-write.js +137 -0
  46. package/dist/diagnostics.cjs +21 -0
  47. package/dist/diagnostics.d.cts +19 -0
  48. package/dist/diagnostics.d.ts +19 -0
  49. package/dist/diagnostics.js +18 -0
  50. package/dist/document.cjs +162 -0
  51. package/dist/document.d.cts +12 -0
  52. package/dist/document.d.ts +12 -0
  53. package/dist/document.js +161 -0
  54. package/dist/encoding.cjs +5 -0
  55. package/dist/encoding.d.cts +6 -0
  56. package/dist/encoding.d.ts +6 -0
  57. package/dist/encoding.js +2 -0
  58. package/dist/filters.cjs +223 -0
  59. package/dist/filters.d.cts +14 -0
  60. package/dist/filters.d.ts +14 -0
  61. package/dist/filters.js +218 -0
  62. package/dist/font-read.cjs +199 -0
  63. package/dist/font-read.d.cts +23 -0
  64. package/dist/font-read.d.ts +23 -0
  65. package/dist/font-read.js +198 -0
  66. package/dist/font-style.cjs +35 -0
  67. package/dist/font-style.d.cts +14 -0
  68. package/dist/font-style.d.ts +14 -0
  69. package/dist/font-style.js +34 -0
  70. package/dist/fonts.cjs +124 -0
  71. package/dist/fonts.d.cts +15 -0
  72. package/dist/fonts.d.ts +15 -0
  73. package/dist/fonts.js +122 -0
  74. package/dist/formula.cjs +0 -0
  75. package/dist/formula.d.cts +10 -0
  76. package/dist/formula.d.ts +10 -0
  77. package/dist/formula.js +0 -0
  78. package/dist/image/jpeg-info.cjs +71 -0
  79. package/dist/image/jpeg-info.d.cts +12 -0
  80. package/dist/image/jpeg-info.d.ts +12 -0
  81. package/dist/image/jpeg-info.js +70 -0
  82. package/dist/image/png-decode.cjs +181 -0
  83. package/dist/image/png-decode.d.cts +14 -0
  84. package/dist/image/png-decode.d.ts +14 -0
  85. package/dist/image/png-decode.js +180 -0
  86. package/dist/image/png-encode.cjs +64 -0
  87. package/dist/image/png-encode.d.cts +8 -0
  88. package/dist/image/png-encode.d.ts +8 -0
  89. package/dist/image/png-encode.js +63 -0
  90. package/dist/image/png-filter.cjs +95 -0
  91. package/dist/image/png-filter.d.cts +6 -0
  92. package/dist/image/png-filter.d.ts +6 -0
  93. package/dist/image/png-filter.js +93 -0
  94. package/dist/images-read.cjs +250 -0
  95. package/dist/images-read.d.cts +13 -0
  96. package/dist/images-read.d.ts +13 -0
  97. package/dist/images-read.js +249 -0
  98. package/dist/index.cjs +45 -5912
  99. package/dist/index.d.cts +21 -483
  100. package/dist/index.d.ts +21 -483
  101. package/dist/index.js +18 -5885
  102. package/dist/interpret.cjs +587 -0
  103. package/dist/interpret.d.cts +84 -0
  104. package/dist/interpret.d.ts +84 -0
  105. package/dist/interpret.js +586 -0
  106. package/dist/lexer.cjs +180 -0
  107. package/dist/lexer.d.cts +29 -0
  108. package/dist/lexer.d.ts +29 -0
  109. package/dist/lexer.js +179 -0
  110. package/dist/math-cmap.cjs +81 -0
  111. package/dist/math-cmap.d.cts +6 -0
  112. package/dist/math-cmap.d.ts +6 -0
  113. package/dist/math-cmap.js +80 -0
  114. package/dist/math-content-write.cjs +83 -0
  115. package/dist/math-content-write.d.cts +11 -0
  116. package/dist/math-content-write.d.ts +11 -0
  117. package/dist/math-content-write.js +81 -0
  118. package/dist/math-font-write.cjs +100 -0
  119. package/dist/math-font-write.d.cts +19 -0
  120. package/dist/math-font-write.d.ts +19 -0
  121. package/dist/math-font-write.js +99 -0
  122. package/dist/math-font.cjs +103 -0
  123. package/dist/math-font.d.cts +25 -0
  124. package/dist/math-font.d.ts +25 -0
  125. package/dist/math-font.js +102 -0
  126. package/dist/math-hmtx.cjs +17 -0
  127. package/dist/math-hmtx.d.cts +8 -0
  128. package/dist/math-hmtx.d.ts +8 -0
  129. package/dist/math-hmtx.js +16 -0
  130. package/dist/math-table.cjs +117 -0
  131. package/dist/math-table.d.cts +45 -0
  132. package/dist/math-table.d.ts +45 -0
  133. package/dist/math-table.js +116 -0
  134. package/dist/math-types-Ba8qAf1p.d.cts +82 -0
  135. package/dist/math-types-Ba8qAf1p.d.ts +82 -0
  136. package/dist/math-types.cjs +0 -0
  137. package/dist/math-types.d.cts +2 -0
  138. package/dist/math-types.d.ts +2 -0
  139. package/dist/math-types.js +0 -0
  140. package/dist/matrix-B3c2_a2f.d.cts +18 -0
  141. package/dist/matrix-B3c2_a2f.d.ts +18 -0
  142. package/dist/matrix.cjs +93 -0
  143. package/dist/matrix.d.cts +2 -0
  144. package/dist/matrix.d.ts +2 -0
  145. package/dist/matrix.js +83 -0
  146. package/dist/measure.cjs +54 -0
  147. package/dist/measure.d.cts +20 -0
  148. package/dist/measure.d.ts +20 -0
  149. package/dist/measure.js +53 -0
  150. package/dist/objects.cjs +100 -0
  151. package/dist/objects.d.cts +58 -0
  152. package/dist/objects.d.ts +58 -0
  153. package/dist/objects.js +84 -0
  154. package/dist/parse.cjs +230 -0
  155. package/dist/parse.d.cts +13 -0
  156. package/dist/parse.d.ts +13 -0
  157. package/dist/parse.js +228 -0
  158. package/dist/predictors.cjs +64 -0
  159. package/dist/predictors.d.cts +13 -0
  160. package/dist/predictors.d.ts +13 -0
  161. package/dist/predictors.js +62 -0
  162. package/dist/read.cjs +418 -0
  163. package/dist/read.d.cts +21 -0
  164. package/dist/read.d.ts +21 -0
  165. package/dist/read.js +413 -0
  166. package/dist/serialize.cjs +69 -0
  167. package/dist/serialize.d.cts +8 -0
  168. package/dist/serialize.d.ts +8 -0
  169. package/dist/serialize.js +66 -0
  170. package/dist/sfnt.cjs +52 -0
  171. package/dist/sfnt.d.cts +17 -0
  172. package/dist/sfnt.d.ts +17 -0
  173. package/dist/sfnt.js +46 -0
  174. package/dist/text-layout.cjs +224 -0
  175. package/dist/text-layout.d.cts +37 -0
  176. package/dist/text-layout.d.ts +37 -0
  177. package/dist/text-layout.js +222 -0
  178. package/dist/util/abort.cjs +7 -0
  179. package/dist/util/abort.d.cts +4 -0
  180. package/dist/util/abort.d.ts +4 -0
  181. package/dist/util/abort.js +6 -0
  182. package/dist/util/base64.cjs +48 -0
  183. package/dist/util/base64.d.cts +5 -0
  184. package/dist/util/base64.d.ts +5 -0
  185. package/dist/util/base64.js +46 -0
  186. package/dist/winansi.cjs +5 -0
  187. package/dist/winansi.d.cts +20 -0
  188. package/dist/winansi.d.ts +20 -0
  189. package/dist/winansi.js +2 -0
  190. package/dist/write.cjs +421 -0
  191. package/dist/write.d.cts +16 -0
  192. package/dist/write.d.ts +16 -0
  193. package/dist/write.js +419 -0
  194. package/dist/xref.cjs +325 -0
  195. package/dist/xref.d.cts +21 -0
  196. package/dist/xref.d.ts +21 -0
  197. package/dist/xref.js +324 -0
  198. package/package.json +9 -1
@@ -0,0 +1,587 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_objects = require("./objects.cjs");
3
+ const require_filters = require("./filters.cjs");
4
+ const require_matrix = require("./matrix.cjs");
5
+ const require_content_read = require("./content-read.cjs");
6
+ let document_schema_js = require("document-schema.js");
7
+ //#region src/interpret.ts
8
+ const MAX_FORM_XOBJECT_DEPTH = 12;
9
+ const FALLBACK_GLYPH_WIDTH_PER_1000 = 500;
10
+ const DEFAULT_LINE_WIDTH_PT = 1;
11
+ function defaultTextState() {
12
+ return {
13
+ tm: require_matrix.IDENTITY_MATRIX,
14
+ tlm: require_matrix.IDENTITY_MATRIX,
15
+ fontResourceName: void 0,
16
+ fontSizePt: 0,
17
+ charSpace: 0,
18
+ wordSpace: 0,
19
+ horizScale: 1,
20
+ leading: 0,
21
+ rise: 0
22
+ };
23
+ }
24
+ function computeTrm(ctm, ts) {
25
+ const fontMatrix = [
26
+ ts.fontSizePt * ts.horizScale,
27
+ 0,
28
+ 0,
29
+ ts.fontSizePt,
30
+ 0,
31
+ ts.rise
32
+ ];
33
+ return require_matrix.multiplyMatrices(require_matrix.multiplyMatrices(fontMatrix, ts.tm), ctm);
34
+ }
35
+ function numAt(operands, index) {
36
+ return require_objects.asNumber(operands[index]) ?? 0;
37
+ }
38
+ function grayColor(value) {
39
+ return {
40
+ r: value,
41
+ g: value,
42
+ b: value
43
+ };
44
+ }
45
+ function rgbColor(operands) {
46
+ return {
47
+ r: numAt(operands, 0),
48
+ g: numAt(operands, 1),
49
+ b: numAt(operands, 2)
50
+ };
51
+ }
52
+ function cmykColor(operands) {
53
+ const c = numAt(operands, 0);
54
+ const m = numAt(operands, 1);
55
+ const y = numAt(operands, 2);
56
+ const k = numAt(operands, 3);
57
+ return {
58
+ r: (1 - c) * (1 - k),
59
+ g: (1 - m) * (1 - k),
60
+ b: (1 - y) * (1 - k)
61
+ };
62
+ }
63
+ function genericColor(operands) {
64
+ const numericOperands = operands.filter((o) => o.kind === "number");
65
+ if (numericOperands.length === 1) return grayColor(numAt(numericOperands, 0));
66
+ if (numericOperands.length === 3) return rgbColor(numericOperands);
67
+ if (numericOperands.length === 4) return cmykColor(numericOperands);
68
+ }
69
+ function matrixFromOperands(operands) {
70
+ return [
71
+ numAt(operands, 0),
72
+ numAt(operands, 1),
73
+ numAt(operands, 2),
74
+ numAt(operands, 3),
75
+ numAt(operands, 4),
76
+ numAt(operands, 5)
77
+ ];
78
+ }
79
+ function isAxisAligned(m) {
80
+ return m[1] === 0 && m[2] === 0;
81
+ }
82
+ function rectFromOperands(operands, ctm) {
83
+ const x = numAt(operands, 0);
84
+ const y = numAt(operands, 1);
85
+ const w = numAt(operands, 2);
86
+ const h = numAt(operands, 3);
87
+ if (!isAxisAligned(ctm)) return;
88
+ const scaledX = x * ctm[0] + ctm[4];
89
+ const scaledY = y * ctm[3] + ctm[5];
90
+ const scaledW = w * ctm[0];
91
+ const scaledH = h * ctm[3];
92
+ return {
93
+ xPt: scaledW >= 0 ? scaledX : scaledX + scaledW,
94
+ yPt: scaledH >= 0 ? scaledY : scaledY + scaledH,
95
+ widthPt: Math.abs(scaledW),
96
+ heightPt: Math.abs(scaledH)
97
+ };
98
+ }
99
+ function interpretContentStream(bytes, resources, context) {
100
+ const items = [];
101
+ runContentStream(bytes, resources, {
102
+ ctm: require_matrix.IDENTITY_MATRIX,
103
+ fillColor: document_schema_js.COLOR_BLACK,
104
+ strokeColor: document_schema_js.COLOR_BLACK,
105
+ lineWidth: DEFAULT_LINE_WIDTH_PT
106
+ }, context, items, 0);
107
+ return items;
108
+ }
109
+ function lastPointOf(subpath) {
110
+ const last = subpath.segments[subpath.segments.length - 1];
111
+ return last === void 0 ? {
112
+ x: subpath.startXPt,
113
+ y: subpath.startYPt
114
+ } : {
115
+ x: last.xPt,
116
+ y: last.yPt
117
+ };
118
+ }
119
+ function runContentStream(bytes, resources, initialState, context, items, depth) {
120
+ const operations = require_content_read.readContentStream(bytes, context.sink);
121
+ const gsStack = [];
122
+ let gs = initialState;
123
+ let ts = defaultTextState();
124
+ let pendingRect;
125
+ let pathSubpaths = [];
126
+ let currentSubpath;
127
+ const finalizeCurrentSubpath = () => {
128
+ if (currentSubpath !== void 0) {
129
+ pathSubpaths.push(currentSubpath);
130
+ currentSubpath = void 0;
131
+ }
132
+ };
133
+ const resetPath = () => {
134
+ pendingRect = void 0;
135
+ pathSubpaths = [];
136
+ currentSubpath = void 0;
137
+ };
138
+ const appendRectSubpath = (operands, ctm) => {
139
+ finalizeCurrentSubpath();
140
+ const x = numAt(operands, 0);
141
+ const y = numAt(operands, 1);
142
+ const w = numAt(operands, 2);
143
+ const h = numAt(operands, 3);
144
+ const p1 = require_matrix.applyMatrix(ctm, {
145
+ x,
146
+ y
147
+ });
148
+ const p2 = require_matrix.applyMatrix(ctm, {
149
+ x: x + w,
150
+ y
151
+ });
152
+ const p3 = require_matrix.applyMatrix(ctm, {
153
+ x: x + w,
154
+ y: y + h
155
+ });
156
+ const p4 = require_matrix.applyMatrix(ctm, {
157
+ x,
158
+ y: y + h
159
+ });
160
+ pathSubpaths.push({
161
+ startXPt: p1.x,
162
+ startYPt: p1.y,
163
+ segments: [
164
+ {
165
+ kind: "line",
166
+ xPt: p2.x,
167
+ yPt: p2.y
168
+ },
169
+ {
170
+ kind: "line",
171
+ xPt: p3.x,
172
+ yPt: p3.y
173
+ },
174
+ {
175
+ kind: "line",
176
+ xPt: p4.x,
177
+ yPt: p4.y
178
+ }
179
+ ],
180
+ closed: true
181
+ });
182
+ };
183
+ const paintFillRuleFor = (operator) => operator.endsWith("*") ? "evenodd" : "nonzero";
184
+ const emitPaint = (operator) => {
185
+ if (operator === "n") {
186
+ resetPath();
187
+ return;
188
+ }
189
+ if ((operator === "s" || operator === "b" || operator === "b*") && currentSubpath !== void 0) currentSubpath.closed = true;
190
+ if ((operator === "f" || operator === "F" || operator === "f*") && currentSubpath === void 0 && pathSubpaths.length === 1 && pendingRect !== void 0) {
191
+ items.push({
192
+ kind: "rect",
193
+ ...pendingRect,
194
+ color: gs.fillColor
195
+ });
196
+ resetPath();
197
+ return;
198
+ }
199
+ finalizeCurrentSubpath();
200
+ if (pathSubpaths.length > 0) {
201
+ const isFillOp = operator === "f" || operator === "F" || operator === "f*" || operator === "B" || operator === "B*" || operator === "b" || operator === "b*";
202
+ const isStrokeOp = operator === "S" || operator === "s" || operator === "B" || operator === "B*" || operator === "b" || operator === "b*";
203
+ items.push({
204
+ kind: "path",
205
+ subpaths: pathSubpaths,
206
+ fillRule: paintFillRuleFor(operator),
207
+ fill: isFillOp ? gs.fillColor : void 0,
208
+ stroke: isStrokeOp ? {
209
+ color: gs.strokeColor,
210
+ widthPt: gs.lineWidth
211
+ } : void 0
212
+ });
213
+ }
214
+ resetPath();
215
+ };
216
+ const advanceThroughString = (codes) => {
217
+ if (ts.fontResourceName === void 0) return;
218
+ let offset = 0;
219
+ while (offset < codes.length) {
220
+ const glyph = context.fontMetrics.glyphAdvance(ts.fontResourceName, resources, codes, offset);
221
+ if (glyph === void 0) context.sink({
222
+ code: "pdf/font-not-resolved",
223
+ severity: "warning",
224
+ message: `could not resolve font resource /${ts.fontResourceName} to compute a glyph advance; assuming a fallback width`
225
+ });
226
+ const widthPer1000 = glyph?.widthPer1000 ?? FALLBACK_GLYPH_WIDTH_PER_1000;
227
+ const byteLength = glyph?.byteLengthConsumed ?? 1;
228
+ const isSingleByteSpace = byteLength === 1 && codes[offset] === 32;
229
+ const tx = (widthPer1000 / 1e3 * ts.fontSizePt + ts.charSpace + (isSingleByteSpace ? ts.wordSpace : 0)) * ts.horizScale;
230
+ ts.tm = require_matrix.multiplyMatrices(require_matrix.translationMatrix(tx, 0), ts.tm);
231
+ offset += byteLength;
232
+ }
233
+ };
234
+ const showTextArray = (elements) => {
235
+ if (ts.fontResourceName === void 0) return;
236
+ const startMatrix = computeTrm(gs.ctm, ts);
237
+ const chunks = [];
238
+ let totalLength = 0;
239
+ for (const el of elements) if (el.kind === "string") {
240
+ chunks.push(el.bytes);
241
+ totalLength += el.bytes.length;
242
+ advanceThroughString(el.bytes);
243
+ } else if (el.kind === "number") {
244
+ const adjustment = -(el.value / 1e3) * ts.fontSizePt * ts.horizScale;
245
+ ts.tm = require_matrix.multiplyMatrices(require_matrix.translationMatrix(adjustment, 0), ts.tm);
246
+ }
247
+ if (totalLength === 0) return;
248
+ const combined = new Uint8Array(totalLength);
249
+ let at = 0;
250
+ for (const chunk of chunks) {
251
+ combined.set(chunk, at);
252
+ at += chunk.length;
253
+ }
254
+ const endMatrix = computeTrm(gs.ctm, ts);
255
+ items.push({
256
+ kind: "text",
257
+ codes: combined,
258
+ fontResourceName: ts.fontResourceName,
259
+ resources,
260
+ startMatrix,
261
+ endMatrix,
262
+ sizePt: ts.fontSizePt,
263
+ color: gs.fillColor
264
+ });
265
+ };
266
+ const showText = (bytes) => {
267
+ showTextArray([{
268
+ kind: "string",
269
+ bytes,
270
+ hex: false
271
+ }]);
272
+ };
273
+ const nextLine = () => {
274
+ ts.tlm = require_matrix.multiplyMatrices(require_matrix.translationMatrix(0, -ts.leading), ts.tlm);
275
+ ts.tm = ts.tlm;
276
+ };
277
+ const handleDo = (name) => {
278
+ if (name === void 0) return;
279
+ const xobjects = context.resolver.resolveDict(require_objects.dictGet(resources, "XObject"));
280
+ const xobj = xobjects !== void 0 ? context.resolver.resolve(require_objects.dictGet(xobjects, name)) : void 0;
281
+ if (xobj?.kind !== "stream") {
282
+ context.sink({
283
+ code: "pdf/xobject-not-resolved",
284
+ severity: "warning",
285
+ message: `XObject resource /${name} did not resolve to a stream`
286
+ });
287
+ return;
288
+ }
289
+ const subtype = require_objects.asName(require_objects.dictGet(xobj.dict, "Subtype"));
290
+ if (subtype === "Image") {
291
+ items.push({
292
+ kind: "image",
293
+ resourceName: name,
294
+ resources,
295
+ matrix: gs.ctm
296
+ });
297
+ return;
298
+ }
299
+ if (subtype === "Form") {
300
+ if (depth >= MAX_FORM_XOBJECT_DEPTH) {
301
+ context.sink({
302
+ code: "pdf/form-recursion-limit",
303
+ severity: "warning",
304
+ message: "form XObject recursion exceeded the depth limit; skipping further nesting"
305
+ });
306
+ return;
307
+ }
308
+ const formMatrixArr = require_objects.asArray(require_objects.dictGet(xobj.dict, "Matrix"));
309
+ const formMatrix = formMatrixArr !== void 0 ? matrixFromOperands(formMatrixArr) : require_matrix.IDENTITY_MATRIX;
310
+ const formResources = context.resolver.resolveDict(require_objects.dictGet(xobj.dict, "Resources")) ?? resources;
311
+ const decoded = require_filters.decodeStream(xobj.raw, xobj.dict, context.sink);
312
+ const formState = {
313
+ ...gs,
314
+ ctm: require_matrix.multiplyMatrices(formMatrix, gs.ctm)
315
+ };
316
+ runContentStream(decoded.bytes, formResources, formState, context, items, depth + 1);
317
+ }
318
+ };
319
+ for (const token of operations) {
320
+ if (token.kind === "inlineImage") {
321
+ items.push({
322
+ kind: "inlineImage",
323
+ dict: token.image.dict,
324
+ data: token.image.data,
325
+ matrix: gs.ctm
326
+ });
327
+ continue;
328
+ }
329
+ const { operands, operator } = token.operation;
330
+ switch (operator) {
331
+ case "q":
332
+ gsStack.push(gs);
333
+ break;
334
+ case "Q":
335
+ gs = gsStack.pop() ?? gs;
336
+ break;
337
+ case "cm":
338
+ gs = {
339
+ ...gs,
340
+ ctm: require_matrix.multiplyMatrices(matrixFromOperands(operands), gs.ctm)
341
+ };
342
+ break;
343
+ case "g":
344
+ gs = {
345
+ ...gs,
346
+ fillColor: grayColor(numAt(operands, 0))
347
+ };
348
+ break;
349
+ case "G":
350
+ gs = {
351
+ ...gs,
352
+ strokeColor: grayColor(numAt(operands, 0))
353
+ };
354
+ break;
355
+ case "rg":
356
+ gs = {
357
+ ...gs,
358
+ fillColor: rgbColor(operands)
359
+ };
360
+ break;
361
+ case "RG":
362
+ gs = {
363
+ ...gs,
364
+ strokeColor: rgbColor(operands)
365
+ };
366
+ break;
367
+ case "k":
368
+ gs = {
369
+ ...gs,
370
+ fillColor: cmykColor(operands)
371
+ };
372
+ break;
373
+ case "K":
374
+ gs = {
375
+ ...gs,
376
+ strokeColor: cmykColor(operands)
377
+ };
378
+ break;
379
+ case "sc":
380
+ case "scn": {
381
+ const color = genericColor(operands);
382
+ if (color !== void 0) gs = {
383
+ ...gs,
384
+ fillColor: color
385
+ };
386
+ break;
387
+ }
388
+ case "SC":
389
+ case "SCN": {
390
+ const color = genericColor(operands);
391
+ if (color !== void 0) gs = {
392
+ ...gs,
393
+ strokeColor: color
394
+ };
395
+ break;
396
+ }
397
+ case "re":
398
+ pendingRect = rectFromOperands(operands, gs.ctm);
399
+ appendRectSubpath(operands, gs.ctm);
400
+ break;
401
+ case "m": {
402
+ finalizeCurrentSubpath();
403
+ const p = require_matrix.applyMatrix(gs.ctm, {
404
+ x: numAt(operands, 0),
405
+ y: numAt(operands, 1)
406
+ });
407
+ currentSubpath = {
408
+ startXPt: p.x,
409
+ startYPt: p.y,
410
+ segments: [],
411
+ closed: false
412
+ };
413
+ pendingRect = void 0;
414
+ break;
415
+ }
416
+ case "l": {
417
+ const p = require_matrix.applyMatrix(gs.ctm, {
418
+ x: numAt(operands, 0),
419
+ y: numAt(operands, 1)
420
+ });
421
+ currentSubpath?.segments.push({
422
+ kind: "line",
423
+ xPt: p.x,
424
+ yPt: p.y
425
+ });
426
+ pendingRect = void 0;
427
+ break;
428
+ }
429
+ case "c": {
430
+ const c1 = require_matrix.applyMatrix(gs.ctm, {
431
+ x: numAt(operands, 0),
432
+ y: numAt(operands, 1)
433
+ });
434
+ const c2 = require_matrix.applyMatrix(gs.ctm, {
435
+ x: numAt(operands, 2),
436
+ y: numAt(operands, 3)
437
+ });
438
+ const p = require_matrix.applyMatrix(gs.ctm, {
439
+ x: numAt(operands, 4),
440
+ y: numAt(operands, 5)
441
+ });
442
+ currentSubpath?.segments.push({
443
+ kind: "cubic",
444
+ c1xPt: c1.x,
445
+ c1yPt: c1.y,
446
+ c2xPt: c2.x,
447
+ c2yPt: c2.y,
448
+ xPt: p.x,
449
+ yPt: p.y
450
+ });
451
+ pendingRect = void 0;
452
+ break;
453
+ }
454
+ case "v":
455
+ if (currentSubpath !== void 0) {
456
+ const cur = lastPointOf(currentSubpath);
457
+ const c2 = require_matrix.applyMatrix(gs.ctm, {
458
+ x: numAt(operands, 0),
459
+ y: numAt(operands, 1)
460
+ });
461
+ const p = require_matrix.applyMatrix(gs.ctm, {
462
+ x: numAt(operands, 2),
463
+ y: numAt(operands, 3)
464
+ });
465
+ currentSubpath.segments.push({
466
+ kind: "cubic",
467
+ c1xPt: cur.x,
468
+ c1yPt: cur.y,
469
+ c2xPt: c2.x,
470
+ c2yPt: c2.y,
471
+ xPt: p.x,
472
+ yPt: p.y
473
+ });
474
+ }
475
+ pendingRect = void 0;
476
+ break;
477
+ case "y": {
478
+ const c1 = require_matrix.applyMatrix(gs.ctm, {
479
+ x: numAt(operands, 0),
480
+ y: numAt(operands, 1)
481
+ });
482
+ const p = require_matrix.applyMatrix(gs.ctm, {
483
+ x: numAt(operands, 2),
484
+ y: numAt(operands, 3)
485
+ });
486
+ currentSubpath?.segments.push({
487
+ kind: "cubic",
488
+ c1xPt: c1.x,
489
+ c1yPt: c1.y,
490
+ c2xPt: p.x,
491
+ c2yPt: p.y,
492
+ xPt: p.x,
493
+ yPt: p.y
494
+ });
495
+ pendingRect = void 0;
496
+ break;
497
+ }
498
+ case "h":
499
+ if (currentSubpath !== void 0) currentSubpath.closed = true;
500
+ pendingRect = void 0;
501
+ break;
502
+ case "w":
503
+ gs = {
504
+ ...gs,
505
+ lineWidth: numAt(operands, 0)
506
+ };
507
+ break;
508
+ case "f":
509
+ case "F":
510
+ case "f*":
511
+ case "S":
512
+ case "s":
513
+ case "B":
514
+ case "B*":
515
+ case "b":
516
+ case "b*":
517
+ case "n":
518
+ emitPaint(operator);
519
+ break;
520
+ case "BT":
521
+ ts = defaultTextState();
522
+ break;
523
+ case "Tf":
524
+ ts.fontResourceName = require_objects.asName(operands[0]);
525
+ ts.fontSizePt = numAt(operands, 1);
526
+ break;
527
+ case "Tc":
528
+ ts.charSpace = numAt(operands, 0);
529
+ break;
530
+ case "Tw":
531
+ ts.wordSpace = numAt(operands, 0);
532
+ break;
533
+ case "Tz":
534
+ ts.horizScale = numAt(operands, 0) / 100;
535
+ break;
536
+ case "TL":
537
+ ts.leading = numAt(operands, 0);
538
+ break;
539
+ case "Ts":
540
+ ts.rise = numAt(operands, 0);
541
+ break;
542
+ case "Td":
543
+ ts.tlm = require_matrix.multiplyMatrices(require_matrix.translationMatrix(numAt(operands, 0), numAt(operands, 1)), ts.tlm);
544
+ ts.tm = ts.tlm;
545
+ break;
546
+ case "TD":
547
+ ts.leading = -numAt(operands, 1);
548
+ ts.tlm = require_matrix.multiplyMatrices(require_matrix.translationMatrix(numAt(operands, 0), numAt(operands, 1)), ts.tlm);
549
+ ts.tm = ts.tlm;
550
+ break;
551
+ case "Tm":
552
+ ts.tlm = matrixFromOperands(operands);
553
+ ts.tm = ts.tlm;
554
+ break;
555
+ case "T*":
556
+ nextLine();
557
+ break;
558
+ case "Tj": {
559
+ const str = operands[0];
560
+ if (str?.kind === "string") showText(str.bytes);
561
+ break;
562
+ }
563
+ case "'": {
564
+ nextLine();
565
+ const str = operands[0];
566
+ if (str?.kind === "string") showText(str.bytes);
567
+ break;
568
+ }
569
+ case "\"": {
570
+ ts.wordSpace = numAt(operands, 0);
571
+ ts.charSpace = numAt(operands, 1);
572
+ nextLine();
573
+ const str = operands[2];
574
+ if (str?.kind === "string") showText(str.bytes);
575
+ break;
576
+ }
577
+ case "TJ": {
578
+ const array = require_objects.asArray(operands[0]);
579
+ if (array !== void 0) showTextArray(array);
580
+ break;
581
+ }
582
+ case "Do": handleDo(require_objects.asName(operands[0]));
583
+ }
584
+ }
585
+ }
586
+ //#endregion
587
+ exports.interpretContentStream = interpretContentStream;
@@ -0,0 +1,84 @@
1
+ import { PdfDiagnosticSink } from "./diagnostics.cjs";
2
+ import { PdfDict, PdfObject } from "./objects.cjs";
3
+ import { n as Matrix } from "./matrix-B3c2_a2f.cjs";
4
+ import { Color } from "document-schema.js";
5
+ //#region src/interpret.d.ts
6
+ interface ExtractedTextRun {
7
+ readonly kind: 'text';
8
+ readonly codes: Uint8Array<ArrayBuffer>;
9
+ readonly fontResourceName: string;
10
+ readonly resources: PdfDict;
11
+ readonly startMatrix: Matrix;
12
+ readonly endMatrix: Matrix;
13
+ readonly sizePt: number;
14
+ readonly color: Color;
15
+ }
16
+ interface ExtractedRect {
17
+ readonly kind: 'rect';
18
+ readonly xPt: number;
19
+ readonly yPt: number;
20
+ readonly widthPt: number;
21
+ readonly heightPt: number;
22
+ readonly color: Color;
23
+ }
24
+ type ExtractedPathSegment = {
25
+ readonly kind: 'line';
26
+ readonly xPt: number;
27
+ readonly yPt: number;
28
+ } | {
29
+ readonly kind: 'cubic';
30
+ readonly c1xPt: number;
31
+ readonly c1yPt: number;
32
+ readonly c2xPt: number;
33
+ readonly c2yPt: number;
34
+ readonly xPt: number;
35
+ readonly yPt: number;
36
+ };
37
+ interface ExtractedSubpath {
38
+ readonly startXPt: number;
39
+ readonly startYPt: number;
40
+ readonly segments: readonly ExtractedPathSegment[];
41
+ readonly closed: boolean;
42
+ }
43
+ interface ExtractedPath {
44
+ readonly kind: 'path';
45
+ readonly subpaths: readonly ExtractedSubpath[];
46
+ readonly fillRule: 'nonzero' | 'evenodd';
47
+ readonly fill: Color | undefined;
48
+ readonly stroke: {
49
+ readonly color: Color;
50
+ readonly widthPt: number;
51
+ } | undefined;
52
+ }
53
+ interface ExtractedImage {
54
+ readonly kind: 'image';
55
+ readonly resourceName: string;
56
+ readonly resources: PdfDict;
57
+ readonly matrix: Matrix;
58
+ }
59
+ interface ExtractedInlineImage {
60
+ readonly kind: 'inlineImage';
61
+ readonly dict: PdfDict;
62
+ readonly data: Uint8Array<ArrayBuffer>;
63
+ readonly matrix: Matrix;
64
+ }
65
+ type ExtractedItem = ExtractedTextRun | ExtractedRect | ExtractedPath | ExtractedImage | ExtractedInlineImage;
66
+ interface GlyphAdvance {
67
+ readonly widthPer1000: number;
68
+ readonly byteLengthConsumed: number;
69
+ }
70
+ interface FontMetricsPort {
71
+ glyphAdvance(fontResourceName: string, resources: PdfDict, codes: Uint8Array<ArrayBuffer>, byteOffset: number): GlyphAdvance | undefined;
72
+ }
73
+ interface PdfObjectResolver {
74
+ resolve(obj: PdfObject | undefined): PdfObject | undefined;
75
+ resolveDict(obj: PdfObject | undefined): PdfDict | undefined;
76
+ }
77
+ interface InterpretContext {
78
+ readonly fontMetrics: FontMetricsPort;
79
+ readonly resolver: PdfObjectResolver;
80
+ readonly sink: PdfDiagnosticSink;
81
+ }
82
+ declare function interpretContentStream(bytes: Uint8Array<ArrayBuffer>, resources: PdfDict, context: InterpretContext): ExtractedItem[];
83
+ //#endregion
84
+ export { ExtractedImage, ExtractedInlineImage, ExtractedItem, ExtractedPath, ExtractedPathSegment, ExtractedRect, ExtractedSubpath, ExtractedTextRun, FontMetricsPort, GlyphAdvance, InterpretContext, PdfObjectResolver, interpretContentStream };