@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.
- package/README.md +3 -3
- 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 +8 -8
- package/dist/api/content.js +23 -24
- package/dist/api/descriptor.d.ts +2 -2
- package/dist/api/descriptor.js +75 -31
- package/dist/api/index.d.ts +8 -8
- package/dist/api/index.js +8 -24
- package/dist/api/insets.js +4 -8
- package/dist/api/layout.d.ts +27 -12
- package/dist/api/layout.js +46 -45
- package/dist/api/structure.d.ts +60 -13
- package/dist/api/structure.js +132 -88
- package/dist/api/table.d.ts +5 -5
- package/dist/api/table.js +28 -24
- package/dist/api/text.d.ts +27 -2
- package/dist/api/text.js +45 -27
- package/dist/assets/font-data.d.ts +2 -0
- package/dist/assets/font-data.js +6 -0
- package/dist/assets/font-data.ts +7 -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/elements/container-element.d.ts +4 -4
- package/dist/elements/container-element.js +9 -13
- package/dist/elements/image-element.d.ts +18 -2
- package/dist/elements/image-element.js +81 -105
- package/dist/elements/index.d.ts +12 -10
- package/dist/elements/index.js +12 -28
- 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 +3 -3
- package/dist/elements/layout/expanded-element.js +10 -14
- package/dist/elements/layout/padding-element.d.ts +3 -3
- package/dist/elements/layout/padding-element.js +9 -14
- package/dist/elements/layout/positioned-element.d.ts +44 -0
- package/dist/elements/layout/positioned-element.js +61 -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/sized-container-element.d.ts +2 -2
- package/dist/elements/layout/sized-container-element.js +6 -11
- package/dist/elements/line-element.d.ts +3 -3
- package/dist/elements/line-element.js +5 -10
- package/dist/elements/page-element.d.ts +8 -6
- package/dist/elements/page-element.js +31 -23
- 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 +28 -3
- package/dist/elements/pdf-element.js +10 -19
- package/dist/elements/rectangle-element.d.ts +14 -6
- package/dist/elements/rectangle-element.js +44 -21
- package/dist/elements/row-element.d.ts +3 -3
- package/dist/elements/row-element.js +7 -11
- package/dist/elements/text-element.d.ts +37 -11
- package/dist/elements/text-element.js +64 -39
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -19
- package/dist/ir/display-list.d.ts +22 -3
- package/dist/ir/display-list.js +1 -2
- package/dist/layout/box-constraints.js +2 -6
- package/dist/layout/fragmentation.d.ts +8 -1
- package/dist/layout/fragmentation.js +22 -10
- 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/container-renderer.d.ts +3 -3
- package/dist/renderer/container-renderer.js +12 -27
- 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/expanded-renderer.d.ts +3 -3
- package/dist/renderer/expanded-renderer.js +6 -21
- package/dist/renderer/image-renderer.d.ts +3 -3
- package/dist/renderer/image-renderer.js +77 -75
- package/dist/renderer/index.d.ts +10 -10
- package/dist/renderer/index.js +10 -26
- package/dist/renderer/line-renderer.d.ts +3 -3
- package/dist/renderer/line-renderer.js +13 -28
- package/dist/renderer/padding-renderer.d.ts +3 -3
- package/dist/renderer/padding-renderer.js +6 -21
- package/dist/renderer/page-renderer.d.ts +2 -2
- package/dist/renderer/page-renderer.js +61 -77
- package/dist/renderer/pdf-backend.d.ts +2 -2
- package/dist/renderer/pdf-backend.js +34 -17
- 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 +24 -41
- package/dist/renderer/pdf-document-renderer.d.ts +3 -3
- package/dist/renderer/pdf-document-renderer.js +71 -85
- package/dist/renderer/pdf-renderer.d.ts +2 -2
- package/dist/renderer/pdf-renderer.js +83 -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 +45 -44
- package/dist/renderer/repeating-header-renderer.d.ts +3 -3
- package/dist/renderer/repeating-header-renderer.js +11 -26
- package/dist/renderer/row-renderer.d.ts +3 -3
- package/dist/renderer/row-renderer.js +12 -27
- package/dist/renderer/text-renderer.d.ts +6 -5
- package/dist/renderer/text-renderer.js +33 -42
- package/dist/text/line-breaker.d.ts +8 -5
- package/dist/text/line-breaker.js +67 -16
- package/dist/text/text-style.d.ts +25 -0
- package/dist/text/text-style.js +29 -0
- package/dist/utils/afm-parser.js +3 -13
- package/dist/utils/bytes.d.ts +24 -0
- package/dist/utils/bytes.js +76 -0
- package/dist/utils/flex-layout.d.ts +2 -2
- package/dist/utils/flex-layout.js +15 -20
- package/dist/utils/font-metrics.d.ts +1 -1
- package/dist/utils/font-metrics.js +1 -2
- package/dist/utils/font-path.js +3 -6
- package/dist/utils/image-helper.d.ts +6 -5
- package/dist/utils/image-helper.js +101 -111
- package/dist/utils/md5.d.ts +4 -0
- package/dist/utils/md5.js +80 -0
- package/dist/utils/pdf-object-manager.d.ts +10 -6
- package/dist/utils/pdf-object-manager.js +89 -94
- package/dist/utils/renderer-registry.js +1 -5
- package/dist/utils/ttf-parser.d.ts +2 -2
- package/dist/utils/ttf-parser.js +32 -36
- package/dist/utils/ttf-subsetter.d.ts +1 -1
- package/dist/utils/ttf-subsetter.js +40 -42
- package/dist/utils/utf8-to-windows1252-encoder.js +1 -4
- package/dist/validators/element-validator.d.ts +2 -2
- package/dist/validators/element-validator.js +17 -23
- package/package.json +14 -2
package/dist/common/color.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Color = void 0;
|
|
4
|
-
class Color {
|
|
1
|
+
export class Color {
|
|
5
2
|
constructor(r, g, b, alpha = 1) {
|
|
6
3
|
this.r = this.clampColorValue(r, "r");
|
|
7
4
|
this.g = this.clampColorValue(g, "g");
|
|
@@ -59,4 +56,3 @@ class Color {
|
|
|
59
56
|
return `${(r / 255).toFixed(3)} ${(g / 255).toFixed(3)} ${(b / 255).toFixed(3)}`;
|
|
60
57
|
}
|
|
61
58
|
}
|
|
62
|
-
exports.Color = Color;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.pageFormats = exports.PageSize = void 0;
|
|
4
1
|
// Definition of all possible page sizes
|
|
5
|
-
var PageSize;
|
|
2
|
+
export var PageSize;
|
|
6
3
|
(function (PageSize) {
|
|
7
4
|
PageSize["A0"] = "a0";
|
|
8
5
|
PageSize["A1"] = "a1";
|
|
@@ -45,9 +42,9 @@ var PageSize;
|
|
|
45
42
|
PageSize["LEDGER"] = "ledger";
|
|
46
43
|
PageSize["TABLOID"] = "tabloid";
|
|
47
44
|
PageSize["CREDIT_CARD"] = "credit-card";
|
|
48
|
-
})(PageSize || (
|
|
45
|
+
})(PageSize || (PageSize = {}));
|
|
49
46
|
// Definition of page formats
|
|
50
|
-
|
|
47
|
+
export const pageFormats = {
|
|
51
48
|
[PageSize.A0]: [2383.94, 3370.39],
|
|
52
49
|
[PageSize.A1]: [1683.78, 2383.94],
|
|
53
50
|
[PageSize.A2]: [1190.55, 1683.78],
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PDF_PARTS = void 0;
|
|
4
|
-
exports.PDF_PARTS = {
|
|
1
|
+
export const PDF_PARTS = {
|
|
5
2
|
HEADER: "%PDF-1.3",
|
|
6
3
|
TRAILER: (size) => `trailer\n<< /Size ${size} >>\nstartxref\n%%EOF`,
|
|
7
4
|
XREF: "xref", // Placeholder for xref elements
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { MainAlign, CrossAlign } from "../utils/flex-layout";
|
|
2
|
-
import { BoxConstraints, Offset, Size } from "../layout/box-constraints";
|
|
3
|
-
import { Fragmentable, FragmentResult } from "../layout/fragmentation";
|
|
4
|
-
import { LayoutContext, SizedElement, SizedPDFElement, WithChildren } from "./pdf-element";
|
|
1
|
+
import { MainAlign, CrossAlign } from "../utils/flex-layout.js";
|
|
2
|
+
import { BoxConstraints, Offset, Size } from "../layout/box-constraints.js";
|
|
3
|
+
import { Fragmentable, FragmentResult } from "../layout/fragmentation.js";
|
|
4
|
+
import { LayoutContext, SizedElement, SizedPDFElement, WithChildren } from "./pdf-element.js";
|
|
5
5
|
interface ContainerElementParams extends SizedElement, WithChildren {
|
|
6
6
|
/** Space between children. */
|
|
7
7
|
gap?: number;
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const fragmentation_1 = require("../layout/fragmentation");
|
|
6
|
-
const pdf_element_1 = require("./pdf-element");
|
|
7
|
-
class ContainerElement extends pdf_element_1.SizedPDFElement {
|
|
1
|
+
import { FlexLayoutHelper, VERTICAL_AXIS } from "../utils/flex-layout.js";
|
|
2
|
+
import { packChildren } from "../layout/fragmentation.js";
|
|
3
|
+
import { SizedPDFElement, } from "./pdf-element.js";
|
|
4
|
+
export class ContainerElement extends SizedPDFElement {
|
|
8
5
|
constructor({ x, y, width, height, children, gap, main, cross }) {
|
|
9
6
|
super({ x, y, width, height });
|
|
10
7
|
this.children = children;
|
|
11
|
-
this.gap = gap
|
|
12
|
-
this.main = main
|
|
13
|
-
this.cross = cross
|
|
8
|
+
this.gap = gap ?? 0;
|
|
9
|
+
this.main = main ?? "start";
|
|
10
|
+
this.cross = cross ?? "stretch";
|
|
14
11
|
}
|
|
15
12
|
/**
|
|
16
13
|
* Splits the vertical stack across pages. Children are measured against the content
|
|
@@ -24,7 +21,7 @@ class ContainerElement extends pdf_element_1.SizedPDFElement {
|
|
|
24
21
|
* in that case we don't fragment and hand the whole container back as `fitted`.
|
|
25
22
|
*/
|
|
26
23
|
fragment(maxHeight, width, ctx) {
|
|
27
|
-
const { fitted, remainder } =
|
|
24
|
+
const { fitted, remainder } = packChildren(this.children, maxHeight, width, ctx, this.gap);
|
|
28
25
|
// Fits as one region: hand the whole container back so the page renders unchanged
|
|
29
26
|
// (its normal layout distributes flex / fills the page).
|
|
30
27
|
if (remainder.length === 0)
|
|
@@ -64,7 +61,7 @@ class ContainerElement extends pdf_element_1.SizedPDFElement {
|
|
|
64
61
|
// Vertical flex stack (main = height, cross = width). The shared helper measures
|
|
65
62
|
// fixed children, distributes the leftover to flex children, and places everything
|
|
66
63
|
// in source order.
|
|
67
|
-
result =
|
|
64
|
+
result = FlexLayoutHelper.layout(this.children, VERTICAL_AXIS, mainAvail, crossAvail, this.y, this.x, { gap: this.gap, main: this.main, cross: this.cross }, ctx);
|
|
68
65
|
}
|
|
69
66
|
// Bounded: fill the offered extent. Unbounded: shrink to the children (height = the
|
|
70
67
|
// stack, width = the widest child). Top-left coordinates; the container draws nothing,
|
|
@@ -88,4 +85,3 @@ class ContainerElement extends pdf_element_1.SizedPDFElement {
|
|
|
88
85
|
};
|
|
89
86
|
}
|
|
90
87
|
}
|
|
91
|
-
exports.ContainerElement = ContainerElement;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BoxConstraints, Offset, Size } from "../layout/box-constraints";
|
|
2
|
-
import { LayoutContext, SizedPDFElement } from "./pdf-element";
|
|
1
|
+
import { BoxConstraints, Offset, Size } from "../layout/box-constraints.js";
|
|
2
|
+
import { LayoutContext, SizedPDFElement } from "./pdf-element.js";
|
|
3
3
|
export declare enum BoxFit {
|
|
4
4
|
none = "NONE",
|
|
5
5
|
contain = "CONTAIN",
|
|
@@ -29,6 +29,22 @@ export declare class CustomLocalImage extends CustomImage {
|
|
|
29
29
|
height: number;
|
|
30
30
|
}>;
|
|
31
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* An image straight from raw bytes (a browser upload / fetch, no filesystem). The PDF filter is sniffed
|
|
34
|
+
* from the magic bytes: JPEG embeds raw (DCTDecode, no decode step), PNG is decoded to RGB (FlateDecode).
|
|
35
|
+
*/
|
|
36
|
+
export declare class CustomBytesImage extends CustomImage {
|
|
37
|
+
private bytes;
|
|
38
|
+
private fileRawData;
|
|
39
|
+
constructor(bytes: Uint8Array);
|
|
40
|
+
init(): Promise<void>;
|
|
41
|
+
getImageType(): Promise<string>;
|
|
42
|
+
getFileData(): string;
|
|
43
|
+
getImageDimensions(): Promise<{
|
|
44
|
+
width: number;
|
|
45
|
+
height: number;
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
32
48
|
interface ImageElementParams {
|
|
33
49
|
image: CustomImage;
|
|
34
50
|
width?: number;
|
|
@@ -1,131 +1,108 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
-
});
|
|
43
|
-
};
|
|
44
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
-
exports.ImageElement = exports.CustomLocalImage = exports.CustomImage = exports.BoxFit = void 0;
|
|
46
|
-
const image_helper_1 = require("../utils/image-helper");
|
|
47
|
-
const pdf_element_1 = require("./pdf-element");
|
|
48
|
-
var BoxFit;
|
|
1
|
+
import { getImageDimensions } from "../utils/image-helper.js";
|
|
2
|
+
import { latin1FromBytes } from "../utils/bytes.js";
|
|
3
|
+
import { readFileBytesAsync } from "../platform/node-fs.js";
|
|
4
|
+
import { SizedPDFElement } from "./pdf-element.js";
|
|
5
|
+
// path.extname without node:path (browser-safe): the substring from the last dot, if it sits after the
|
|
6
|
+
// last slash (so a dot in a directory name does not count). Enough for image file extensions.
|
|
7
|
+
function extname(p) {
|
|
8
|
+
const dot = p.lastIndexOf(".");
|
|
9
|
+
const slash = p.lastIndexOf("/");
|
|
10
|
+
return dot > slash + 1 ? p.slice(dot) : "";
|
|
11
|
+
}
|
|
12
|
+
export var BoxFit;
|
|
49
13
|
(function (BoxFit) {
|
|
50
14
|
BoxFit["none"] = "NONE";
|
|
51
15
|
BoxFit["contain"] = "CONTAIN";
|
|
52
16
|
BoxFit["cover"] = "COVER";
|
|
53
17
|
BoxFit["fill"] = "FILL";
|
|
54
|
-
})(BoxFit || (
|
|
55
|
-
class CustomImage {
|
|
18
|
+
})(BoxFit || (BoxFit = {}));
|
|
19
|
+
export class CustomImage {
|
|
56
20
|
}
|
|
57
|
-
|
|
58
|
-
class CustomLocalImage extends CustomImage {
|
|
21
|
+
export class CustomLocalImage extends CustomImage {
|
|
59
22
|
constructor(imagePath) {
|
|
60
23
|
super();
|
|
61
24
|
this.imagePath = imagePath;
|
|
62
25
|
}
|
|
63
|
-
init() {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
26
|
+
async init() {
|
|
27
|
+
try {
|
|
28
|
+
// Loading image and convert it to base64
|
|
29
|
+
await this.loadImage(this.imagePath);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error("Error loading image:", error);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async getImageType() {
|
|
36
|
+
const ext = extname(this.imagePath).toLowerCase();
|
|
37
|
+
switch (ext) {
|
|
38
|
+
case ".jpg":
|
|
39
|
+
case ".jpeg":
|
|
40
|
+
return "DCTDecode"; // For JPEG
|
|
41
|
+
case ".png":
|
|
42
|
+
return "FlateDecode"; // For PNG
|
|
43
|
+
case ".bmp":
|
|
44
|
+
throw new Error("BMP is not directly supported. Please convert to PNG or JPEG.");
|
|
45
|
+
case ".webp":
|
|
46
|
+
throw new Error("WebP is not directly supported. Please convert to PNG or JPEG.");
|
|
47
|
+
default:
|
|
48
|
+
throw new Error(`Unsupported image format: ${ext}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async loadImage(imagePath) {
|
|
52
|
+
const result = await readFileBytesAsync(imagePath);
|
|
53
|
+
//const result = await convertImageToGrayscaleBuffer(imagePath);
|
|
54
|
+
this.fileBuffer = result;
|
|
55
|
+
this.fileRawData = latin1FromBytes(result);
|
|
56
|
+
return result;
|
|
73
57
|
}
|
|
74
|
-
|
|
75
|
-
return
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
58
|
+
getFileData() {
|
|
59
|
+
return this.fileRawData;
|
|
60
|
+
}
|
|
61
|
+
async getImageDimensions() {
|
|
62
|
+
if (!this.fileBuffer) {
|
|
63
|
+
throw new Error("You must first call the `loadAndConvertImage` method");
|
|
64
|
+
}
|
|
65
|
+
// Since now (30.09.2024) we using "Jimp" - So we don't need our custom method to get the image dimension.
|
|
66
|
+
// But at the moment I let it still here...
|
|
67
|
+
const dimensions = await getImageDimensions(this.fileBuffer);
|
|
68
|
+
return dimensions;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* An image straight from raw bytes (a browser upload / fetch, no filesystem). The PDF filter is sniffed
|
|
73
|
+
* from the magic bytes: JPEG embeds raw (DCTDecode, no decode step), PNG is decoded to RGB (FlateDecode).
|
|
74
|
+
*/
|
|
75
|
+
export class CustomBytesImage extends CustomImage {
|
|
76
|
+
constructor(bytes) {
|
|
77
|
+
super();
|
|
78
|
+
this.bytes = bytes;
|
|
79
|
+
this.fileRawData = latin1FromBytes(bytes);
|
|
92
80
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
});
|
|
81
|
+
async init() { }
|
|
82
|
+
async getImageType() {
|
|
83
|
+
const b = this.bytes;
|
|
84
|
+
if (b[0] === 0xff && b[1] === 0xd8)
|
|
85
|
+
return "DCTDecode"; // JPEG
|
|
86
|
+
if (b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47)
|
|
87
|
+
return "FlateDecode"; // PNG
|
|
88
|
+
throw new Error("Unsupported image bytes (only JPEG and PNG are supported).");
|
|
102
89
|
}
|
|
103
90
|
getFileData() {
|
|
104
91
|
return this.fileRawData;
|
|
105
92
|
}
|
|
106
|
-
getImageDimensions() {
|
|
107
|
-
return
|
|
108
|
-
if (!this.fileBuffer) {
|
|
109
|
-
throw new Error("You must first call the `loadAndConvertImage` method");
|
|
110
|
-
}
|
|
111
|
-
// Since now (30.09.2024) we using "Jimp" - So we don't need our custom method to get the image dimension.
|
|
112
|
-
// But at the moment I let it still here...
|
|
113
|
-
const dimensions = yield (0, image_helper_1.getImageDimensions)(this.fileBuffer);
|
|
114
|
-
return dimensions;
|
|
115
|
-
});
|
|
93
|
+
async getImageDimensions() {
|
|
94
|
+
return getImageDimensions(this.bytes);
|
|
116
95
|
}
|
|
117
96
|
}
|
|
118
|
-
|
|
119
|
-
class ImageElement extends pdf_element_1.SizedPDFElement {
|
|
97
|
+
export class ImageElement extends SizedPDFElement {
|
|
120
98
|
constructor({ image, width, height, fit = BoxFit.none, radius }) {
|
|
121
99
|
super({ x: 0, y: 0, width });
|
|
122
100
|
this.image = image;
|
|
123
101
|
this.height = height;
|
|
124
102
|
this.fit = fit;
|
|
125
|
-
this.radius = radius
|
|
103
|
+
this.radius = radius ?? 0;
|
|
126
104
|
}
|
|
127
105
|
calculateLayout(constraints, offset, _ctx) {
|
|
128
|
-
var _a, _b;
|
|
129
106
|
this.x = offset.x;
|
|
130
107
|
this.y = offset.y;
|
|
131
108
|
// A bounded axis overrides the intrinsic/explicit size; otherwise keep our own.
|
|
@@ -134,7 +111,7 @@ class ImageElement extends pdf_element_1.SizedPDFElement {
|
|
|
134
111
|
if (constraints.hasBoundedHeight)
|
|
135
112
|
this.height = constraints.maxHeight;
|
|
136
113
|
// Top-left coordinates; the fit logic (renderer) and the Y-flip (seam) run later.
|
|
137
|
-
return { width:
|
|
114
|
+
return { width: this.width ?? 0, height: this.height ?? 0 };
|
|
138
115
|
}
|
|
139
116
|
getProps() {
|
|
140
117
|
return {
|
|
@@ -148,4 +125,3 @@ class ImageElement extends pdf_element_1.SizedPDFElement {
|
|
|
148
125
|
};
|
|
149
126
|
}
|
|
150
127
|
}
|
|
151
|
-
exports.ImageElement = ImageElement;
|
package/dist/elements/index.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
export { PDFElement } from "./pdf-element";
|
|
2
|
-
export * from "./text-element";
|
|
3
|
-
export * from "./pdf-document-element";
|
|
4
|
-
export * from "./page-element";
|
|
5
|
-
export * from "./rectangle-element";
|
|
6
|
-
export * from "./image-element";
|
|
7
|
-
export * from "./layout/expanded-element";
|
|
8
|
-
export * from "./layout/padding-element";
|
|
9
|
-
export * from "./
|
|
10
|
-
export * from "./
|
|
1
|
+
export { PDFElement } from "./pdf-element.js";
|
|
2
|
+
export * from "./text-element.js";
|
|
3
|
+
export * from "./pdf-document-element.js";
|
|
4
|
+
export * from "./page-element.js";
|
|
5
|
+
export * from "./rectangle-element.js";
|
|
6
|
+
export * from "./image-element.js";
|
|
7
|
+
export * from "./layout/expanded-element.js";
|
|
8
|
+
export * from "./layout/padding-element.js";
|
|
9
|
+
export * from "./layout/default-text-style-element.js";
|
|
10
|
+
export * from "./layout/positioned-element.js";
|
|
11
|
+
export * from "./line-element.js";
|
|
12
|
+
export * from "./row-element.js";
|
package/dist/elements/index.js
CHANGED
|
@@ -1,28 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
exports.PDFElement = void 0;
|
|
18
|
-
var pdf_element_1 = require("./pdf-element"); // the base element type - public for composing custom layouts
|
|
19
|
-
Object.defineProperty(exports, "PDFElement", { enumerable: true, get: function () { return pdf_element_1.PDFElement; } });
|
|
20
|
-
__exportStar(require("./text-element"), exports);
|
|
21
|
-
__exportStar(require("./pdf-document-element"), exports);
|
|
22
|
-
__exportStar(require("./page-element"), exports);
|
|
23
|
-
__exportStar(require("./rectangle-element"), exports);
|
|
24
|
-
__exportStar(require("./image-element"), exports);
|
|
25
|
-
__exportStar(require("./layout/expanded-element"), exports);
|
|
26
|
-
__exportStar(require("./layout/padding-element"), exports);
|
|
27
|
-
__exportStar(require("./line-element"), exports);
|
|
28
|
-
__exportStar(require("./row-element"), exports);
|
|
1
|
+
export { PDFElement } from "./pdf-element.js"; // the base element type - public for composing custom layouts
|
|
2
|
+
export * from "./text-element.js";
|
|
3
|
+
export * from "./pdf-document-element.js";
|
|
4
|
+
export * from "./page-element.js";
|
|
5
|
+
export * from "./rectangle-element.js";
|
|
6
|
+
export * from "./image-element.js";
|
|
7
|
+
export * from "./layout/expanded-element.js";
|
|
8
|
+
export * from "./layout/padding-element.js";
|
|
9
|
+
export * from "./layout/default-text-style-element.js";
|
|
10
|
+
export * from "./layout/positioned-element.js";
|
|
11
|
+
export * from "./line-element.js";
|
|
12
|
+
export * from "./row-element.js";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { PDFElement, LayoutContext, WithChild, SizedPDFElement } from "../pdf-element.js";
|
|
2
|
+
import { BoxConstraints, Offset, Size } from "../../layout/box-constraints.js";
|
|
3
|
+
import { Fragmentable, FragmentResult } from "../../layout/fragmentation.js";
|
|
4
|
+
import { ResolvedTextStyle } from "../../text/text-style.js";
|
|
5
|
+
interface DefaultTextStyleParams extends WithChild {
|
|
6
|
+
style: Partial<ResolvedTextStyle>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Provides default text properties (font/size/color/lineHeight/align/weight) to its whole subtree -
|
|
10
|
+
* Flutter's `DefaultTextStyle`. Transparent to layout: the child takes the same constraints, offset
|
|
11
|
+
* and size; only the inherited TextStyle changes. A `Text` below still wins per property, and these
|
|
12
|
+
* overrides layer onto whatever the element already inherited from above.
|
|
13
|
+
*/
|
|
14
|
+
export declare class DefaultTextStyleElement extends SizedPDFElement implements Fragmentable {
|
|
15
|
+
private child;
|
|
16
|
+
private style;
|
|
17
|
+
constructor({ child, style }: DefaultTextStyleParams);
|
|
18
|
+
private childCtx;
|
|
19
|
+
fragment(maxHeight: number, width: number, ctx: LayoutContext): FragmentResult;
|
|
20
|
+
private cloneWithChild;
|
|
21
|
+
calculateLayout(constraints: BoxConstraints, offset: Offset, ctx: LayoutContext): Size;
|
|
22
|
+
getProps(): {
|
|
23
|
+
x: number;
|
|
24
|
+
y: number;
|
|
25
|
+
width: number | undefined;
|
|
26
|
+
height: number | undefined;
|
|
27
|
+
child: PDFElement;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { SizedPDFElement } from "../pdf-element.js";
|
|
2
|
+
import { isFragmentable } from "../../layout/fragmentation.js";
|
|
3
|
+
import { DEFAULT_TEXT_STYLE, mergeTextStyle } from "../../text/text-style.js";
|
|
4
|
+
/**
|
|
5
|
+
* Provides default text properties (font/size/color/lineHeight/align/weight) to its whole subtree -
|
|
6
|
+
* Flutter's `DefaultTextStyle`. Transparent to layout: the child takes the same constraints, offset
|
|
7
|
+
* and size; only the inherited TextStyle changes. A `Text` below still wins per property, and these
|
|
8
|
+
* overrides layer onto whatever the element already inherited from above.
|
|
9
|
+
*/
|
|
10
|
+
export class DefaultTextStyleElement extends SizedPDFElement {
|
|
11
|
+
constructor({ child, style }) {
|
|
12
|
+
super({ x: 0, y: 0 });
|
|
13
|
+
this.child = child;
|
|
14
|
+
this.style = style;
|
|
15
|
+
}
|
|
16
|
+
childCtx(ctx) {
|
|
17
|
+
return {
|
|
18
|
+
...ctx,
|
|
19
|
+
textStyle: mergeTextStyle(ctx.textStyle ?? DEFAULT_TEXT_STYLE, this.style),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// Transparent to fragmentation too: split the child against the merged context, re-wrapping each
|
|
23
|
+
// half so the remainder on the next page keeps the same defaults.
|
|
24
|
+
fragment(maxHeight, width, ctx) {
|
|
25
|
+
if (!isFragmentable(this.child))
|
|
26
|
+
return { fitted: null, remainder: this };
|
|
27
|
+
const split = this.child.fragment(maxHeight, width, this.childCtx(ctx));
|
|
28
|
+
return {
|
|
29
|
+
fitted: split.fitted ? this.cloneWithChild(split.fitted) : null,
|
|
30
|
+
remainder: split.remainder ? this.cloneWithChild(split.remainder) : null,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
cloneWithChild(child) {
|
|
34
|
+
return new DefaultTextStyleElement({ child, style: this.style });
|
|
35
|
+
}
|
|
36
|
+
calculateLayout(constraints, offset, ctx) {
|
|
37
|
+
this.x = offset.x;
|
|
38
|
+
this.y = offset.y;
|
|
39
|
+
const size = this.child.calculateLayout(constraints, offset, this.childCtx(ctx));
|
|
40
|
+
this.width = size.width;
|
|
41
|
+
this.height = size.height;
|
|
42
|
+
return size;
|
|
43
|
+
}
|
|
44
|
+
getProps() {
|
|
45
|
+
return { x: this.x, y: this.y, width: this.width, height: this.height, child: this.child };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { BoxConstraints, Offset, Size } from "../../layout/box-constraints";
|
|
2
|
-
import { Fragmentable, FragmentResult } from "../../layout/fragmentation";
|
|
3
|
-
import { LayoutContext, PDFElement } from "../pdf-element";
|
|
1
|
+
import { BoxConstraints, Offset, Size } from "../../layout/box-constraints.js";
|
|
2
|
+
import { Fragmentable, FragmentResult } from "../../layout/fragmentation.js";
|
|
3
|
+
import { LayoutContext, PDFElement } from "../pdf-element.js";
|
|
4
4
|
/**
|
|
5
5
|
* Builds its subtree at layout time via `resolve(ctx)`, so the tree can depend on font
|
|
6
6
|
* metrics (e.g. a Table resolving `"auto"` column widths from cell content). The engine
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.DeferredElement = void 0;
|
|
4
|
-
const fragmentation_1 = require("../../layout/fragmentation");
|
|
5
|
-
const pdf_element_1 = require("../pdf-element");
|
|
1
|
+
import { isFragmentable } from "../../layout/fragmentation.js";
|
|
2
|
+
import { PDFElement } from "../pdf-element.js";
|
|
6
3
|
/**
|
|
7
4
|
* Builds its subtree at layout time via `resolve(ctx)`, so the tree can depend on font
|
|
8
5
|
* metrics (e.g. a Table resolving `"auto"` column widths from cell content). The engine
|
|
9
6
|
* stays table-agnostic - the closure comes from the API layer.
|
|
10
7
|
*/
|
|
11
|
-
class DeferredElement extends
|
|
8
|
+
export class DeferredElement extends PDFElement {
|
|
12
9
|
constructor(resolve) {
|
|
13
10
|
super();
|
|
14
11
|
this.resolve = resolve;
|
|
@@ -22,7 +19,7 @@ class DeferredElement extends pdf_element_1.PDFElement {
|
|
|
22
19
|
}
|
|
23
20
|
fragment(maxHeight, width, ctx) {
|
|
24
21
|
const c = this.build(ctx);
|
|
25
|
-
return
|
|
22
|
+
return isFragmentable(c)
|
|
26
23
|
? c.fragment(maxHeight, width, ctx)
|
|
27
24
|
: { fitted: this, remainder: null };
|
|
28
25
|
}
|
|
@@ -30,4 +27,3 @@ class DeferredElement extends pdf_element_1.PDFElement {
|
|
|
30
27
|
return { composed: this.composed };
|
|
31
28
|
}
|
|
32
29
|
}
|
|
33
|
-
exports.DeferredElement = DeferredElement;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { PDFElement, LayoutContext, FlexiblePDFElement, WithChild, FlexibleElement } from "../pdf-element";
|
|
2
|
-
import { BoxConstraints, Offset, Size } from "../../layout/box-constraints";
|
|
3
|
-
import { Fragmentable, FragmentResult } from "../../layout/fragmentation";
|
|
1
|
+
import { PDFElement, LayoutContext, FlexiblePDFElement, WithChild, FlexibleElement } from "../pdf-element.js";
|
|
2
|
+
import { BoxConstraints, Offset, Size } from "../../layout/box-constraints.js";
|
|
3
|
+
import { Fragmentable, FragmentResult } from "../../layout/fragmentation.js";
|
|
4
4
|
interface ExpandedElementParams extends FlexibleElement, WithChild {
|
|
5
5
|
}
|
|
6
6
|
export declare class ExpandedElement extends FlexiblePDFElement implements Fragmentable {
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const box_constraints_1 = require("../../layout/box-constraints");
|
|
7
|
-
const fragmentation_1 = require("../../layout/fragmentation");
|
|
8
|
-
class ExpandedElement extends pdf_element_1.FlexiblePDFElement {
|
|
1
|
+
import { Validator } from "../../validators/element-validator.js";
|
|
2
|
+
import { FlexiblePDFElement, } from "../pdf-element.js";
|
|
3
|
+
import { BoxConstraints } from "../../layout/box-constraints.js";
|
|
4
|
+
import { isFragmentable } from "../../layout/fragmentation.js";
|
|
5
|
+
export class ExpandedElement extends FlexiblePDFElement {
|
|
9
6
|
constructor({ flex, child }) {
|
|
10
7
|
super({ flex });
|
|
11
8
|
this.x = 0;
|
|
@@ -20,17 +17,17 @@ class ExpandedElement extends pdf_element_1.FlexiblePDFElement {
|
|
|
20
17
|
// Absolute placement from the parent; assignment (not +=) so re-layout is idempotent.
|
|
21
18
|
this.x = offset.x;
|
|
22
19
|
this.y = offset.y;
|
|
23
|
-
|
|
20
|
+
Validator.validateFlexElement(this);
|
|
24
21
|
if (constraints.hasBoundedHeight) {
|
|
25
|
-
// A bounded region: fill it - the normal flex
|
|
22
|
+
// A bounded region: fill it - the normal flex behavior.
|
|
26
23
|
this.height = constraints.maxHeight;
|
|
27
|
-
this.child.calculateLayout(
|
|
24
|
+
this.child.calculateLayout(BoxConstraints.loose(this.width, this.height), { x: this.x, y: this.y }, ctx);
|
|
28
25
|
}
|
|
29
26
|
else {
|
|
30
27
|
// Unbounded (measuring while paginating): there's no leftover space to fill, so
|
|
31
28
|
// collapse to the child's natural height. This lets an overflowing column flow
|
|
32
29
|
// instead of the flex silently hiding the overflow.
|
|
33
|
-
const childSize = this.child.calculateLayout(
|
|
30
|
+
const childSize = this.child.calculateLayout(BoxConstraints.loose(this.width, Infinity), { x: this.x, y: this.y }, ctx);
|
|
34
31
|
this.height = childSize.height;
|
|
35
32
|
}
|
|
36
33
|
// Top-left coordinates; the Y-flip now happens once at the IR -> backend seam.
|
|
@@ -43,7 +40,7 @@ class ExpandedElement extends pdf_element_1.FlexiblePDFElement {
|
|
|
43
40
|
* whole Expanded moves on.
|
|
44
41
|
*/
|
|
45
42
|
fragment(maxHeight, width, ctx) {
|
|
46
|
-
if (!
|
|
43
|
+
if (!isFragmentable(this.child)) {
|
|
47
44
|
return { fitted: null, remainder: this };
|
|
48
45
|
}
|
|
49
46
|
const split = this.child.fragment(maxHeight, width, ctx);
|
|
@@ -65,4 +62,3 @@ class ExpandedElement extends pdf_element_1.FlexiblePDFElement {
|
|
|
65
62
|
};
|
|
66
63
|
}
|
|
67
64
|
}
|
|
68
|
-
exports.ExpandedElement = ExpandedElement;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { PDFElement, LayoutContext, WithChild, SizedPDFElement } from "../pdf-element";
|
|
2
|
-
import { BoxConstraints, Offset, Size } from "../../layout/box-constraints";
|
|
3
|
-
import { Fragmentable, FragmentResult } from "../../layout/fragmentation";
|
|
1
|
+
import { PDFElement, LayoutContext, WithChild, SizedPDFElement } from "../pdf-element.js";
|
|
2
|
+
import { BoxConstraints, Offset, Size } from "../../layout/box-constraints.js";
|
|
3
|
+
import { Fragmentable, FragmentResult } from "../../layout/fragmentation.js";
|
|
4
4
|
interface PaddingElementParams extends WithChild {
|
|
5
5
|
margin: [number, number, number, number];
|
|
6
6
|
}
|