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

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 (279) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -21
  3. package/dist/api/args.d.ts +1 -1
  4. package/dist/api/args.js +2 -5
  5. package/dist/api/color.d.ts +4 -4
  6. package/dist/api/color.js +11 -17
  7. package/dist/api/content.d.ts +20 -13
  8. package/dist/api/content.js +44 -29
  9. package/dist/api/descriptor.d.ts +2 -2
  10. package/dist/api/descriptor.js +121 -31
  11. package/dist/api/dimension.d.ts +76 -0
  12. package/dist/api/dimension.js +43 -0
  13. package/dist/api/font-url.d.ts +28 -0
  14. package/dist/api/font-url.js +134 -0
  15. package/dist/api/forms.d.ts +347 -0
  16. package/dist/api/forms.js +189 -0
  17. package/dist/api/gradient.d.ts +53 -0
  18. package/dist/api/gradient.js +97 -0
  19. package/dist/api/index.d.ts +13 -8
  20. package/dist/api/index.js +13 -24
  21. package/dist/api/insets.d.ts +19 -12
  22. package/dist/api/insets.js +19 -12
  23. package/dist/api/layout.d.ts +149 -25
  24. package/dist/api/layout.js +182 -51
  25. package/dist/api/page-builder.d.ts +40 -0
  26. package/dist/api/page-builder.js +44 -0
  27. package/dist/api/structure.d.ts +107 -13
  28. package/dist/api/structure.js +187 -88
  29. package/dist/api/table.d.ts +5 -5
  30. package/dist/api/table.js +38 -26
  31. package/dist/api/text.d.ts +90 -4
  32. package/dist/api/text.js +116 -31
  33. package/dist/assets/font-data.d.ts +2 -0
  34. package/dist/assets/font-data.js +21 -0
  35. package/dist/assets/font-data.ts +37 -0
  36. package/dist/common/color.js +1 -5
  37. package/dist/constants/page-sizes.js +3 -6
  38. package/dist/constants/pdf-parts.js +1 -4
  39. package/dist/crypto/legacy-handler.d.ts +43 -0
  40. package/dist/crypto/legacy-handler.js +145 -0
  41. package/dist/crypto/security-handler.d.ts +62 -0
  42. package/dist/crypto/security-handler.js +155 -0
  43. package/dist/crypto/webcrypto.d.ts +11 -0
  44. package/dist/crypto/webcrypto.js +62 -0
  45. package/dist/edit/acroform-reader.d.ts +70 -0
  46. package/dist/edit/acroform-reader.js +126 -0
  47. package/dist/edit/appearance.d.ts +47 -0
  48. package/dist/edit/appearance.js +171 -0
  49. package/dist/edit/document.d.ts +145 -0
  50. package/dist/edit/document.js +642 -0
  51. package/dist/edit/fill.d.ts +65 -0
  52. package/dist/edit/fill.js +424 -0
  53. package/dist/edit/flatten.d.ts +54 -0
  54. package/dist/edit/flatten.js +462 -0
  55. package/dist/edit/index.d.ts +20 -0
  56. package/dist/edit/index.js +18 -0
  57. package/dist/edit/lexer.d.ts +30 -0
  58. package/dist/edit/lexer.js +285 -0
  59. package/dist/edit/objects.d.ts +68 -0
  60. package/dist/edit/objects.js +83 -0
  61. package/dist/edit/writer.d.ts +60 -0
  62. package/dist/edit/writer.js +283 -0
  63. package/dist/elements/container-element.d.ts +50 -5
  64. package/dist/elements/container-element.js +100 -39
  65. package/dist/elements/forms/checkbox-element.d.ts +51 -0
  66. package/dist/elements/forms/checkbox-element.js +48 -0
  67. package/dist/elements/forms/choice-element.d.ts +53 -0
  68. package/dist/elements/forms/choice-element.js +59 -0
  69. package/dist/elements/forms/push-button-element.d.ts +56 -0
  70. package/dist/elements/forms/push-button-element.js +49 -0
  71. package/dist/elements/forms/radio-element.d.ts +52 -0
  72. package/dist/elements/forms/radio-element.js +49 -0
  73. package/dist/elements/forms/signature-element.d.ts +54 -0
  74. package/dist/elements/forms/signature-element.js +47 -0
  75. package/dist/elements/forms/text-field-element.d.ts +61 -0
  76. package/dist/elements/forms/text-field-element.js +54 -0
  77. package/dist/elements/image-element.d.ts +58 -6
  78. package/dist/elements/image-element.js +145 -111
  79. package/dist/elements/index.d.ts +26 -10
  80. package/dist/elements/index.js +26 -28
  81. package/dist/elements/layout/anchor-element.d.ts +23 -0
  82. package/dist/elements/layout/anchor-element.js +27 -0
  83. package/dist/elements/layout/bookmark-element.d.ts +27 -0
  84. package/dist/elements/layout/bookmark-element.js +30 -0
  85. package/dist/elements/layout/default-text-style-element.d.ts +30 -0
  86. package/dist/elements/layout/default-text-style-element.js +47 -0
  87. package/dist/elements/layout/deferred-element.d.ts +3 -3
  88. package/dist/elements/layout/deferred-element.js +4 -8
  89. package/dist/elements/layout/expanded-element.d.ts +6 -4
  90. package/dist/elements/layout/expanded-element.js +22 -17
  91. package/dist/elements/layout/keep-together-element.d.ts +42 -0
  92. package/dist/elements/layout/keep-together-element.js +85 -0
  93. package/dist/elements/layout/link-element.d.ts +33 -0
  94. package/dist/elements/layout/link-element.js +39 -0
  95. package/dist/elements/layout/padding-element.d.ts +10 -5
  96. package/dist/elements/layout/padding-element.js +25 -16
  97. package/dist/elements/layout/page-break-element.d.ts +17 -0
  98. package/dist/elements/layout/page-break-element.js +24 -0
  99. package/dist/elements/layout/page-builder-element.d.ts +32 -0
  100. package/dist/elements/layout/page-builder-element.js +45 -0
  101. package/dist/elements/layout/positioned-element.d.ts +47 -0
  102. package/dist/elements/layout/positioned-element.js +73 -0
  103. package/dist/elements/layout/repeating-header-element.d.ts +3 -3
  104. package/dist/elements/layout/repeating-header-element.js +8 -12
  105. package/dist/elements/layout/rotated-box-element.d.ts +35 -0
  106. package/dist/elements/layout/rotated-box-element.js +54 -0
  107. package/dist/elements/layout/rotated-element.d.ts +32 -0
  108. package/dist/elements/layout/rotated-element.js +41 -0
  109. package/dist/elements/layout/sized-container-element.d.ts +2 -2
  110. package/dist/elements/layout/sized-container-element.js +6 -11
  111. package/dist/elements/layout/struct-group.d.ts +28 -0
  112. package/dist/elements/layout/struct-group.js +42 -0
  113. package/dist/elements/line-element.d.ts +3 -3
  114. package/dist/elements/line-element.js +5 -10
  115. package/dist/elements/page-element.d.ts +26 -6
  116. package/dist/elements/page-element.js +72 -27
  117. package/dist/elements/pdf-document-element.d.ts +10 -4
  118. package/dist/elements/pdf-document-element.js +11 -10
  119. package/dist/elements/pdf-element.d.ts +150 -4
  120. package/dist/elements/pdf-element.js +138 -20
  121. package/dist/elements/rectangle-element.d.ts +52 -11
  122. package/dist/elements/rectangle-element.js +129 -36
  123. package/dist/elements/row-element.d.ts +45 -4
  124. package/dist/elements/row-element.js +66 -18
  125. package/dist/elements/text-element.d.ts +139 -11
  126. package/dist/elements/text-element.js +234 -57
  127. package/dist/forms/acroform.d.ts +63 -0
  128. package/dist/forms/acroform.js +427 -0
  129. package/dist/forms/appearance.d.ts +58 -0
  130. package/dist/forms/appearance.js +204 -0
  131. package/dist/forms/field.d.ts +164 -0
  132. package/dist/forms/field.js +1 -0
  133. package/dist/forms/pdf.d.ts +19 -0
  134. package/dist/forms/pdf.js +28 -0
  135. package/dist/index.d.ts +3 -3
  136. package/dist/index.js +3 -19
  137. package/dist/ir/display-list.d.ts +197 -8
  138. package/dist/ir/display-list.js +8 -2
  139. package/dist/layout/alignment.d.ts +10 -0
  140. package/dist/layout/alignment.js +6 -0
  141. package/dist/layout/box-constraints.d.ts +61 -0
  142. package/dist/layout/box-constraints.js +88 -6
  143. package/dist/layout/collect-images.d.ts +9 -0
  144. package/dist/layout/collect-images.js +34 -0
  145. package/dist/layout/fragmentation.d.ts +20 -1
  146. package/dist/layout/fragmentation.js +74 -18
  147. package/dist/layout/insets.d.ts +28 -0
  148. package/dist/layout/insets.js +20 -0
  149. package/dist/platform/browser-fs.d.ts +2 -0
  150. package/dist/platform/browser-fs.js +9 -0
  151. package/dist/platform/browser-image.d.ts +5 -0
  152. package/dist/platform/browser-image.js +13 -0
  153. package/dist/platform/node-fs.d.ts +2 -0
  154. package/dist/platform/node-fs.js +10 -0
  155. package/dist/platform/node-image.d.ts +5 -0
  156. package/dist/platform/node-image.js +9 -0
  157. package/dist/renderer/anchor-renderer.d.ts +6 -0
  158. package/dist/renderer/anchor-renderer.js +11 -0
  159. package/dist/renderer/bookmark-renderer.d.ts +6 -0
  160. package/dist/renderer/bookmark-renderer.js +11 -0
  161. package/dist/renderer/container-renderer.d.ts +3 -3
  162. package/dist/renderer/container-renderer.js +11 -28
  163. package/dist/renderer/default-text-style-renderer.d.ts +6 -0
  164. package/dist/renderer/default-text-style-renderer.js +10 -0
  165. package/dist/renderer/deferred-renderer.d.ts +3 -3
  166. package/dist/renderer/deferred-renderer.js +8 -23
  167. package/dist/renderer/emoji-image.d.ts +9 -0
  168. package/dist/renderer/emoji-image.js +68 -0
  169. package/dist/renderer/expanded-renderer.d.ts +3 -3
  170. package/dist/renderer/expanded-renderer.js +6 -21
  171. package/dist/renderer/form-field-renderer.d.ts +20 -0
  172. package/dist/renderer/form-field-renderer.js +12 -0
  173. package/dist/renderer/image-renderer.d.ts +4 -4
  174. package/dist/renderer/image-renderer.js +86 -75
  175. package/dist/renderer/index.d.ts +10 -10
  176. package/dist/renderer/index.js +10 -26
  177. package/dist/renderer/keep-together-renderer.d.ts +10 -0
  178. package/dist/renderer/keep-together-renderer.js +12 -0
  179. package/dist/renderer/line-renderer.d.ts +3 -3
  180. package/dist/renderer/line-renderer.js +13 -28
  181. package/dist/renderer/link-renderer.d.ts +6 -0
  182. package/dist/renderer/link-renderer.js +11 -0
  183. package/dist/renderer/padding-renderer.d.ts +3 -3
  184. package/dist/renderer/padding-renderer.js +6 -21
  185. package/dist/renderer/page-break-renderer.d.ts +14 -0
  186. package/dist/renderer/page-break-renderer.js +15 -0
  187. package/dist/renderer/page-builder-renderer.d.ts +6 -0
  188. package/dist/renderer/page-builder-renderer.js +11 -0
  189. package/dist/renderer/page-renderer.d.ts +2 -2
  190. package/dist/renderer/page-renderer.js +115 -77
  191. package/dist/renderer/pdf-backend.d.ts +31 -4
  192. package/dist/renderer/pdf-backend.js +287 -49
  193. package/dist/renderer/pdf-config.js +4 -7
  194. package/dist/renderer/pdf-document-class.d.ts +5 -5
  195. package/dist/renderer/pdf-document-class.js +27 -41
  196. package/dist/renderer/pdf-document-renderer.d.ts +19 -10
  197. package/dist/renderer/pdf-document-renderer.js +135 -91
  198. package/dist/renderer/pdf-renderer.d.ts +2 -2
  199. package/dist/renderer/pdf-renderer.js +165 -90
  200. package/dist/renderer/positioned-renderer.d.ts +6 -0
  201. package/dist/renderer/positioned-renderer.js +10 -0
  202. package/dist/renderer/rectangle-renderer.d.ts +3 -3
  203. package/dist/renderer/rectangle-renderer.js +49 -44
  204. package/dist/renderer/repeating-header-renderer.d.ts +3 -3
  205. package/dist/renderer/repeating-header-renderer.js +10 -26
  206. package/dist/renderer/rotated-renderer.d.ts +7 -0
  207. package/dist/renderer/rotated-renderer.js +29 -0
  208. package/dist/renderer/row-renderer.d.ts +3 -3
  209. package/dist/renderer/row-renderer.js +11 -28
  210. package/dist/renderer/struct-group-renderer.d.ts +10 -0
  211. package/dist/renderer/struct-group-renderer.js +24 -0
  212. package/dist/renderer/text-renderer.d.ts +9 -5
  213. package/dist/renderer/text-renderer.js +437 -89
  214. package/dist/text/advance.d.ts +34 -0
  215. package/dist/text/advance.js +45 -0
  216. package/dist/text/arabic.d.ts +20 -0
  217. package/dist/text/arabic.js +101 -0
  218. package/dist/text/bidi.d.ts +33 -0
  219. package/dist/text/bidi.js +94 -0
  220. package/dist/text/emoji-codepoints.d.ts +1 -0
  221. package/dist/text/emoji-codepoints.js +29 -0
  222. package/dist/text/font-fallback.d.ts +25 -0
  223. package/dist/text/font-fallback.js +38 -0
  224. package/dist/text/glyph-coverage.d.ts +15 -0
  225. package/dist/text/glyph-coverage.js +77 -0
  226. package/dist/text/line-breaker.d.ts +50 -12
  227. package/dist/text/line-breaker.js +200 -54
  228. package/dist/text/line-metrics.d.ts +49 -0
  229. package/dist/text/line-metrics.js +57 -0
  230. package/dist/text/orphans-widows.d.ts +27 -0
  231. package/dist/text/orphans-widows.js +53 -0
  232. package/dist/text/shape.d.ts +29 -0
  233. package/dist/text/shape.js +67 -0
  234. package/dist/text/text-decoration.d.ts +50 -0
  235. package/dist/text/text-decoration.js +62 -0
  236. package/dist/text/text-style.d.ts +60 -0
  237. package/dist/text/text-style.js +79 -0
  238. package/dist/text/whitespace.d.ts +4 -0
  239. package/dist/text/whitespace.js +43 -0
  240. package/dist/utils/afm-parser.d.ts +34 -0
  241. package/dist/utils/afm-parser.js +76 -17
  242. package/dist/utils/bytes.d.ts +24 -0
  243. package/dist/utils/bytes.js +76 -0
  244. package/dist/utils/dest-registry.d.ts +22 -0
  245. package/dist/utils/dest-registry.js +32 -0
  246. package/dist/utils/flex-layout.d.ts +36 -9
  247. package/dist/utils/flex-layout.js +207 -30
  248. package/dist/utils/font-metrics.d.ts +26 -1
  249. package/dist/utils/font-metrics.js +1 -2
  250. package/dist/utils/font-path.js +3 -6
  251. package/dist/utils/gsub.d.ts +36 -0
  252. package/dist/utils/gsub.js +178 -0
  253. package/dist/utils/image-helper.d.ts +6 -5
  254. package/dist/utils/image-helper.js +101 -111
  255. package/dist/utils/inflate.d.ts +16 -0
  256. package/dist/utils/inflate.js +52 -0
  257. package/dist/utils/md5.d.ts +4 -0
  258. package/dist/utils/md5.js +79 -0
  259. package/dist/utils/outline.d.ts +21 -0
  260. package/dist/utils/outline.js +79 -0
  261. package/dist/utils/pdf-object-manager.d.ts +127 -8
  262. package/dist/utils/pdf-object-manager.js +615 -141
  263. package/dist/utils/renderer-registry.d.ts +13 -1
  264. package/dist/utils/renderer-registry.js +23 -6
  265. package/dist/utils/struct-tree.d.ts +44 -0
  266. package/dist/utils/struct-tree.js +129 -0
  267. package/dist/utils/ttf-parser.d.ts +134 -2
  268. package/dist/utils/ttf-parser.js +873 -50
  269. package/dist/utils/ttf-subsetter.d.ts +1 -1
  270. package/dist/utils/ttf-subsetter.js +40 -42
  271. package/dist/utils/ua-xmp.d.ts +9 -0
  272. package/dist/utils/ua-xmp.js +32 -0
  273. package/dist/utils/utf8-to-windows1252-encoder.d.ts +6 -0
  274. package/dist/utils/utf8-to-windows1252-encoder.js +11 -4
  275. package/dist/utils/woff.d.ts +10 -0
  276. package/dist/utils/woff.js +116 -0
  277. package/dist/validators/element-validator.d.ts +2 -2
  278. package/dist/validators/element-validator.js +31 -26
  279. package/package.json +22 -2
