@jasy/pdf 1.0.0-alpha.2 → 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 +18 -16
  14. package/dist/api/layout.js +41 -52
  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 -11
  32. package/dist/elements/index.js +12 -29
  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 +17 -4
  42. package/dist/elements/layout/positioned-element.js +29 -25
  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 +20 -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 +12 -3
  54. package/dist/elements/pdf-element.js +10 -19
  55. package/dist/elements/rectangle-element.d.ts +5 -5
  56. package/dist/elements/rectangle-element.js +19 -25
  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 +4 -2
  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 +21 -19
  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 -93
  103. package/dist/renderer/positioned-renderer.d.ts +3 -3
  104. package/dist/renderer/positioned-renderer.js +8 -23
  105. package/dist/renderer/rectangle-renderer.d.ts +3 -3
  106. package/dist/renderer/rectangle-renderer.js +45 -52
  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 +9 -13
  139. package/package.json +14 -2
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Color = void 0;
4
- class Color {
1
+ export class Color {
5
2
  constructor(r, g, b, alpha = 1) {
6
3
  this.r = this.clampColorValue(r, "r");
7
4
  this.g = this.clampColorValue(g, "g");
@@ -59,4 +56,3 @@ class Color {
59
56
  return `${(r / 255).toFixed(3)} ${(g / 255).toFixed(3)} ${(b / 255).toFixed(3)}`;
60
57
  }
61
58
  }
62
- exports.Color = Color;
@@ -1,8 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pageFormats = exports.PageSize = void 0;
4
1
  // Definition of all possible page sizes
5
- var PageSize;
2
+ export var PageSize;
6
3
  (function (PageSize) {
7
4
  PageSize["A0"] = "a0";
8
5
  PageSize["A1"] = "a1";
@@ -45,9 +42,9 @@ var PageSize;
45
42
  PageSize["LEDGER"] = "ledger";
46
43
  PageSize["TABLOID"] = "tabloid";
47
44
  PageSize["CREDIT_CARD"] = "credit-card";
48
- })(PageSize || (exports.PageSize = PageSize = {}));
45
+ })(PageSize || (PageSize = {}));
49
46
  // Definition of page formats
