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