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

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 (275) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -21
  3. package/dist/api/args.d.ts +1 -1
  4. package/dist/api/args.js +2 -5
  5. package/dist/api/color.d.ts +4 -4
  6. package/dist/api/color.js +11 -17
  7. package/dist/api/content.d.ts +20 -13
  8. package/dist/api/content.js +44 -29
  9. package/dist/api/descriptor.d.ts +2 -2
  10. package/dist/api/descriptor.js +121 -31
  11. package/dist/api/dimension.d.ts +76 -0
  12. package/dist/api/dimension.js +43 -0
  13. package/dist/api/font-url.d.ts +28 -0
  14. package/dist/api/font-url.js +134 -0
  15. package/dist/api/forms.d.ts +347 -0
  16. package/dist/api/forms.js +189 -0
  17. package/dist/api/gradient.d.ts +53 -0
  18. package/dist/api/gradient.js +97 -0
  19. package/dist/api/index.d.ts +13 -8
  20. package/dist/api/index.js +13 -24
  21. package/dist/api/insets.d.ts +19 -12
  22. package/dist/api/insets.js +19 -12
  23. package/dist/api/layout.d.ts +149 -25
  24. package/dist/api/layout.js +182 -51
  25. package/dist/api/page-builder.d.ts +40 -0
  26. package/dist/api/page-builder.js +44 -0
  27. package/dist/api/structure.d.ts +100 -13
  28. package/dist/api/structure.js +179 -88
  29. package/dist/api/table.d.ts +5 -5
  30. package/dist/api/table.js +38 -26
  31. package/dist/api/text.d.ts +90 -4
  32. package/dist/api/text.js +116 -31
  33. package/dist/assets/font-data.d.ts +2 -0
  34. package/dist/assets/font-data.js +21 -0
  35. package/dist/assets/font-data.ts +37 -0
  36. package/dist/common/color.js +1 -5
  37. package/dist/constants/page-sizes.js +3 -6
  38. package/dist/constants/pdf-parts.js +1 -4
  39. package/dist/crypto/legacy-handler.d.ts +43 -0
  40. package/dist/crypto/legacy-handler.js +145 -0
  41. package/dist/crypto/security-handler.d.ts +62 -0
  42. package/dist/crypto/security-handler.js +155 -0
  43. package/dist/crypto/webcrypto.d.ts +11 -0
  44. package/dist/crypto/webcrypto.js +62 -0
  45. package/dist/edit/acroform-reader.d.ts +70 -0
  46. package/dist/edit/acroform-reader.js +126 -0
  47. package/dist/edit/appearance.d.ts +47 -0
  48. package/dist/edit/appearance.js +171 -0
  49. package/dist/edit/document.d.ts +145 -0
  50. package/dist/edit/document.js +642 -0
  51. package/dist/edit/fill.d.ts +65 -0
  52. package/dist/edit/fill.js +424 -0
  53. package/dist/edit/flatten.d.ts +54 -0
  54. package/dist/edit/flatten.js +462 -0
  55. package/dist/edit/index.d.ts +20 -0
  56. package/dist/edit/index.js +18 -0
  57. package/dist/edit/lexer.d.ts +30 -0
  58. package/dist/edit/lexer.js +285 -0
  59. package/dist/edit/objects.d.ts +68 -0
  60. package/dist/edit/objects.js +83 -0
  61. package/dist/edit/writer.d.ts +60 -0
  62. package/dist/edit/writer.js +283 -0
  63. package/dist/elements/container-element.d.ts +50 -5
  64. package/dist/elements/container-element.js +100 -39
  65. package/dist/elements/forms/checkbox-element.d.ts +51 -0
  66. package/dist/elements/forms/checkbox-element.js +48 -0
  67. package/dist/elements/forms/choice-element.d.ts +53 -0
  68. package/dist/elements/forms/choice-element.js +59 -0
  69. package/dist/elements/forms/push-button-element.d.ts +56 -0
  70. package/dist/elements/forms/push-button-element.js +49 -0
  71. package/dist/elements/forms/radio-element.d.ts +52 -0
  72. package/dist/elements/forms/radio-element.js +49 -0
  73. package/dist/elements/forms/signature-element.d.ts +54 -0
  74. package/dist/elements/forms/signature-element.js +47 -0
  75. package/dist/elements/forms/text-field-element.d.ts +61 -0
  76. package/dist/elements/forms/text-field-element.js +54 -0
  77. package/dist/elements/image-element.d.ts +58 -6
  78. package/dist/elements/image-element.js +145 -111
  79. package/dist/elements/index.d.ts +26 -10
  80. package/dist/elements/index.js +26 -28
  81. package/dist/elements/layout/anchor-element.d.ts +23 -0
  82. package/dist/elements/layout/anchor-element.js +27 -0
  83. package/dist/elements/layout/bookmark-element.d.ts +27 -0
  84. package/dist/elements/layout/bookmark-element.js +30 -0
  85. package/dist/elements/layout/default-text-style-element.d.ts +30 -0
  86. package/dist/elements/layout/default-text-style-element.js +47 -0
  87. package/dist/elements/layout/deferred-element.d.ts +3 -3
  88. package/dist/elements/layout/deferred-element.js +4 -8
  89. package/dist/elements/layout/expanded-element.d.ts +6 -4
  90. package/dist/elements/layout/expanded-element.js +22 -17
  91. package/dist/elements/layout/keep-together-element.d.ts +42 -0
  92. package/dist/elements/layout/keep-together-element.js +85 -0
  93. package/dist/elements/layout/link-element.d.ts +33 -0
  94. package/dist/elements/layout/link-element.js +39 -0
  95. package/dist/elements/layout/padding-element.d.ts +10 -5
  96. package/dist/elements/layout/padding-element.js +25 -16
  97. package/dist/elements/layout/page-break-element.d.ts +17 -0
  98. package/dist/elements/layout/page-break-element.js +24 -0
  99. package/dist/elements/layout/page-builder-element.d.ts +32 -0
  100. package/dist/elements/layout/page-builder-element.js +45 -0
  101. package/dist/elements/layout/positioned-element.d.ts +47 -0
  102. package/dist/elements/layout/positioned-element.js +73 -0
  103. package/dist/elements/layout/repeating-header-element.d.ts +3 -3
  104. package/dist/elements/layout/repeating-header-element.js +8 -12
  105. package/dist/elements/layout/rotated-box-element.d.ts +35 -0
  106. package/dist/elements/layout/rotated-box-element.js +54 -0
  107. package/dist/elements/layout/rotated-element.d.ts +32 -0
  108. package/dist/elements/layout/rotated-element.js +41 -0
  109. package/dist/elements/layout/sized-container-element.d.ts +2 -2
  110. package/dist/elements/layout/sized-container-element.js +6 -11
  111. package/dist/elements/layout/struct-group.d.ts +28 -0
  112. package/dist/elements/layout/struct-group.js +42 -0
  113. package/dist/elements/line-element.d.ts +3 -3
  114. package/dist/elements/line-element.js +5 -10
  115. package/dist/elements/page-element.d.ts +26 -6
  116. package/dist/elements/page-element.js +72 -27
  117. package/dist/elements/pdf-document-element.d.ts +10 -4
  118. package/dist/elements/pdf-document-element.js +11 -10
  119. package/dist/elements/pdf-element.d.ts +150 -4
  120. package/dist/elements/pdf-element.js +138 -20
  121. package/dist/elements/rectangle-element.d.ts +52 -11
  122. package/dist/elements/rectangle-element.js +129 -36
  123. package/dist/elements/row-element.d.ts +45 -4
  124. package/dist/elements/row-element.js +66 -18
  125. package/dist/elements/text-element.d.ts +132 -11
  126. package/dist/elements/text-element.js +206 -56
  127. package/dist/forms/acroform.d.ts +63 -0
  128. package/dist/forms/acroform.js +427 -0
  129. package/dist/forms/appearance.d.ts +58 -0
  130. package/dist/forms/appearance.js +204 -0
  131. package/dist/forms/field.d.ts +164 -0
  132. package/dist/forms/field.js +1 -0
  133. package/dist/forms/pdf.d.ts +19 -0
  134. package/dist/forms/pdf.js +28 -0
  135. package/dist/index.d.ts +3 -3
  136. package/dist/index.js +3 -19
  137. package/dist/ir/display-list.d.ts +197 -8
  138. package/dist/ir/display-list.js +8 -2
  139. package/dist/layout/alignment.d.ts +10 -0
  140. package/dist/layout/alignment.js +6 -0
  141. package/dist/layout/box-constraints.d.ts +61 -0
  142. package/dist/layout/box-constraints.js +88 -6
  143. package/dist/layout/collect-images.d.ts +9 -0
  144. package/dist/layout/collect-images.js +34 -0
  145. package/dist/layout/fragmentation.d.ts +20 -1
  146. package/dist/layout/fragmentation.js +74 -18
  147. package/dist/layout/insets.d.ts +28 -0
  148. package/dist/layout/insets.js +20 -0
  149. package/dist/platform/browser-fs.d.ts +2 -0
  150. package/dist/platform/browser-fs.js +9 -0
  151. package/dist/platform/browser-image.d.ts +5 -0
  152. package/dist/platform/browser-image.js +13 -0
  153. package/dist/platform/node-fs.d.ts +2 -0
  154. package/dist/platform/node-fs.js +10 -0
  155. package/dist/platform/node-image.d.ts +5 -0
  156. package/dist/platform/node-image.js +9 -0
  157. package/dist/renderer/anchor-renderer.d.ts +6 -0
  158. package/dist/renderer/anchor-renderer.js +11 -0
  159. package/dist/renderer/bookmark-renderer.d.ts +6 -0
  160. package/dist/renderer/bookmark-renderer.js +11 -0
  161. package/dist/renderer/container-renderer.d.ts +3 -3
  162. package/dist/renderer/container-renderer.js +11 -28
  163. package/dist/renderer/default-text-style-renderer.d.ts +6 -0
  164. package/dist/renderer/default-text-style-renderer.js +10 -0
  165. package/dist/renderer/deferred-renderer.d.ts +3 -3
  166. package/dist/renderer/deferred-renderer.js +8 -23
  167. package/dist/renderer/emoji-image.d.ts +9 -0
  168. package/dist/renderer/emoji-image.js +68 -0
  169. package/dist/renderer/expanded-renderer.d.ts +3 -3
  170. package/dist/renderer/expanded-renderer.js +6 -21
  171. package/dist/renderer/form-field-renderer.d.ts +20 -0
  172. package/dist/renderer/form-field-renderer.js +12 -0
  173. package/dist/renderer/image-renderer.d.ts +4 -4
  174. package/dist/renderer/image-renderer.js +86 -75
  175. package/dist/renderer/index.d.ts +10 -10
  176. package/dist/renderer/index.js +10 -26
  177. package/dist/renderer/keep-together-renderer.d.ts +10 -0
  178. package/dist/renderer/keep-together-renderer.js +12 -0
  179. package/dist/renderer/line-renderer.d.ts +3 -3
  180. package/dist/renderer/line-renderer.js +13 -28
  181. package/dist/renderer/link-renderer.d.ts +6 -0
  182. package/dist/renderer/link-renderer.js +11 -0
  183. package/dist/renderer/padding-renderer.d.ts +3 -3
  184. package/dist/renderer/padding-renderer.js +6 -21
  185. package/dist/renderer/page-break-renderer.d.ts +14 -0
  186. package/dist/renderer/page-break-renderer.js +15 -0
  187. package/dist/renderer/page-builder-renderer.d.ts +6 -0
  188. package/dist/renderer/page-builder-renderer.js +11 -0
  189. package/dist/renderer/page-renderer.d.ts +2 -2
  190. package/dist/renderer/page-renderer.js +115 -77
  191. package/dist/renderer/pdf-backend.d.ts +31 -4
  192. package/dist/renderer/pdf-backend.js +287 -49
  193. package/dist/renderer/pdf-config.js +4 -7
  194. package/dist/renderer/pdf-document-class.d.ts +5 -5
  195. package/dist/renderer/pdf-document-class.js +27 -41
  196. package/dist/renderer/pdf-document-renderer.d.ts +19 -10
  197. package/dist/renderer/pdf-document-renderer.js +135 -91
  198. package/dist/renderer/pdf-renderer.d.ts +2 -2
  199. package/dist/renderer/pdf-renderer.js +165 -90
  200. package/dist/renderer/positioned-renderer.d.ts +6 -0
  201. package/dist/renderer/positioned-renderer.js +10 -0
  202. package/dist/renderer/rectangle-renderer.d.ts +3 -3
  203. package/dist/renderer/rectangle-renderer.js +49 -44
  204. package/dist/renderer/repeating-header-renderer.d.ts +3 -3
  205. package/dist/renderer/repeating-header-renderer.js +10 -26
  206. package/dist/renderer/rotated-renderer.d.ts +7 -0
  207. package/dist/renderer/rotated-renderer.js +29 -0
  208. package/dist/renderer/row-renderer.d.ts +3 -3
  209. package/dist/renderer/row-renderer.js +11 -28
  210. package/dist/renderer/struct-group-renderer.d.ts +10 -0
  211. package/dist/renderer/struct-group-renderer.js +24 -0
  212. package/dist/renderer/text-renderer.d.ts +9 -5
  213. package/dist/renderer/text-renderer.js +437 -89
  214. package/dist/text/advance.d.ts +34 -0
  215. package/dist/text/advance.js +45 -0
  216. package/dist/text/arabic.d.ts +20 -0
  217. package/dist/text/arabic.js +101 -0
  218. package/dist/text/bidi.d.ts +33 -0
  219. package/dist/text/bidi.js +94 -0
  220. package/dist/text/emoji-codepoints.d.ts +1 -0
  221. package/dist/text/emoji-codepoints.js +29 -0
  222. package/dist/text/font-fallback.d.ts +25 -0
  223. package/dist/text/font-fallback.js +38 -0
  224. package/dist/text/line-breaker.d.ts +50 -12
  225. package/dist/text/line-breaker.js +158 -37
  226. package/dist/text/line-metrics.d.ts +49 -0
  227. package/dist/text/line-metrics.js +57 -0
  228. package/dist/text/orphans-widows.d.ts +27 -0
  229. package/dist/text/orphans-widows.js +53 -0
  230. package/dist/text/shape.d.ts +29 -0
  231. package/dist/text/shape.js +67 -0
  232. package/dist/text/text-decoration.d.ts +50 -0
  233. package/dist/text/text-decoration.js +62 -0
  234. package/dist/text/text-style.d.ts +60 -0
  235. package/dist/text/text-style.js +79 -0
  236. package/dist/utils/afm-parser.d.ts +34 -0
  237. package/dist/utils/afm-parser.js +76 -17
  238. package/dist/utils/bytes.d.ts +24 -0
  239. package/dist/utils/bytes.js +76 -0
  240. package/dist/utils/dest-registry.d.ts +22 -0
  241. package/dist/utils/dest-registry.js +32 -0
  242. package/dist/utils/flex-layout.d.ts +36 -9
  243. package/dist/utils/flex-layout.js +207 -30
  244. package/dist/utils/font-metrics.d.ts +20 -1
  245. package/dist/utils/font-metrics.js +1 -2
  246. package/dist/utils/font-path.js +3 -6
  247. package/dist/utils/gsub.d.ts +36 -0
  248. package/dist/utils/gsub.js +178 -0
  249. package/dist/utils/image-helper.d.ts +6 -5
  250. package/dist/utils/image-helper.js +101 -111
  251. package/dist/utils/inflate.d.ts +16 -0
  252. package/dist/utils/inflate.js +52 -0
  253. package/dist/utils/md5.d.ts +4 -0
  254. package/dist/utils/md5.js +79 -0
  255. package/dist/utils/outline.d.ts +21 -0
  256. package/dist/utils/outline.js +79 -0
  257. package/dist/utils/pdf-object-manager.d.ts +110 -8
  258. package/dist/utils/pdf-object-manager.js +583 -141
  259. package/dist/utils/renderer-registry.d.ts +13 -1
  260. package/dist/utils/renderer-registry.js +23 -6
  261. package/dist/utils/struct-tree.d.ts +44 -0
  262. package/dist/utils/struct-tree.js +129 -0
  263. package/dist/utils/ttf-parser.d.ts +134 -2
  264. package/dist/utils/ttf-parser.js +873 -50
  265. package/dist/utils/ttf-subsetter.d.ts +1 -1
  266. package/dist/utils/ttf-subsetter.js +40 -42
  267. package/dist/utils/ua-xmp.d.ts +9 -0
  268. package/dist/utils/ua-xmp.js +32 -0
  269. package/dist/utils/utf8-to-windows1252-encoder.d.ts +6 -0
  270. package/dist/utils/utf8-to-windows1252-encoder.js +11 -4
  271. package/dist/utils/woff.d.ts +10 -0
  272. package/dist/utils/woff.js +116 -0
  273. package/dist/validators/element-validator.d.ts +2 -2
  274. package/dist/validators/element-validator.js +31 -26
  275. package/package.json +22 -2