50
- exports.pageFormats = {
47
+ export const pageFormats = {
51
48
  [PageSize.A0]: [2383.94, 3370.39],
52
49
  [PageSize.A1]: [1683.78, 2383.94],
53
50
  [PageSize.A2]: [1190.55, 1683.78],
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PDF_PARTS = void 0;
4
- exports.PDF_PARTS = {
1
+ export const PDF_PARTS = {
5
2
  HEADER: "%PDF-1.3",
6
3
  TRAILER: (size) => `trailer\n<< /Size ${size} >>\nstartxref\n%%EOF`,
7
4
  XREF: "xref", // Placeholder for xref elements
@@ -1,7 +1,7 @@
1
- import { MainAlign, CrossAlign } from "../utils/flex-layout";
2
- import { BoxConstraints, Offset, Size } from "../layout/box-constraints";
3
- import { Fragmentable, FragmentResult } from "../layout/fragmentation";
4
- import { LayoutContext, SizedElement, SizedPDFElement, WithChildren } from "./pdf-element";
1
+ import { MainAlign, CrossAlign } from "../utils/flex-layout.js";
2
+ import { BoxConstraints, Offset, Size } from "../layout/box-constraints.js";
3
+ import { Fragmentable, FragmentResult } from "../layout/fragmentation.js";
4
+ import { LayoutContext, SizedElement, SizedPDFElement, WithChildren } from "./pdf-element.js";
5
5
  interface ContainerElementParams extends SizedElement, WithChildren {
6
6
  /** Space between children. */
7
7
  gap?: number;
@@ -1,16 +1,13 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ContainerElement = void 0;
4
- const flex_layout_1 = require("../utils/flex-layout");
5
- const fragmentation_1 = require("../layout/fragmentation");
6
- const pdf_element_1 = require("./pdf-element");
7
- class ContainerElement extends pdf_element_1.SizedPDFElement {
1
+ import { FlexLayoutHelper, VERTICAL_AXIS } from "../utils/flex-layout.js";
2
+ import { packChildren } from "../layout/fragmentation.js";
3
+ import { SizedPDFElement, } from "./pdf-element.js";
4
+ export class ContainerElement extends SizedPDFElement {
8
5
  constructor({ x, y, width, height, children, gap, main, cross }) {
9
6
  super({ x, y, width, height });
10
7
  this.children = children;
11
- this.gap = gap !== null && gap !== void 0 ? gap : 0;
12
- this.main = main !== null && main !== void 0 ? main : "start";
13
- this.cross = cross !== null && cross !== void 0 ? cross : "stretch";
8
+ this.gap = gap ?? 0;
9
+ this.main = main ?? "start";
10
+ this.cross = cross ?? "stretch";
14
11
  }
15
12
  /**
16
13
  * Splits the vertical stack across pages. Children are measured against the content
@@ -24,7 +21,7 @@ class ContainerElement extends pdf_element_1.SizedPDFElement {
24
21
  * in that case we don't fragment and hand the whole container back as `fitted`.
25
22
  */
26
23
  fragment(maxHeight, width, ctx) {
27
- const { fitted, remainder } = (0, fragmentation_1.packChildren)(this.children, maxHeight, width, ctx, this.gap);
24
+ const { fitted, remainder } = packChildren(this.children, maxHeight, width, ctx, this.gap);
28
25
  // Fits as one region: hand the whole container back so the page renders unchanged
29
26
  // (its normal layout distributes flex / fills the page).
30
27
  if (remainder.length === 0)
@@ -64,7 +61,7 @@ class ContainerElement extends pdf_element_1.SizedPDFElement {
64
61
  // Vertical flex stack (main = height, cross = width). The shared helper measures
65
62
  // fixed children, distributes the leftover to flex children, and places everything
66
63
  // in source order.
67
- result = flex_layout_1.FlexLayoutHelper.layout(this.children, flex_layout_1.VERTICAL_AXIS, mainAvail, crossAvail, this.y, this.x, { gap: this.gap, main: this.main, cross: this.cross }, ctx);
64
+ result = FlexLayoutHelper.layout(this.children, VERTICAL_AXIS, mainAvail, crossAvail, this.y, this.x, { gap: this.gap, main: this.main, cross: this.cross }, ctx);
68
65
  }
69
66
  // Bounded: fill the offered extent. Unbounded: shrink to the children (height = the
70
67
  // stack, width = the widest child). Top-left coordinates; the container draws nothing,
@@ -88,4 +85,3 @@ class ContainerElement extends pdf_element_1.SizedPDFElement {
88
85
  };
89
86
  }
90
87
  }
91
- exports.ContainerElement = ContainerElement;
@@ -1,5 +1,5 @@
1
- import { BoxConstraints, Offset, Size } from "../layout/box-constraints";
2
- import { LayoutContext, SizedPDFElement } from "./pdf-element";
1
+ import { BoxConstraints, Offset, Size } from "../layout/box-constraints.js";
2
+ import { LayoutContext, SizedPDFElement } from "./pdf-element.js";
3
3
  export declare enum BoxFit {
4
4
  none = "NONE",
5
5
  contain = "CONTAIN",
@@ -29,6 +29,22 @@ export declare class CustomLocalImage extends CustomImage {
29
29
  height: number;
30
30
  }>;
31
31
  }
32
+ /**
33
+ * An image straight from raw bytes (a browser upload / fetch, no filesystem). The PDF filter is sniffed
34
+ * from the magic bytes: JPEG embeds raw (DCTDecode, no decode step), PNG is decoded to RGB (FlateDecode).
35
+ */
36
+ export declare class CustomBytesImage extends CustomImage {
37
+ private bytes;
38
+ private fileRawData;
39
+ constructor(bytes: Uint8Array);
40
+ init(): Promise<void>;
41
+ getImageType(): Promise<string>;
42
+ getFileData(): string;
43
+ getImageDimensions(): Promise<{
44
+ width: number;
45
+ height: number;
46
+ }>;
47
+ }
32
48
  interface ImageElementParams {
33
49
  image: CustomImage;
34
50
  width?: number;
@@ -1,131 +1,108 @@
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 { SizedPDFElement } from "./pdf-element.js";
5
+ // path.extname without node:path (browser-safe): the substring from the last dot, if it sits after the
6
+ // last slash (so a dot in a directory name does not count). Enough for image file extensions.
7
+ function extname(p) {
8
+ const dot = p.lastIndexOf(".");
9
+ const slash = p.lastIndexOf("/");
10
+ return dot > slash + 1 ? p.slice(dot) : "";
11
+ }
12
+ export var BoxFit;
49
13
  (function (BoxFit) {
50
14
  BoxFit["none"] = "NONE";
51
15
  BoxFit["contain"] = "CONTAIN";
52
16
  BoxFit["cover"] = "COVER";
53
17
  BoxFit["fill"] = "FILL";
54
- })(BoxFit || (exports.BoxFit = BoxFit = {}));
55
- class CustomImage {
18
+ })(BoxFit || (BoxFit = {}));
19
+ export class CustomImage {
56
20
  }
57
- exports.CustomImage = CustomImage;
58
- class CustomLocalImage extends CustomImage {
21
+ export class CustomLocalImage extends CustomImage {
59
22
  constructor(imagePath) {
60
23
  super();
61
24
  this.imagePath = imagePath;
62
25
  }
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
- });
26
+ async init() {
27
+ try {
28
+ // Loading image and convert it to base64
29
+ await this.loadImage(this.imagePath);
30
+ }
31
+ catch (error) {
32
+ console.error("Error loading image:", error);
33
+ }
34
+ }
35
+ async getImageType() {
36
+ const ext = extname(this.imagePath).toLowerCase();
37
+ switch (ext) {
38
+ case ".jpg":
39
+ case ".jpeg":
40
+ return "DCTDecode"; // For JPEG
41
+ case ".png":
42
+ return "FlateDecode"; // For PNG
43
+ case ".bmp":
44
+ throw new Error("BMP is not directly supported. Please convert to PNG or JPEG.");
45
+ case ".webp":
46
+ throw new Error("WebP is not directly supported. Please convert to PNG or JPEG.");
47
+ default:
48
+ throw new Error(`Unsupported image format: ${ext}`);
49
+ }
50
+ }
51
+ async loadImage(imagePath) {
52
+ const result = await readFileBytesAsync(imagePath);
53
+ //const result = await convertImageToGrayscaleBuffer(imagePath);
54
+ this.fileBuffer = result;
55
+ this.fileRawData = latin1FromBytes(result);
56
+ return result;
73
57
  }
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
- });
58
+ getFileData() {
59
+ return this.fileRawData;
60
+ }
61
+ async getImageDimensions() {
62
+ if (!this.fileBuffer) {
63
+ throw new Error("You must first call the `loadAndConvertImage` method");
64
+ }
65
+ // Since now (30.09.2024) we using "Jimp" - So we don't need our custom method to get the image dimension.
66
+ // But at the moment I let it still here...
67
+ const dimensions = await getImageDimensions(this.fileBuffer);
68
+ return dimensions;
69
+ }
70
+ }
71
+ /**
72
+ * An image straight from raw bytes (a browser upload / fetch, no filesystem). The PDF filter is sniffed
73
+ * from the magic bytes: JPEG embeds raw (DCTDecode, no decode step), PNG is decoded to RGB (FlateDecode).
74
+ */
75
+ export class CustomBytesImage extends CustomImage {
76
+ constructor(bytes) {
77
+ super();
78
+ this.bytes = bytes;
79
+ this.fileRawData = latin1FromBytes(bytes);
92
80
  }
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
- });
81
+ async init() { }
82
+ async getImageType() {
83
+ const b = this.bytes;
84
+ if (b[0] === 0xff && b[1] === 0xd8)
85
+ return "DCTDecode"; // JPEG
86
+ if (b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47)
87
+ return "FlateDecode"; // PNG
88
+ throw new Error("Unsupported image bytes (only JPEG and PNG are supported).");
102
89
  }
103
90
  getFileData() {
104
91
  return this.fileRawData;
105
92
  }
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
- });
93
+ async getImageDimensions() {
94
+ return getImageDimensions(this.bytes);
116
95
  }
