@jasy/pdf 1.0.0-alpha.1 → 1.0.0-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +35 -21
- package/dist/api/args.d.ts +1 -1
- package/dist/api/args.js +2 -5
- package/dist/api/color.d.ts +4 -4
- package/dist/api/color.js +11 -17
- package/dist/api/content.d.ts +20 -13
- package/dist/api/content.js +44 -29
- package/dist/api/descriptor.d.ts +2 -2
- package/dist/api/descriptor.js +121 -31
- package/dist/api/dimension.d.ts +76 -0
- package/dist/api/dimension.js +43 -0
- package/dist/api/font-url.d.ts +28 -0
- package/dist/api/font-url.js +134 -0
- package/dist/api/forms.d.ts +347 -0
- package/dist/api/forms.js +189 -0
- package/dist/api/gradient.d.ts +53 -0
- package/dist/api/gradient.js +97 -0
- package/dist/api/index.d.ts +13 -8
- package/dist/api/index.js +13 -24
- package/dist/api/insets.d.ts +19 -12
- package/dist/api/insets.js +19 -12
- package/dist/api/layout.d.ts +149 -25
- package/dist/api/layout.js +182 -51
- package/dist/api/page-builder.d.ts +40 -0
- package/dist/api/page-builder.js +44 -0
- package/dist/api/structure.d.ts +107 -13
- package/dist/api/structure.js +187 -88
- package/dist/api/table.d.ts +5 -5
- package/dist/api/table.js +38 -26
- package/dist/api/text.d.ts +90 -4
- package/dist/api/text.js +116 -31
- package/dist/assets/font-data.d.ts +2 -0
- package/dist/assets/font-data.js +21 -0
- package/dist/assets/font-data.ts +37 -0
- package/dist/common/color.js +1 -5
- package/dist/constants/page-sizes.js +3 -6
- package/dist/constants/pdf-parts.js +1 -4
- package/dist/crypto/legacy-handler.d.ts +43 -0
- package/dist/crypto/legacy-handler.js +145 -0
- package/dist/crypto/security-handler.d.ts +62 -0
- package/dist/crypto/security-handler.js +155 -0
- package/dist/crypto/webcrypto.d.ts +11 -0
- package/dist/crypto/webcrypto.js +62 -0
- package/dist/edit/acroform-reader.d.ts +70 -0
- package/dist/edit/acroform-reader.js +126 -0
- package/dist/edit/appearance.d.ts +47 -0
- package/dist/edit/appearance.js +171 -0
- package/dist/edit/document.d.ts +145 -0
- package/dist/edit/document.js +642 -0
- package/dist/edit/fill.d.ts +65 -0
- package/dist/edit/fill.js +424 -0
- package/dist/edit/flatten.d.ts +54 -0
- package/dist/edit/flatten.js +462 -0
- package/dist/edit/index.d.ts +20 -0
- package/dist/edit/index.js +18 -0
- package/dist/edit/lexer.d.ts +30 -0
- package/dist/edit/lexer.js +285 -0
- package/dist/edit/objects.d.ts +68 -0
- package/dist/edit/objects.js +83 -0
- package/dist/edit/writer.d.ts +60 -0
- package/dist/edit/writer.js +283 -0
- package/dist/elements/container-element.d.ts +50 -5
- package/dist/elements/container-element.js +100 -39
- package/dist/elements/forms/checkbox-element.d.ts +51 -0
- package/dist/elements/forms/checkbox-element.js +48 -0
- package/dist/elements/forms/choice-element.d.ts +53 -0
- package/dist/elements/forms/choice-element.js +59 -0
- package/dist/elements/forms/push-button-element.d.ts +56 -0
- package/dist/elements/forms/push-button-element.js +49 -0
- package/dist/elements/forms/radio-element.d.ts +52 -0
- package/dist/elements/forms/radio-element.js +49 -0
- package/dist/elements/forms/signature-element.d.ts +54 -0
- package/dist/elements/forms/signature-element.js +47 -0
- package/dist/elements/forms/text-field-element.d.ts +61 -0
- package/dist/elements/forms/text-field-element.js +54 -0
- package/dist/elements/image-element.d.ts +58 -6
- package/dist/elements/image-element.js +145 -111
- package/dist/elements/index.d.ts +26 -10
- package/dist/elements/index.js +26 -28
- package/dist/elements/layout/anchor-element.d.ts +23 -0
- package/dist/elements/layout/anchor-element.js +27 -0
- package/dist/elements/layout/bookmark-element.d.ts +27 -0
- package/dist/elements/layout/bookmark-element.js +30 -0
- package/dist/elements/layout/default-text-style-element.d.ts +30 -0
- package/dist/elements/layout/default-text-style-element.js +47 -0
- package/dist/elements/layout/deferred-element.d.ts +3 -3
- package/dist/elements/layout/deferred-element.js +4 -8
- package/dist/elements/layout/expanded-element.d.ts +6 -4
- package/dist/elements/layout/expanded-element.js +22 -17
- package/dist/elements/layout/keep-together-element.d.ts +42 -0
- package/dist/elements/layout/keep-together-element.js +85 -0
- package/dist/elements/layout/link-element.d.ts +33 -0
- package/dist/elements/layout/link-element.js +39 -0
- package/dist/elements/layout/padding-element.d.ts +10 -5
- package/dist/elements/layout/padding-element.js +25 -16
- package/dist/elements/layout/page-break-element.d.ts +17 -0
- package/dist/elements/layout/page-break-element.js +24 -0
- package/dist/elements/layout/page-builder-element.d.ts +32 -0
- package/dist/elements/layout/page-builder-element.js +45 -0
- package/dist/elements/layout/positioned-element.d.ts +47 -0
- package/dist/elements/layout/positioned-element.js +73 -0
- package/dist/elements/layout/repeating-header-element.d.ts +3 -3
- package/dist/elements/layout/repeating-header-element.js +8 -12
- package/dist/elements/layout/rotated-box-element.d.ts +35 -0
- package/dist/elements/layout/rotated-box-element.js +54 -0
- package/dist/elements/layout/rotated-element.d.ts +32 -0
- package/dist/elements/layout/rotated-element.js +41 -0
- package/dist/elements/layout/sized-container-element.d.ts +2 -2
- package/dist/elements/layout/sized-container-element.js +6 -11
- package/dist/elements/layout/struct-group.d.ts +28 -0
- package/dist/elements/layout/struct-group.js +42 -0
- package/dist/elements/line-element.d.ts +3 -3
- package/dist/elements/line-element.js +5 -10
- package/dist/elements/page-element.d.ts +26 -6
- package/dist/elements/page-element.js +72 -27
- package/dist/elements/pdf-document-element.d.ts +10 -4
- package/dist/elements/pdf-document-element.js +11 -10
- package/dist/elements/pdf-element.d.ts +150 -4
- package/dist/elements/pdf-element.js +138 -20
- package/dist/elements/rectangle-element.d.ts +52 -11
- package/dist/elements/rectangle-element.js +129 -36
- package/dist/elements/row-element.d.ts +45 -4
- package/dist/elements/row-element.js +66 -18
- package/dist/elements/text-element.d.ts +139 -11
- package/dist/elements/text-element.js +234 -57
- package/dist/forms/acroform.d.ts +63 -0
- package/dist/forms/acroform.js +427 -0
- package/dist/forms/appearance.d.ts +58 -0
- package/dist/forms/appearance.js +204 -0
- package/dist/forms/field.d.ts +164 -0
- package/dist/forms/field.js +1 -0
- package/dist/forms/pdf.d.ts +19 -0
- package/dist/forms/pdf.js +28 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -19
- package/dist/ir/display-list.d.ts +197 -8
- package/dist/ir/display-list.js +8 -2
- package/dist/layout/alignment.d.ts +10 -0
- package/dist/layout/alignment.js +6 -0
- package/dist/layout/box-constraints.d.ts +61 -0
- package/dist/layout/box-constraints.js +88 -6
- package/dist/layout/collect-images.d.ts +9 -0
- package/dist/layout/collect-images.js +34 -0
- package/dist/layout/fragmentation.d.ts +20 -1
- package/dist/layout/fragmentation.js +74 -18
- package/dist/layout/insets.d.ts +28 -0
- package/dist/layout/insets.js +20 -0
- package/dist/platform/browser-fs.d.ts +2 -0
- package/dist/platform/browser-fs.js +9 -0
- package/dist/platform/browser-image.d.ts +5 -0
- package/dist/platform/browser-image.js +13 -0
- package/dist/platform/node-fs.d.ts +2 -0
- package/dist/platform/node-fs.js +10 -0
- package/dist/platform/node-image.d.ts +5 -0
- package/dist/platform/node-image.js +9 -0
- package/dist/renderer/anchor-renderer.d.ts +6 -0
- package/dist/renderer/anchor-renderer.js +11 -0
- package/dist/renderer/bookmark-renderer.d.ts +6 -0
- package/dist/renderer/bookmark-renderer.js +11 -0
- package/dist/renderer/container-renderer.d.ts +3 -3
- package/dist/renderer/container-renderer.js +11 -28
- package/dist/renderer/default-text-style-renderer.d.ts +6 -0
- package/dist/renderer/default-text-style-renderer.js +10 -0
- package/dist/renderer/deferred-renderer.d.ts +3 -3
- package/dist/renderer/deferred-renderer.js +8 -23
- package/dist/renderer/emoji-image.d.ts +9 -0
- package/dist/renderer/emoji-image.js +68 -0
- package/dist/renderer/expanded-renderer.d.ts +3 -3
- package/dist/renderer/expanded-renderer.js +6 -21
- package/dist/renderer/form-field-renderer.d.ts +20 -0
- package/dist/renderer/form-field-renderer.js +12 -0
- package/dist/renderer/image-renderer.d.ts +4 -4
- package/dist/renderer/image-renderer.js +86 -75
- package/dist/renderer/index.d.ts +10 -10
- package/dist/renderer/index.js +10 -26
- package/dist/renderer/keep-together-renderer.d.ts +10 -0
- package/dist/renderer/keep-together-renderer.js +12 -0
- package/dist/renderer/line-renderer.d.ts +3 -3
- package/dist/renderer/line-renderer.js +13 -28
- package/dist/renderer/link-renderer.d.ts +6 -0
- package/dist/renderer/link-renderer.js +11 -0
- package/dist/renderer/padding-renderer.d.ts +3 -3
- package/dist/renderer/padding-renderer.js +6 -21
- package/dist/renderer/page-break-renderer.d.ts +14 -0
- package/dist/renderer/page-break-renderer.js +15 -0
- package/dist/renderer/page-builder-renderer.d.ts +6 -0
- package/dist/renderer/page-builder-renderer.js +11 -0
- package/dist/renderer/page-renderer.d.ts +2 -2
- package/dist/renderer/page-renderer.js +115 -77
- package/dist/renderer/pdf-backend.d.ts +31 -4
- package/dist/renderer/pdf-backend.js +287 -49
- package/dist/renderer/pdf-config.js +4 -7
- package/dist/renderer/pdf-document-class.d.ts +5 -5
- package/dist/renderer/pdf-document-class.js +27 -41
- package/dist/renderer/pdf-document-renderer.d.ts +19 -10
- package/dist/renderer/pdf-document-renderer.js +135 -91
- package/dist/renderer/pdf-renderer.d.ts +2 -2
- package/dist/renderer/pdf-renderer.js +165 -90
- package/dist/renderer/positioned-renderer.d.ts +6 -0
- package/dist/renderer/positioned-renderer.js +10 -0
- package/dist/renderer/rectangle-renderer.d.ts +3 -3
- package/dist/renderer/rectangle-renderer.js +49 -44
- package/dist/renderer/repeating-header-renderer.d.ts +3 -3
- package/dist/renderer/repeating-header-renderer.js +10 -26
- package/dist/renderer/rotated-renderer.d.ts +7 -0
- package/dist/renderer/rotated-renderer.js +29 -0
- package/dist/renderer/row-renderer.d.ts +3 -3
- package/dist/renderer/row-renderer.js +11 -28
- package/dist/renderer/struct-group-renderer.d.ts +10 -0
- package/dist/renderer/struct-group-renderer.js +24 -0
- package/dist/renderer/text-renderer.d.ts +9 -5
- package/dist/renderer/text-renderer.js +437 -89
- package/dist/text/advance.d.ts +34 -0
- package/dist/text/advance.js +45 -0
- package/dist/text/arabic.d.ts +20 -0
- package/dist/text/arabic.js +101 -0
- package/dist/text/bidi.d.ts +33 -0
- package/dist/text/bidi.js +94 -0
- package/dist/text/emoji-codepoints.d.ts +1 -0
- package/dist/text/emoji-codepoints.js +29 -0
- package/dist/text/font-fallback.d.ts +25 -0
- package/dist/text/font-fallback.js +38 -0
- package/dist/text/glyph-coverage.d.ts +15 -0
- package/dist/text/glyph-coverage.js +77 -0
- package/dist/text/line-breaker.d.ts +50 -12
- package/dist/text/line-breaker.js +200 -54
- package/dist/text/line-metrics.d.ts +49 -0
- package/dist/text/line-metrics.js +57 -0
- package/dist/text/orphans-widows.d.ts +27 -0
- package/dist/text/orphans-widows.js +53 -0
- package/dist/text/shape.d.ts +29 -0
- package/dist/text/shape.js +67 -0
- package/dist/text/text-decoration.d.ts +50 -0
- package/dist/text/text-decoration.js +62 -0
- package/dist/text/text-style.d.ts +60 -0
- package/dist/text/text-style.js +79 -0
- package/dist/text/whitespace.d.ts +4 -0
- package/dist/text/whitespace.js +43 -0
- package/dist/utils/afm-parser.d.ts +34 -0
- package/dist/utils/afm-parser.js +76 -17
- package/dist/utils/bytes.d.ts +24 -0
- package/dist/utils/bytes.js +76 -0
- package/dist/utils/dest-registry.d.ts +22 -0
- package/dist/utils/dest-registry.js +32 -0
- package/dist/utils/flex-layout.d.ts +36 -9
- package/dist/utils/flex-layout.js +207 -30
- package/dist/utils/font-metrics.d.ts +26 -1
- package/dist/utils/font-metrics.js +1 -2
- package/dist/utils/font-path.js +3 -6
- package/dist/utils/gsub.d.ts +36 -0
- package/dist/utils/gsub.js +178 -0
- package/dist/utils/image-helper.d.ts +6 -5
- package/dist/utils/image-helper.js +101 -111
- package/dist/utils/inflate.d.ts +16 -0
- package/dist/utils/inflate.js +52 -0
- package/dist/utils/md5.d.ts +4 -0
- package/dist/utils/md5.js +79 -0
- package/dist/utils/outline.d.ts +21 -0
- package/dist/utils/outline.js +79 -0
- package/dist/utils/pdf-object-manager.d.ts +127 -8
- package/dist/utils/pdf-object-manager.js +615 -141
- package/dist/utils/renderer-registry.d.ts +13 -1
- package/dist/utils/renderer-registry.js +23 -6
- package/dist/utils/struct-tree.d.ts +44 -0
- package/dist/utils/struct-tree.js +129 -0
- package/dist/utils/ttf-parser.d.ts +134 -2
- package/dist/utils/ttf-parser.js +873 -50
- package/dist/utils/ttf-subsetter.d.ts +1 -1
- package/dist/utils/ttf-subsetter.js +40 -42
- package/dist/utils/ua-xmp.d.ts +9 -0
- package/dist/utils/ua-xmp.js +32 -0
- package/dist/utils/utf8-to-windows1252-encoder.d.ts +6 -0
- package/dist/utils/utf8-to-windows1252-encoder.js +11 -4
- package/dist/utils/woff.d.ts +10 -0
- package/dist/utils/woff.js +116 -0
- package/dist/validators/element-validator.d.ts +2 -2
- package/dist/validators/element-validator.js +31 -26
- package/package.json +22 -2
|
@@ -1,11 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { BoxConstraints } from "./box-constraints.js";
|
|
2
|
+
export function isFragmentable(element) {
|
|
3
|
+
if (!("fragment" in element) ||
|
|
4
|
+
typeof element.fragment !== "function") {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
// An element may veto splitting at runtime via canFragment() - a transparent StructGroup only fragments
|
|
8
|
+
// when its wrapped child does, so a non-splittable wrapped child (e.g. a table row) is moved whole to the
|
|
9
|
+
// next page instead of being clipped at the boundary. Elements without canFragment() are always splittable.
|
|
10
|
+
const canFragment = element.canFragment;
|
|
11
|
+
return typeof canFragment !== "function" || canFragment.call(element);
|
|
12
|
+
}
|
|
13
|
+
export function reportOverflow(child, childHeight, maxHeight, policy) {
|
|
14
|
+
if (policy === "ignore")
|
|
15
|
+
return;
|
|
16
|
+
const name = child.constructor.name.replace(/Element$/, "");
|
|
17
|
+
const detail = `${name} is ${Math.round(childHeight)}pt tall but the page region is only ` +
|
|
18
|
+
`${Math.round(maxHeight)}pt and it cannot be broken - reduce its size, give it a bounded ` +
|
|
19
|
+
`height, or let it split across pages.`;
|
|
20
|
+
if (policy === "error")
|
|
21
|
+
throw new Error(`Layout overflow: ${detail}`);
|
|
22
|
+
console.warn(`Layout overflow (clipped): ${detail}`);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* True if packing `children` will hit a forced cut: a child that IS a break, contains one deeper in its
|
|
26
|
+
* subtree, or asks to break before/after itself. A flow container reports this from `hasForcedBreak` so
|
|
27
|
+
* its parent fragments it (runs `packChildren`) instead of placing it whole and swallowing the cut.
|
|
28
|
+
*/
|
|
29
|
+
export function childrenForceBreak(children) {
|
|
30
|
+
return children.some((child) => child.hasForcedBreak() || child.breaksBefore() || child.breaksAfter());
|
|
9
31
|
}
|
|
10
32
|
/**
|
|
11
33
|
* Packs a vertical stack of children into `maxHeight`, in order. Children are measured
|
|
@@ -21,41 +43,75 @@ function isFragmentable(element) {
|
|
|
21
43
|
* Shared by every element that lays out a vertical stack and can split it across regions
|
|
22
44
|
* (Container, and the decorated boxes Padding/Rectangle).
|
|
23
45
|
*/
|
|
24
|
-
function packChildren(children, maxHeight, width, ctx, gap = 0) {
|
|
46
|
+
export function packChildren(children, maxHeight, width, ctx, gap = 0) {
|
|
25
47
|
const fitted = [];
|
|
26
48
|
const remainder = [];
|
|
27
49
|
let usedHeight = 0;
|
|
50
|
+
// Everything from index `from` onward spills to the next region; `broke` says whether the cut was
|
|
51
|
+
// a FORCED page break (so an enclosing flow stops too) rather than the region filling up.
|
|
52
|
+
const spill = (from, broke) => {
|
|
53
|
+
for (let j = from; j < children.length; j++)
|
|
54
|
+
remainder.push(children[j]);
|
|
55
|
+
return { fitted, remainder, forceBreak: broke };
|
|
56
|
+
};
|
|
28
57
|
for (let i = 0; i < children.length; i++) {
|
|
29
58
|
const child = children[i];
|
|
30
|
-
|
|
59
|
+
// A forced break: consume the marker (it draws nothing) and send everything after it to a fresh
|
|
60
|
+
// page, regardless of how much room is left.
|
|
61
|
+
if (child.isPageBreak())
|
|
62
|
+
return spill(i + 1, true);
|
|
63
|
+
// break-before: this child wants a fresh page. Honour it only if something is already on this region
|
|
64
|
+
// (CSS ignores break-before at the top of a page); that guard also prevents an empty page + a loop.
|
|
65
|
+
if (child.breaksBefore() && fitted.length > 0)
|
|
66
|
+
return spill(i, true);
|
|
67
|
+
const childHeight = child.calculateLayout(BoxConstraints.loose(width, Infinity), { x: 0, y: 0 }, ctx).height;
|
|
31
68
|
// A gap precedes every child except the first one placed in this region.
|
|
32
69
|
const lead = fitted.length > 0 ? gap : 0;
|
|
33
|
-
if
|
|
70
|
+
// Place whole only if it fits AND holds no forced break: a child that fits by height but contains
|
|
71
|
+
// a `PageBreak` (or a break-before/after) in its subtree must still be fragmented, or the break
|
|
72
|
+
// would be swallowed.
|
|
73
|
+
if (usedHeight + lead + childHeight <= maxHeight && !child.hasForcedBreak()) {
|
|
34
74
|
fitted.push(child);
|
|
35
75
|
usedHeight += lead + childHeight;
|
|
76
|
+
// break-after: everything after this child starts a fresh page.
|
|
77
|
+
if (child.breaksAfter())
|
|
78
|
+
return spill(i + 1, true);
|
|
36
79
|
continue;
|
|
37
80
|
}
|
|
38
|
-
// `child` straddles the boundary
|
|
81
|
+
// `child` straddles the boundary, or carries a forced break. Split it; otherwise place/defer whole.
|
|
39
82
|
const remaining = maxHeight - usedHeight - lead;
|
|
40
83
|
let placedPart = false;
|
|
84
|
+
let childBroke = false;
|
|
41
85
|
if (isFragmentable(child)) {
|
|
42
86
|
const split = child.fragment(Math.max(0, remaining), width, ctx);
|
|
87
|
+
childBroke = split.forceBreak ?? false;
|
|
43
88
|
if (split.fitted) {
|
|
44
89
|
fitted.push(split.fitted);
|
|
90
|
+
// The child fully fit and triggered no cut: it only reached this path because its subtree
|
|
91
|
+
// FLAGGED a possible break (hasForcedBreak) that turned out to be a no-op here - e.g. a
|
|
92
|
+
// break-before at the top of the region, which CSS ignores. Keep packing the siblings after
|
|
93
|
+
// it instead of spilling them, so break-before does not accidentally push later content away.
|
|
94
|
+
if (!split.remainder && !childBroke) {
|
|
95
|
+
usedHeight += lead + childHeight;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
45
98
|
if (split.remainder)
|
|
46
99
|
remainder.push(split.remainder);
|
|
47
100
|
placedPart = true;
|
|
48
101
|
}
|
|
49
102
|
}
|
|
50
103
|
if (!placedPart) {
|
|
51
|
-
if (fitted.length === 0)
|
|
104
|
+
if (fitted.length === 0 && !childBroke) {
|
|
105
|
+
// Taller than the whole region and unsplittable: force it on (it overflows and is clipped)
|
|
106
|
+
// so the next region still advances - and surface it per the overflow policy.
|
|
107
|
+
reportOverflow(child, childHeight, maxHeight, ctx.onOverflow ?? "ignore");
|
|
52
108
|
fitted.push(child);
|
|
53
|
-
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
54
111
|
remainder.push(child);
|
|
112
|
+
}
|
|
55
113
|
}
|
|
56
|
-
|
|
57
|
-
remainder.push(children[j]);
|
|
58
|
-
break;
|
|
114
|
+
return spill(i + 1, childBroke);
|
|
59
115
|
}
|
|
60
|
-
return { fitted, remainder };
|
|
116
|
+
return { fitted, remainder, forceBreak: false };
|
|
61
117
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolved and unresolved edge insets, on the LAYOUT side of the seam.
|
|
3
|
+
*
|
|
4
|
+
* The public `Insets` input (points, percentages, four shapes) lives in `api/insets.ts` and normalizes
|
|
5
|
+
* into the specs below - the same split `dimension.ts` and `box-constraints.ts` already use for sizes,
|
|
6
|
+
* so an element never sees a percentage string and the api layer never sees layout geometry.
|
|
7
|
+
*/
|
|
8
|
+
/** One side: an absolute point size, or a fraction of the available width. */
|
|
9
|
+
export interface EdgeSpec {
|
|
10
|
+
points?: number;
|
|
11
|
+
factor?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* `[top, right, bottom, left]`, each still unresolved.
|
|
15
|
+
*
|
|
16
|
+
* A plain number is accepted as shorthand for `{ points: n }`: the engine elements are exported for
|
|
17
|
+
* power users and used to take four numbers, so requiring `{ points: 5 }` would break them for a
|
|
18
|
+
* feature they are not using.
|
|
19
|
+
*/
|
|
20
|
+
export type EdgeSpecs = [EdgeInput, EdgeInput, EdgeInput, EdgeInput];
|
|
21
|
+
/** A side as given: points for short, or a spec when it may be a percentage. */
|
|
22
|
+
export type EdgeInput = number | EdgeSpec;
|
|
23
|
+
/**
|
|
24
|
+
* Turn the specs into points. `available` is the WIDTH the element was offered - a percentage resolves
|
|
25
|
+
* against the width on ALL FOUR sides, top and bottom included, which is the CSS rule (and Yoga's, so
|
|
26
|
+
* react-pdf agrees). An unbounded width leaves a percentage at 0, the no-op a percentage size gives.
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveEdges(specs: EdgeSpecs, available: number): [number, number, number, number];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolved and unresolved edge insets, on the LAYOUT side of the seam.
|
|
3
|
+
*
|
|
4
|
+
* The public `Insets` input (points, percentages, four shapes) lives in `api/insets.ts` and normalizes
|
|
5
|
+
* into the specs below - the same split `dimension.ts` and `box-constraints.ts` already use for sizes,
|
|
6
|
+
* so an element never sees a percentage string and the api layer never sees layout geometry.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Turn the specs into points. `available` is the WIDTH the element was offered - a percentage resolves
|
|
10
|
+
* against the width on ALL FOUR sides, top and bottom included, which is the CSS rule (and Yoga's, so
|
|
11
|
+
* react-pdf agrees). An unbounded width leaves a percentage at 0, the no-op a percentage size gives.
|
|
12
|
+
*/
|
|
13
|
+
export function resolveEdges(specs, available) {
|
|
14
|
+
const one = (e) => {
|
|
15
|
+
if (typeof e === "number")
|
|
16
|
+
return e;
|
|
17
|
+
return (e.points ?? (e.factor !== undefined && Number.isFinite(available) ? available * e.factor : 0));
|
|
18
|
+
};
|
|
19
|
+
return [one(specs[0]), one(specs[1]), one(specs[2]), one(specs[3])];
|
|
20
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Browser stand-in for platform/node-fs.ts (selected by the package.json "browser" field). The browser has
|
|
2
|
+
// no file paths, so loading from one throws a clear, actionable error - pass bytes instead.
|
|
3
|
+
const hint = "needs Node. In the browser pass bytes (Uint8Array / ArrayBuffer) instead - e.g. import the file as a URL and fetch() it, or register a font from its bytes.";
|
|
4
|
+
export function readFileBytes(_path) {
|
|
5
|
+
throw new Error(`Loading a font from a file path ${hint}`);
|
|
6
|
+
}
|
|
7
|
+
export function readFileBytesAsync(_path) {
|
|
8
|
+
throw new Error(`Loading an image from a file path ${hint}`);
|
|
9
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// PNG decode in the browser: the platform's own image decoder, via an OffscreenCanvas, to raw RGBA. No
|
|
2
|
+
// jimp, no Buffer - keeps the browser bundle lean and works wherever Canvas does. The package `browser`
|
|
3
|
+
// field swaps `node-image.ts` for this module at bundle time.
|
|
4
|
+
export async function pngToRgba(bytes) {
|
|
5
|
+
const bitmap = await createImageBitmap(new Blob([new Uint8Array(bytes)], { type: "image/png" }));
|
|
6
|
+
const { width, height } = bitmap;
|
|
7
|
+
const ctx = new OffscreenCanvas(width, height).getContext("2d");
|
|
8
|
+
if (!ctx)
|
|
9
|
+
throw new Error("@jasy/pdf: no 2D canvas context available to decode the PNG.");
|
|
10
|
+
ctx.drawImage(bitmap, 0, 0);
|
|
11
|
+
bitmap.close();
|
|
12
|
+
return { width, height, rgba: new Uint8Array(ctx.getImageData(0, 0, width, height).data.buffer) };
|
|
13
|
+
}
|
|
@@ -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,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
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { PDFObjectManager } from "../utils/pdf-object-manager.js";
|
|
2
|
+
import { AnchorElement } from "../elements/layout/anchor-element.js";
|
|
3
|
+
import { IRNode } from "../ir/display-list.js";
|
|
4
|
+
export declare class AnchorRenderer {
|
|
5
|
+
static render(element: AnchorElement, objectManager: PDFObjectManager): Promise<IRNode[]>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { RendererRegistry } from "../utils/renderer-registry.js";
|
|
2
|
+
export class AnchorRenderer {
|
|
3
|
+
static async render(element, objectManager) {
|
|
4
|
+
const { name, child, y } = element.getProps();
|
|
5
|
+
const renderer = RendererRegistry.getRenderer(child);
|
|
6
|
+
const childNodes = await renderer(child, objectManager);
|
|
7
|
+
// The child draws normally; an Anchor IR node carries the name + scroll target for the page renderer
|
|
8
|
+
// to register as a named destination (it produces no content-stream ops itself).
|
|
9
|
+
return [...childNodes, { type: "anchor", y, name }];
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { PDFObjectManager } from "../utils/pdf-object-manager.js";
|
|
2
|
+
import { BookmarkElement } from "../elements/layout/bookmark-element.js";
|
|
3
|
+
import { IRNode } from "../ir/display-list.js";
|
|
4
|
+
export declare class BookmarkRenderer {
|
|
5
|
+
static render(element: BookmarkElement, objectManager: PDFObjectManager): Promise<IRNode[]>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { RendererRegistry } from "../utils/renderer-registry.js";
|
|
2
|
+
export class BookmarkRenderer {
|
|
3
|
+
static async render(element, objectManager) {
|
|
4
|
+
const { title, level, child, y } = element.getProps();
|
|
5
|
+
const renderer = RendererRegistry.getRenderer(child);
|
|
6
|
+
const childNodes = await renderer(child, objectManager);
|
|
7
|
+
// The child draws normally; an Outline IR node carries the title + nesting + scroll target for the
|
|
8
|
+
// page renderer to collect into the /Outlines tree (it produces no content-stream ops itself).
|
|
9
|
+
return [...childNodes, { type: "outline", y, title, level }];
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -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,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
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
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return nodes;
|
|
27
|
-
});
|
|
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
|
+
nodes.push(...(await renderer(child, objectManager)));
|
|
10
|
+
}
|
|
11
|
+
return nodes;
|
|
28
12
|
}
|
|
29
13
|
}
|
|
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(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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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(composed, objectManager);
|
|
23
9
|
}
|
|
24
10
|
}
|
|
25
|
-
exports.DeferredRenderer = DeferredRenderer;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Image } from "../ir/display-list.js";
|
|
2
|
+
export declare function emojiImageUrl(codePoint: number, source: {
|
|
3
|
+
url: string;
|
|
4
|
+
format: string;
|
|
5
|
+
}): string;
|
|
6
|
+
export declare function emojiImageNode(codePoint: number, source: {
|
|
7
|
+
url: string;
|
|
8
|
+
format: string;
|
|
9
|
+
}, x: number, baselineY: number, em: number): Promise<Image | null>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { CustomBytesImage } from "../elements/image-element.js";
|
|
2
|
+
import { decodePngToRgbFlate } from "../utils/image-helper.js";
|
|
3
|
+
import { bytesFromLatin1 } from "../utils/bytes.js";
|
|
4
|
+
// Per-URL fetch cache (process-wide): an emoji image is fetched once, however many times it appears.
|
|
5
|
+
const cache = new Map();
|
|
6
|
+
const FETCH_TIMEOUT_MS = 5000; // a slow CDN must not stall the whole render
|
|
7
|
+
async function fetchBytes(url) {
|
|
8
|
+
const cached = cache.get(url);
|
|
9
|
+
if (cached)
|
|
10
|
+
return cached;
|
|
11
|
+
const pending = (async () => {
|
|
12
|
+
const controller = new AbortController();
|
|
13
|
+
const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
14
|
+
try {
|
|
15
|
+
const r = await fetch(url, { signal: controller.signal });
|
|
16
|
+
return r.ok ? new Uint8Array(await r.arrayBuffer()) : null;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return null; // offline / 404 / timeout -> null; the caller leaves a blank gap (graceful)
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
clearTimeout(timer);
|
|
23
|
+
}
|
|
24
|
+
})();
|
|
25
|
+
cache.set(url, pending);
|
|
26
|
+
// Cache only SUCCESSFUL results: drop a failure so a transient error (offline) can be retried later.
|
|
27
|
+
void pending.then((bytes) => {
|
|
28
|
+
if (!bytes && cache.get(url) === pending)
|
|
29
|
+
cache.delete(url);
|
|
30
|
+
});
|
|
31
|
+
return pending;
|
|
32
|
+
}
|
|
33
|
+
// Twemoji-style URL: base + lowercase hex code point + "." + format (e.g. ".../1f600.png"). Single
|
|
34
|
+
// code points only - multi-code-point sequences (flags, ZWJ) are out of scope for now.
|
|
35
|
+
export function emojiImageUrl(codePoint, source) {
|
|
36
|
+
return `${source.url}${codePoint.toString(16)}.${source.format}`;
|
|
37
|
+
}
|
|
38
|
+
// Builds an `Image` IR node for an emoji drawn as a 1em square seated on the baseline (mostly above
|
|
39
|
+
// it, a little below - like a text glyph), or null when the fetch/decode fails.
|
|
40
|
+
export async function emojiImageNode(codePoint, source, x, baselineY, em) {
|
|
41
|
+
const bytes = await fetchBytes(emojiImageUrl(codePoint, source));
|
|
42
|
+
if (!bytes)
|
|
43
|
+
return null;
|
|
44
|
+
const img = new CustomBytesImage(bytes);
|
|
45
|
+
const imageType = await img.getImageType();
|
|
46
|
+
const fileData = await img.getFileData();
|
|
47
|
+
const dims = await img.getImageDimensions();
|
|
48
|
+
// JPEG embeds raw; PNG is decoded to DeviceRGB + an /SMask alpha channel (transparency).
|
|
49
|
+
let data = fileData;
|
|
50
|
+
let smask;
|
|
51
|
+
if (imageType === "FlateDecode") {
|
|
52
|
+
const decoded = await decodePngToRgbFlate(bytesFromLatin1(fileData));
|
|
53
|
+
data = decoded.data;
|
|
54
|
+
smask = decoded.smask;
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
type: "image",
|
|
58
|
+
x,
|
|
59
|
+
y: baselineY - em * 0.82,
|
|
60
|
+
width: em,
|
|
61
|
+
height: em,
|
|
62
|
+
intrinsicWidth: dims.width,
|
|
63
|
+
intrinsicHeight: dims.height,
|
|
64
|
+
data,
|
|
65
|
+
imageType,
|
|
66
|
+
...(smask ? { smask } : {}),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
@@ -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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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(child, objectManager);
|
|
21
7
|
}
|
|
22
8
|
}
|
|
23
|
-
exports.ExpandedRenderer = ExpandedRenderer;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PDFObjectManager } from "../utils/pdf-object-manager.js";
|
|
2
|
+
import { TextFieldElement } from "../elements/forms/text-field-element.js";
|
|
3
|
+
import { CheckboxElement } from "../elements/forms/checkbox-element.js";
|
|
4
|
+
import { RadioElement } from "../elements/forms/radio-element.js";
|
|
5
|
+
import { ChoiceElement } from "../elements/forms/choice-element.js";
|
|
6
|
+
import { PushButtonElement } from "../elements/forms/push-button-element.js";
|
|
7
|
+
import { SignatureFieldElement } from "../elements/forms/signature-element.js";
|
|
8
|
+
import { IRNode } from "../ir/display-list.js";
|
|
9
|
+
/** Any form-field element exposes its box + shared spec + style through `getProps()`. */
|
|
10
|
+
type FormFieldElement = TextFieldElement | CheckboxElement | RadioElement | ChoiceElement | PushButtonElement | SignatureFieldElement;
|
|
11
|
+
/**
|
|
12
|
+
* Renders a form-field element to a single `formfield` IR node - the field's box + its shared
|
|
13
|
+
* `FormFieldSpec` + style. It draws nothing; the PageRenderer peels it into a Widget /Annot and the
|
|
14
|
+
* /AcroForm (via forms/acroform.ts). One renderer serves every field element (the spec's `kind`
|
|
15
|
+
* discriminates downstream).
|
|
16
|
+
*/
|
|
17
|
+
export declare class FormFieldRenderer {
|
|
18
|
+
static render(element: FormFieldElement, _objectManager: PDFObjectManager): Promise<IRNode[]>;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renders a form-field element to a single `formfield` IR node - the field's box + its shared
|
|
3
|
+
* `FormFieldSpec` + style. It draws nothing; the PageRenderer peels it into a Widget /Annot and the
|
|
4
|
+
* /AcroForm (via forms/acroform.ts). One renderer serves every field element (the spec's `kind`
|
|
5
|
+
* discriminates downstream).
|
|
6
|
+
*/
|
|
7
|
+
export class FormFieldRenderer {
|
|
8
|
+
static async render(element, _objectManager) {
|
|
9
|
+
const { x, y, width, height, spec, style } = element.getProps();
|
|
10
|
+
return [{ type: "formfield", x, y, width, height, field: spec, style }];
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -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
|
-
static render(imageElement: ImageElement,
|
|
5
|
+
static render(imageElement: ImageElement, objectManager: PDFObjectManager): Promise<IRNode[]>;
|
|
6
6
|
}
|