@jasy/pdf 1.0.0-alpha.1 → 1.0.0-alpha.3

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 (139) hide show
  1. package/README.md +3 -3
  2. package/dist/api/args.d.ts +1 -1
  3. package/dist/api/args.js +2 -5
  4. package/dist/api/color.d.ts +4 -4
  5. package/dist/api/color.js +11 -17
  6. package/dist/api/content.d.ts +8 -8
  7. package/dist/api/content.js +23 -24
  8. package/dist/api/descriptor.d.ts +2 -2
  9. package/dist/api/descriptor.js +75 -31
  10. package/dist/api/index.d.ts +8 -8
  11. package/dist/api/index.js +8 -24
  12. package/dist/api/insets.js +4 -8
  13. package/dist/api/layout.d.ts +27 -12
  14. package/dist/api/layout.js +46 -45
  15. package/dist/api/structure.d.ts +60 -13
  16. package/dist/api/structure.js +132 -88
  17. package/dist/api/table.d.ts +5 -5
  18. package/dist/api/table.js +28 -24
  19. package/dist/api/text.d.ts +27 -2
  20. package/dist/api/text.js +45 -27
  21. package/dist/assets/font-data.d.ts +2 -0
  22. package/dist/assets/font-data.js +6 -0
  23. package/dist/assets/font-data.ts +7 -0
  24. package/dist/common/color.js +1 -5
  25. package/dist/constants/page-sizes.js +3 -6
  26. package/dist/constants/pdf-parts.js +1 -4
  27. package/dist/elements/container-element.d.ts +4 -4
  28. package/dist/elements/container-element.js +9 -13
  29. package/dist/elements/image-element.d.ts +18 -2
  30. package/dist/elements/image-element.js +81 -105
  31. package/dist/elements/index.d.ts +12 -10
  32. package/dist/elements/index.js +12 -28
  33. package/dist/elements/layout/default-text-style-element.d.ts +30 -0
  34. package/dist/elements/layout/default-text-style-element.js +47 -0
  35. package/dist/elements/layout/deferred-element.d.ts +3 -3
  36. package/dist/elements/layout/deferred-element.js +4 -8
  37. package/dist/elements/layout/expanded-element.d.ts +3 -3
  38. package/dist/elements/layout/expanded-element.js +10 -14
  39. package/dist/elements/layout/padding-element.d.ts +3 -3
  40. package/dist/elements/layout/padding-element.js +9 -14
  41. package/dist/elements/layout/positioned-element.d.ts +44 -0
  42. package/dist/elements/layout/positioned-element.js +61 -0
  43. package/dist/elements/layout/repeating-header-element.d.ts +3 -3
  44. package/dist/elements/layout/repeating-header-element.js +8 -12
  45. package/dist/elements/layout/sized-container-element.d.ts +2 -2
  46. package/dist/elements/layout/sized-container-element.js +6 -11
  47. package/dist/elements/line-element.d.ts +3 -3
  48. package/dist/elements/line-element.js +5 -10
  49. package/dist/elements/page-element.d.ts +8 -6
  50. package/dist/elements/page-element.js +31 -23
  51. package/dist/elements/pdf-document-element.d.ts +10 -4
  52. package/dist/elements/pdf-document-element.js +11 -10
  53. package/dist/elements/pdf-element.d.ts +28 -3
  54. package/dist/elements/pdf-element.js +10 -19
  55. package/dist/elements/rectangle-element.d.ts +14 -6
  56. package/dist/elements/rectangle-element.js +44 -21
  57. package/dist/elements/row-element.d.ts +3 -3
  58. package/dist/elements/row-element.js +7 -11
  59. package/dist/elements/text-element.d.ts +37 -11
  60. package/dist/elements/text-element.js +64 -39
  61. package/dist/index.d.ts +3 -3
  62. package/dist/index.js +3 -19
  63. package/dist/ir/display-list.d.ts +22 -3
  64. package/dist/ir/display-list.js +1 -2
  65. package/dist/layout/box-constraints.js +2 -6
  66. package/dist/layout/fragmentation.d.ts +8 -1
  67. package/dist/layout/fragmentation.js +22 -10
  68. package/dist/platform/browser-fs.d.ts +2 -0
  69. package/dist/platform/browser-fs.js +9 -0
  70. package/dist/platform/browser-image.d.ts +5 -0
  71. package/dist/platform/browser-image.js +13 -0
  72. package/dist/platform/node-fs.d.ts +2 -0
  73. package/dist/platform/node-fs.js +10 -0
  74. package/dist/platform/node-image.d.ts +5 -0
  75. package/dist/platform/node-image.js +9 -0
  76. package/dist/renderer/container-renderer.d.ts +3 -3
  77. package/dist/renderer/container-renderer.js +12 -27
  78. package/dist/renderer/default-text-style-renderer.d.ts +6 -0
  79. package/dist/renderer/default-text-style-renderer.js +10 -0
  80. package/dist/renderer/deferred-renderer.d.ts +3 -3
  81. package/dist/renderer/deferred-renderer.js +8 -23
  82. package/dist/renderer/expanded-renderer.d.ts +3 -3
  83. package/dist/renderer/expanded-renderer.js +6 -21
  84. package/dist/renderer/image-renderer.d.ts +3 -3
  85. package/dist/renderer/image-renderer.js +77 -75
  86. package/dist/renderer/index.d.ts +10 -10
  87. package/dist/renderer/index.js +10 -26
  88. package/dist/renderer/line-renderer.d.ts +3 -3
  89. package/dist/renderer/line-renderer.js +13 -28
  90. package/dist/renderer/padding-renderer.d.ts +3 -3
  91. package/dist/renderer/padding-renderer.js +6 -21
  92. package/dist/renderer/page-renderer.d.ts +2 -2
  93. package/dist/renderer/page-renderer.js +61 -77
  94. package/dist/renderer/pdf-backend.d.ts +2 -2
  95. package/dist/renderer/pdf-backend.js +34 -17
  96. package/dist/renderer/pdf-config.js +4 -7
  97. package/dist/renderer/pdf-document-class.d.ts +5 -5
  98. package/dist/renderer/pdf-document-class.js +24 -41
  99. package/dist/renderer/pdf-document-renderer.d.ts +3 -3
  100. package/dist/renderer/pdf-document-renderer.js +71 -85
  101. package/dist/renderer/pdf-renderer.d.ts +2 -2
  102. package/dist/renderer/pdf-renderer.js +83 -90
  103. package/dist/renderer/positioned-renderer.d.ts +6 -0
  104. package/dist/renderer/positioned-renderer.js +10 -0
  105. package/dist/renderer/rectangle-renderer.d.ts +3 -3
  106. package/dist/renderer/rectangle-renderer.js +45 -44
  107. package/dist/renderer/repeating-header-renderer.d.ts +3 -3
  108. package/dist/renderer/repeating-header-renderer.js +11 -26
  109. package/dist/renderer/row-renderer.d.ts +3 -3
  110. package/dist/renderer/row-renderer.js +12 -27
  111. package/dist/renderer/text-renderer.d.ts +6 -5
  112. package/dist/renderer/text-renderer.js +33 -42
  113. package/dist/text/line-breaker.d.ts +8 -5
  114. package/dist/text/line-breaker.js +67 -16
  115. package/dist/text/text-style.d.ts +25 -0
  116. package/dist/text/text-style.js +29 -0
  117. package/dist/utils/afm-parser.js +3 -13
  118. package/dist/utils/bytes.d.ts +24 -0
  119. package/dist/utils/bytes.js +76 -0
  120. package/dist/utils/flex-layout.d.ts +2 -2
  121. package/dist/utils/flex-layout.js +15 -20
  122. package/dist/utils/font-metrics.d.ts +1 -1
  123. package/dist/utils/font-metrics.js +1 -2
  124. package/dist/utils/font-path.js +3 -6
  125. package/dist/utils/image-helper.d.ts +6 -5
  126. package/dist/utils/image-helper.js +101 -111
  127. package/dist/utils/md5.d.ts +4 -0
  128. package/dist/utils/md5.js +80 -0
  129. package/dist/utils/pdf-object-manager.d.ts +10 -6
  130. package/dist/utils/pdf-object-manager.js +89 -94
  131. package/dist/utils/renderer-registry.js +1 -5
  132. package/dist/utils/ttf-parser.d.ts +2 -2
  133. package/dist/utils/ttf-parser.js +32 -36
  134. package/dist/utils/ttf-subsetter.d.ts +1 -1
  135. package/dist/utils/ttf-subsetter.js +40 -42
  136. package/dist/utils/utf8-to-windows1252-encoder.js +1 -4
  137. package/dist/validators/element-validator.d.ts +2 -2
  138. package/dist/validators/element-validator.js +17 -23
  139. package/package.json +14 -2