@@ -1,74 +1,78 @@
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
+ import { isRounded } from "../ir/display-list.js";
5
+ export class ImageRenderer {
6
+ static async render(imageElement, objectManager) {
7
+ // Load the image and convert it in a binary string
8
+ let { x, y, width, height, image, fit, radius, alt } = imageElement.getProps();
9
+ await image.init(); // Load and initialize the image
10
+ const imageType = await image.getImageType(); // For the moment we can handle `png` and `jpg/jpeg` files
11
+ const fileData = await image.getFileData();
12
+ const dimensions = await image.getImageDimensions();
13
+ if (!fileData) {
14
+ throw new Error("File data cannot be `null`");
15
+ }
16
+ // JPEG embeds raw (PDF decodes DCTDecode natively). PNG is not a valid Flate stream,
17
+ // so decode it to raw DeviceRGB samples that the FlateDecode XObject path expects.
18
+ let embedData = fileData;
19
+ let smask;
20
+ if (imageType === "FlateDecode") {
21
+ const decoded = await decodePngToRgbFlate(bytesFromLatin1(fileData));
22
+ embedData = decoded.data;
23
+ smask = decoded.smask;
24
+ }
25
+ // Now we check the `fit` property and changing the dimensions of the image
26
+ // Optionally we must add an overflow container
27
+ let mustCreateOverflowContainer = false;
28
+ const containerDimensions = JSON.parse(JSON.stringify({ x, y, width, height })); // Deep clone images dimensions
29
+ switch (fit) {
30
+ case BoxFit.cover:
31
+ mustCreateOverflowContainer = true;
32
+ const fitCoverResult = applyCoverFit(dimensions.width, dimensions.height, width ?? 0, height ?? 0);
33
+ x += fitCoverResult.offsetX;
34
+ y += fitCoverResult.offsetY;
35
+ width = fitCoverResult.width;
36
+ height = fitCoverResult.height;
37
+ break;
38
+ case BoxFit.contain:
39
+ mustCreateOverflowContainer = true;
40
+ const fitContainResult = applyContainFit(dimensions.width, dimensions.height, width ?? 0, height ?? 0);
41
+ x += fitContainResult.offsetX;
42
+ y += fitContainResult.offsetY;
43
+ width = fitContainResult.width;
44
+ height = fitContainResult.height;
45
+ break;
46
+ case BoxFit.none:
47
+ const fitNoneResult = applyFitNone(dimensions.width, dimensions.height, width ?? 0, height ?? 0);
48
+ x += fitNoneResult.offsetX;
49
+ y += fitNoneResult.offsetY;
50
+ width = fitNoneResult.width;
51
+ height = fitNoneResult.height;
52
+ break;
53
+ case BoxFit.fill:
54
+ const fitFillResult = applyFillFit(width ?? 0, height ?? 0);
55
+ width = fitFillResult.width;
56
+ height = fitFillResult.height;
57
+ }
58
+ // A radius rounds the image BOX (the element frame), so it clips to that frame too -
59
+ // independent of the cover/contain overflow clip.
60
+ const wantsClip = mustCreateOverflowContainer || isRounded(radius);
61
+ // The fitted geometry becomes a display-list primitive; the backend registers
62
+ // the XObject and emits the placement (+ clip, rounded when a radius is set).
63
+ const node = {
64
+ type: "image",
65
+ x,
66
+ y,
67
+ width: width,
68
+ height: height,
69
+ intrinsicWidth: dimensions.width,
70
+ intrinsicHeight: dimensions.height,
71
+ data: embedData,
72
+ imageType,
73
+ ...(smask ? { smask } : {}),
74
+ ...(radius ? { radius } : {}),
75
+ ...(wantsClip
72
76
  ? {
73
77
  clip: {
74
78
  x: containerDimensions.x,
@@ -77,9 +81,16 @@ class ImageRenderer {
77
81
  height: containerDimensions.height,
78
82
  },
79
83
  }
80
- : {}));
81
- return [node];
82
- });
84
+ : {}),
85
+ };
86
+ // Accessible tagging: an image WITH alt text is a Figure; without, it stays untagged and the backend
87
+ // treats it as decoration (an Artifact). One struct element per image.
88
+ if (objectManager.struct.enabled && alt) {
89
+ node.tag = {
90
+ role: "Figure",
91
+ key: objectManager.struct.openElement(imageElement.structId, "Figure", { alt }),
92
+ };
93
+ }
94
+ return [node];
83
95
  }
