@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
@@ -0,0 +1,10 @@
1
+ // Node implementation of the platform file reads. In a browser bundle this whole module is swapped for
2
+ // platform/browser-fs.ts via the package.json "browser" field, so `node:fs` never reaches the browser.
3
+ import { readFileSync } from "node:fs";
4
+ import { readFile } from "node:fs/promises";
5
+ export function readFileBytes(path) {
6
+ return readFileSync(path);
7
+ }
8
+ export function readFileBytesAsync(path) {
9
+ return readFile(path);
10
+ }
@@ -0,0 +1,5 @@
1
+ export declare function pngToRgba(bytes: Uint8Array): Promise<{
2
+ width: number;
3
+ height: number;
4
+ rgba: Uint8Array;
5
+ }>;
@@ -0,0 +1,9 @@
1
+ // PNG decode on Node: jimp → raw RGBA pixels. jimp is lazy-imported (it pulls Node-ish bits in) so a
2
+ // text-only render never loads it. The browser swaps this whole module for `browser-image.ts` (a Canvas
3
+ // decode) via the package `browser` field, so neither jimp nor Buffer reach the browser bundle.
4
+ export async function pngToRgba(bytes) {
5
+ const { Jimp } = await import("jimp");
6
+ const image = await Jimp.fromBuffer(Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength));
7
+ const { width, height, data } = image.bitmap;
8
+ return { width, height, rgba: new Uint8Array(data.buffer, data.byteOffset, data.byteLength) };
9
+ }
@@ -1,6 +1,6 @@
1
- import { PDFObjectManager } from "../utils/pdf-object-manager";
2
- import { ContainerElement } from "../elements/container-element";
3
- import { IRNode } from "../ir/display-list";
1
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
2
+ import { ContainerElement } from "../elements/container-element.js";
3
+ import { IRNode } from "../ir/display-list.js";
4
4
  export declare class ContainerRenderer {
5
5
  static render(containerElement: ContainerElement, objectManager: PDFObjectManager): Promise<IRNode[]>;
6
6
  }