117
96
  }
118
- exports.CustomLocalImage = CustomLocalImage;
119
- class ImageElement extends pdf_element_1.SizedPDFElement {
97
+ export class ImageElement extends SizedPDFElement {
120
98
  constructor({ image, width, height, fit = BoxFit.none, radius }) {
121
99
  super({ x: 0, y: 0, width });
122
100
  this.image = image;
123
101
  this.height = height;
124
102
  this.fit = fit;
125
- this.radius = radius !== null && radius !== void 0 ? radius : 0;
103
+ this.radius = radius ?? 0;
126
104
  }
127
105
  calculateLayout(constraints, offset, _ctx) {
128
- var _a, _b;
129
106
  this.x = offset.x;
130
107
  this.y = offset.y;
131
108
  // A bounded axis overrides the intrinsic/explicit size; otherwise keep our own.
@@ -134,7 +111,7 @@ class ImageElement extends pdf_element_1.SizedPDFElement {
134
111
  if (constraints.hasBoundedHeight)
135
112
  this.height = constraints.maxHeight;
136
113
  // 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 };
114
+ return { width: this.width ?? 0, height: this.height ?? 0 };
138
115
  }
139
116
  getProps() {
140
117
  return {
@@ -148,4 +125,3 @@ class ImageElement extends pdf_element_1.SizedPDFElement {
148
125
  };
149
126
  }
150
127
  }
151
- exports.ImageElement = ImageElement;
@@ -1,11 +1,12 @@
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 "./layout/positioned-element";
10
- export * from "./line-element";
11
- 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/default-text-style-element.js";
10
+ export * from "./layout/positioned-element.js";
11
+ export * from "./line-element.js";
12
+ export * from "./row-element.js";
@@ -1,29 +1,12 @@
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("./layout/positioned-element"), exports);
28
- __exportStar(require("./line-element"), exports);
29
- __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/default-text-style-element.js";
10
+ export * from "./layout/positioned-element.js";
11
+ export * from "./line-element.js";
12
+ export * from "./row-element.js";
@@ -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;
@@ -1,6 +1,6 @@
1
- import { PDFElement, LayoutContext, FlexiblePDFElement, WithChild, FlexibleElement } from "../pdf-element";
2
- import { BoxConstraints, Offset, Size } from "../../layout/box-constraints";
3
- import { Fragmentable, FragmentResult } from "../../layout/fragmentation";
1
+ import { PDFElement, LayoutContext, FlexiblePDFElement, WithChild, FlexibleElement } from "../pdf-element.js";
2
+ import { BoxConstraints, Offset, Size } from "../../layout/box-constraints.js";
3
+ import { Fragmentable, FragmentResult } from "../../layout/fragmentation.js";
4
4
  interface ExpandedElementParams extends FlexibleElement, WithChild {
5
5
  }
6
6
  export declare class ExpandedElement extends FlexiblePDFElement implements Fragmentable {
@@ -1,11 +1,8 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ExpandedElement = void 0;
4
- const element_validator_1 = require("../../validators/element-validator");
5
- const pdf_element_1 = require("../pdf-element");
6
- const box_constraints_1 = require("../../layout/box-constraints");
7
- const fragmentation_1 = require("../../layout/fragmentation");
8
- class ExpandedElement extends pdf_element_1.FlexiblePDFElement {
1
+ import { Validator } from "../../validators/element-validator.js";
2
+ import { FlexiblePDFElement, } from "../pdf-element.js";
3
+ import { BoxConstraints } from "../../layout/box-constraints.js";
4
+ import { isFragmentable } from "../../layout/fragmentation.js";
5
+ export class ExpandedElement extends FlexiblePDFElement {
9
6
  constructor({ flex, child }) {
10
7
  super({ flex });
11
8
  this.x = 0;
@@ -20,17 +17,17 @@ class ExpandedElement extends pdf_element_1.FlexiblePDFElement {
20
17
  // Absolute placement from the parent; assignment (not +=) so re-layout is idempotent.
21
18
  this.x = offset.x;
22
19
  this.y = offset.y;
23
- element_validator_1.Validator.validateFlexElement(this);
20
+ Validator.validateFlexElement(this);
24
21
  if (constraints.hasBoundedHeight) {
25
- // A bounded region: fill it - the normal flex behaviour.
22
+ // A bounded region: fill it - the normal flex behavior.
26
23
  this.height = constraints.maxHeight;
27
- this.child.calculateLayout(box_constraints_1.BoxConstraints.loose(this.width, this.height), { x: this.x, y: this.y }, ctx);
24
+ this.child.calculateLayout(BoxConstraints.loose(this.width, this.height), { x: this.x, y: this.y }, ctx);
28
25
  }
29
26
  else {
30
27
  // Unbounded (measuring while paginating): there's no leftover space to fill, so
31
28
  // collapse to the child's natural height. This lets an overflowing column flow
32
29
  // instead of the flex silently hiding the overflow.
33
- const childSize = this.child.calculateLayout(box_constraints_1.BoxConstraints.loose(this.width, Infinity), { x: this.x, y: this.y }, ctx);
30
+ const childSize = this.child.calculateLayout(BoxConstraints.loose(this.width, Infinity), { x: this.x, y: this.y }, ctx);
34
31
  this.height = childSize.height;
35
32
  }
36
33
  // Top-left coordinates; the Y-flip now happens once at the IR -> backend seam.
@@ -43,7 +40,7 @@ class ExpandedElement extends pdf_element_1.FlexiblePDFElement {
43
40
  * whole Expanded moves on.
44
41
  */
45
42
  fragment(maxHeight, width, ctx) {
46
- if (!(0, fragmentation_1.isFragmentable)(this.child)) {
43
+ if (!isFragmentable(this.child)) {
47
44
  return { fitted: null, remainder: this };
48
45
  }
49
46
  const split = this.child.fragment(maxHeight, width, ctx);
@@ -65,4 +62,3 @@ class ExpandedElement extends pdf_element_1.FlexiblePDFElement {
65
62
  };
66
63
  }
67
64
  }
68
- exports.ExpandedElement = ExpandedElement;
@@ -1,6 +1,6 @@
1
- import { PDFElement, LayoutContext, WithChild, SizedPDFElement } from "../pdf-element";
2
- import { BoxConstraints, Offset, Size } from "../../layout/box-constraints";
3
- import { Fragmentable, FragmentResult } from "../../layout/fragmentation";
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
4
  interface PaddingElementParams extends WithChild {
5
5
  margin: [number, number, number, number];
6
6
  }