84
96
  }
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";
@@ -0,0 +1,10 @@
1
+ import { KeepTogetherElement } from "../elements/layout/keep-together-element.js";
2
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
3
+ import { IRNode } from "../ir/display-list.js";
4
+ /**
5
+ * A `keepTogether` is layout-transparent: it just renders its child. All of its work happens in the
6
+ * layout pass (`fragment`), never here.
7
+ */
8
+ export declare class KeepTogetherRenderer {
9
+ static render(group: KeepTogetherElement, objectManager: PDFObjectManager): Promise<IRNode[]>;
10
+ }
@@ -0,0 +1,12 @@
1
+ import { RendererRegistry } from "../utils/renderer-registry.js";
2
+ /**
3
+ * A `keepTogether` is layout-transparent: it just renders its child. All of its work happens in the
4
+ * layout pass (`fragment`), never here.
5
+ */
6
+ export class KeepTogetherRenderer {
7
+ static async render(group, objectManager) {
8
+ const { child } = group.getProps();
9
+ const renderer = RendererRegistry.getRenderer(child);
10
+ return renderer(child, objectManager);
11
+ }
12
+ }
@@ -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;
@@ -0,0 +1,6 @@
1
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
2
+ import { LinkElement } from "../elements/layout/link-element.js";
3
+ import { IRNode } from "../ir/display-list.js";
4
+ export declare class LinkRenderer {
5
+ static render(element: LinkElement, objectManager: PDFObjectManager): Promise<IRNode[]>;
6
+ }
@@ -0,0 +1,11 @@
1
+ import { RendererRegistry } from "../utils/renderer-registry.js";
2
+ export class LinkRenderer {
3
+ static async render(element, objectManager) {
4
+ const { href, dest, child, x, y, width, height } = element.getProps();
5
+ const renderer = RendererRegistry.getRenderer(child);
6
+ const childNodes = await renderer(child, objectManager);
7
+ // The child draws normally; a Link IR node carries the clickable rect + target (external href or
8
+ // internal dest) for the page renderer to emit as a /Link annotation (no content-stream ops itself).
9
+ return [...childNodes, { type: "link", x, y, width, height, href, dest }];
10
+ }
11
+ }
@@ -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(child, objectManager);
21
7
  }
