@jasy/pdf 1.0.0-alpha.8 → 1.0.0-beta.1
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/README.md +29 -10
- package/dist/api/color.js +69 -0
- package/dist/api/content.d.ts +45 -5
- package/dist/api/content.js +96 -7
- package/dist/api/descriptor.js +6 -1
- package/dist/api/dimension.d.ts +57 -0
- package/dist/api/dimension.js +27 -0
- package/dist/api/font-url.d.ts +28 -0
- package/dist/api/font-url.js +135 -0
- package/dist/api/gradient.d.ts +53 -0
- package/dist/api/gradient.js +97 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/insets.d.ts +19 -12
- package/dist/api/insets.js +18 -7
- package/dist/api/layout.d.ts +20 -6
- package/dist/api/layout.js +31 -6
- package/dist/api/page-builder.d.ts +8 -0
- package/dist/api/page-builder.js +12 -0
- package/dist/api/structure.d.ts +12 -0
- package/dist/api/structure.js +54 -7
- package/dist/api/text.d.ts +65 -8
- package/dist/api/text.js +38 -5
- package/dist/canvas/painter.d.ts +102 -0
- package/dist/canvas/painter.js +183 -0
- package/dist/edit/document.d.ts +14 -4
- package/dist/edit/document.js +15 -22
- package/dist/edit/fill.d.ts +19 -2
- package/dist/edit/fill.js +63 -34
- package/dist/edit/flatten.d.ts +13 -1
- package/dist/edit/flatten.js +38 -13
- package/dist/edit/index.d.ts +2 -0
- package/dist/edit/index.js +3 -1
- package/dist/edit/objects.d.ts +5 -0
- package/dist/edit/objects.js +27 -0
- package/dist/edit/writer.d.ts +7 -0
- package/dist/edit/writer.js +23 -1
- package/dist/elements/canvas-element.d.ts +38 -0
- package/dist/elements/canvas-element.js +47 -0
- package/dist/elements/container-element.d.ts +23 -1
- package/dist/elements/container-element.js +31 -10
- package/dist/elements/image-element.d.ts +18 -4
- package/dist/elements/image-element.js +27 -12
- package/dist/elements/index.d.ts +2 -0
- package/dist/elements/index.js +2 -0
- package/dist/elements/layout/expanded-element.d.ts +5 -1
- package/dist/elements/layout/expanded-element.js +16 -3
- package/dist/elements/layout/keep-together-element.d.ts +2 -0
- package/dist/elements/layout/keep-together-element.js +4 -0
- package/dist/elements/layout/padding-element.d.ts +9 -2
- package/dist/elements/layout/padding-element.js +12 -2
- package/dist/elements/layout/page-builder-element.js +2 -0
- package/dist/elements/layout/struct-group.d.ts +2 -0
- package/dist/elements/layout/struct-group.js +4 -0
- package/dist/elements/pdf-element.d.ts +75 -1
- package/dist/elements/pdf-element.js +80 -1
- package/dist/elements/rectangle-element.d.ts +22 -6
- package/dist/elements/rectangle-element.js +31 -12
- package/dist/elements/row-element.d.ts +26 -1
- package/dist/elements/row-element.js +31 -10
- package/dist/elements/svg-element.d.ts +41 -0
- package/dist/elements/svg-element.js +93 -0
- package/dist/elements/text-element.d.ts +92 -1
- package/dist/elements/text-element.js +208 -33
- package/dist/ir/display-list.d.ts +67 -11
- package/dist/ir/display-list.js +8 -1
- package/dist/layout/alignment.d.ts +10 -0
- package/dist/layout/alignment.js +6 -0
- package/dist/layout/box-constraints.d.ts +53 -0
- package/dist/layout/box-constraints.js +72 -0
- package/dist/layout/insets.d.ts +28 -0
- package/dist/layout/insets.js +20 -0
- package/dist/layout/min-intrinsic.d.ts +29 -0
- package/dist/layout/min-intrinsic.js +37 -0
- package/dist/renderer/anchor-renderer.js +1 -1
- package/dist/renderer/bookmark-renderer.js +1 -1
- package/dist/renderer/canvas-renderer.d.ts +14 -0
- package/dist/renderer/canvas-renderer.js +36 -0
- package/dist/renderer/container-renderer.js +1 -3
- package/dist/renderer/default-text-style-renderer.js +1 -1
- package/dist/renderer/deferred-renderer.js +1 -1
- package/dist/renderer/expanded-renderer.js +1 -1
- package/dist/renderer/image-renderer.js +2 -1
- package/dist/renderer/index.d.ts +2 -0
- package/dist/renderer/index.js +2 -0
- package/dist/renderer/keep-together-renderer.js +1 -1
- package/dist/renderer/link-renderer.js +1 -1
- package/dist/renderer/padding-renderer.js +1 -1
- package/dist/renderer/page-builder-renderer.js +1 -1
- package/dist/renderer/page-renderer.js +1 -3
- package/dist/renderer/pdf-backend.d.ts +21 -4
- package/dist/renderer/pdf-backend.js +198 -61
- package/dist/renderer/pdf-document-renderer.js +8 -1
- package/dist/renderer/pdf-renderer.js +5 -1
- package/dist/renderer/positioned-renderer.js +1 -1
- package/dist/renderer/rectangle-renderer.js +9 -5
- package/dist/renderer/repeating-header-renderer.js +1 -2
- package/dist/renderer/rotated-renderer.js +1 -1
- package/dist/renderer/row-renderer.js +1 -3
- package/dist/renderer/struct-group-renderer.js +1 -1
- package/dist/renderer/svg-renderer.d.ts +11 -0
- package/dist/renderer/svg-renderer.js +27 -0
- package/dist/renderer/text-renderer.d.ts +2 -2
- package/dist/renderer/text-renderer.js +176 -57
- package/dist/svg/css.d.ts +38 -0
- package/dist/svg/css.js +115 -0
- package/dist/svg/errors.d.ts +24 -0
- package/dist/svg/errors.js +30 -0
- package/dist/svg/gradients.d.ts +34 -0
- package/dist/svg/gradients.js +156 -0
- package/dist/svg/index.d.ts +22 -0
- package/dist/svg/index.js +331 -0
- package/dist/svg/shapes.d.ts +6 -0
- package/dist/svg/shapes.js +177 -0
- package/dist/svg/style.d.ts +61 -0
- package/dist/svg/style.js +144 -0
- package/dist/svg/transform.d.ts +13 -0
- package/dist/svg/transform.js +68 -0
- package/dist/svg/units.d.ts +11 -0
- package/dist/svg/units.js +73 -0
- package/dist/svg/xml.d.ts +24 -0
- package/dist/svg/xml.js +158 -0
- package/dist/text/advance.d.ts +3 -0
- package/dist/text/advance.js +8 -4
- 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/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 +43 -1
- package/dist/text/line-breaker.js +181 -45
- 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 +91 -0
- package/dist/text/text-style.d.ts +38 -0
- package/dist/text/text-style.js +50 -1
- package/dist/text/whitespace.d.ts +4 -0
- package/dist/text/whitespace.js +43 -0
- package/dist/text/word-splitting.d.ts +42 -0
- package/dist/text/word-splitting.js +72 -0
- package/dist/utils/flex-layout.d.ts +24 -4
- package/dist/utils/flex-layout.js +218 -7
- package/dist/utils/font-metrics.d.ts +13 -2
- package/dist/utils/gsub.d.ts +36 -0
- package/dist/utils/gsub.js +178 -0
- package/dist/utils/inflate.d.ts +16 -0
- package/dist/utils/inflate.js +52 -0
- package/dist/utils/pdf-object-manager.d.ts +44 -3
- package/dist/utils/pdf-object-manager.js +176 -14
- package/dist/utils/renderer-registry.d.ts +13 -1
- package/dist/utils/renderer-registry.js +22 -1
- package/dist/utils/ttf-parser.d.ts +6 -0
- package/dist/utils/ttf-parser.js +19 -0
- package/dist/utils/utf8-to-windows1252-encoder.d.ts +6 -0
- package/dist/utils/utf8-to-windows1252-encoder.js +10 -0
- package/dist/utils/woff.d.ts +10 -0
- package/dist/utils/woff.js +116 -0
- package/dist/utils/woff2.d.ts +6 -0
- package/dist/utils/woff2.js +651 -0
- package/dist/validators/element-validator.js +9 -2
- package/dist/vector/path.d.ts +33 -0
- package/dist/vector/path.js +81 -0
- package/package.json +6 -2
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { PathCommand } from "../ir/display-list.js";
|
|
2
|
+
/**
|
|
3
|
+
* Geometry helpers shared by everything that produces a `Path` IR node - today a colour glyph's
|
|
4
|
+
* outline, next an SVG shape.
|
|
5
|
+
*
|
|
6
|
+
* PDF has no quadratic curve operator: `c` (cubic), `v` and `y` are all there is. TrueType outlines
|
|
7
|
+
* are quadratic and so is SVG's `Q`/`T`, so both have to raise the degree, and there is exactly one
|
|
8
|
+
* correct way to do it - hence one function rather than two copies that drift.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Raises a quadratic Bézier to the cubic PDF wants. A quadratic with control point `C` between `P0`
|
|
12
|
+
* and `P1` is the cubic with controls `P0 + 2/3(C - P0)` and `P1 + 2/3(C - P1)` - an exact identity,
|
|
13
|
+
* not an approximation, so nothing is lost.
|
|
14
|
+
*/
|
|
15
|
+
export declare function quadToCubic(x0: number, y0: number, cx: number, cy: number, x: number, y: number): PathCommand;
|
|
16
|
+
/**
|
|
17
|
+
* Applies an affine to every point of a command list, BAKING the transform into the coordinates.
|
|
18
|
+
*
|
|
19
|
+
* Normally a transform belongs in the graphics state, so a stroke scales with the drawing. A clip has
|
|
20
|
+
* no stroke and is set from a path in the CURRENT space, so a `<clipPath>` whose children carry their
|
|
21
|
+
* own `transform` has to have it folded in here instead.
|
|
22
|
+
*/
|
|
23
|
+
export declare function transformCommands(commands: readonly PathCommand[], [a, b, c, d, e, f]: readonly [number, number, number, number, number, number]): PathCommand[];
|
|
24
|
+
/**
|
|
25
|
+
* The bounding box of a command list. Control points are included, which overstates a curve slightly -
|
|
26
|
+
* the approximation every renderer makes for `objectBoundingBox` units and for a canvas gradient.
|
|
27
|
+
*/
|
|
28
|
+
export declare function boundsOf(commands: readonly PathCommand[]): {
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
width: number;
|
|
32
|
+
height: number;
|
|
33
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geometry helpers shared by everything that produces a `Path` IR node - today a colour glyph's
|
|
3
|
+
* outline, next an SVG shape.
|
|
4
|
+
*
|
|
5
|
+
* PDF has no quadratic curve operator: `c` (cubic), `v` and `y` are all there is. TrueType outlines
|
|
6
|
+
* are quadratic and so is SVG's `Q`/`T`, so both have to raise the degree, and there is exactly one
|
|
7
|
+
* correct way to do it - hence one function rather than two copies that drift.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Raises a quadratic Bézier to the cubic PDF wants. A quadratic with control point `C` between `P0`
|
|
11
|
+
* and `P1` is the cubic with controls `P0 + 2/3(C - P0)` and `P1 + 2/3(C - P1)` - an exact identity,
|
|
12
|
+
* not an approximation, so nothing is lost.
|
|
13
|
+
*/
|
|
14
|
+
export function quadToCubic(x0, y0, cx, cy, x, y) {
|
|
15
|
+
return {
|
|
16
|
+
op: "c",
|
|
17
|
+
x1: x0 + (2 / 3) * (cx - x0),
|
|
18
|
+
y1: y0 + (2 / 3) * (cy - y0),
|
|
19
|
+
x2: x + (2 / 3) * (cx - x),
|
|
20
|
+
y2: y + (2 / 3) * (cy - y),
|
|
21
|
+
x,
|
|
22
|
+
y,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Applies an affine to every point of a command list, BAKING the transform into the coordinates.
|
|
27
|
+
*
|
|
28
|
+
* Normally a transform belongs in the graphics state, so a stroke scales with the drawing. A clip has
|
|
29
|
+
* no stroke and is set from a path in the CURRENT space, so a `<clipPath>` whose children carry their
|
|
30
|
+
* own `transform` has to have it folded in here instead.
|
|
31
|
+
*/
|
|
32
|
+
export function transformCommands(commands, [a, b, c, d, e, f]) {
|
|
33
|
+
const mx = (x, y) => a * x + c * y + e;
|
|
34
|
+
const my = (x, y) => b * x + d * y + f;
|
|
35
|
+
return commands.map((cmd) => {
|
|
36
|
+
if (cmd.op === "z")
|
|
37
|
+
return cmd;
|
|
38
|
+
if (cmd.op === "c") {
|
|
39
|
+
return {
|
|
40
|
+
op: "c",
|
|
41
|
+
x1: mx(cmd.x1, cmd.y1),
|
|
42
|
+
y1: my(cmd.x1, cmd.y1),
|
|
43
|
+
x2: mx(cmd.x2, cmd.y2),
|
|
44
|
+
y2: my(cmd.x2, cmd.y2),
|
|
45
|
+
x: mx(cmd.x, cmd.y),
|
|
46
|
+
y: my(cmd.x, cmd.y),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return { op: cmd.op, x: mx(cmd.x, cmd.y), y: my(cmd.x, cmd.y) };
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The bounding box of a command list. Control points are included, which overstates a curve slightly -
|
|
54
|
+
* the approximation every renderer makes for `objectBoundingBox` units and for a canvas gradient.
|
|
55
|
+
*/
|
|
56
|
+
export function boundsOf(commands) {
|
|
57
|
+
let minX = Infinity;
|
|
58
|
+
let minY = Infinity;
|
|
59
|
+
let maxX = -Infinity;
|
|
60
|
+
let maxY = -Infinity;
|
|
61
|
+
for (const c of commands) {
|
|
62
|
+
const points = c.op === "c"
|
|
63
|
+
? [
|
|
64
|
+
[c.x1, c.y1],
|
|
65
|
+
[c.x2, c.y2],
|
|
66
|
+
[c.x, c.y],
|
|
67
|
+
]
|
|
68
|
+
: c.op === "z"
|
|
69
|
+
? []
|
|
70
|
+
: [[c.x, c.y]];
|
|
71
|
+
for (const [x, y] of points) {
|
|
72
|
+
minX = Math.min(minX, x);
|
|
73
|
+
maxX = Math.max(maxX, x);
|
|
74
|
+
minY = Math.min(minY, y);
|
|
75
|
+
maxY = Math.max(maxY, y);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (!Number.isFinite(minX))
|
|
79
|
+
return { x: 0, y: 0, width: 0, height: 0 };
|
|
80
|
+
return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
|
|
81
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jasy/pdf",
|
|
3
|
-
"version": "1.0.0-
|
|
3
|
+
"version": "1.0.0-beta.1",
|
|
4
4
|
"description": "Declarative, component-based PDF generation in pure TypeScript - Flutter-style components, real AFM font metrics, a hand-rolled PDF writer. No headless browser, no Java.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"declarative",
|
|
@@ -40,13 +40,17 @@
|
|
|
40
40
|
"./package.json": "./package.json"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
+
"bidi-js": "^1.0.3",
|
|
44
|
+
"brotli": "^1.3.3",
|
|
43
45
|
"fflate": "^0.8.3",
|
|
44
|
-
"jimp": "^1.6.0"
|
|
46
|
+
"jimp": "^1.6.0",
|
|
47
|
+
"svgpath": "^2.6.0"
|
|
45
48
|
},
|
|
46
49
|
"devDependencies": {
|
|
47
50
|
"@jimp/types": "^1.6.0",
|
|
48
51
|
"@types/node": "^25.9.3",
|
|
49
52
|
"@vitest/coverage-v8": "^2.1.1",
|
|
53
|
+
"hyphen": "^1.14.1",
|
|
50
54
|
"ncp": "^2.0.0",
|
|
51
55
|
"oxfmt": "^0.55.0",
|
|
52
56
|
"oxlint": "^1.70.0",
|