@@ -1,30 +1,15 @@
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.ContainerRenderer = void 0;
13
- const renderer_registry_1 = require("../utils/renderer-registry");
14
- class ContainerRenderer {
15
- static render(containerElement, objectManager) {
16
- return __awaiter(this, void 0, void 0, function* () {
17
- const { children } = containerElement.getProps();
18
- const nodes = [];
19
- if (children)
20
- for (const child of children) {
21
- const renderer = renderer_registry_1.RendererRegistry.getRenderer(child);
22
- if (renderer) {
23
- nodes.push(...(yield renderer(child, objectManager)));
24
- }
1
+ import { RendererRegistry } from "../utils/renderer-registry.js";
2
+ export class ContainerRenderer {
3
+ static async render(containerElement, objectManager) {
4
+ const { children } = containerElement.getProps();
5
+ const nodes = [];
6
+ if (children)
7
+ for (const child of children) {
8
+ const renderer = RendererRegistry.getRenderer(child);
9
+ if (renderer) {
10
+ nodes.push(...(await renderer(child, objectManager)));
25
11
  }
26
- return nodes;
27
- });
12
+ }
13
+ return nodes;
28
14
  }
29
15
  }
30
- exports.ContainerRenderer = ContainerRenderer;
@@ -0,0 +1,6 @@
1
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
2
+ import { DefaultTextStyleElement } from "../elements/layout/default-text-style-element.js";
3
+ import { IRNode } from "../ir/display-list.js";
4
+ export declare class DefaultTextStyleRenderer {
5
+ static render(element: DefaultTextStyleElement, objectManager: PDFObjectManager): Promise<IRNode[]>;
6
+ }
@@ -0,0 +1,10 @@
1
+ import { RendererRegistry } from "../utils/renderer-registry.js";
2
+ // Transparent wrapper: the text style was already resolved onto the descendants at layout time, so
3
+ // the renderer just emits the child's display list (like PaddingRenderer).
4
+ export class DefaultTextStyleRenderer {
5
+ static async render(element, objectManager) {
6
+ const { child } = element.getProps();
7
+ const renderer = RendererRegistry.getRenderer(child);
8
+ return renderer ? await renderer(child, objectManager) : [];
9
+ }
10
+ }
@@ -1,6 +1,6 @@
1
- import { PDFObjectManager } from "../utils/pdf-object-manager";
2
- import { DeferredElement } from "../elements/layout/deferred-element";
3
- import { IRNode } from "../ir/display-list";
1
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
2
+ import { DeferredElement } from "../elements/layout/deferred-element.js";
3
+ import { IRNode } from "../ir/display-list.js";
4
4
  export declare class DeferredRenderer {
5
5
  static render(element: DeferredElement, objectManager: PDFObjectManager): Promise<IRNode[]>;
6
6
  }
@@ -1,25 +1,10 @@
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.DeferredRenderer = void 0;
13
- const renderer_registry_1 = require("../utils/renderer-registry");
14
- class DeferredRenderer {
15
- static render(element, objectManager) {
16
- return __awaiter(this, void 0, void 0, function* () {
17
- const { composed } = element.getProps();
18
- if (!composed)
19
- return [];
20
- const renderer = renderer_registry_1.RendererRegistry.getRenderer(composed);
21
- return renderer ? renderer(composed, objectManager) : [];
22
- });
1
+ import { RendererRegistry } from "../utils/renderer-registry.js";
2
+ export class DeferredRenderer {
3
+ static async render(element, objectManager) {
4
+ const { composed } = element.getProps();
5
+ if (!composed)
6
+ return [];
7
+ const renderer = RendererRegistry.getRenderer(composed);
8
+ return renderer ? renderer(composed, objectManager) : [];
23
9
  }
24
10
  }
25
- exports.DeferredRenderer = DeferredRenderer;
@@ -1,6 +1,6 @@
1
- import { PDFObjectManager } from "../utils/pdf-object-manager";
2
- import { ExpandedElement } from "../elements";
3
- import { IRNode } from "../ir/display-list";
1
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
2
+ import { ExpandedElement } from "../elements/index.js";
3
+ import { IRNode } from "../ir/display-list.js";
4
4
  export declare class ExpandedRenderer {
5
5
  static render(expandedElement: ExpandedElement, objectManager: PDFObjectManager): Promise<IRNode[]>;
6
6
  }
@@ -1,23 +1,8 @@
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.ExpandedRenderer = void 0;
13
- const renderer_registry_1 = require("../utils/renderer-registry");
14
- class ExpandedRenderer {
15
- static render(expandedElement, objectManager) {
16
- return __awaiter(this, void 0, void 0, function* () {
17
- const { child } = expandedElement.getProps();
18
- const renderer = renderer_registry_1.RendererRegistry.getRenderer(child);
19
- return renderer ? yield renderer(child, objectManager) : [];
20
- });
1
+ import { RendererRegistry } from "../utils/renderer-registry.js";
2
+ export class ExpandedRenderer {
3
+ static async render(expandedElement, objectManager) {
4
+ const { child } = expandedElement.getProps();
5
+ const renderer = RendererRegistry.getRenderer(child);
6
+ return renderer ? await renderer(child, objectManager) : [];
21
7
  }
22
8
  }
23
- exports.ExpandedRenderer = ExpandedRenderer;
@@ -1,6 +1,6 @@
1
- import { ImageElement } from "../elements/image-element";
2
- import { PDFObjectManager } from "../utils/pdf-object-manager";
3
- import { IRNode } from "../ir/display-list";
1
+ import { ImageElement } from "../elements/image-element.js";
2
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
3
+ import { IRNode } from "../ir/display-list.js";
4
4
  export declare class ImageRenderer {
5
5
  static render(imageElement: ImageElement, _objectManager: PDFObjectManager): Promise<IRNode[]>;
6
6
  }
@@ -1,74 +1,77 @@
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.ImageRenderer = void 0;
13
- const image_element_1 = require("../elements/image-element");
14
- const image_helper_1 = require("../utils/image-helper");
15
- class ImageRenderer {
16
- static render(imageElement, _objectManager) {
17
- return __awaiter(this, void 0, void 0, function* () {
18
- // Load the image and convert it in a binary string
19
- let { x, y, width, height, image, fit, radius } = imageElement.getProps();
20
- yield image.init(); // Load and initialize the image
21
- const imageType = yield image.getImageType(); // For the moment we can handle `png` and `jpg/jpeg` files
22
- const fileData = yield image.getFileData();
23
- const dimensions = yield image.getImageDimensions();
24
- if (!fileData) {
25
- throw new Error("File data cannot be `null`");
26
- }
27
- // JPEG embeds raw (PDF decodes DCTDecode natively). PNG is not a valid Flate stream,
28
- // so decode it to raw DeviceRGB samples that the FlateDecode XObject path expects.
29
- const embedData = imageType === "FlateDecode"
30
- ? (yield (0, image_helper_1.decodePngToRgbFlate)(Buffer.from(fileData, "binary"))).data
31
- : fileData;
32
- // Now we check the `fit` property and changing the dimensions of the image
33
- // Optionally we must add an overflow container
34
- let mustCreateOverflowContainer = false;
35
- const containerDimensions = JSON.parse(JSON.stringify({ x, y, width, height })); // Deep clone images dimensions
36
- switch (fit) {
37
- case image_element_1.BoxFit.cover:
38
- mustCreateOverflowContainer = true;
39
- const fitCoverResult = (0, image_helper_1.applyCoverFit)(dimensions.width, dimensions.height, width !== null && width !== void 0 ? width : 0, height !== null && height !== void 0 ? height : 0);
40
- x += fitCoverResult.offsetX;
41
- y += fitCoverResult.offsetY;
42
- width = fitCoverResult.width;
43
- height = fitCoverResult.height;
44
- break;
45
- case image_element_1.BoxFit.contain:
46
- mustCreateOverflowContainer = true;
47
- const fitContainResult = (0, image_helper_1.applyContainFit)(dimensions.width, dimensions.height, width !== null && width !== void 0 ? width : 0, height !== null && height !== void 0 ? height : 0);
48
- x += fitContainResult.offsetX;
49
- y += fitContainResult.offsetY;
50
- width = fitContainResult.width;
51
- height = fitContainResult.height;
52
- break;
53
- case image_element_1.BoxFit.none:
54
- const fitNoneResult = (0, image_helper_1.applyFitNone)(dimensions.width, dimensions.height, width !== null && width !== void 0 ? width : 0, height !== null && height !== void 0 ? height : 0);
55
- x += fitNoneResult.offsetX;
56
- y += fitNoneResult.offsetY;
57
- width = fitNoneResult.width;
58
- height = fitNoneResult.height;
59
- break;
60
- case image_element_1.BoxFit.fill:
61
- const fitFillResult = (0, image_helper_1.applyFillFit)(width !== null && width !== void 0 ? width : 0, height !== null && height !== void 0 ? height : 0);
62
- width = fitFillResult.width;
63
- height = fitFillResult.height;
64
- }
65
- // A radius rounds the image BOX (the element frame), so it clips to that frame too -
66
- // independent of the cover/contain overflow clip.
67
- const wantsClip = mustCreateOverflowContainer || (radius !== null && radius !== void 0 ? radius : 0) > 0;
68
- // The fitted geometry becomes a display-list primitive; the backend registers
69
- // the XObject and emits the placement (+ clip, rounded when a radius is set).
70
- const node = Object.assign(Object.assign({ type: "image", x,
71
- y, width: width, height: height, intrinsicWidth: dimensions.width, intrinsicHeight: dimensions.height, data: embedData, imageType }, (radius ? { radius } : {})), (wantsClip
1
+ import { BoxFit } from "../elements/image-element.js";
2
+ import { bytesFromLatin1 } from "../utils/bytes.js";
3
+ import { applyContainFit, applyCoverFit, applyFillFit, applyFitNone, decodePngToRgbFlate, } from "../utils/image-helper.js";
4
+ export class ImageRenderer {
5
+ static async render(imageElement, _objectManager) {
6
+ // Load the image and convert it in a binary string
7
+ let { x, y, width, height, image, fit, radius } = imageElement.getProps();
8
+ await image.init(); // Load and initialize the image
9
+ const imageType = await image.getImageType(); // For the moment we can handle `png` and `jpg/jpeg` files
10
+ const fileData = await image.getFileData();
11
+ const dimensions = await image.getImageDimensions();
12
+ if (!fileData) {
13
+ throw new Error("File data cannot be `null`");
14
+ }
15
+ // JPEG embeds raw (PDF decodes DCTDecode natively). PNG is not a valid Flate stream,
16
+ // so decode it to raw DeviceRGB samples that the FlateDecode XObject path expects.
17
+ let embedData = fileData;
18
+ let smask;
19
+ if (imageType === "FlateDecode") {
20
+ const decoded = await decodePngToRgbFlate(bytesFromLatin1(fileData));
21
+ embedData = decoded.data;
22
+ smask = decoded.smask;
23
+ }
24
+ // Now we check the `fit` property and changing the dimensions of the image
25
+ // Optionally we must add an overflow container
26
+ let mustCreateOverflowContainer = false;
27
+ const containerDimensions = JSON.parse(JSON.stringify({ x, y, width, height })); // Deep clone images dimensions
28
+ switch (fit) {
29
+ case BoxFit.cover:
30
+ mustCreateOverflowContainer = true;
31
+ const fitCoverResult = applyCoverFit(dimensions.width, dimensions.height, width ?? 0, height ?? 0);
32
+ x += fitCoverResult.offsetX;
33
+ y += fitCoverResult.offsetY;
34
+ width = fitCoverResult.width;
35
+ height = fitCoverResult.height;
36
+ break;
37
+ case BoxFit.contain:
38
+ mustCreateOverflowContainer = true;
39
+ const fitContainResult = applyContainFit(dimensions.width, dimensions.height, width ?? 0, height ?? 0);
40
+ x += fitContainResult.offsetX;
41
+ y += fitContainResult.offsetY;
42
+ width = fitContainResult.width;
43
+ height = fitContainResult.height;
44
+ break;
45
+ case BoxFit.none:
46
+ const fitNoneResult = applyFitNone(dimensions.width, dimensions.height, width ?? 0, height ?? 0);
47
+ x += fitNoneResult.offsetX;
48
+ y += fitNoneResult.offsetY;
49
+ width = fitNoneResult.width;
50
+ height = fitNoneResult.height;
51
+ break;
52
+ case BoxFit.fill:
53
+ const fitFillResult = applyFillFit(width ?? 0, height ?? 0);
54
+ width = fitFillResult.width;
55
+ height = fitFillResult.height;
56
+ }
57
+ // A radius rounds the image BOX (the element frame), so it clips to that frame too -
58
+ // independent of the cover/contain overflow clip.
59
+ const wantsClip = mustCreateOverflowContainer || (radius ?? 0) > 0;
60
+ // The fitted geometry becomes a display-list primitive; the backend registers
61
+ // the XObject and emits the placement (+ clip, rounded when a radius is set).
62
+ const node = {
63
+ type: "image",
64
+ x,
65
+ y,
66
+ width: width,
67
+ height: height,
68
+ intrinsicWidth: dimensions.width,
69
+ intrinsicHeight: dimensions.height,
70
+ data: embedData,
71
+ imageType,
72
+ ...(smask ? { smask } : {}),
73
+ ...(radius ? { radius } : {}),
74
+ ...(wantsClip
72
75
  ? {
73
76
  clip: {
74
77
  x: containerDimensions.x,
@@ -77,9 +80,8 @@ class ImageRenderer {
77
80
  height: containerDimensions.height,
78
81
  },
79
82
  }
80
- : {}));
81
- return [node];
82
- });
83
+ : {}),
84
+ };
85
+ return [node];
83
86
  }
84
87
  }
85
- exports.ImageRenderer = ImageRenderer;
@@ -1,10 +1,10 @@
1
- export * from "./container-renderer";
2
- export * from "./page-renderer";
3
- export * from "./pdf-document-class";
4
- export * from "./pdf-document-renderer";
5
- export * from "./pdf-renderer";
6
- export * from "./rectangle-renderer";
7
- export * from "./text-renderer";
8
- export * from "./expanded-renderer";
9
- export * from "./line-renderer";
10
- export * from "./row-renderer";
1
+ export * from "./container-renderer.js";
2
+ export * from "./page-renderer.js";
3
+ export * from "./pdf-document-class.js";
4
+ export * from "./pdf-document-renderer.js";
5
+ export * from "./pdf-renderer.js";
6
+ export * from "./rectangle-renderer.js";
7
+ export * from "./text-renderer.js";
8
+ export * from "./expanded-renderer.js";
9
+ export * from "./line-renderer.js";
10
+ export * from "./row-renderer.js";
@@ -1,26 +1,10 @@
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
- __exportStar(require("./container-renderer"), exports);
18
- __exportStar(require("./page-renderer"), exports);
19
- __exportStar(require("./pdf-document-class"), exports);
20
- __exportStar(require("./pdf-document-renderer"), exports);
21
- __exportStar(require("./pdf-renderer"), exports);
22
- __exportStar(require("./rectangle-renderer"), exports);
23
- __exportStar(require("./text-renderer"), exports);
24
- __exportStar(require("./expanded-renderer"), exports);
25
- __exportStar(require("./line-renderer"), exports);
26
- __exportStar(require("./row-renderer"), exports);
1
+ export * from "./container-renderer.js";
2
+ export * from "./page-renderer.js";
3
+ export * from "./pdf-document-class.js";
4
+ export * from "./pdf-document-renderer.js";
5
+ export * from "./pdf-renderer.js";
6
+ export * from "./rectangle-renderer.js";
7
+ export * from "./text-renderer.js";
8
+ export * from "./expanded-renderer.js";
9
+ export * from "./line-renderer.js";
10
+ export * from "./row-renderer.js";
@@ -1,6 +1,6 @@
1
- import { PDFObjectManager } from "../utils/pdf-object-manager";
2
- import { LineElement } from "../elements";
3
- import { IRNode } from "../ir/display-list";
1
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
2
+ import { LineElement } from "../elements/index.js";
3
+ import { IRNode } from "../ir/display-list.js";
4
4
  export declare class LineRenderer {
5
5
  static render(lineElement: LineElement, _objectManager: PDFObjectManager): Promise<IRNode[]>;
6
6
  }
@@ -1,30 +1,15 @@
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.LineRenderer = void 0;
13
- class LineRenderer {
14
- static render(lineElement, _objectManager) {
15
- return __awaiter(this, void 0, void 0, function* () {
16
- const { x, y, xEnd, yEnd, color, strokeWidth } = lineElement.getProps();
17
- const node = {
18
- type: "line",
19
- x1: x,
20
- y1: y,
21
- x2: xEnd,
22
- y2: yEnd,
23
- stroke: color,
24
- strokeWidth: strokeWidth,
25
- };
26
- return [node];
27
- });
1
+ export class LineRenderer {
2
+ static async render(lineElement, _objectManager) {
3
+ const { x, y, xEnd, yEnd, color, strokeWidth } = lineElement.getProps();
4
+ const node = {
5
+ type: "line",
6
+ x1: x,
7
+ y1: y,
8
+ x2: xEnd,
9
+ y2: yEnd,
10
+ stroke: color,
11
+ strokeWidth: strokeWidth,
12
+ };
13
+ return [node];
28
14
  }
29
15
  }
30
- exports.LineRenderer = LineRenderer;
@@ -1,6 +1,6 @@
1
- import { PDFObjectManager } from "../utils/pdf-object-manager";
2
- import { PaddingElement } from "../elements/layout/padding-element";
3
- import { IRNode } from "../ir/display-list";
1
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
2
+ import { PaddingElement } from "../elements/layout/padding-element.js";
3
+ import { IRNode } from "../ir/display-list.js";
4
4
  export declare class PaddingRenderer {
5
5
  static render(paddingElement: PaddingElement, objectManager: PDFObjectManager): Promise<IRNode[]>;
6
6
  }
@@ -1,23 +1,8 @@
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.PaddingRenderer = void 0;
13
- const renderer_registry_1 = require("../utils/renderer-registry");
14
- class PaddingRenderer {
15
- static render(paddingElement, objectManager) {
16
- return __awaiter(this, void 0, void 0, function* () {
17
- const { child } = paddingElement.getProps();
18
- const renderer = renderer_registry_1.RendererRegistry.getRenderer(child);
19
- return renderer ? yield renderer(child, objectManager) : [];
20
- });
1
+ import { RendererRegistry } from "../utils/renderer-registry.js";
2
+ export class PaddingRenderer {
3
+ static async render(paddingElement, objectManager) {
4
+ const { child } = paddingElement.getProps();
5
+ const renderer = RendererRegistry.getRenderer(child);
6
+ return renderer ? await renderer(child, objectManager) : [];
21
7
  }
22
8
  }
23
- exports.PaddingRenderer = PaddingRenderer;
@@ -1,5 +1,5 @@
1
- import { PageElement } from "../elements/page-element";
2
- import { PDFObjectManager } from "../utils/pdf-object-manager";
1
+ import { PageElement } from "../elements/page-element.js";
2
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
3
3
  export declare class PageRenderer {
4
4
  static render(page: PageElement, objectManager: PDFObjectManager): Promise<number>;
5
5
  }