22
8
  }
23
- exports.PaddingRenderer = PaddingRenderer;
@@ -0,0 +1,14 @@
1
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
2
+ import { PageBreakElement } from "../elements/layout/page-break-element.js";
3
+ import { IRNode } from "../ir/display-list.js";
4
+ /**
5
+ * A `PageBreak` draws nothing - the pagination packer consumes it at the cut, so in a vertical flow it
6
+ * never reaches this pass. Reaching it therefore means the break was ineffective: it sat somewhere that
7
+ * does not paginate, like inside a horizontal `Row` (a row is one line, you cannot split it across
8
+ * pages - CSS and react-pdf ignore a forced break there too). We degrade to drawing nothing, but warn
9
+ * once so the mistake is not silent. This one choke-point catches every ineffective break; no element
10
+ * needs a special case.
11
+ */
12
+ export declare class PageBreakRenderer {
13
+ static render(_element: PageBreakElement, _objectManager: PDFObjectManager): Promise<IRNode[]>;
14
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * A `PageBreak` draws nothing - the pagination packer consumes it at the cut, so in a vertical flow it
3
+ * never reaches this pass. Reaching it therefore means the break was ineffective: it sat somewhere that
4
+ * does not paginate, like inside a horizontal `Row` (a row is one line, you cannot split it across
5
+ * pages - CSS and react-pdf ignore a forced break there too). We degrade to drawing nothing, but warn
6
+ * once so the mistake is not silent. This one choke-point catches every ineffective break; no element
7
+ * needs a special case.
8
+ */
9
+ export class PageBreakRenderer {
10
+ static async render(_element, _objectManager) {
11
+ console.warn("PageBreak had no effect: it is not in a paginating flow (e.g. it is inside a Row, which is a " +
12
+ "single horizontal line). Put the break as a sibling in a Column to break after that content.");
13
+ return [];
14
+ }
15
+ }
@@ -0,0 +1,6 @@
1
+ import { PDFObjectManager } from "../utils/pdf-object-manager.js";
2
+ import { PageBuilderElement } from "../elements/layout/page-builder-element.js";
3
+ import { IRNode } from "../ir/display-list.js";
4
+ export declare class PageBuilderRenderer {
5
+ static render(element: PageBuilderElement, objectManager: PDFObjectManager): Promise<IRNode[]>;
6
+ }
@@ -0,0 +1,11 @@
1
+ import { RendererRegistry } from "../utils/renderer-registry.js";
2
+ export class PageBuilderRenderer {
3
+ static async render(element, objectManager) {
4
+ // `composed` is whatever the closure built for THIS page during the render pass's layout.
5
+ const { composed } = element.getProps();
6
+ if (!composed)
7
+ return [];
8
+ const renderer = RendererRegistry.getRenderer(composed);
9
+ return renderer(composed, objectManager);
10
+ }
11
+ }
@@ -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
  }