@@ -1,140 +1,174 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
- return new (P || (P = Promise))(function (resolve, reject) {
38
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
- step((generator = generator.apply(thisArg, _arguments || [])).next());
42
- });
43
- };
44
- Object.defineProperty(exports, "__esModule", { value: true });
45
- exports.ImageElement = exports.CustomLocalImage = exports.CustomImage = exports.BoxFit = void 0;
46
- const image_helper_1 = require("../utils/image-helper");
47
- const pdf_element_1 = require("./pdf-element");
48
- var BoxFit;
1
+ import { getImageDimensions } from "../utils/image-helper.js";
2
+ import { latin1FromBytes } from "../utils/bytes.js";
3
+ import { readFileBytesAsync } from "../platform/node-fs.js";
4
+ import { extentSpecs, resolveSize, } from "../layout/box-constraints.js";
5
+ import { SizedPDFElement } from "./pdf-element.js";
6
+ // path.extname without node:path (browser-safe): the substring from the last dot, if it sits after the
7
+ // last slash (so a dot in a directory name does not count). Enough for image file extensions.
8
+ function extname(p) {
9
+ const dot = p.lastIndexOf(".");
10
+ const slash = p.lastIndexOf("/");
11
+ return dot > slash + 1 ? p.slice(dot) : "";
12
+ }
13
+ export var BoxFit;
49
14
  (function (BoxFit) {
50
15
  BoxFit["none"] = "NONE";
51
16
  BoxFit["contain"] = "CONTAIN";
52
17
  BoxFit["cover"] = "COVER";
53
18
  BoxFit["fill"] = "FILL";
54
- })(BoxFit || (exports.BoxFit = BoxFit = {}));
55
- class CustomImage {
19
+ })(BoxFit || (BoxFit = {}));
20
+ export class CustomImage {
56
21
  }
