reamkit 1.24.0 → 1.25.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 (56) hide show
  1. package/README.md +22 -11
  2. package/dist/esm/core/converter/facade.d.ts +3 -3
  3. package/dist/esm/core/converter/facade.js +12 -0
  4. package/dist/esm/core/converter/ream.d.ts +48 -4
  5. package/dist/esm/core/converter/ream.js +25 -4
  6. package/dist/esm/core/document-model/index.d.ts +1 -1
  7. package/dist/esm/core/document-model/types.d.ts +17 -0
  8. package/dist/esm/core/outline.d.ts +17 -0
  9. package/dist/esm/core/outline.js +30 -0
  10. package/dist/esm/core/style-cascade/resolver.js +1 -0
  11. package/dist/esm/core/style-cascade/types.d.ts +3 -1
  12. package/dist/esm/excel/sheet-to-flow.d.ts +10 -0
  13. package/dist/esm/excel/sheet-to-flow.js +14 -1
  14. package/dist/esm/html/html-writer.js +3 -2
  15. package/dist/esm/index.d.ts +3 -0
  16. package/dist/esm/index.js +2 -1
  17. package/dist/esm/layout/page-doc.js +1 -1
  18. package/dist/esm/layout/styled-layout.js +41 -15
  19. package/dist/esm/markdown/markdown-writer.d.ts +41 -0
  20. package/dist/esm/markdown/markdown-writer.js +733 -0
  21. package/dist/esm/pdf/styled-page-emitter.js +20 -1
  22. package/dist/esm/pdf-reader/annots.d.ts +24 -0
  23. package/dist/esm/pdf-reader/annots.js +126 -0
  24. package/dist/esm/pdf-reader/content.d.ts +131 -5
  25. package/dist/esm/pdf-reader/content.js +169 -12
  26. package/dist/esm/pdf-reader/display.d.ts +56 -0
  27. package/dist/esm/pdf-reader/display.js +162 -0
  28. package/dist/esm/pdf-reader/document.d.ts +36 -1
  29. package/dist/esm/pdf-reader/document.js +92 -25
  30. package/dist/esm/pdf-reader/embedded-fonts.d.ts +31 -0
  31. package/dist/esm/pdf-reader/embedded-fonts.js +94 -0
  32. package/dist/esm/pdf-reader/flow-build.d.ts +61 -6
  33. package/dist/esm/pdf-reader/flow-build.js +128 -22
  34. package/dist/esm/pdf-reader/font.js +185 -4
  35. package/dist/esm/pdf-reader/image-decode.js +55 -4
  36. package/dist/esm/pdf-reader/images.d.ts +6 -0
  37. package/dist/esm/pdf-reader/images.js +25 -5
  38. package/dist/esm/pdf-reader/jpeg.d.ts +18 -0
  39. package/dist/esm/pdf-reader/jpeg.js +419 -0
  40. package/dist/esm/pdf-reader/layout.d.ts +1 -1
  41. package/dist/esm/pdf-reader/layout.js +221 -32
  42. package/dist/esm/pdf-reader/pattern-tint.d.ts +17 -0
  43. package/dist/esm/pdf-reader/pattern-tint.js +181 -0
  44. package/dist/esm/pdf-reader/reader.d.ts +9 -1
  45. package/dist/esm/pdf-reader/reader.js +22 -6
  46. package/dist/esm/pdf-reader/shading.d.ts +14 -0
  47. package/dist/esm/pdf-reader/shading.js +27 -1
  48. package/dist/esm/pdf-reader/tagged.js +156 -17
  49. package/dist/esm/pdf-reader/text.d.ts +13 -1
  50. package/dist/esm/pdf-reader/text.js +70 -3
  51. package/dist/esm/pdf-reader/vector.d.ts +25 -1
  52. package/dist/esm/pdf-reader/vector.js +168 -12
  53. package/dist/esm/pptx/slide-parser.js +5 -0
  54. package/dist/esm/word/docx-writer.js +11 -1
  55. package/dist/esm/word/drawing-parser.js +7 -1
  56. package/package.json +1 -1