@@ -7,7 +7,7 @@ interface ImageDimensions {
7
7
  width: number;
8
8
  height: number;
9
9
  }
10
- export declare function getImageDimensions(buffer: Buffer): Promise<ImageDimensions>;
10
+ export declare function getImageDimensions(buffer: Uint8Array): Promise<ImageDimensions>;
11
11
  /**
12
12
  * Converts the given image to grayscale and returns its binary data.
13
13
  * @param imagePath Path to the input image file.
@@ -16,15 +16,16 @@ export declare function getImageDimensions(buffer: Buffer): Promise<ImageDimensi
16
16
  /**
17
17
  * Decodes a PNG into raw DeviceRGB samples, Flate-compressed, ready to embed as a PDF
18
18
  * image XObject. A PNG file is NOT a valid `/FlateDecode` stream (it's a signature plus
19
- * chunks of filtered, zlib-compressed scanlines), so it must be decoded first. PDF has
20
- * no alpha channel for DeviceRGB, so transparent pixels are composited over white.
19
+ * chunks of filtered, zlib-compressed scanlines), so it must be decoded first. DeviceRGB has
20
+ * no alpha itself, so any transparency rides alongside as a DeviceGray `/SMask` (the return's `smask`).
21
21
  */
22
- export declare function decodePngToRgbFlate(pngBuffer: Buffer): Promise<{
22
+ export declare function decodePngToRgbFlate(pngBuffer: Uint8Array): Promise<{
23
23
  data: string;
24
+ smask?: string;
24
25
  width: number;
25
26
  height: number;
26
27
  }>;
27
- export declare function convertImageToGrayscaleBuffer(imagePath: string): Promise<Buffer>;
28
+ export declare function convertImageToGrayscaleBuffer(imagePath: string): Promise<Uint8Array>;
28
29
  export interface FitResult {
29
30
  width: number;
30
31
  height: number;
@@ -1,23 +1,6 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.getImageDimensions = getImageDimensions;
13
- exports.decodePngToRgbFlate = decodePngToRgbFlate;
14
- exports.convertImageToGrayscaleBuffer = convertImageToGrayscaleBuffer;
15
- exports.applyContainFit = applyContainFit;
16
- exports.applyCoverFit = applyCoverFit;
17
- exports.applyFillFit = applyFillFit;
18
- exports.applyFitNone = applyFitNone;
19
- const jimp_1 = require("jimp");
20
- const zlib_1 = require("zlib");
1
+ import { zlibSync } from "fflate";
2
+ import { latin1FromBytes } from "./bytes.js";
3
+ import { pngToRgba } from "../platform/node-image.js";
21
4
  // Implement the method to handle 24-bit integers
22
5
  DataView.prototype.getUint24 = function (byteOffset, littleEndian = false) {
23
6
  const b1 = this.getUint8(byteOffset);
@@ -25,61 +8,59 @@ DataView.prototype.getUint24 = function (byteOffset, littleEndian = false) {
25
8
  const b3 = this.getUint8(byteOffset + 2);
26
9
  return littleEndian ? (b3 << 16) | (b2 << 8) | b1 : (b1 << 16) | (b2 << 8) | b3;
27
10
  };
28
- function getImageDimensions(buffer) {
29
- return __awaiter(this, void 0, void 0, function* () {
30
- const dataView = new DataView(buffer.buffer);
31
- // Check for JPEG (0xFFD8 is the start of JPEG file)
32
- if (dataView.getUint16(0) === 0xffd8) {
33
- let offset = 2;
34
- while (offset < buffer.byteLength) {
35
- const marker = dataView.getUint16(offset, false);
36
- offset += 2;
37
- if (marker === 0xffc0 || marker === 0xffc2) {
38
- // SOF0 or SOF2
39
- return {
40
- height: dataView.getUint16(offset + 3, false),
41
- width: dataView.getUint16(offset + 5, false),
42
- };
43
- }
44
- else {
45
- offset += dataView.getUint16(offset, false);
46
- }
11
+ export async function getImageDimensions(buffer) {
12
+ const dataView = new DataView(buffer.buffer);
13
+ // Check for JPEG (0xFFD8 is the start of JPEG file)
14
+ if (dataView.getUint16(0) === 0xffd8) {
15
+ let offset = 2;
16
+ while (offset < buffer.byteLength) {
17
+ const marker = dataView.getUint16(offset, false);
18
+ offset += 2;
19
+ if (marker === 0xffc0 || marker === 0xffc2) {
20
+ // SOF0 or SOF2
21
+ return {
22
+ height: dataView.getUint16(offset + 3, false),
23
+ width: dataView.getUint16(offset + 5, false),
24
+ };
25
+ }
26
+ else {
27
+ offset += dataView.getUint16(offset, false);
47
28
  }
48
29
  }
49
- // Check for PNG (0x89504E47 is the PNG signature)
50
- if (dataView.getUint32(0) === 0x89504e47) {
30
+ }
31
+ // Check for PNG (0x89504E47 is the PNG signature)
32
+ if (dataView.getUint32(0) === 0x89504e47) {
33
+ return {
34
+ width: dataView.getUint32(16, false),
35
+ height: dataView.getUint32(20, false),
36
+ };
37
+ }
38
+ // Check for BMP (0x424D is the BMP signature)
39
+ if (dataView.getUint16(0) === 0x424d) {
40
+ return {
41
+ width: dataView.getUint32(18, true),
42
+ height: dataView.getUint32(22, true),
43
+ };
44
+ }
45
+ // Check for WebP (0x52494646 is the WebP signature 'RIFF')
46
+ if (dataView.getUint32(0) === 0x52494646 && dataView.getUint32(8) === 0x57454250) {
47
+ // 'WEBP'
48
+ if (dataView.getUint32(12) === 0x56503820) {
49
+ // 'VP8 '
51
50
  return {
52
- width: dataView.getUint32(16, false),
53
- height: dataView.getUint32(20, false),
51
+ width: dataView.getUint16(26, true),
52
+ height: dataView.getUint16(28, true),
54
53
  };
55
54
  }
56
- // Check for BMP (0x424D is the BMP signature)
57
- if (dataView.getUint16(0) === 0x424d) {
55
+ else if (dataView.getUint32(12) === 0x56503858) {
56
+ // 'VP8X'
58
57
  return {
59
- width: dataView.getUint32(18, true),
60
- height: dataView.getUint32(22, true),
58
+ width: dataView.getUint24(24, true) + 1,
59
+ height: dataView.getUint24(27, true) + 1,
61
60
  };
62
61
  }
63
- // Check for WebP (0x52494646 is the WebP signature 'RIFF')
64
- if (dataView.getUint32(0) === 0x52494646 && dataView.getUint32(8) === 0x57454250) {
65
- // 'WEBP'
66
- if (dataView.getUint32(12) === 0x56503820) {
67
- // 'VP8 '
68
- return {
69
- width: dataView.getUint16(26, true),
70
- height: dataView.getUint16(28, true),
71
- };
72
- }
73
- else if (dataView.getUint32(12) === 0x56503858) {
74
- // 'VP8X'
75
- return {
76
- width: dataView.getUint24(24, true) + 1,
77
- height: dataView.getUint24(27, true) + 1,
78
- };
79
- }
80
- }
81
- throw new Error("Unsupported image format");
82
- });
62
+ }
63
+ throw new Error("Unsupported image format");
83
64
  }
84
65
  /**
85
66
  * Converts the given image to grayscale and returns its binary data.
@@ -89,50 +70,59 @@ function getImageDimensions(buffer) {
89
70
  /**
90
71
  * Decodes a PNG into raw DeviceRGB samples, Flate-compressed, ready to embed as a PDF
91
72
  * image XObject. A PNG file is NOT a valid `/FlateDecode` stream (it's a signature plus
92
- * chunks of filtered, zlib-compressed scanlines), so it must be decoded first. PDF has
93
- * no alpha channel for DeviceRGB, so transparent pixels are composited over white.
73
+ * chunks of filtered, zlib-compressed scanlines), so it must be decoded first. DeviceRGB has
74
+ * no alpha itself, so any transparency rides alongside as a DeviceGray `/SMask` (the return's `smask`).
94
75
  */
95
- function decodePngToRgbFlate(pngBuffer) {
96
- return __awaiter(this, void 0, void 0, function* () {
97
- const image = yield jimp_1.Jimp.fromBuffer(pngBuffer);
98
- const { width, height, data: rgba } = image.bitmap;
99
- const rgb = Buffer.allocUnsafe(width * height * 3);
100
- for (let i = 0, j = 0; i < rgba.length; i += 4, j += 3) {
101
- const alpha = rgba[i + 3] / 255;
102
- rgb[j] = Math.round(rgba[i] * alpha + 255 * (1 - alpha));
103
- rgb[j + 1] = Math.round(rgba[i + 1] * alpha + 255 * (1 - alpha));
104
- rgb[j + 2] = Math.round(rgba[i + 2] * alpha + 255 * (1 - alpha));
105
- }
106
- // Compress so the existing `/Filter /FlateDecode` XObject path embeds it correctly.
107
- return { data: (0, zlib_1.deflateSync)(rgb).toString("binary"), width, height };
108
- });
76
+ export async function decodePngToRgbFlate(pngBuffer) {
77
+ // The decode (PNG bytes RGBA) is platform-specific: jimp on Node, an OffscreenCanvas in the browser
78
+ // (`platform/{node,browser}-image.ts`, swapped by the package `browser` field). The split below is shared.
79
+ const { width, height, rgba } = await pngToRgba(pngBuffer);
80
+ // Raw DeviceRGB samples + (only when the PNG actually has transparency) a DeviceGray alpha channel that
81
+ // rides as the XObject's /SMask. An opaque PNG yields the same raw RGB as before and no SMask, so it stays
82
+ // byte-identical; a transparent one now composites correctly over whatever sits behind it.
83
+ const rgb = new Uint8Array(width * height * 3);
84
+ const alpha = new Uint8Array(width * height);
85
+ let hasAlpha = false;
86
+ for (let i = 0, j = 0, k = 0; i < rgba.length; i += 4, j += 3, k++) {
87
+ rgb[j] = rgba[i];
88
+ rgb[j + 1] = rgba[i + 1];
89
+ rgb[j + 2] = rgba[i + 2];
90
+ alpha[k] = rgba[i + 3];
91
+ if (rgba[i + 3] !== 255)
92
+ hasAlpha = true;
93
+ }
94
+ return {
95
+ data: latin1FromBytes(zlibSync(rgb)),
96
+ smask: hasAlpha ? latin1FromBytes(zlibSync(alpha)) : undefined,
97
+ width,
98
+ height,
99
+ };
109
100
  }
110
- function convertImageToGrayscaleBuffer(imagePath) {
111
- return __awaiter(this, void 0, void 0, function* () {
112
- // We get the image from the buffer
113
- const image = yield jimp_1.Jimp.read(imagePath);
114
- // Get MIME type. If emtpy throw error
115
- const mime = image.mime;
116
- if (!mime)
117
- throw new Error("Cannot read MIME type");
118
- // We need to check the MIME type (the exact union `getBuffer` accepts).
119
- let mimeType;
120
- switch (mime) {
121
- case jimp_1.JimpMime.png:
122
- case jimp_1.JimpMime.jpeg:
123
- case jimp_1.JimpMime.bmp:
124
- mimeType = mime;
125
- break;
126
- default:
127
- throw new Error("Unsupported MIME type");
128
- }
129
- image.greyscale();
130
- // Convert the image back to buffer with current MIME type
131
- const grayscaleBuffer = yield image.getBuffer(mimeType);
132
- return grayscaleBuffer;
133
- });
101
+ export async function convertImageToGrayscaleBuffer(imagePath) {
102
+ // We get the image from the buffer (jimp lazily loaded - see decodePngToRgbFlate).
103
+ const { Jimp, JimpMime } = await import("jimp");
104
+ const image = await Jimp.read(imagePath);
105
+ // Get MIME type. If emtpy throw error
106
+ const mime = image.mime;
107
+ if (!mime)
108
+ throw new Error("Cannot read MIME type");
109
+ // We need to check the MIME type (the exact union `getBuffer` accepts).
110
+ let mimeType;
111
+ switch (mime) {
112
+ case JimpMime.png:
113
+ case JimpMime.jpeg:
114
+ case JimpMime.bmp:
115
+ mimeType = mime;
116
+ break;
117
+ default:
118
+ throw new Error("Unsupported MIME type");
119
+ }
120
+ image.greyscale();
121
+ // Convert the image back to buffer with current MIME type
122
+ const grayscaleBuffer = await image.getBuffer(mimeType);
123
+ return grayscaleBuffer;
134
124
  }
135
- function applyContainFit(imageWidth, imageHeight, containerWidth, containerHeight) {
125
+ export function applyContainFit(imageWidth, imageHeight, containerWidth, containerHeight) {
136
126
  const imageAspectRatio = imageWidth / imageHeight;
137
127
  const containerAspectRatio = containerWidth / containerHeight;
138
128
  let width, height, offsetX, offsetY;
@@ -159,7 +149,7 @@ function applyContainFit(imageWidth, imageHeight, containerWidth, containerHeigh
159
149
  offsetY,
160
150
  };
161
151
  }
162
- function applyCoverFit(imageWidth, imageHeight, containerWidth, containerHeight) {
152
+ export function applyCoverFit(imageWidth, imageHeight, containerWidth, containerHeight) {
163
153
  const imageAspectRatio = imageWidth / imageHeight;
164
154
  const containerAspectRatio = containerWidth / containerHeight;
165
155
  let width, height, offsetX, offsetY;
@@ -186,7 +176,7 @@ function applyCoverFit(imageWidth, imageHeight, containerWidth, containerHeight)
186
176
  offsetY,
187
177
  };
188
178
  }
189
- function applyFillFit(containerWidth, containerHeight) {
179
+ export function applyFillFit(containerWidth, containerHeight) {
190
180
  return {
191
181
  width: containerWidth,
192
182
  height: containerHeight,
@@ -194,7 +184,7 @@ function applyFillFit(containerWidth, containerHeight) {
194
184
  offsetY: 0,
195
185
  };
196
186
  }
197
- function applyFitNone(imageWidth, imageHeight, containerWidth, containerHeight) {
187
+ export function applyFitNone(imageWidth, imageHeight, containerWidth, containerHeight) {
198
188
  const offsetX = (containerWidth - imageWidth) / 2; // Center horizontally
199
189
  const offsetY = (containerHeight - imageHeight) / 2; // Center vertically
200
190
  return {
@@ -0,0 +1,4 @@
1
+ /** The raw 16-byte MD5 digest of `input`. */
2
+ export declare function md5(input: Uint8Array): Uint8Array;
3
+ /** Lowercase hex of the MD5 digest (matches `digest("hex")`). */
4
+ export declare function md5Hex(input: Uint8Array): string;
@@ -0,0 +1,80 @@
1
+ // MD5 (RFC 1321), vendored + isomorphic - so the font subset tag and the documentId /ID hash work in the
2
+ // browser too: Node `crypto` is absent there, and Web Crypto has no MD5 and is async. Verified byte-for-byte
3
+ // identical to Node's `createHash("md5")`. Operates on bytes; callers UTF-8-encode strings (TextEncoder),
4
+ // matching `hash.update(string)`'s default encoding.
5
+ // Per-round left-rotate amounts.
6
+ const S = [
7
+ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
8
+ 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
9
+ 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
10
+ 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,
11
+ ];
12
+ // Per-round constants K[i] = floor(abs(sin(i+1)) * 2^32).
13
+ const K = new Int32Array(64);
14
+ for (let i = 0; i < 64; i++)
15
+ K[i] = Math.floor(Math.abs(Math.sin(i + 1)) * 2 ** 32) | 0;
16
+ /** The raw 16-byte MD5 digest of `input`. */
17
+ export function md5(input) {
18
+ const len = input.length;
19
+ // Pad to a multiple of 64: message + 0x80 + zeros + 64-bit little-endian bit length.
20
+ const total = (((len + 8) >> 6) + 1) << 6;
21
+ const b = new Uint8Array(total);
22
+ b.set(input);
23
+ b[len] = 0x80;
24
+ const bits = len * 8;
25
+ b[total - 8] = bits & 0xff;
26
+ b[total - 7] = (bits >>> 8) & 0xff;
27
+ b[total - 6] = (bits >>> 16) & 0xff;
28
+ b[total - 5] = (bits >>> 24) & 0xff;
29
+ // High 32 bits of the length stay 0 (inputs are well under 512 MB).
30
+ let a0 = 0x67452301, b0 = 0xefcdab89, c0 = 0x98badcfe, d0 = 0x10325476;
31
+ const M = new Int32Array(16);
32
+ for (let off = 0; off < total; off += 64) {
33
+ for (let i = 0; i < 16; i++) {
34
+ const j = off + i * 4;
35
+ M[i] = b[j] | (b[j + 1] << 8) | (b[j + 2] << 16) | (b[j + 3] << 24);
36
+ }
37
+ let A = a0, B = b0, C = c0, D = d0;
38
+ for (let i = 0; i < 64; i++) {
39
+ let f, g;
40
+ if (i < 16) {
41
+ f = (B & C) | (~B & D);
42
+ g = i;
43
+ }
44
+ else if (i < 32) {
45
+ f = (D & B) | (~D & C);
46
+ g = (5 * i + 1) % 16;
47
+ }
48
+ else if (i < 48) {
49
+ f = B ^ C ^ D;
50
+ g = (3 * i + 5) % 16;
51
+ }
52
+ else {
53
+ f = C ^ (B | ~D);
54
+ g = (7 * i) % 16;
55
+ }
56
+ f = (f + A + K[i] + M[g]) | 0;
57
+ A = D;
58
+ D = C;
59
+ C = B;
60
+ B = (B + (((f << S[i]) | (f >>> (32 - S[i]))) | 0)) | 0;
61
+ }
62
+ a0 = (a0 + A) | 0;
63
+ b0 = (b0 + B) | 0;
64
+ c0 = (c0 + C) | 0;
65
+ d0 = (d0 + D) | 0;
66
+ }
67
+ const out = new Uint8Array(16);
68
+ const w = [a0, b0, c0, d0];
69
+ for (let i = 0; i < 4; i++) {
70
+ out[i * 4] = w[i] & 0xff;
71
+ out[i * 4 + 1] = (w[i] >>> 8) & 0xff;
72
+ out[i * 4 + 2] = (w[i] >>> 16) & 0xff;
73
+ out[i * 4 + 3] = (w[i] >>> 24) & 0xff;
74
+ }
75
+ return out;
76
+ }
77
+ /** Lowercase hex of the MD5 digest (matches `digest("hex")`). */
78
+ export function md5Hex(input) {
79
+ return [...md5(input)].map((x) => x.toString(16).padStart(2, "0")).join("");
80
+ }
@@ -1,5 +1,6 @@
1
- import type { PDFConfig } from "../renderer/pdf-document-class";
2
- import type { FontMetrics } from "./font-metrics";
1
+ import type { OverflowPolicy } from "../layout/fragmentation.js";
2
+ import type { PDFConfig } from "../renderer/pdf-document-class.js";
3
+ import type { FontMetrics } from "./font-metrics.js";
3
4
  interface FontIndexes {
4
5
  fontIndex: number;
5
6
  resourceIndex: number;
@@ -30,10 +31,13 @@ export declare class PDFObjectManager implements FontMetrics {
30
31
  private pdfVersion;
31
32
  private documentId;
32
33
  private compress;
34
+ private overflowPolicy;
33
35
  constructor();
34
36
  addObject(content: string): number;
35
37
  replaceObject(objectNumber: number, content: string): void;
36
38
  setCompress(on: boolean): void;
39
+ setOverflowPolicy(policy: OverflowPolicy): void;
40
+ getOverflowPolicy(): OverflowPolicy;
37
41
  private stream;
38
42
  addContentStream(content: string): number;
39
43
  changePDFConfig(config: PDFConfig): void;
@@ -42,8 +46,8 @@ export declare class PDFObjectManager implements FontMetrics {
42
46
  private getCurrentByteLength;
43
47
  setParentObjectNumber(number: number): void;
44
48
  getParentObjectNumber(): number;
45
- registerImage(width: number, height: number, imageType: string, imageData: string): number;
46
- attachFile(name: string, data: Buffer, opts?: {
49
+ registerImage(width: number, height: number, imageType: string, imageData: string, smaskData?: string): number;
50
+ attachFile(name: string, data: Uint8Array, opts?: {
47
51
  relationship?: string;
48
52
  mimeType?: string;
49
53
  description?: string;
@@ -54,7 +58,7 @@ export declare class PDFObjectManager implements FontMetrics {
54
58
  }[];
55
59
  setXmpMetadata(xml: string): void;
56
60
  getXmpMetadata(): string | undefined;
57
- setOutputIntent(icc: Buffer, opts?: {
61
+ setOutputIntent(icc: Uint8Array, opts?: {
58
62
  identifier?: string;
59
63
  info?: string;
60
64
  }): void;
@@ -66,7 +70,7 @@ export declare class PDFObjectManager implements FontMetrics {
66
70
  registerExtGState(fillAlpha: number, strokeAlpha: number): string;
67
71
  getAllExtGStatesRaw(): Map<string, number>;
68
72
  registerFont(fontName: string, fontStyle?: FontStyle, fullName?: string): FontIndexes;
69
- registerCustomFont(name: string, data: Buffer, style?: FontStyle): void;
73
+ registerCustomFont(name: string, data: Uint8Array, style?: FontStyle): void;
70
74
  private ensureEmitted;
71
75
  finalizeCustomFonts(): void;
72
76
  private subsetTag;