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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +3 -3
  2. package/dist/api/args.d.ts +1 -1
  3. package/dist/api/args.js +2 -5
  4. package/dist/api/color.d.ts +4 -4
  5. package/dist/api/color.js +11 -17
  6. package/dist/api/content.d.ts +8 -8
  7. package/dist/api/content.js +23 -24
  8. package/dist/api/descriptor.d.ts +2 -2
  9. package/dist/api/descriptor.js +75 -31
  10. package/dist/api/index.d.ts +8 -8
  11. package/dist/api/index.js +8 -24
  12. package/dist/api/insets.js +4 -8
  13. package/dist/api/layout.d.ts +27 -12
  14. package/dist/api/layout.js +46 -45
  15. package/dist/api/structure.d.ts +60 -13
  16. package/dist/api/structure.js +132 -88
  17. package/dist/api/table.d.ts +5 -5
  18. package/dist/api/table.js +28 -24
  19. package/dist/api/text.d.ts +27 -2
  20. package/dist/api/text.js +45 -27
  21. package/dist/assets/font-data.d.ts +2 -0
  22. package/dist/assets/font-data.js +6 -0
  23. package/dist/assets/font-data.ts +7 -0
  24. package/dist/common/color.js +1 -5
  25. package/dist/constants/page-sizes.js +3 -6
  26. package/dist/constants/pdf-parts.js +1 -4
  27. package/dist/elements/container-element.d.ts +4 -4
  28. package/dist/elements/container-element.js +9 -13
  29. package/dist/elements/image-element.d.ts +18 -2
  30. package/dist/elements/image-element.js +81 -105
  31. package/dist/elements/index.d.ts +12 -10
  32. package/dist/elements/index.js +12 -28
  33. package/dist/elements/layout/default-text-style-element.d.ts +30 -0
  34. package/dist/elements/layout/default-text-style-element.js +47 -0
  35. package/dist/elements/layout/deferred-element.d.ts +3 -3
  36. package/dist/elements/layout/deferred-element.js +4 -8
  37. package/dist/elements/layout/expanded-element.d.ts +3 -3
  38. package/dist/elements/layout/expanded-element.js +10 -14
  39. package/dist/elements/layout/padding-element.d.ts +3 -3
  40. package/dist/elements/layout/padding-element.js +9 -14
  41. package/dist/elements/layout/positioned-element.d.ts +44 -0
  42. package/dist/elements/layout/positioned-element.js +61 -0
  43. package/dist/elements/layout/repeating-header-element.d.ts +3 -3
  44. package/dist/elements/layout/repeating-header-element.js +8 -12
  45. package/dist/elements/layout/sized-container-element.d.ts +2 -2
  46. package/dist/elements/layout/sized-container-element.js +6 -11
  47. package/dist/elements/line-element.d.ts +3 -3
  48. package/dist/elements/line-element.js +5 -10
  49. package/dist/elements/page-element.d.ts +8 -6
  50. package/dist/elements/page-element.js +31 -23
  51. package/dist/elements/pdf-document-element.d.ts +10 -4
  52. package/dist/elements/pdf-document-element.js +11 -10
  53. package/dist/elements/pdf-element.d.ts +28 -3
  54. package/dist/elements/pdf-element.js +10 -19
  55. package/dist/elements/rectangle-element.d.ts +14 -6
  56. package/dist/elements/rectangle-element.js +44 -21
  57. package/dist/elements/row-element.d.ts +3 -3
  58. package/dist/elements/row-element.js +7 -11
  59. package/dist/elements/text-element.d.ts +37 -11
  60. package/dist/elements/text-element.js +64 -39
  61. package/dist/index.d.ts +3 -3
  62. package/dist/index.js +3 -19
  63. package/dist/ir/display-list.d.ts +22 -3
  64. package/dist/ir/display-list.js +1 -2
  65. package/dist/layout/box-constraints.js +2 -6
  66. package/dist/layout/fragmentation.d.ts +8 -1
  67. package/dist/layout/fragmentation.js +22 -10
  68. package/dist/platform/browser-fs.d.ts +2 -0
  69. package/dist/platform/browser-fs.js +9 -0
  70. package/dist/platform/browser-image.d.ts +5 -0
  71. package/dist/platform/browser-image.js +13 -0
  72. package/dist/platform/node-fs.d.ts +2 -0
  73. package/dist/platform/node-fs.js +10 -0
  74. package/dist/platform/node-image.d.ts +5 -0
  75. package/dist/platform/node-image.js +9 -0
  76. package/dist/renderer/container-renderer.d.ts +3 -3
  77. package/dist/renderer/container-renderer.js +12 -27
  78. package/dist/renderer/default-text-style-renderer.d.ts +6 -0
  79. package/dist/renderer/default-text-style-renderer.js +10 -0
  80. package/dist/renderer/deferred-renderer.d.ts +3 -3
  81. package/dist/renderer/deferred-renderer.js +8 -23
  82. package/dist/renderer/expanded-renderer.d.ts +3 -3
  83. package/dist/renderer/expanded-renderer.js +6 -21
  84. package/dist/renderer/image-renderer.d.ts +3 -3
  85. package/dist/renderer/image-renderer.js +77 -75
  86. package/dist/renderer/index.d.ts +10 -10
  87. package/dist/renderer/index.js +10 -26
  88. package/dist/renderer/line-renderer.d.ts +3 -3
  89. package/dist/renderer/line-renderer.js +13 -28
  90. package/dist/renderer/padding-renderer.d.ts +3 -3
  91. package/dist/renderer/padding-renderer.js +6 -21
  92. package/dist/renderer/page-renderer.d.ts +2 -2
  93. package/dist/renderer/page-renderer.js +61 -77
  94. package/dist/renderer/pdf-backend.d.ts +2 -2
  95. package/dist/renderer/pdf-backend.js +34 -17
  96. package/dist/renderer/pdf-config.js +4 -7
  97. package/dist/renderer/pdf-document-class.d.ts +5 -5
  98. package/dist/renderer/pdf-document-class.js +24 -41
  99. package/dist/renderer/pdf-document-renderer.d.ts +3 -3
  100. package/dist/renderer/pdf-document-renderer.js +71 -85
  101. package/dist/renderer/pdf-renderer.d.ts +2 -2
  102. package/dist/renderer/pdf-renderer.js +83 -90
  103. package/dist/renderer/positioned-renderer.d.ts +6 -0
  104. package/dist/renderer/positioned-renderer.js +10 -0
  105. package/dist/renderer/rectangle-renderer.d.ts +3 -3
  106. package/dist/renderer/rectangle-renderer.js +45 -44
  107. package/dist/renderer/repeating-header-renderer.d.ts +3 -3
  108. package/dist/renderer/repeating-header-renderer.js +11 -26
  109. package/dist/renderer/row-renderer.d.ts +3 -3
  110. package/dist/renderer/row-renderer.js +12 -27
  111. package/dist/renderer/text-renderer.d.ts +6 -5
  112. package/dist/renderer/text-renderer.js +33 -42
  113. package/dist/text/line-breaker.d.ts +8 -5
  114. package/dist/text/line-breaker.js +67 -16
  115. package/dist/text/text-style.d.ts +25 -0
  116. package/dist/text/text-style.js +29 -0
  117. package/dist/utils/afm-parser.js +3 -13
  118. package/dist/utils/bytes.d.ts +24 -0
  119. package/dist/utils/bytes.js +76 -0
  120. package/dist/utils/flex-layout.d.ts +2 -2
  121. package/dist/utils/flex-layout.js +15 -20
  122. package/dist/utils/font-metrics.d.ts +1 -1
  123. package/dist/utils/font-metrics.js +1 -2
  124. package/dist/utils/font-path.js +3 -6
  125. package/dist/utils/image-helper.d.ts +6 -5
  126. package/dist/utils/image-helper.js +101 -111
  127. package/dist/utils/md5.d.ts +4 -0
  128. package/dist/utils/md5.js +80 -0
  129. package/dist/utils/pdf-object-manager.d.ts +10 -6
  130. package/dist/utils/pdf-object-manager.js +89 -94
  131. package/dist/utils/renderer-registry.js +1 -5
  132. package/dist/utils/ttf-parser.d.ts +2 -2
  133. package/dist/utils/ttf-parser.js +32 -36
  134. package/dist/utils/ttf-subsetter.d.ts +1 -1
  135. package/dist/utils/ttf-subsetter.js +40 -42
  136. package/dist/utils/utf8-to-windows1252-encoder.js +1 -4
  137. package/dist/validators/element-validator.d.ts +2 -2
  138. package/dist/validators/element-validator.js +17 -23
  139. package/package.json +14 -2