57
- exports.CustomImage = CustomImage;
58
- class CustomLocalImage extends CustomImage {
22
+ export class CustomLocalImage extends CustomImage {
59
23
  constructor(imagePath) {
60
24
  super();
61
25
  this.imagePath = imagePath;
62
26
  }
63
- init() {
64
- return __awaiter(this, void 0, void 0, function* () {
65
- try {
66
- // Loading image and convert it to base64
67
- yield this.loadImage(this.imagePath);
68
- }
69
- catch (error) {
70
- console.error("Error loading image:", error);
71
- }
72
- });
27
+ async init() {
28
+ if (this.fileBuffer)
29
+ return; // idempotent: the pre-layout size pass and the renderer both call init()
30
+ try {
31
+ // Loading image and convert it to base64
32
+ await this.loadImage(this.imagePath);
33
+ }
34
+ catch (error) {
35
+ console.error("Error loading image:", error);
36
+ }
73
37
  }
74
- getImageType() {
75
- return __awaiter(this, void 0, void 0, function* () {
76
- const path = yield Promise.resolve().then(() => __importStar(require("path"))); // Dynamic import
77
- const ext = path.extname(this.imagePath).toLowerCase();
78
- switch (ext) {
79
- case ".jpg":
80
- case ".jpeg":
81
- return "DCTDecode"; // For JPEG
82
- case ".png":
83
- return "FlateDecode"; // For PNG
84
- case ".bmp":
85
- throw new Error("BMP is not directly supported. Please convert to PNG or JPEG.");
86
- case ".webp":
87
- throw new Error("WebP is not directly supported. Please convert to PNG or JPEG.");
88
- default:
89
- throw new Error(`Unsupported image format: ${ext}`);
90
- }
91
- });
38
+ async getImageType() {
39
+ const ext = extname(this.imagePath).toLowerCase();
40
+ switch (ext) {
41
+ case ".jpg":
42
+ case ".jpeg":
43
+ return "DCTDecode"; // For JPEG
44
+ case ".png":
45
+ return "FlateDecode"; // For PNG
46
+ case ".bmp":
47
+ throw new Error("BMP is not directly supported. Please convert to PNG or JPEG.");
48
+ case ".webp":
49
+ throw new Error("WebP is not directly supported. Please convert to PNG or JPEG.");
50
+ default:
51
+ throw new Error(`Unsupported image format: ${ext}`);
52
+ }
92
53
  }
93
- loadImage(imagePath) {
94
- return __awaiter(this, void 0, void 0, function* () {
95
- const fs = yield Promise.resolve().then(() => __importStar(require("fs/promises"))); // Dynamic import
96
- const result = yield fs.readFile(imagePath);
97
- //const result = await convertImageToGrayscaleBuffer(imagePath);
98
- this.fileBuffer = result;
99
- this.fileRawData = result.toString("binary");
100
- return result;
101
- });
54
+ async loadImage(imagePath) {
55
+ const result = await readFileBytesAsync(imagePath);
56
+ //const result = await convertImageToGrayscaleBuffer(imagePath);
57
+ this.fileBuffer = result;
58
+ this.fileRawData = latin1FromBytes(result);
59
+ return result;
102
60
  }
103
61
  getFileData() {
104
62
  return this.fileRawData;
105
63
  }
106
- getImageDimensions() {
107
- return __awaiter(this, void 0, void 0, function* () {
108
- if (!this.fileBuffer) {
109
- throw new Error("You must first call the `loadAndConvertImage` method");
110
- }
111
- // Since now (30.09.2024) we using "Jimp" - So we don't need our custom method to get the image dimension.
112
- // But at the moment I let it still here...
113
- const dimensions = yield (0, image_helper_1.getImageDimensions)(this.fileBuffer);
114
- return dimensions;
115
- });
64
+ async getImageDimensions() {
65
+ if (this.dims)
66
+ return this.dims; // reuse: the pre-layout size pass and the renderer both ask
67
+ if (!this.fileBuffer) {
68
+ throw new Error("You must first call the `loadAndConvertImage` method");
69
+ }
70
+ this.dims = await getImageDimensions(this.fileBuffer);
71
+ return this.dims;
72
+ }
73
+ }
74
+ /**
75
+ * An image straight from raw bytes (a browser upload / fetch, no filesystem). The PDF filter is sniffed
76
+ * from the magic bytes: JPEG embeds raw (DCTDecode, no decode step), PNG is decoded to RGB (FlateDecode).
77
+ */
78
+ export class CustomBytesImage extends CustomImage {
79
+ constructor(bytes) {
80
+ super();
81
+ this.bytes = bytes;
82
+ this.fileRawData = latin1FromBytes(bytes);
83
+ }
84
+ async init() { }
85
+ async getImageType() {
86
+ const b = this.bytes;
87
+ if (b[0] === 0xff && b[1] === 0xd8)
88
+ return "DCTDecode"; // JPEG
89
+ if (b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47)
90
+ return "FlateDecode"; // PNG
91
+ throw new Error("Unsupported image bytes (only JPEG and PNG are supported).");
92
+ }
93
+ getFileData() {
94
+ return this.fileRawData;
95
+ }
96
+ async getImageDimensions() {
97
+ if (!this.dims)
98
+ this.dims = await getImageDimensions(this.bytes); // reuse across pre-pass + render
99
+ return this.dims;
116
100
  }
117
101
  }
118
- exports.CustomLocalImage = CustomLocalImage;
119
- class ImageElement extends pdf_element_1.SizedPDFElement {
120
- constructor({ image, width, height, fit = BoxFit.none, radius }) {
102
+ export class ImageElement extends SizedPDFElement {
103
+ constructor({ image, width, height, widthFactor, heightFactor, fit = BoxFit.none, radius, alt, ...sizing }) {
104
+ // Seed this.width/height from the request so getProps() reflects it before layout; calculateLayout
105
+ // then reads `requested` (never the mutated fields) and overwrites these with the laid-out size.
121
106
  super({ x: 0, y: 0, width });
122
107
  this.image = image;
123
108
  this.height = height;
109
+ this.requested = { width, height };
110
+ this.widthFactor = widthFactor;
111
+ this.heightFactor = heightFactor;
112
+ this.sizing = sizing;
124
113
  this.fit = fit;
125
- this.radius = radius !== null && radius !== void 0 ? radius : 0;
114
+ this.radius = radius ?? 0;
115
+ this.alt = alt;
116
+ }
117
+ /**
118
+ * Loads the image and records its intrinsic pixel size. Runs in the async pre-layout pass (layout
119
+ * itself is synchronous and cannot await jimp) so `calculateLayout` can turn a width-only image
120
+ * into a proportional box. Best-effort: a load failure leaves the size unresolved (the renderer
121
+ * surfaces the real error) and the image just keeps whatever explicit size it was given.
122
+ */
123
+ async resolveIntrinsicSize() {
124
+ try {
125
+ await this.image.init();
126
+ this.intrinsic = await this.image.getImageDimensions();
127
+ }
128
+ catch {
129
+ // leave intrinsic undefined - aspect derivation simply doesn't fire
130
+ }
131
+ }
132
+ relativeSizeFactor(horizontal) {
133
+ return horizontal ? this.widthFactor : this.heightFactor;
126
134
  }
127
135
  calculateLayout(constraints, offset, _ctx) {
128
- var _a, _b;
129
136
  this.x = offset.x;
130
137
  this.y = offset.y;
131
- // A bounded axis overrides the intrinsic/explicit size; otherwise keep our own.
132
- if (constraints.hasBoundedWidth)
133
- this.width = constraints.maxWidth;
134
- if (constraints.hasBoundedHeight)
135
- this.height = constraints.maxHeight;
138
+ // Relative sizing: a fixed size or a fraction of the offered box (fraction only in a bounded axis).
139
+ // Read from `requested` (not this.width/height, which we overwrite below) so every pass re-resolves.
140
+ const specs = extentSpecs({
141
+ ...this.sizing,
142
+ width: this.requested.width,
143
+ height: this.requested.height,
144
+ widthFactor: this.widthFactor,
145
+ heightFactor: this.heightFactor,
146
+ });
147
+ // An explicit `aspectRatio` wins over the image's own, as it does in CSS - and only it may size a
148
+ // box with NEITHER axis pinned. Left to the intrinsic ratio that would change what an unsized image
149
+ // has always done here (fill both axes and let `fit` sort it out).
150
+ const resolved = resolveSize(specs.width, specs.height, this.sizing.aspectRatio, constraints);
151
+ let w = resolved.width;
152
+ let h = resolved.height;
153
+ const bounds = resolved.constraints;
154
+ // Aspect auto-size: when exactly ONE axis is pinned, derive the other from the intrinsic ratio
155
+ // (CSS `width: 50%; height: auto`). Only fires once the pre-pass resolved the pixel size.
156
+ if (this.sizing.aspectRatio === undefined &&
157
+ this.intrinsic &&
158
+ this.intrinsic.width > 0 &&
159
+ this.intrinsic.height > 0) {
160
+ const ratio = this.intrinsic.width / this.intrinsic.height;
161
+ if (w !== undefined && h === undefined)
162
+ h = bounds.constrainHeight(w / ratio);
163
+ else if (h !== undefined && w === undefined)
164
+ w = bounds.constrainWidth(h * ratio);
165
+ }
166
+ // Fall back to the prior behavior for an unpinned axis: a bounded axis fills, otherwise keep the
167
+ // requested fixed size (or undefined). Read from `requested`, never the mutated this.width/height.
168
+ this.width = w ?? (bounds.hasBoundedWidth ? bounds.maxWidth : this.requested.width);
169
+ this.height = h ?? (bounds.hasBoundedHeight ? bounds.maxHeight : this.requested.height);
136
170
  // Top-left coordinates; the fit logic (renderer) and the Y-flip (seam) run later.
137
- return { width: (_a = this.width) !== null && _a !== void 0 ? _a : 0, height: (_b = this.height) !== null && _b !== void 0 ? _b : 0 };
171
+ return { width: this.width ?? 0, height: this.height ?? 0 };
138
172
  }
139
173
  getProps() {
140
174
  return {
@@ -145,7 +179,7 @@ class ImageElement extends pdf_element_1.SizedPDFElement {
145
179
  image: this.image,
146
180
  fit: this.fit,
147
181
  radius: this.radius,
182
+ alt: this.alt,
148
183
  };
149
184
  }
150
185
  }
151
- exports.ImageElement = ImageElement;
@@ -1,10 +1,26 @@
1
- export { PDFElement } from "./pdf-element";
2
- export * from "./text-element";
3
- export * from "./pdf-document-element";
4
- export * from "./page-element";
5
- export * from "./rectangle-element";
6
- export * from "./image-element";
7
- export * from "./layout/expanded-element";
8
- export * from "./layout/padding-element";
9
- export * from "./line-element";
10
- export * from "./row-element";
1
+ export { PDFElement } from "./pdf-element.js";
2
+ export * from "./text-element.js";
3
+ export * from "./pdf-document-element.js";
4
+ export * from "./page-element.js";
5
+ export * from "./rectangle-element.js";
6
+ export * from "./image-element.js";
7
+ export * from "./layout/expanded-element.js";
8
+ export * from "./layout/padding-element.js";
9
+ export * from "./layout/page-break-element.js";
10
+ export * from "./layout/keep-together-element.js";
11
+ export * from "./forms/text-field-element.js";
12
+ export * from "./forms/checkbox-element.js";
13
+ export * from "./forms/radio-element.js";
14
+ export * from "./forms/choice-element.js";
15
+ export * from "./forms/push-button-element.js";
16
+ export * from "./forms/signature-element.js";
17
+ export * from "./layout/default-text-style-element.js";
18
+ export * from "./layout/positioned-element.js";
19
+ export * from "./layout/link-element.js";
20
+ export * from "./layout/bookmark-element.js";
21
+ export * from "./layout/anchor-element.js";
22
+ export * from "./layout/page-builder-element.js";
23
+ export * from "./layout/rotated-element.js";
24
+ export * from "./layout/rotated-box-element.js";
25
+ export * from "./line-element.js";
26
+ export * from "./row-element.js";
@@ -1,28 +1,26 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.PDFElement = void 0;
18
- var pdf_element_1 = require("./pdf-element"); // the base element type - public for composing custom layouts
19
- Object.defineProperty(exports, "PDFElement", { enumerable: true, get: function () { return pdf_element_1.PDFElement; } });
20
- __exportStar(require("./text-element"), exports);
21
- __exportStar(require("./pdf-document-element"), exports);
22
- __exportStar(require("./page-element"), exports);
23
- __exportStar(require("./rectangle-element"), exports);
24
- __exportStar(require("./image-element"), exports);
25
- __exportStar(require("./layout/expanded-element"), exports);
26
- __exportStar(require("./layout/padding-element"), exports);
27
- __exportStar(require("./line-element"), exports);
28
- __exportStar(require("./row-element"), exports);
1
+ export { PDFElement } from "./pdf-element.js"; // the base element type - public for composing custom layouts
2
+ export * from "./text-element.js";
3
+ export * from "./pdf-document-element.js";
4
+ export * from "./page-element.js";
5
+ export * from "./rectangle-element.js";
6
+ export * from "./image-element.js";
7
+ export * from "./layout/expanded-element.js";
8
+ export * from "./layout/padding-element.js";
9
+ export * from "./layout/page-break-element.js";
10
+ export * from "./layout/keep-together-element.js";
11
+ export * from "./forms/text-field-element.js";
12
+ export * from "./forms/checkbox-element.js";
13
+ export * from "./forms/radio-element.js";
14
+ export * from "./forms/choice-element.js";
15
+ export * from "./forms/push-button-element.js";
16
+ export * from "./forms/signature-element.js";
17
+ export * from "./layout/default-text-style-element.js";
18
+ export * from "./layout/positioned-element.js";
19
+ export * from "./layout/link-element.js";
20
+ export * from "./layout/bookmark-element.js";
21
+ export * from "./layout/anchor-element.js";
22
+ export * from "./layout/page-builder-element.js";
23
+ export * from "./layout/rotated-element.js";
24
+ export * from "./layout/rotated-box-element.js";
25
+ export * from "./line-element.js";
26
+ export * from "./row-element.js";
@@ -0,0 +1,23 @@
1
+ import { PDFElement, LayoutContext } from "../pdf-element.js";
2
+ import { BoxConstraints, Offset, Size } from "../../layout/box-constraints.js";
3
+ /**
4
+ * Marks its child as a named jump target for an internal `Link({ to: name })`. Layout-transparent: it
5
+ * delegates `calculateLayout` to the child and records the child's top, which the renderer turns into an
6
+ * `Anchor` IR node (and PDFRenderer into a /Names /Dests entry). It draws nothing - the child renders
7
+ * exactly as it would on its own.
8
+ */
9
+ export declare class AnchorElement extends PDFElement {
10
+ private name;
11
+ private child;
12
+ private y;
13
+ constructor({ name, child }: {
14
+ name: string;
15
+ child: PDFElement;
16
+ });
17
+ calculateLayout(constraints: BoxConstraints, offset: Offset, ctx: LayoutContext): Size;
18
+ getProps(): {
19
+ name: string;
20
+ child: PDFElement;
21
+ y: number;
22
+ };
23
+ }
@@ -0,0 +1,27 @@
1
+ import { PDFElement } from "../pdf-element.js";
2
+ /**
3
+ * Marks its child as a named jump target for an internal `Link({ to: name })`. Layout-transparent: it
4
+ * delegates `calculateLayout` to the child and records the child's top, which the renderer turns into an
5
+ * `Anchor` IR node (and PDFRenderer into a /Names /Dests entry). It draws nothing - the child renders
6
+ * exactly as it would on its own.
7
+ */
8
+ export class AnchorElement extends PDFElement {
9
+ constructor({ name, child }) {
10
+ super();
11
+ this.y = 0;
12
+ this.name = name;
13
+ this.child = child;
14
+ }
15
+ calculateLayout(constraints, offset, ctx) {
16
+ const size = this.child.calculateLayout(constraints, offset, ctx);
17
+ this.y = offset.y; // the child's top - the scroll target for a link that jumps here
18
+ return size;
19
+ }
20
+ getProps() {
21
+ return {
22
+ name: this.name,
23
+ child: this.child,
24
+ y: this.y,
25
+ };
26
+ }
27
+ }
@@ -0,0 +1,27 @@
1
+ import { PDFElement, LayoutContext } from "../pdf-element.js";
2
+ import { BoxConstraints, Offset, Size } from "../../layout/box-constraints.js";
3
+ /**
4
+ * Adds a document-outline entry (a bookmark) that jumps to its child. Layout-transparent: it delegates
5
+ * `calculateLayout` to the child and records the child's top, which the renderer turns into an `Outline`
6
+ * IR node (and PDFRenderer into a /Outlines tree entry). `title` is the label shown in the viewer's
7
+ * bookmark panel; `level` (1-based, default 1) nests it under the nearest preceding smaller level. It
8
+ * draws nothing - the child renders exactly as it would without the bookmark.
9
+ */
10
+ export declare class BookmarkElement extends PDFElement {
11
+ private title;
12
+ private level;
13
+ private child;
14
+ private y;
15
+ constructor({ title, level, child }: {
16
+ title: string;
17
+ level?: number;
18
+ child: PDFElement;
19
+ });
20
+ calculateLayout(constraints: BoxConstraints, offset: Offset, ctx: LayoutContext): Size;
21
+ getProps(): {
22
+ title: string;
23
+ level: number;
24
+ child: PDFElement;
25
+ y: number;
26
+ };
27
+ }
@@ -0,0 +1,30 @@
1
+ import { PDFElement } from "../pdf-element.js";
2
+ /**
3
+ * Adds a document-outline entry (a bookmark) that jumps to its child. Layout-transparent: it delegates
4
+ * `calculateLayout` to the child and records the child's top, which the renderer turns into an `Outline`
5
+ * IR node (and PDFRenderer into a /Outlines tree entry). `title` is the label shown in the viewer's
6
+ * bookmark panel; `level` (1-based, default 1) nests it under the nearest preceding smaller level. It
7
+ * draws nothing - the child renders exactly as it would without the bookmark.
8
+ */
9
+ export class BookmarkElement extends PDFElement {
10
+ constructor({ title, level = 1, child }) {
11
+ super();
12
+ this.y = 0;
13
+ this.title = title;
14
+ this.level = level;
15
+ this.child = child;
16
+ }
17
+ calculateLayout(constraints, offset, ctx) {
18
+ const size = this.child.calculateLayout(constraints, offset, ctx);
19
+ this.y = offset.y; // the child's top - the scroll target for the bookmark
20
+ return size;
21
+ }
22
+ getProps() {
23
+ return {
24
+ title: this.title,
25
+ level: this.level,
26
+ child: this.child,
27
+ y: this.y,
28
+ };
29
+ }
30
+ }
@@ -0,0 +1,30 @@
1
+ import { PDFElement, LayoutContext, WithChild, SizedPDFElement } from "../pdf-element.js";
2
+ import { BoxConstraints, Offset, Size } from "../../layout/box-constraints.js";
3
+ import { Fragmentable, FragmentResult } from "../../layout/fragmentation.js";
4
+ import { ResolvedTextStyle } from "../../text/text-style.js";
5
+ interface DefaultTextStyleParams extends WithChild {
6
+ style: Partial<ResolvedTextStyle>;
7
+ }
8
+ /**
9
+ * Provides default text properties (font/size/color/lineHeight/align/weight) to its whole subtree -
10
+ * Flutter's `DefaultTextStyle`. Transparent to layout: the child takes the same constraints, offset
11
+ * and size; only the inherited TextStyle changes. A `Text` below still wins per property, and these
12
+ * overrides layer onto whatever the element already inherited from above.
13
+ */
14
+ export declare class DefaultTextStyleElement extends SizedPDFElement implements Fragmentable {
15
+ private child;
16
+ private style;
17
+ constructor({ child, style }: DefaultTextStyleParams);
18
+ private childCtx;
19
+ fragment(maxHeight: number, width: number, ctx: LayoutContext): FragmentResult;
20
+ private cloneWithChild;
21
+ calculateLayout(constraints: BoxConstraints, offset: Offset, ctx: LayoutContext): Size;
22
+ getProps(): {
23
+ x: number;
24
+ y: number;
25
+ width: number | undefined;
26
+ height: number | undefined;
27
+ child: PDFElement;
28
+ };
29
+ }
30
+ export {};
@@ -0,0 +1,47 @@
1
+ import { SizedPDFElement } from "../pdf-element.js";
2
+ import { isFragmentable } from "../../layout/fragmentation.js";
3
+ import { DEFAULT_TEXT_STYLE, mergeTextStyle } from "../../text/text-style.js";
4
+ /**
5
+ * Provides default text properties (font/size/color/lineHeight/align/weight) to its whole subtree -
6
+ * Flutter's `DefaultTextStyle`. Transparent to layout: the child takes the same constraints, offset
7
+ * and size; only the inherited TextStyle changes. A `Text` below still wins per property, and these
8
+ * overrides layer onto whatever the element already inherited from above.
9
+ */
10
+ export class DefaultTextStyleElement extends SizedPDFElement {
11
+ constructor({ child, style }) {
12
+ super({ x: 0, y: 0 });
13
+ this.child = child;
14
+ this.style = style;
15
+ }
16
+ childCtx(ctx) {
17
+ return {
18
+ ...ctx,
19
+ textStyle: mergeTextStyle(ctx.textStyle ?? DEFAULT_TEXT_STYLE, this.style),
20
+ };
21
+ }
22
+ // Transparent to fragmentation too: split the child against the merged context, re-wrapping each
23
+ // half so the remainder on the next page keeps the same defaults.
24
+ fragment(maxHeight, width, ctx) {
25
+ if (!isFragmentable(this.child))
26
+ return { fitted: null, remainder: this };
27
+ const split = this.child.fragment(maxHeight, width, this.childCtx(ctx));
28
+ return {
29
+ fitted: split.fitted ? this.cloneWithChild(split.fitted) : null,
30
+ remainder: split.remainder ? this.cloneWithChild(split.remainder) : null,
31
+ };
32
+ }
33
+ cloneWithChild(child) {
34
+ return new DefaultTextStyleElement({ child, style: this.style });
35
+ }
36
+ calculateLayout(constraints, offset, ctx) {
37
+ this.x = offset.x;
38
+ this.y = offset.y;
39
+ const size = this.child.calculateLayout(constraints, offset, this.childCtx(ctx));
40
+ this.width = size.width;
41
+ this.height = size.height;
42
+ return size;
43
+ }
44
+ getProps() {
45
+ return { x: this.x, y: this.y, width: this.width, height: this.height, child: this.child };
46
+ }
47
+ }
@@ -1,6 +1,6 @@
1
- import { BoxConstraints, Offset, Size } from "../../layout/box-constraints";
2
- import { Fragmentable, FragmentResult } from "../../layout/fragmentation";
3
- import { LayoutContext, PDFElement } from "../pdf-element";
1
+ import { BoxConstraints, Offset, Size } from "../../layout/box-constraints.js";
2
+ import { Fragmentable, FragmentResult } from "../../layout/fragmentation.js";
3
+ import { LayoutContext, PDFElement } from "../pdf-element.js";
4
4
  /**
5
5
  * Builds its subtree at layout time via `resolve(ctx)`, so the tree can depend on font
6
6
  * metrics (e.g. a Table resolving `"auto"` column widths from cell content). The engine
@@ -1,14 +1,11 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DeferredElement = void 0;
4
- const fragmentation_1 = require("../../layout/fragmentation");
5
- const pdf_element_1 = require("../pdf-element");
1
+ import { isFragmentable } from "../../layout/fragmentation.js";
2
+ import { PDFElement } from "../pdf-element.js";
6
3
  /**
7
4
  * Builds its subtree at layout time via `resolve(ctx)`, so the tree can depend on font
8
5
  * metrics (e.g. a Table resolving `"auto"` column widths from cell content). The engine
9
6
  * stays table-agnostic - the closure comes from the API layer.
10
7
  */
11
- class DeferredElement extends pdf_element_1.PDFElement {
8
+ export class DeferredElement extends PDFElement {
12
9
  constructor(resolve) {
13
10
  super();
14
11
  this.resolve = resolve;
@@ -22,7 +19,7 @@ class DeferredElement extends pdf_element_1.PDFElement {
22
19
  }
23
20
  fragment(maxHeight, width, ctx) {
24
21
  const c = this.build(ctx);
25
- return (0, fragmentation_1.isFragmentable)(c)
22
+ return isFragmentable(c)
26
23
  ? c.fragment(maxHeight, width, ctx)
27
24
  : { fitted: this, remainder: null };
28
25
  }
@@ -30,4 +27,3 @@ class DeferredElement extends pdf_element_1.PDFElement {
30
27
  return { composed: this.composed };
31
28
  }
32
29
  }
33
- exports.DeferredElement = DeferredElement;