@@ -0,0 +1,419 @@
1
+ //#region src/pdf-reader/jpeg.ts
2
+ /** §A.3.6 — the zig-zag order the coefficients of a block are coded in. */
3
+ var ZIGZAG = new Uint8Array([
4
+ 0,
5
+ 1,
6
+ 8,
7
+ 16,
8
+ 9,
9
+ 2,
10
+ 3,
11
+ 10,
12
+ 17,
13
+ 24,
14
+ 32,
15
+ 25,
16
+ 18,
17
+ 11,
18
+ 4,
19
+ 5,
20
+ 12,
21
+ 19,
22
+ 26,
23
+ 33,
24
+ 40,
25
+ 48,
26
+ 41,
27
+ 34,
28
+ 27,
29
+ 20,
30
+ 13,
31
+ 6,
32
+ 7,
33
+ 14,
34
+ 21,
35
+ 28,
36
+ 35,
37
+ 42,
38
+ 49,
39
+ 56,
40
+ 57,
41
+ 50,
42
+ 43,
43
+ 36,
44
+ 29,
45
+ 22,
46
+ 15,
47
+ 23,
48
+ 30,
49
+ 37,
50
+ 44,
51
+ 51,
52
+ 58,
53
+ 59,
54
+ 52,
55
+ 45,
56
+ 38,
57
+ 31,
58
+ 39,
59
+ 46,
60
+ 53,
61
+ 60,
62
+ 61,
63
+ 54,
64
+ 47,
65
+ 55,
66
+ 62,
67
+ 63
68
+ ]);
69
+ var MAX_PIXELS = 5e7;
70
+ /**
71
+ * Decode a baseline JPEG to interleaved 8-bit samples.
72
+ *
73
+ * @param bytes The JPEG stream, starting at its SOI marker.
74
+ * @returns The decoded image, or `undefined` when the stream is not a baseline
75
+ * JPEG this decoder handles (progressive, arithmetic, 12-bit, CMYK) or
76
+ * is malformed — the caller then carries the original bytes through.
77
+ */
78
+ function decodeJpeg(bytes) {
79
+ try {
80
+ return decode(bytes);
81
+ } catch {
82
+ return;
83
+ }
84
+ }
85
+ function decode(bytes) {
86
+ if (bytes.length < 4 || bytes[0] !== 255 || bytes[1] !== 216) return void 0;
87
+ const quant = [];
88
+ const dcTables = [];
89
+ const acTables = [];
90
+ let frame;
91
+ let restartInterval = 0;
92
+ let adobeTransform;
93
+ let p = 2;
94
+ while (p < bytes.length) {
95
+ if (bytes[p] !== 255) {
96
+ p++;
97
+ continue;
98
+ }
99
+ const marker = bytes[p + 1];
100
+ p += 2;
101
+ if (marker === 216 || marker === 1 || marker >= 208 && marker <= 215) continue;
102
+ if (marker === 217) break;
103
+ const length = be16(bytes, p);
104
+ const segEnd = p + length;
105
+ switch (marker) {
106
+ case 219:
107
+ readQuantTables(bytes, p + 2, segEnd, quant);
108
+ break;
109
+ case 196:
110
+ readHuffTables(bytes, p + 2, segEnd, dcTables, acTables);
111
+ break;
112
+ case 221:
113
+ restartInterval = be16(bytes, p + 2);
114
+ break;
115
+ case 238:
116
+ if (length >= 14 && str(bytes, p + 2, 5) === "Adobe") adobeTransform = bytes[p + 13];
117
+ break;
118
+ case 192:
119
+ case 193:
120
+ frame = readFrame(bytes, p + 2);
121
+ if (!frame) return void 0;
122
+ break;
123
+ case 194:
124
+ case 195:
125
+ case 197:
126
+ case 198:
127
+ case 199:
128
+ case 201:
129
+ case 202:
130
+ case 203:
131
+ case 205:
132
+ case 206:
133
+ case 207: return;
134
+ case 218: {
135
+ if (!frame) return void 0;
136
+ const scanComps = readScanHeader(bytes, p + 2, frame.comps);
137
+ if (!scanComps) return void 0;
138
+ p = decodeScan(bytes, segEnd, frame, scanComps, dcTables, acTables, quant, restartInterval);
139
+ continue;
140
+ }
141
+ default: break;
142
+ }
143
+ p = segEnd;
144
+ }
145
+ if (!frame) return void 0;
146
+ return assemble(frame, adobeTransform);
147
+ }
148
+ function readFrame(bytes, p) {
149
+ if (bytes[p] !== 8) return void 0;
150
+ const height = be16(bytes, p + 1);
151
+ const width = be16(bytes, p + 3);
152
+ const count = bytes[p + 5];
153
+ if (width <= 0 || height <= 0 || width * height > MAX_PIXELS) return void 0;
154
+ if (count !== 1 && count !== 3) return void 0;
155
+ const comps = [];
156
+ let maxH = 1;
157
+ let maxV = 1;
158
+ for (let i = 0; i < count; i++) {
159
+ const at = p + 6 + i * 3;
160
+ const h = bytes[at + 1] >> 4;
161
+ const v = bytes[at + 1] & 15;
162
+ if (h < 1 || h > 4 || v < 1 || v > 4) return void 0;
163
+ maxH = Math.max(maxH, h);
164
+ maxV = Math.max(maxV, v);
165
+ comps.push({
166
+ id: bytes[at],
167
+ h,
168
+ v,
169
+ tq: bytes[at + 2],
170
+ dc: 0,
171
+ ac: 0,
172
+ pred: 0,
173
+ blocksPerLine: 0,
174
+ blocksPerCol: 0,
175
+ plane: new Uint8ClampedArray(0),
176
+ stride: 0
177
+ });
178
+ }
179
+ const mcusPerLine = Math.ceil(width / (8 * maxH));
180
+ const mcusPerCol = Math.ceil(height / (8 * maxV));
181
+ for (const c of comps) {
182
+ c.blocksPerLine = mcusPerLine * c.h;
183
+ c.blocksPerCol = mcusPerCol * c.v;
184
+ c.stride = c.blocksPerLine * 8;
185
+ c.plane = new Uint8ClampedArray(c.stride * c.blocksPerCol * 8);
186
+ }
187
+ return {
188
+ width,
189
+ height,
190
+ comps,
191
+ maxH,
192
+ maxV
193
+ };
194
+ }
195
+ function readScanHeader(bytes, p, comps) {
196
+ const count = bytes[p];
197
+ const out = [];
198
+ for (let i = 0; i < count; i++) {
199
+ const id = bytes[p + 1 + i * 2];
200
+ const tables = bytes[p + 2 + i * 2];
201
+ const comp = comps.find((c) => c.id === id);
202
+ if (!comp) return void 0;
203
+ comp.dc = tables >> 4;
204
+ comp.ac = tables & 15;
205
+ out.push(comp);
206
+ }
207
+ return out;
208
+ }
209
+ function readQuantTables(bytes, p, end, into) {
210
+ while (p < end) {
211
+ const pq = bytes[p] >> 4;
212
+ const tq = bytes[p] & 15;
213
+ p++;
214
+ const table = new Int32Array(64);
215
+ for (let i = 0; i < 64; i++) table[ZIGZAG[i]] = pq === 0 ? bytes[p + i] : be16(bytes, p + i * 2);
216
+ p += pq === 0 ? 64 : 128;
217
+ into[tq] = table;
218
+ }
219
+ }
220
+ function readHuffTables(bytes, p, end, dc, ac) {
221
+ while (p < end) {
222
+ const tc = bytes[p] >> 4;
223
+ const th = bytes[p] & 15;
224
+ p++;
225
+ const counts = bytes.subarray(p, p + 16);
226
+ p += 16;
227
+ let total = 0;
228
+ for (const n of counts) total += n;
229
+ const values = bytes.slice(p, p + total);
230
+ p += total;
231
+ const table = buildHuffTable(counts, values);
232
+ if (tc === 0) dc[th] = table;
233
+ else ac[th] = table;
234
+ }
235
+ }
236
+ /** §F.2.2.3 — the decoding tables, built from BITS and HUFFVAL. */
237
+ function buildHuffTable(counts, values) {
238
+ const maxcode = new Int32Array(18).fill(-1);
239
+ const mincode = new Int32Array(18);
240
+ const valptr = new Int32Array(18);
241
+ let code = 0;
242
+ let k = 0;
243
+ for (let l = 1; l <= 16; l++) {
244
+ const n = counts[l - 1];
245
+ if (n === 0) maxcode[l] = -1;
246
+ else {
247
+ valptr[l] = k;
248
+ mincode[l] = code;
249
+ code += n;
250
+ k += n;
251
+ maxcode[l] = code - 1;
252
+ }
253
+ code <<= 1;
254
+ }
255
+ return {
256
+ maxcode,
257
+ mincode,
258
+ valptr,
259
+ values
260
+ };
261
+ }
262
+ /**
263
+ * Decode one scan's entropy-coded segment into the components' planes.
264
+ *
265
+ * @returns The offset of the marker that ends the scan.
266
+ */
267
+ function decodeScan(bytes, start, frame, scan, dcTables, acTables, quant, restartInterval) {
268
+ let at = start;
269
+ let bitBuf = 0;
270
+ let bitCount = 0;
271
+ const nextBit = () => {
272
+ if (bitCount === 0) {
273
+ let b = bytes[at++] ?? 0;
274
+ if (b === 255) if ((bytes[at] ?? 0) === 0) at++;
275
+ else {
276
+ at--;
277
+ b = 0;
278
+ }
279
+ bitBuf = b;
280
+ bitCount = 8;
281
+ }
282
+ bitCount--;
283
+ return bitBuf >> bitCount & 1;
284
+ };
285
+ const decodeHuff = (table) => {
286
+ if (!table) return 0;
287
+ let code = nextBit();
288
+ let l = 1;
289
+ while (l <= 16 && (table.maxcode[l] === -1 || code > table.maxcode[l])) {
290
+ code = code << 1 | nextBit();
291
+ l++;
292
+ }
293
+ if (l > 16) return 0;
294
+ return table.values[table.valptr[l] + code - table.mincode[l]] ?? 0;
295
+ };
296
+ const receiveExtend = (s) => {
297
+ if (s === 0) return 0;
298
+ let v = 0;
299
+ for (let i = 0; i < s; i++) v = v << 1 | nextBit();
300
+ return v < 1 << s - 1 ? v - (1 << s) + 1 : v;
301
+ };
302
+ const block = new Int32Array(64);
303
+ const decodeBlock = (comp, row, col) => {
304
+ block.fill(0);
305
+ const q = quant[comp.tq];
306
+ const t = decodeHuff(dcTables[comp.dc]);
307
+ comp.pred += receiveExtend(t);
308
+ block[0] = comp.pred * (q?.[0] ?? 1);
309
+ let i = 1;
310
+ while (i < 64) {
311
+ const rs = decodeHuff(acTables[comp.ac]);
312
+ const run = rs >> 4;
313
+ const size = rs & 15;
314
+ if (size === 0) {
315
+ if (run !== 15) break;
316
+ i += 16;
317
+ continue;
318
+ }
319
+ i += run;
320
+ if (i > 63) break;
321
+ const z = ZIGZAG[i];
322
+ block[z] = receiveExtend(size) * (q?.[z] ?? 1);
323
+ i++;
324
+ }
325
+ idctBlock(block, comp.plane, row * 8 * comp.stride + col * 8, comp.stride);
326
+ };
327
+ const mcusPerLine = Math.ceil(frame.width / (8 * frame.maxH));
328
+ const mcusPerCol = Math.ceil(frame.height / (8 * frame.maxV));
329
+ const single = scan.length === 1;
330
+ const total = single ? Math.ceil(scan[0].blocksPerLine * scan[0].blocksPerCol) : mcusPerLine * mcusPerCol;
331
+ const perLine = single ? scan[0].blocksPerLine : mcusPerLine;
332
+ let untilRestart = restartInterval || total;
333
+ for (let n = 0; n < total; n++) {
334
+ if (single) {
335
+ const c = scan[0];
336
+ decodeBlock(c, Math.floor(n / perLine), n % perLine);
337
+ } else {
338
+ const mcuRow = Math.floor(n / mcusPerLine);
339
+ const mcuCol = n % mcusPerLine;
340
+ for (const c of scan) for (let v = 0; v < c.v; v++) for (let h = 0; h < c.h; h++) decodeBlock(c, mcuRow * c.v + v, mcuCol * c.h + h);
341
+ }
342
+ if (--untilRestart === 0 && n + 1 < total) {
343
+ bitCount = 0;
344
+ while (at + 1 < bytes.length && !(bytes[at] === 255 && bytes[at + 1] >= 208 && bytes[at + 1] <= 215)) at++;
345
+ at += 2;
346
+ for (const c of scan) c.pred = 0;
347
+ untilRestart = restartInterval;
348
+ }
349
+ }
350
+ while (at + 1 < bytes.length && !(bytes[at] === 255 && bytes[at + 1] !== 0)) at++;
351
+ return at;
352
+ }
353
+ /** §A.3.3 — cos((2x+1)uπ/16) · C(u)/2, precomputed. */
354
+ var COS = (() => {
355
+ const t = new Float32Array(64);
356
+ for (let u = 0; u < 8; u++) {
357
+ const c = u === 0 ? Math.SQRT1_2 : 1;
358
+ for (let x = 0; x < 8; x++) t[u * 8 + x] = c * Math.cos((2 * x + 1) * u * Math.PI / 16) / 2;
359
+ }
360
+ return t;
361
+ })();
362
+ /** The separable 2-D inverse DCT of one block, levelshifted into `out`. */
363
+ function idctBlock(block, out, offset, stride) {
364
+ const rows = new Float32Array(64);
365
+ for (let y = 0; y < 8; y++) for (let x = 0; x < 8; x++) {
366
+ let sum = 0;
367
+ for (let u = 0; u < 8; u++) sum += COS[u * 8 + x] * block[y * 8 + u];
368
+ rows[y * 8 + x] = sum;
369
+ }
370
+ for (let x = 0; x < 8; x++) for (let y = 0; y < 8; y++) {
371
+ let sum = 0;
372
+ for (let v = 0; v < 8; v++) sum += COS[v * 8 + y] * rows[v * 8 + x];
373
+ out[offset + y * stride + x] = sum + 128;
374
+ }
375
+ }
376
+ /** Upsample every component to full size and convert to gray or RGB. */
377
+ function assemble(frame, adobeTransform) {
378
+ const { width, height, comps, maxH, maxV } = frame;
379
+ const n = comps.length;
380
+ const samples = new Uint8Array(width * height * n);
381
+ for (let ci = 0; ci < n; ci++) {
382
+ const c = comps[ci];
383
+ const sx = c.h / maxH;
384
+ const sy = c.v / maxV;
385
+ for (let y = 0; y < height; y++) {
386
+ const srcRow = Math.min(c.blocksPerCol * 8 - 1, y * sy | 0) * c.stride;
387
+ for (let x = 0; x < width; x++) samples[(y * width + x) * n + ci] = c.plane[srcRow + Math.min(c.stride - 1, x * sx | 0)];
388
+ }
389
+ }
390
+ if (n === 1) return {
391
+ width,
392
+ height,
393
+ components: 1,
394
+ samples
395
+ };
396
+ if (adobeTransform !== 0) ycbcrToRgb(samples);
397
+ return {
398
+ width,
399
+ height,
400
+ components: 3,
401
+ samples
402
+ };
403
+ }
404
+ /** ITU-T T.871 §7 — the JFIF YCbCr → RGB conversion, in place. */
405
+ function ycbcrToRgb(s) {
406
+ for (let i = 0; i < s.length; i += 3) {
407
+ const y = s[i];
408
+ const cb = s[i + 1] - 128;
409
+ const cr = s[i + 2] - 128;
410
+ s[i] = clamp(y + 1.402 * cr);
411
+ s[i + 1] = clamp(y - .344136 * cb - .714136 * cr);
412
+ s[i + 2] = clamp(y + 1.772 * cb);
413
+ }
414
+ }
415
+ var clamp = (v) => v < 0 ? 0 : v > 255 ? 255 : v | 0;
416
+ var be16 = (b, p) => (b[p] ?? 0) << 8 | (b[p + 1] ?? 0);
417
+ var str = (b, p, n) => String.fromCharCode(...b.subarray(p, p + n));
418
+ //#endregion
419
+ export { decodeJpeg };
@@ -15,4 +15,4 @@ import { Reconstruction } from './flow-build.js';
15
15
  * @param file The PDF to reconstruct.
16
16
  * @returns The reconstructed {@link FlowDoc} plus any read-time losses.
17
17
  */
18
- export declare function reconstructByLayout(file: PdfFile): Reconstruction;
18
+ export declare function reconstructByLayout(file: PdfFile, mode?: 'flow' | 'positional'): Reconstruction;