@@ -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
  }
@@ -1,81 +1,65 @@
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.PageRenderer = void 0;
13
- const page_sizes_1 = require("../constants/page-sizes");
14
- const renderer_registry_1 = require("../utils/renderer-registry");
15
- const pdf_config_1 = require("./pdf-config");
16
- const pdf_backend_1 = require("./pdf-backend");
17
- class PageRenderer {
18
- static render(page, objectManager) {
19
- return __awaiter(this, void 0, void 0, function* () {
20
- var _a;
21
- const { children, config, header, footer } = page.getProps();
22
- // Header (top band) and footer (bottom band) sit around the body and repeat on every
23
- // physical page; they are placed by `PageElement.calculateLayout` / the page driver.
24
- const renderables = [...(header ? [header] : []), ...children, ...(footer ? [footer] : [])];
25
- // Page geometry (also the MediaBox below). Needed up front because flipping the
26
- // display list to PDF coordinates uses the page height. config is fully resolved
27
- // by the layout pass; fall back to the document default rather than asserting.
28
- let [width, height] = page_sizes_1.pageFormats[(_a = config === null || config === void 0 ? void 0 : config.pageSize) !== null && _a !== void 0 ? _a : page_sizes_1.PageSize.A4];
29
- if ((config === null || config === void 0 ? void 0 : config.orientation) === pdf_config_1.Orientation.landscape) {
30
- [width, height] = [height, width];
1
+ import { pageFormats, PageSize } from "../constants/page-sizes.js";
2
+ import { RendererRegistry } from "../utils/renderer-registry.js";
3
+ import { Orientation } from "./pdf-config.js";
4
+ import { PdfBackend } from "./pdf-backend.js";
5
+ export class PageRenderer {
6
+ static async render(page, objectManager) {
7
+ const { children, config, header, footer } = page.getProps();
8
+ // Header (top band) and footer (bottom band) sit around the body and repeat on every
9
+ // physical page; they are placed by `PageElement.calculateLayout` / the page driver.
10
+ const renderables = [...(header ? [header] : []), ...children, ...(footer ? [footer] : [])];
11
+ // Page geometry (also the MediaBox below). Needed up front because flipping the
12
+ // display list to PDF coordinates uses the page height. config is fully resolved
13
+ // by the layout pass; fall back to the document default rather than asserting.
14
+ let [width, height] = config?.customSize ?? pageFormats[config?.pageSize ?? PageSize.A4];
15
+ if (config?.orientation === Orientation.landscape) {
16
+ [width, height] = [height, width];
17
+ }
18
+ // Collect the whole page as a display list (top-left coordinates), flip it to PDF
19
+ // coordinates at this one seam, then serialize once. Serializing registers the
20
+ // fonts/images used below, so it must run before the resource section.
21
+ const nodes = [];
22
+ for (const element of renderables) {
23
+ const renderer = RendererRegistry.getRenderer(element);
24
+ if (renderer) {
25
+ nodes.push(...(await renderer(element, objectManager)));
31
26
  }
32
- // Collect the whole page as a display list (top-left coordinates), flip it to PDF
33
- // coordinates at this one seam, then serialize once. Serializing registers the
34
- // fonts/images used below, so it must run before the resource section.
35
- const nodes = [];
36
- for (const element of renderables) {
37
- const renderer = renderer_registry_1.RendererRegistry.getRenderer(element);
38
- if (renderer) {
39
- nodes.push(...(yield renderer(element, objectManager)));
40
- }
41
- }
42
- const pageContent = pdf_backend_1.PdfBackend.serialize(pdf_backend_1.PdfBackend.flipY(nodes, height), objectManager);
43
- // Add the page content as a new object (FlateDecode-compressed when enabled). The /Length is
44
- // computed inside, with an explicit EOL before `endstream` (PDF/A clause 6.1.7.1).
45
- const contentObjectNumber = objectManager.addContentStream(pageContent);
46
- // Get the parent object number dynamically (linked with the page object)
47
- const parentObjectNumber = objectManager.getParentObjectNumber(); // Get parent object number
48
- // Page object with MediaBox
49
- // - Get all fonts and add it to the page (reference)
50
- objectManager.registerFont("Helvetica");
51
- const fontReferences = [];
52
- objectManager.getAllFontsRaw().forEach((value, _key) => {
53
- const fontRef = `/F${value.fontIndex} ${value.resourceIndex} 0 R`;
54
- fontReferences.push(fontRef);
55
- });
56
- // - Get all images and add it to the page (reference)
57
- const imageReferences = [];
58
- objectManager.getAllImagesRaw().forEach((value) => {
59
- const imageRef = `/IM${value} ${value} 0 R`;
60
- imageReferences.push(imageRef);
61
- });
62
- const imageCode = imageReferences.length > 0
63
- ? "/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /XObject <<\n" +
64
- imageReferences.join("\n") +
65
- "\n>>\n"
66
- : "";
67
- // - Transparency (ExtGState) references, registered during serialize above
68
- const extGStateReferences = [];
69
- objectManager.getAllExtGStatesRaw().forEach((objectNumber, name) => {
70
- extGStateReferences.push(`/${name} ${objectNumber} 0 R`);
71
- });
72
- const extGStateCode = extGStateReferences.length > 0
73
- ? "/ExtGState <<\n" + extGStateReferences.join("\n") + "\n>>\n"
74
- : "";
75
- const pageObject = `<< /Type /Page /Parent ${parentObjectNumber} 0 R /Contents ${contentObjectNumber} 0 R /Resources <<\n/Font <<\n${fontReferences.join("\n")}\n>>\n${imageCode}${extGStateCode}>>\n/MediaBox [0 0 ${width} ${height}] >>`;
76
- // Add page as new object and return the page number
77
- return objectManager.addObject(pageObject);
27
+ }
28
+ const pageContent = PdfBackend.serialize(PdfBackend.flipY(nodes, height), objectManager);
29
+ // Add the page content as a new object (FlateDecode-compressed when enabled). The /Length is
30
+ // computed inside, with an explicit EOL before `endstream` (PDF/A clause 6.1.7.1).
31
+ const contentObjectNumber = objectManager.addContentStream(pageContent);
32
+ // Get the parent object number dynamically (linked with the page object)
33
+ const parentObjectNumber = objectManager.getParentObjectNumber(); // Get parent object number
34
+ // Page object with MediaBox
35
+ // - Get all fonts and add it to the page (reference)
36
+ objectManager.registerFont("Helvetica");
37
+ const fontReferences = [];
38
+ objectManager.getAllFontsRaw().forEach((value, _key) => {
39
+ const fontRef = `/F${value.fontIndex} ${value.resourceIndex} 0 R`;
40
+ fontReferences.push(fontRef);
41
+ });
42
+ // - Get all images and add it to the page (reference)
43
+ const imageReferences = [];
44
+ objectManager.getAllImagesRaw().forEach((value) => {
45
+ const imageRef = `/IM${value} ${value} 0 R`;
46
+ imageReferences.push(imageRef);
47
+ });
48
+ const imageCode = imageReferences.length > 0
49
+ ? "/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /XObject <<\n" +
50
+ imageReferences.join("\n") +
51
+ "\n>>\n"
52
+ : "";
53
+ // - Transparency (ExtGState) references, registered during serialize above
54
+ const extGStateReferences = [];
55
+ objectManager.getAllExtGStatesRaw().forEach((objectNumber, name) => {
56
+ extGStateReferences.push(`/${name} ${objectNumber} 0 R`);
78
57
  });
58
+ const extGStateCode = extGStateReferences.length > 0
59
+ ? "/ExtGState <<\n" + extGStateReferences.join("\n") + "\n>>\n"
60
+ : "";
61
+ const pageObject = `<< /Type /Page /Parent ${parentObjectNumber} 0 R /Contents ${contentObjectNumber} 0 R /Resources <<\n/Font <<\n${fontReferences.join("\n")}\n>>\n${imageCode}${extGStateCode}>>\n/MediaBox [0 0 ${width} ${height}] >>`;
62
+ // Add page as new object and return the page number
63
+ return objectManager.addObject(pageObject);
79
64
  }
80
65
  }
81
- exports.PageRenderer = PageRenderer;
@@ -1,5 +1,5 @@
1
- import { IRNode } from "../ir/display-list";
2
- import { PDFObjectManager } from "../utils/pdf-object-manager";
1
+ import { IRNode } from "../ir/display-list.js";
2
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
3
3
  /**
4
4
  * PDF backend - turns display-list primitives into content-stream operators.
5
5
  *
@@ -1,6 +1,3 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PdfBackend = void 0;
4
1
  /**
5
2
  * PDF backend - turns display-list primitives into content-stream operators.
6
3
  *
@@ -9,7 +6,7 @@ exports.PdfBackend = void 0;
9
6
  * emitted inline by the per-element renderers, so output stays byte-identical while
10
7
  * the renderers are migrated onto the IR one at a time.
11
8
  */
12
- class PdfBackend {
9
+ export class PdfBackend {
13
10
  /**
14
11
  * Flip a display list from the engine's top-left origin (y grows downward) to PDF's
15
12
  * bottom-left origin (y grows upward). This is the ONE place the Y axis is flipped -
@@ -21,20 +18,32 @@ class PdfBackend {
21
18
  return nodes.map((node) => {
22
19
  switch (node.type) {
23
20
  case "rect":
24
- return Object.assign(Object.assign({}, node), { y: pageHeight - node.y - node.height });
21
+ return { ...node, y: pageHeight - node.y - node.height };
25
22
  case "line":
26
- return Object.assign(Object.assign({}, node), { y1: pageHeight - node.y1, y2: pageHeight - node.y2 });
23
+ return {
24
+ ...node,
25
+ y1: pageHeight - node.y1,
26
+ y2: pageHeight - node.y2,
27
+ };
27
28
  case "text":
28
29
  // node.y is the baseline measured from the page top; flip it directly.
29
- return Object.assign(Object.assign({}, node), { y: pageHeight - node.y });
30
+ return { ...node, y: pageHeight - node.y };
30
31
  case "image": {
31
32
  // Flip the placement box (and the clip frame, if any) around its bottom edge.
32
- const flipped = Object.assign(Object.assign({}, node), { y: pageHeight - node.y - node.height });
33
+ const flipped = { ...node, y: pageHeight - node.y - node.height };
33
34
  if (node.clip) {
34
- flipped.clip = Object.assign(Object.assign({}, node.clip), { y: pageHeight - node.clip.y - node.clip.height });
35
+ flipped.clip = {
36
+ ...node.clip,
37
+ y: pageHeight - node.clip.y - node.clip.height,
38
+ };
35
39
  }
36
40
  return flipped;
37
41
  }
42
+ case "clip-push":
43
+ // Flip the clip rect around its bottom edge, like a rect.
44
+ return { ...node, y: pageHeight - node.y - node.height };
45
+ case "clip-pop":
46
+ return node;
38
47
  default: {
39
48
  const unknown = node;
40
49
  return unknown;
@@ -95,7 +104,6 @@ class PdfBackend {
95
104
  * `om` is used only by primitives that allocate PDF resources (images, fonts).
96
105
  */
97
106
  static serializeNode(node, om) {
98
- var _a, _b, _c, _d, _e;
99
107
  switch (node.type) {
100
108
  case "line":
101
109
  // q/Q isolates the graphics state; "[] 0 d" resets the dash pattern to solid.
@@ -109,10 +117,10 @@ class PdfBackend {
109
117
  `S\n` +
110
118
  `Q\n`);
111
119
  case "rect": {
112
- // Stroke only with a stroke colour AND a positive width - a 0-width border means
120
+ // Stroke only with a stroke color AND a positive width - a 0-width border means
113
121
  // "no border" (e.g. a filled box with no outline). Nothing to paint at all (no
114
122
  // fill, no border) draws nothing. Paint: B = fill+stroke, f = fill, S = stroke.
115
- const doStroke = !!node.stroke && ((_a = node.strokeWidth) !== null && _a !== void 0 ? _a : 0) > 0;
123
+ const doStroke = !!node.stroke && (node.strokeWidth ?? 0) > 0;
116
124
  if (!node.fill && !doStroke)
117
125
  return "";
118
126
  let ops = "";
@@ -124,13 +132,13 @@ class PdfBackend {
124
132
  const paint = node.fill ? (doStroke ? "B" : "f") : "S";
125
133
  // Rounded corners emit a Bézier path; sharp corners keep the plain `re`
126
134
  // (byte-identical when no radius is set).
127
- const path = ((_b = node.radius) !== null && _b !== void 0 ? _b : 0) > 0
135
+ const path = (node.radius ?? 0) > 0
128
136
  ? PdfBackend.roundedRectPath(node.x, node.y, node.width, node.height, node.radius)
129
137
  : `${node.x} ${node.y} ${node.width} ${node.height} re`;
130
138
  const body = ops + `${path} ${paint}\n`;
131
139
  // Transparency needs an isolating q/Q so the state does not leak; opaque rects
132
140
  // keep their bare operators (byte-identical).
133
- const gs = PdfBackend.alphaPrefix(om, (_d = (_c = node.fill) === null || _c === void 0 ? void 0 : _c.getAlpha()) !== null && _d !== void 0 ? _d : 1, doStroke ? node.stroke.getAlpha() : 1);
141
+ const gs = PdfBackend.alphaPrefix(om, node.fill?.getAlpha() ?? 1, doStroke ? node.stroke.getAlpha() : 1);
134
142
  return gs ? `q\n${gs}${body}Q\n` : body;
135
143
  }
136
144
  case "text": {
@@ -161,18 +169,28 @@ class PdfBackend {
161
169
  case "image": {
162
170
  // The backend owns PDF resource creation: register the XObject (using the
163
171
  // source pixel dimensions) and then place it with a scaling matrix.
164
- const ref = om.registerImage(node.intrinsicWidth, node.intrinsicHeight, node.imageType, node.data);
172
+ const ref = om.registerImage(node.intrinsicWidth, node.intrinsicHeight, node.imageType, node.data, node.smask);
165
173
  const draw = `q\n${node.width} 0 0 ${node.height} ${node.x} ${node.y} cm\n` + `/IM${ref} Do\nQ\n`;
166
174
  if (!node.clip)
167
175
  return draw;
168
176
  // Clip to the frame (re … W n); rounded when a radius is set. The rectangular
169
177
  // path is byte-identical to before.
170
178
  const c = node.clip;
171
- const clipPath = ((_e = node.radius) !== null && _e !== void 0 ? _e : 0) > 0
179
+ const clipPath = (node.radius ?? 0) > 0
172
180
  ? PdfBackend.roundedRectPath(c.x, c.y, c.width, c.height, node.radius)
173
181
  : `${c.x} ${c.y} ${c.width} ${c.height} re `;
174
182
  return `q\n${clipPath}\nW n \n` + draw + `Q\n`;
175
183
  }
184
+ case "clip-push": {
185
+ // Save the graphics state and intersect the clip with this (rounded) rect. Everything
186
+ // drawn until the matching clip-pop is cropped to it.
187
+ const path = (node.radius ?? 0) > 0
188
+ ? PdfBackend.roundedRectPath(node.x, node.y, node.width, node.height, node.radius)
189
+ : `${node.x} ${node.y} ${node.width} ${node.height} re`;
190
+ return `q\n${path}\nW n\n`;
191
+ }
192
+ case "clip-pop":
193
+ return `Q\n`;
176
194
  default: {
177
195
  // Exhaustiveness guard: if a new IRNode variant is added, this fails to compile.
178
196
  const unknown = node;
@@ -181,4 +199,3 @@ class PdfBackend {
181
199
  }
182
200
  }
183
201
  }
184
- exports.PdfBackend = PdfBackend;
@@ -1,17 +1,14 @@
1
- "use strict";
2
1
  // Leaf module: no imports, so it can never sit inside an import cycle. The page/color
3
2
  // enums live here because they are runtime values used across modules that DO form
4
3
  // cycles (object manager <-> document <-> elements); importing them from a cyclic
5
4
  // module snapshots them as `undefined` under some load orders.
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.ColorMode = exports.Orientation = void 0;
8
- var Orientation;
5
+ export var Orientation;
9
6
  (function (Orientation) {
10
7
  Orientation["portrait"] = "PORTRAIT";
11
8
  Orientation["landscape"] = "LANDSCAPE";
12
- })(Orientation || (exports.Orientation = Orientation = {}));
13
- var ColorMode;
9
+ })(Orientation || (Orientation = {}));
10
+ export var ColorMode;
14
11
  (function (ColorMode) {
15
12
  ColorMode["color"] = "COLOR";
16
13
  ColorMode["grayscale"] = "GRAYSCALE";
17
- })(ColorMode || (exports.ColorMode = ColorMode = {}));
14
+ })(ColorMode || (ColorMode = {}));
@@ -1,8 +1,8 @@
1
- import { PageSize } from "../constants/page-sizes";
2
- import { PDFDocumentElement } from "../elements";
3
- import { FontStyle, PDFObjectManager } from "../utils/pdf-object-manager";
4
- import { ColorMode, Orientation } from "./pdf-config";
5
- export { ColorMode, Orientation } from "./pdf-config";
1
+ import { PageSize } from "../constants/page-sizes.js";
2
+ import { PDFDocumentElement } from "../elements/index.js";
3
+ import { FontStyle, PDFObjectManager } from "../utils/pdf-object-manager.js";
4
+ import { ColorMode, Orientation } from "./pdf-config.js";
5
+ export { ColorMode, Orientation } from "./pdf-config.js";
6
6
  export interface Margin {
7
7
  left: number;
8
8
  top: number;
@@ -1,90 +1,76 @@
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.PDFDocument = exports.Orientation = exports.ColorMode = void 0;
13
- const pdf_object_manager_1 = require("../utils/pdf-object-manager");
14
- const pdf_renderer_1 = require("./pdf-renderer");
1
+ import { FontStyle, PDFObjectManager } from "../utils/pdf-object-manager.js";
2
+ import { PDFRenderer } from "./pdf-renderer.js";
15
3
  // Re-exported so existing `../renderer` consumers keep importing these from here.
16
- var pdf_config_1 = require("./pdf-config");
17
- Object.defineProperty(exports, "ColorMode", { enumerable: true, get: function () { return pdf_config_1.ColorMode; } });
18
- Object.defineProperty(exports, "Orientation", { enumerable: true, get: function () { return pdf_config_1.Orientation; } });
19
- class PDFDocument {
4
+ export { ColorMode, Orientation } from "./pdf-config.js";
5
+ export class PDFDocument {
20
6
  //#region Helper
21
7
  // Method to register all standard fonts
22
8
  registerStandardFonts(objectManager) {
23
9
  const standardFonts = [
24
10
  {
25
11
  fontName: "Helvetica",
26
- fontStyle: pdf_object_manager_1.FontStyle.Normal,
12
+ fontStyle: FontStyle.Normal,
27
13
  fullName: "Helvetica",
28
14
  },
29
15
  {
30
16
  fontName: "Helvetica",
31
- fontStyle: pdf_object_manager_1.FontStyle.Bold,
17
+ fontStyle: FontStyle.Bold,
32
18
  fullName: "Helvetica-Bold",
33
19
  },
34
20
  {
35
21
  fontName: "Helvetica",
36
- fontStyle: pdf_object_manager_1.FontStyle.Italic,
22
+ fontStyle: FontStyle.Italic,
37
23
  fullName: "Helvetica-Oblique",
38
24
  },
39
25
  {
40
26
  fontName: "Helvetica",
41
- fontStyle: pdf_object_manager_1.FontStyle.BoldItalic,
27
+ fontStyle: FontStyle.BoldItalic,
42
28
  fullName: "Helvetica-BoldOblique",
43
29
  },
44
- { fontName: "Courier", fontStyle: pdf_object_manager_1.FontStyle.Normal, fullName: "Courier" },
30
+ { fontName: "Courier", fontStyle: FontStyle.Normal, fullName: "Courier" },
45
31
  {
46
32
  fontName: "Courier",
47
- fontStyle: pdf_object_manager_1.FontStyle.Bold,
33
+ fontStyle: FontStyle.Bold,
48
34
  fullName: "Courier-Bold",
49
35
  },
50
36
  {
51
37
  fontName: "Courier",
52
- fontStyle: pdf_object_manager_1.FontStyle.Italic,
38
+ fontStyle: FontStyle.Italic,
53
39
  fullName: "Courier-Oblique",
54
40
  },
55
41
  {
56
42
  fontName: "Courier",
57
- fontStyle: pdf_object_manager_1.FontStyle.BoldItalic,
43
+ fontStyle: FontStyle.BoldItalic,
58
44
  fullName: "Courier-BoldOblique",
59
45
  },
60
46
  {
61
47
  fontName: "Times-Roman",
62
- fontStyle: pdf_object_manager_1.FontStyle.Normal,
48
+ fontStyle: FontStyle.Normal,
63
49
  fullName: "Times-Roman",
64
50
  },
65
51
  {
66
52
  fontName: "Times-Roman",
67
- fontStyle: pdf_object_manager_1.FontStyle.Bold,
53
+ fontStyle: FontStyle.Bold,
68
54
  fullName: "Times-Bold",
69
55
  },
70
56
  {
71
57
  fontName: "Times-Roman",
72
- fontStyle: pdf_object_manager_1.FontStyle.Italic,
58
+ fontStyle: FontStyle.Italic,
73
59
  fullName: "Times-Italic",
74
60
  },
75
61
  {
76
62
  fontName: "Times-Roman",
77
- fontStyle: pdf_object_manager_1.FontStyle.BoldItalic,
63
+ fontStyle: FontStyle.BoldItalic,
78
64
  fullName: "Times-BoldItalic",
79
65
  },
80
66
  {
81
67
  fontName: "Symbol",
82
- fontStyle: pdf_object_manager_1.FontStyle.Normal,
68
+ fontStyle: FontStyle.Normal,
83
69
  fullName: "Symbol",
84
70
  },
85
71
  {
86
72
  fontName: "ITC Zapf Dingbats",
87
- fontStyle: pdf_object_manager_1.FontStyle.Normal,
73
+ fontStyle: FontStyle.Normal,
88
74
  fullName: "ZapfDingbats",
89
75
  },
90
76
  ];
@@ -94,10 +80,10 @@ class PDFDocument {
94
80
  constructor(config) {
95
81
  // One object manager per document instance - no global singleton. Threaded
96
82
  // explicitly into the renderer.
97
- this._objectManager = new pdf_object_manager_1.PDFObjectManager();
83
+ this._objectManager = new PDFObjectManager();
98
84
  // Add all standard font families - unless the document is PDF/A, which forbids non-embedded
99
85
  // fonts (the caller then supplies embedded fonts for every name it uses).
100
- if ((config === null || config === void 0 ? void 0 : config.registerStandardFonts) !== false) {
86
+ if (config?.registerStandardFonts !== false) {
101
87
  this.registerStandardFonts(this._objectManager);
102
88
  }
103
89
  if (config)
@@ -107,12 +93,9 @@ class PDFDocument {
107
93
  return this._objectManager;
108
94
  }
109
95
  beforeRenderer() { }
110
- static render() {
111
- return __awaiter(this, void 0, void 0, function* () {
112
- const instance = new this();
113
- instance.child = instance.build();
114
- return yield pdf_renderer_1.PDFRenderer.render(instance.child, instance._objectManager);
115
- });
96
+ static async render() {
97
+ const instance = new this();
98
+ instance.child = instance.build();
99
+ return await PDFRenderer.render(instance.child, instance._objectManager);
116
100
  }
117
101
  }
118
- exports.PDFDocument = PDFDocument;
@@ -1,6 +1,6 @@
1
- import { PDFDocumentElement } from "../elements/pdf-document-element";
2
- import { LayoutContext } from "../elements/pdf-element";
3
- import { PDFObjectManager } from "../utils/pdf-object-manager";
1
+ import { PDFDocumentElement } from "../elements/pdf-document-element.js";
2
+ import { LayoutContext } from "../elements/pdf-element.js";
3
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
4
4
  export declare class PDFDocumentRenderer {
5
5
  static render(document: PDFDocumentElement, objectManager: PDFObjectManager, ctx: LayoutContext): Promise<number>;
6
6
  /**