postext-pdf 0.1.0
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 +67 -0
- package/dist/__bench__/render.bench.test.d.ts +2 -0
- package/dist/__bench__/render.bench.test.d.ts.map +1 -0
- package/dist/__bench__/render.bench.test.js +86 -0
- package/dist/__bench__/render.bench.test.js.map +1 -0
- package/dist/__tests__/accessibility.test.d.ts +2 -0
- package/dist/__tests__/accessibility.test.d.ts.map +1 -0
- package/dist/__tests__/accessibility.test.js +364 -0
- package/dist/__tests__/accessibility.test.js.map +1 -0
- package/dist/__tests__/contentsLinks.test.d.ts +2 -0
- package/dist/__tests__/contentsLinks.test.d.ts.map +1 -0
- package/dist/__tests__/contentsLinks.test.js +131 -0
- package/dist/__tests__/contentsLinks.test.js.map +1 -0
- package/dist/__tests__/fontCache.test.d.ts +2 -0
- package/dist/__tests__/fontCache.test.d.ts.map +1 -0
- package/dist/__tests__/fontCache.test.js +42 -0
- package/dist/__tests__/fontCache.test.js.map +1 -0
- package/dist/__tests__/headerFooter.test.d.ts +2 -0
- package/dist/__tests__/headerFooter.test.d.ts.map +1 -0
- package/dist/__tests__/headerFooter.test.js +68 -0
- package/dist/__tests__/headerFooter.test.js.map +1 -0
- package/dist/__tests__/rotatedTable.test.d.ts +2 -0
- package/dist/__tests__/rotatedTable.test.d.ts.map +1 -0
- package/dist/__tests__/rotatedTable.test.js +112 -0
- package/dist/__tests__/rotatedTable.test.js.map +1 -0
- package/dist/__tests__/svgVector.test.d.ts +2 -0
- package/dist/__tests__/svgVector.test.d.ts.map +1 -0
- package/dist/__tests__/svgVector.test.js +322 -0
- package/dist/__tests__/svgVector.test.js.map +1 -0
- package/dist/__tests__/toUnicode.test.d.ts +2 -0
- package/dist/__tests__/toUnicode.test.d.ts.map +1 -0
- package/dist/__tests__/toUnicode.test.js +57 -0
- package/dist/__tests__/toUnicode.test.js.map +1 -0
- package/dist/colors.d.ts +23 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +47 -0
- package/dist/colors.js.map +1 -0
- package/dist/fontCache.d.ts +41 -0
- package/dist/fontCache.d.ts.map +1 -0
- package/dist/fontCache.js +154 -0
- package/dist/fontCache.js.map +1 -0
- package/dist/fontString.d.ts +14 -0
- package/dist/fontString.d.ts.map +1 -0
- package/dist/fontString.js +43 -0
- package/dist/fontString.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/pdf-backend/blockRender.d.ts +15 -0
- package/dist/pdf-backend/blockRender.d.ts.map +1 -0
- package/dist/pdf-backend/blockRender.js +244 -0
- package/dist/pdf-backend/blockRender.js.map +1 -0
- package/dist/pdf-backend/fontHelpers.d.ts +6 -0
- package/dist/pdf-backend/fontHelpers.d.ts.map +1 -0
- package/dist/pdf-backend/fontHelpers.js +81 -0
- package/dist/pdf-backend/fontHelpers.js.map +1 -0
- package/dist/pdf-backend/headerFooter.d.ts +15 -0
- package/dist/pdf-backend/headerFooter.d.ts.map +1 -0
- package/dist/pdf-backend/headerFooter.js +145 -0
- package/dist/pdf-backend/headerFooter.js.map +1 -0
- package/dist/pdf-backend/index.d.ts +47 -0
- package/dist/pdf-backend/index.d.ts.map +1 -0
- package/dist/pdf-backend/index.js +227 -0
- package/dist/pdf-backend/index.js.map +1 -0
- package/dist/pdf-backend/links.d.ts +44 -0
- package/dist/pdf-backend/links.d.ts.map +1 -0
- package/dist/pdf-backend/links.js +110 -0
- package/dist/pdf-backend/links.js.map +1 -0
- package/dist/pdf-backend/outlines.d.ts +8 -0
- package/dist/pdf-backend/outlines.d.ts.map +1 -0
- package/dist/pdf-backend/outlines.js +145 -0
- package/dist/pdf-backend/outlines.js.map +1 -0
- package/dist/pdf-backend/pageDecorations.d.ts +13 -0
- package/dist/pdf-backend/pageDecorations.d.ts.map +1 -0
- package/dist/pdf-backend/pageDecorations.js +88 -0
- package/dist/pdf-backend/pageDecorations.js.map +1 -0
- package/dist/pdf-backend/pageLabels.d.ts +8 -0
- package/dist/pdf-backend/pageLabels.d.ts.map +1 -0
- package/dist/pdf-backend/pageLabels.js +61 -0
- package/dist/pdf-backend/pageLabels.js.map +1 -0
- package/dist/pdf-backend/primitives.d.ts +46 -0
- package/dist/pdf-backend/primitives.d.ts.map +1 -0
- package/dist/pdf-backend/primitives.js +162 -0
- package/dist/pdf-backend/primitives.js.map +1 -0
- package/dist/pdf-backend/renderResourceBlock.d.ts +87 -0
- package/dist/pdf-backend/renderResourceBlock.d.ts.map +1 -0
- package/dist/pdf-backend/renderResourceBlock.js +753 -0
- package/dist/pdf-backend/renderResourceBlock.js.map +1 -0
- package/dist/pdf-backend/structureFlow.d.ts +55 -0
- package/dist/pdf-backend/structureFlow.d.ts.map +1 -0
- package/dist/pdf-backend/structureFlow.js +180 -0
- package/dist/pdf-backend/structureFlow.js.map +1 -0
- package/dist/pdf-backend/svgVector.d.ts +144 -0
- package/dist/pdf-backend/svgVector.d.ts.map +1 -0
- package/dist/pdf-backend/svgVector.js +1455 -0
- package/dist/pdf-backend/svgVector.js.map +1 -0
- package/dist/pdf-backend/tagging.d.ts +136 -0
- package/dist/pdf-backend/tagging.d.ts.map +1 -0
- package/dist/pdf-backend/tagging.js +296 -0
- package/dist/pdf-backend/tagging.js.map +1 -0
- package/dist/woff2.d.ts +11 -0
- package/dist/woff2.d.ts.map +1 -0
- package/dist/woff2.js +47 -0
- package/dist/woff2.js.map +1 -0
- package/dist/worker/client.d.ts +30 -0
- package/dist/worker/client.d.ts.map +1 -0
- package/dist/worker/client.js +112 -0
- package/dist/worker/client.js.map +1 -0
- package/dist/worker/pdf.worker.d.ts +2 -0
- package/dist/worker/pdf.worker.d.ts.map +1 -0
- package/dist/worker/pdf.worker.js +67 -0
- package/dist/worker/pdf.worker.js.map +1 -0
- package/dist/worker/protocol.d.ts +49 -0
- package/dist/worker/protocol.d.ts.map +1 -0
- package/dist/worker/protocol.js +2 -0
- package/dist/worker/protocol.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/pdf-backend/links.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PDFDocument } from 'pdf-lib';
|
|
2
|
+
import type { VDTDocument } from 'postext';
|
|
3
|
+
/** Attach an `/Outlines` dictionary tree to the document so PDF readers can
|
|
4
|
+
* expose clickable bookmarks for every heading, jumping to the heading's
|
|
5
|
+
* page (and approximate Y position). Also sets `/PageMode /UseOutlines` so
|
|
6
|
+
* the outlines panel is open when the file is first displayed. */
|
|
7
|
+
export declare function addOutlines(pdfDoc: PDFDocument, input: VDTDocument | VDTDocument[]): void;
|
|
8
|
+
//# sourceMappingURL=outlines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outlines.d.ts","sourceRoot":"","sources":["../../src/pdf-backend/outlines.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAMZ,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAY,WAAW,EAAE,MAAM,SAAS,CAAC;AA+ErD;;;mEAGmE;AACnE,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,EAAE,GAAG,IAAI,CAiGzF"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { PDFHexString, PDFName, } from 'pdf-lib';
|
|
2
|
+
function extractBlockText(block) {
|
|
3
|
+
const raw = block.lines
|
|
4
|
+
.map((line) => line.text)
|
|
5
|
+
.join(' ')
|
|
6
|
+
.replace(/\s+/g, ' ')
|
|
7
|
+
.trim();
|
|
8
|
+
if (!raw)
|
|
9
|
+
return '';
|
|
10
|
+
if (block.numberPrefix && !raw.startsWith(block.numberPrefix)) {
|
|
11
|
+
return `${block.numberPrefix} ${raw}`;
|
|
12
|
+
}
|
|
13
|
+
return raw;
|
|
14
|
+
}
|
|
15
|
+
/** Headings of `doc`, with page indices offset by `base` (the PDF pages of
|
|
16
|
+
* the documents rendered before it). */
|
|
17
|
+
function collectHeadings(doc, base = 0) {
|
|
18
|
+
const entries = [];
|
|
19
|
+
for (const page of doc.pages) {
|
|
20
|
+
// Part-divider pages sit above the chapters: level 0 so `buildTree`
|
|
21
|
+
// nests the following H1s (level 1) under them.
|
|
22
|
+
if (page.partInfo) {
|
|
23
|
+
const title = `${page.partInfo.number} ${page.partInfo.title.replace(/[ \t]*\\\\[ \t]*/g, ' ')}`.trim();
|
|
24
|
+
if (title)
|
|
25
|
+
entries.push({ title, level: 0, pageIndex: base + page.index, y: 0 });
|
|
26
|
+
}
|
|
27
|
+
for (const col of page.columns) {
|
|
28
|
+
for (const block of col.blocks) {
|
|
29
|
+
if (block.type !== 'heading')
|
|
30
|
+
continue;
|
|
31
|
+
const title = extractBlockText(block);
|
|
32
|
+
if (!title)
|
|
33
|
+
continue;
|
|
34
|
+
entries.push({
|
|
35
|
+
title,
|
|
36
|
+
level: block.headingLevel ?? 1,
|
|
37
|
+
pageIndex: base + page.index,
|
|
38
|
+
y: block.bbox.y,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return entries;
|
|
44
|
+
}
|
|
45
|
+
function buildTree(entries) {
|
|
46
|
+
const roots = [];
|
|
47
|
+
const stack = [];
|
|
48
|
+
for (const entry of entries) {
|
|
49
|
+
const node = { entry, children: [] };
|
|
50
|
+
while (stack.length > 0 && stack[stack.length - 1].entry.level >= entry.level) {
|
|
51
|
+
stack.pop();
|
|
52
|
+
}
|
|
53
|
+
if (stack.length === 0) {
|
|
54
|
+
roots.push(node);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
stack[stack.length - 1].children.push(node);
|
|
58
|
+
}
|
|
59
|
+
stack.push(node);
|
|
60
|
+
}
|
|
61
|
+
return roots;
|
|
62
|
+
}
|
|
63
|
+
function countDescendants(node) {
|
|
64
|
+
let n = node.children.length;
|
|
65
|
+
for (const child of node.children)
|
|
66
|
+
n += countDescendants(child);
|
|
67
|
+
return n;
|
|
68
|
+
}
|
|
69
|
+
/** Attach an `/Outlines` dictionary tree to the document so PDF readers can
|
|
70
|
+
* expose clickable bookmarks for every heading, jumping to the heading's
|
|
71
|
+
* page (and approximate Y position). Also sets `/PageMode /UseOutlines` so
|
|
72
|
+
* the outlines panel is open when the file is first displayed. */
|
|
73
|
+
export function addOutlines(pdfDoc, input) {
|
|
74
|
+
const docs = Array.isArray(input) ? input : [input];
|
|
75
|
+
const entries = [];
|
|
76
|
+
let base = 0;
|
|
77
|
+
for (const doc of docs) {
|
|
78
|
+
entries.push(...collectHeadings(doc, base));
|
|
79
|
+
base += doc.pages.length;
|
|
80
|
+
}
|
|
81
|
+
if (entries.length === 0 || docs.length === 0)
|
|
82
|
+
return;
|
|
83
|
+
const roots = buildTree(entries);
|
|
84
|
+
if (roots.length === 0)
|
|
85
|
+
return;
|
|
86
|
+
const context = pdfDoc.context;
|
|
87
|
+
const pdfPages = pdfDoc.getPages();
|
|
88
|
+
const scale = 72 / docs[0].config.page.dpi;
|
|
89
|
+
const rootRef = context.nextRef();
|
|
90
|
+
const refMap = new Map();
|
|
91
|
+
function assignRefs(nodes) {
|
|
92
|
+
for (const node of nodes) {
|
|
93
|
+
refMap.set(node, context.nextRef());
|
|
94
|
+
assignRefs(node.children);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
assignRefs(roots);
|
|
98
|
+
function registerNode(node, parentRef, prevRef, nextRef) {
|
|
99
|
+
const { entry } = node;
|
|
100
|
+
const pdfPage = pdfPages[entry.pageIndex];
|
|
101
|
+
const pageRef = pdfPage ? pdfPage.ref : undefined;
|
|
102
|
+
const pageHeightPt = pdfPage ? pdfPage.getHeight() : 0;
|
|
103
|
+
const topPt = pdfPage ? pageHeightPt - entry.y * scale : 0;
|
|
104
|
+
const destArray = context.obj([
|
|
105
|
+
pageRef ?? pdfPages[0].ref,
|
|
106
|
+
PDFName.of('XYZ'),
|
|
107
|
+
null,
|
|
108
|
+
topPt,
|
|
109
|
+
null,
|
|
110
|
+
]);
|
|
111
|
+
const childRefs = node.children.map((c) => refMap.get(c));
|
|
112
|
+
const dict = context.obj({
|
|
113
|
+
Title: PDFHexString.fromText(entry.title),
|
|
114
|
+
Parent: parentRef,
|
|
115
|
+
Dest: destArray,
|
|
116
|
+
});
|
|
117
|
+
if (prevRef)
|
|
118
|
+
dict.set(PDFName.of('Prev'), prevRef);
|
|
119
|
+
if (nextRef)
|
|
120
|
+
dict.set(PDFName.of('Next'), nextRef);
|
|
121
|
+
if (childRefs.length > 0) {
|
|
122
|
+
dict.set(PDFName.of('First'), childRefs[0]);
|
|
123
|
+
dict.set(PDFName.of('Last'), childRefs[childRefs.length - 1]);
|
|
124
|
+
dict.set(PDFName.of('Count'), context.obj(-countDescendants(node)));
|
|
125
|
+
}
|
|
126
|
+
context.assign(refMap.get(node), dict);
|
|
127
|
+
for (let i = 0; i < node.children.length; i++) {
|
|
128
|
+
registerNode(node.children[i], refMap.get(node), i > 0 ? childRefs[i - 1] : null, i < node.children.length - 1 ? childRefs[i + 1] : null);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const rootChildRefs = roots.map((r) => refMap.get(r));
|
|
132
|
+
for (let i = 0; i < roots.length; i++) {
|
|
133
|
+
registerNode(roots[i], rootRef, i > 0 ? rootChildRefs[i - 1] : null, i < roots.length - 1 ? rootChildRefs[i + 1] : null);
|
|
134
|
+
}
|
|
135
|
+
const rootDict = context.obj({
|
|
136
|
+
Type: 'Outlines',
|
|
137
|
+
First: rootChildRefs[0],
|
|
138
|
+
Last: rootChildRefs[rootChildRefs.length - 1],
|
|
139
|
+
Count: roots.reduce((n, r) => n + 1 + countDescendants(r), 0),
|
|
140
|
+
});
|
|
141
|
+
context.assign(rootRef, rootDict);
|
|
142
|
+
pdfDoc.catalog.set(PDFName.of('Outlines'), rootRef);
|
|
143
|
+
pdfDoc.catalog.set(PDFName.of('PageMode'), PDFName.of('UseOutlines'));
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=outlines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outlines.js","sourceRoot":"","sources":["../../src/pdf-backend/outlines.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { VDTDocument, VDTPage, VDTColumn, BoundingBox } from 'postext';
|
|
2
|
+
import { type PageCtx } from './primitives';
|
|
3
|
+
export declare function renderBaselineGrid(ctx: PageCtx, contentArea: BoundingBox, baselineIncrement: number, colorHex: string, lineWidthPx: number, textExtent: {
|
|
4
|
+
top: number;
|
|
5
|
+
bottom: number;
|
|
6
|
+
}): void;
|
|
7
|
+
export declare function renderColumnRule(ctx: PageCtx, columns: VDTColumn[], colorHex: string, lineWidthPx: number): void;
|
|
8
|
+
export declare function renderCutLines(ctx: PageCtx, page: VDTPage, doc: VDTDocument): void;
|
|
9
|
+
/** The page's content area: `page.contentArea` when the pipeline set it
|
|
10
|
+
* (per page, so mirrored margins are honoured), else inferred from the
|
|
11
|
+
* column bboxes (hand-built pages). */
|
|
12
|
+
export declare function computeContentArea(page: VDTPage, doc: VDTDocument): BoundingBox;
|
|
13
|
+
//# sourceMappingURL=pageDecorations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageDecorations.d.ts","sourceRoot":"","sources":["../../src/pdf-backend/pageDecorations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE5E,OAAO,EAAE,KAAK,OAAO,EAA4B,MAAM,cAAc,CAAC;AAEtE,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,MAAM,EACzB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC1C,IAAI,CAgBN;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,SAAS,EAAE,EACpB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,IAAI,CAUN;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAiClF;AAED;;wCAEwC;AACxC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,WAAW,CAiB/E"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { dimensionToPx, columnRuleSegments } from 'postext';
|
|
2
|
+
import { drawLinePx, colorFromHex } from './primitives';
|
|
3
|
+
export function renderBaselineGrid(ctx, contentArea, baselineIncrement, colorHex, lineWidthPx, textExtent) {
|
|
4
|
+
const color = colorFromHex(colorHex, ctx.colorSpace);
|
|
5
|
+
// Mirrors the canvas backend: baselines on the global grid anchored at the
|
|
6
|
+
// content-area top, drawn only across the page's actual text extent. `k0`
|
|
7
|
+
// may be negative when column 0 carries a top float band (its bbox-derived
|
|
8
|
+
// contentArea.y sits below the global top); band heights are grid
|
|
9
|
+
// multiples, so those earlier baselines still lie on the global grid.
|
|
10
|
+
const eps = 0.5;
|
|
11
|
+
const firstBaseline = contentArea.y + baselineIncrement * 0.8;
|
|
12
|
+
const k0 = Math.ceil((textExtent.top - eps - firstBaseline) / baselineIncrement);
|
|
13
|
+
let y = firstBaseline + k0 * baselineIncrement;
|
|
14
|
+
const right = contentArea.x + contentArea.width;
|
|
15
|
+
while (y <= textExtent.bottom + eps) {
|
|
16
|
+
drawLinePx(ctx, contentArea.x, y, right, y, color, lineWidthPx);
|
|
17
|
+
y += baselineIncrement;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function renderColumnRule(ctx, columns, colorHex, lineWidthPx) {
|
|
21
|
+
if (columns.length < 2)
|
|
22
|
+
return;
|
|
23
|
+
// One segment per gutter of each column band; span columns interrupt the
|
|
24
|
+
// rule (mirrors the canvas backend via `columnRuleSegments`).
|
|
25
|
+
const segments = columnRuleSegments(columns);
|
|
26
|
+
if (segments.length === 0)
|
|
27
|
+
return;
|
|
28
|
+
const color = colorFromHex(colorHex, ctx.colorSpace);
|
|
29
|
+
for (const seg of segments) {
|
|
30
|
+
drawLinePx(ctx, seg.x, seg.top, seg.x, seg.bottom, color, lineWidthPx);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function renderCutLines(ctx, page, doc) {
|
|
34
|
+
const { cutLines, dpi } = doc.config.page;
|
|
35
|
+
if (!cutLines.enabled)
|
|
36
|
+
return;
|
|
37
|
+
const bleedPx = dimensionToPx(cutLines.bleed, dpi);
|
|
38
|
+
const markOffsetPx = dimensionToPx(cutLines.markOffset, dpi);
|
|
39
|
+
const markLengthPx = dimensionToPx(cutLines.markLength, dpi);
|
|
40
|
+
const markWidthPx = dimensionToPx(cutLines.markWidth, dpi);
|
|
41
|
+
const totalExpansion = bleedPx + markOffsetPx + markLengthPx;
|
|
42
|
+
const trimX = totalExpansion;
|
|
43
|
+
const trimY = totalExpansion;
|
|
44
|
+
const trimW = page.width - totalExpansion * 2;
|
|
45
|
+
const trimH = page.height - totalExpansion * 2;
|
|
46
|
+
const color = colorFromHex(cutLines.color.hex, ctx.colorSpace);
|
|
47
|
+
const corners = [
|
|
48
|
+
{ x: trimX, y: trimY },
|
|
49
|
+
{ x: trimX + trimW, y: trimY },
|
|
50
|
+
{ x: trimX, y: trimY + trimH },
|
|
51
|
+
{ x: trimX + trimW, y: trimY + trimH },
|
|
52
|
+
];
|
|
53
|
+
for (const corner of corners) {
|
|
54
|
+
const isLeft = corner.x === trimX;
|
|
55
|
+
const isTop = corner.y === trimY;
|
|
56
|
+
const hDir = isLeft ? -1 : 1;
|
|
57
|
+
const hStart = corner.x + hDir * markOffsetPx;
|
|
58
|
+
const hEnd = corner.x + hDir * (markOffsetPx + markLengthPx);
|
|
59
|
+
drawLinePx(ctx, hStart, corner.y, hEnd, corner.y, color, markWidthPx);
|
|
60
|
+
const vDir = isTop ? -1 : 1;
|
|
61
|
+
const vStart = corner.y + vDir * markOffsetPx;
|
|
62
|
+
const vEnd = corner.y + vDir * (markOffsetPx + markLengthPx);
|
|
63
|
+
drawLinePx(ctx, corner.x, vStart, corner.x, vEnd, color, markWidthPx);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** The page's content area: `page.contentArea` when the pipeline set it
|
|
67
|
+
* (per page, so mirrored margins are honoured), else inferred from the
|
|
68
|
+
* column bboxes (hand-built pages). */
|
|
69
|
+
export function computeContentArea(page, doc) {
|
|
70
|
+
if (page.contentArea)
|
|
71
|
+
return page.contentArea;
|
|
72
|
+
const { dpi, margins } = doc.config.page;
|
|
73
|
+
const pxPerCm = dpi / 2.54;
|
|
74
|
+
const marginTop = margins.top.unit === 'cm' ? margins.top.value * pxPerCm : margins.top.value;
|
|
75
|
+
const marginLeft = margins.left.unit === 'cm' ? margins.left.value * pxPerCm : margins.left.value;
|
|
76
|
+
if (page.columns.length > 0) {
|
|
77
|
+
const firstCol = page.columns[0];
|
|
78
|
+
const lastCol = page.columns[page.columns.length - 1];
|
|
79
|
+
return {
|
|
80
|
+
x: firstCol.bbox.x,
|
|
81
|
+
y: firstCol.bbox.y,
|
|
82
|
+
width: (lastCol.bbox.x + lastCol.bbox.width) - firstCol.bbox.x,
|
|
83
|
+
height: firstCol.bbox.height,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return { x: marginLeft, y: marginTop, width: 0, height: 0 };
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=pageDecorations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageDecorations.js","sourceRoot":"","sources":["../../src/pdf-backend/pageDecorations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type PDFDocument } from 'pdf-lib';
|
|
2
|
+
import type { VDTDocument } from 'postext';
|
|
3
|
+
/** Emit a `/PageLabels` number tree on the PDF catalog. No-op when
|
|
4
|
+
* `doc.pages` is empty. Alpha runs whose max value exceeds 26 fall back
|
|
5
|
+
* to per-page `/P` prefix entries so PDF viewers show the exact postext
|
|
6
|
+
* label (`AA`, `AB`, …) rather than the PDF repeated-letter scheme. */
|
|
7
|
+
export declare function addPageLabels(pdfDoc: PDFDocument, input: VDTDocument | VDTDocument[]): void;
|
|
8
|
+
//# sourceMappingURL=pageLabels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageLabels.d.ts","sourceRoot":"","sources":["../../src/pdf-backend/pageLabels.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,SAAS,CAAC;AAoBzD;;;wEAGwE;AACxE,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,EAAE,GAAG,IAAI,CAyC3F"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { PDFArray, PDFDict, PDFName, PDFNumber, PDFString, } from 'pdf-lib';
|
|
2
|
+
import { collectPageLabelRuns } from 'postext';
|
|
3
|
+
/**
|
|
4
|
+
* postext `NumeralStyle` → PDF `/S` style code. PDF 1.7 §12.4.2 supports
|
|
5
|
+
* `/D` (decimal), `/R` (upper roman), `/r` (lower roman), `/A` (upper
|
|
6
|
+
* letters A–Z, AA–ZZ), `/a` (lower letters a–z, aa–zz). The PDF letter
|
|
7
|
+
* variants only survive up to 26 (AA repeats A twice, not 27) so we
|
|
8
|
+
* only emit them when the entire run fits within ±26; otherwise we
|
|
9
|
+
* drop the style and emit per-page `/P` prefix entries carrying the
|
|
10
|
+
* literal label.
|
|
11
|
+
*/
|
|
12
|
+
const STYLE_CODE = {
|
|
13
|
+
decimal: 'D',
|
|
14
|
+
'upper-roman': 'R',
|
|
15
|
+
'lower-roman': 'r',
|
|
16
|
+
'upper-alpha': 'A',
|
|
17
|
+
'lower-alpha': 'a',
|
|
18
|
+
};
|
|
19
|
+
/** Emit a `/PageLabels` number tree on the PDF catalog. No-op when
|
|
20
|
+
* `doc.pages` is empty. Alpha runs whose max value exceeds 26 fall back
|
|
21
|
+
* to per-page `/P` prefix entries so PDF viewers show the exact postext
|
|
22
|
+
* label (`AA`, `AB`, …) rather than the PDF repeated-letter scheme. */
|
|
23
|
+
export function addPageLabels(pdfDoc, input) {
|
|
24
|
+
const docs = Array.isArray(input) ? input : [input];
|
|
25
|
+
// One page list for the whole PDF: a book is several documents in a row.
|
|
26
|
+
const pages = docs.flatMap((doc) => doc.pages);
|
|
27
|
+
if (pages.length === 0)
|
|
28
|
+
return;
|
|
29
|
+
const ctx = pdfDoc.context;
|
|
30
|
+
const nums = PDFArray.withContext(ctx);
|
|
31
|
+
const runs = collectPageLabelRuns(pages.map((p) => ({
|
|
32
|
+
value: p.pageNumberValue,
|
|
33
|
+
label: p.pageLabel,
|
|
34
|
+
format: p.pageNumberFormat,
|
|
35
|
+
})));
|
|
36
|
+
for (const run of runs) {
|
|
37
|
+
const code = STYLE_CODE[run.format] ?? null;
|
|
38
|
+
const isAlpha = run.format === 'upper-alpha' || run.format === 'lower-alpha';
|
|
39
|
+
if (isAlpha && run.maxValue > 26) {
|
|
40
|
+
for (let i = run.startPageIndex; i <= run.endPageIndex; i++) {
|
|
41
|
+
const page = pages[i];
|
|
42
|
+
const dict = PDFDict.withContext(ctx);
|
|
43
|
+
dict.set(PDFName.of('P'), PDFString.of(page.pageLabel));
|
|
44
|
+
nums.push(PDFNumber.of(i));
|
|
45
|
+
nums.push(dict);
|
|
46
|
+
}
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const dict = PDFDict.withContext(ctx);
|
|
50
|
+
if (code)
|
|
51
|
+
dict.set(PDFName.of('S'), PDFName.of(code));
|
|
52
|
+
if (run.startAt !== 1)
|
|
53
|
+
dict.set(PDFName.of('St'), PDFNumber.of(run.startAt));
|
|
54
|
+
nums.push(PDFNumber.of(run.startPageIndex));
|
|
55
|
+
nums.push(dict);
|
|
56
|
+
}
|
|
57
|
+
const pageLabels = PDFDict.withContext(ctx);
|
|
58
|
+
pageLabels.set(PDFName.of('Nums'), nums);
|
|
59
|
+
pdfDoc.catalog.set(PDFName.of('PageLabels'), pageLabels);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=pageLabels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageLabels.js","sourceRoot":"","sources":["../../src/pdf-backend/pageLabels.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { BlendMode, type PDFPage, type PDFFont, type Color } from 'pdf-lib';
|
|
2
|
+
import type { PdfColorSpace } from 'postext';
|
|
3
|
+
import type { PageTagger } from './tagging';
|
|
4
|
+
export interface PageCtx {
|
|
5
|
+
page: PDFPage;
|
|
6
|
+
pageHeightPt: number;
|
|
7
|
+
scale: number;
|
|
8
|
+
colorSpace: PdfColorSpace;
|
|
9
|
+
/** Marked-content state of an accessible (tagged) render; absent when the
|
|
10
|
+
* document is not tagged. Renderers route each drawing call to a
|
|
11
|
+
* structure element or flag it as an artifact through it. */
|
|
12
|
+
tags?: PageTagger;
|
|
13
|
+
/** Set while a transform is pushed (a rotated resource block): maps a
|
|
14
|
+
* rect `[x1, y1, x2, y2]` in points of the transformed frame — what the
|
|
15
|
+
* `*Px` helpers compute — to page user space, for the annotation and
|
|
16
|
+
* structure rects that live outside the content stream. */
|
|
17
|
+
mapRectPt?: (rect: [number, number, number, number]) => [number, number, number, number];
|
|
18
|
+
}
|
|
19
|
+
/** A PDF transformation matrix `[a b c d e f]` (`x' = a·x + c·y + e`,
|
|
20
|
+
* `y' = b·x + d·y + f`). */
|
|
21
|
+
export type PdfMatrix = [number, number, number, number, number, number];
|
|
22
|
+
/** Apply `m` to a point. */
|
|
23
|
+
export declare function applyMatrix(m: PdfMatrix, x: number, y: number): {
|
|
24
|
+
x: number;
|
|
25
|
+
y: number;
|
|
26
|
+
};
|
|
27
|
+
/** Push a graphics state with `m` concatenated onto the CTM. Everything
|
|
28
|
+
* drawn until {@link popTransform} goes through it. */
|
|
29
|
+
export declare function pushTransform(ctx: PageCtx, m: PdfMatrix): void;
|
|
30
|
+
export declare function popTransform(ctx: PageCtx): void;
|
|
31
|
+
/** Map a rect `[x1, y1, x2, y2]` through `m`, re-normalised to min / max. */
|
|
32
|
+
export declare function mapRectThrough(m: PdfMatrix, rect: [number, number, number, number]): [number, number, number, number];
|
|
33
|
+
/** Inline colour swatch (`:swatch{…}`): a square of `sidePx` on the
|
|
34
|
+
* baseline, filled with `fill` (hex) when resolved and outlined in `ink`. */
|
|
35
|
+
export declare function drawSwatchPx(ctx: PageCtx, xPx: number, baselinePx: number, sidePx: number, fill: string | undefined, ink: Color): void;
|
|
36
|
+
export declare function makeScale(dpi: number): number;
|
|
37
|
+
export declare function whiteColor(colorSpace: PdfColorSpace): Color;
|
|
38
|
+
export declare function colorFromHex(hex: string, colorSpace: PdfColorSpace): Color;
|
|
39
|
+
/** Back-compat alias — defaults to RGB. */
|
|
40
|
+
export declare function rgbFromHex(hex: string): Color;
|
|
41
|
+
export declare function fillRectPx(ctx: PageCtx, xPx: number, yPx: number, wPx: number, hPx: number, color: Color, blendMode?: BlendMode): void;
|
|
42
|
+
export declare function drawLinePx(ctx: PageCtx, x1Px: number, y1Px: number, x2Px: number, y2Px: number, color: Color, thicknessPx: number): void;
|
|
43
|
+
export declare function drawTextPx(ctx: PageCtx, text: string, xPx: number, baselinePx: number, font: PDFFont, sizePx: number, color: Color): void;
|
|
44
|
+
export declare function pushClipRect(ctx: PageCtx, xPx: number, yPx: number, wPx: number, hPx: number): void;
|
|
45
|
+
export declare function popClip(ctx: PageCtx): void;
|
|
46
|
+
//# sourceMappingURL=primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../src/pdf-backend/primitives.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { rgb, cmyk, grayscale, pushGraphicsState, popGraphicsState, rectangle, clip, endPath, concatTransformationMatrix, beginText, endText, setFillingColor, setFontAndSize, showText, setTextMatrix, } from 'pdf-lib';
|
|
2
|
+
import { hexToRgb, rgbToCmyk, rgbToGrayscale } from '../colors';
|
|
3
|
+
/** Apply `m` to a point. */
|
|
4
|
+
export function applyMatrix(m, x, y) {
|
|
5
|
+
return { x: m[0] * x + m[2] * y + m[4], y: m[1] * x + m[3] * y + m[5] };
|
|
6
|
+
}
|
|
7
|
+
/** Push a graphics state with `m` concatenated onto the CTM. Everything
|
|
8
|
+
* drawn until {@link popTransform} goes through it. */
|
|
9
|
+
export function pushTransform(ctx, m) {
|
|
10
|
+
ctx.tags?.close();
|
|
11
|
+
ctx.page.pushOperators(pushGraphicsState(), concatTransformationMatrix(...m));
|
|
12
|
+
}
|
|
13
|
+
export function popTransform(ctx) {
|
|
14
|
+
ctx.tags?.close();
|
|
15
|
+
ctx.page.pushOperators(popGraphicsState());
|
|
16
|
+
}
|
|
17
|
+
/** Map a rect `[x1, y1, x2, y2]` through `m`, re-normalised to min / max. */
|
|
18
|
+
export function mapRectThrough(m, rect) {
|
|
19
|
+
const a = applyMatrix(m, rect[0], rect[1]);
|
|
20
|
+
const b = applyMatrix(m, rect[2], rect[3]);
|
|
21
|
+
return [Math.min(a.x, b.x), Math.min(a.y, b.y), Math.max(a.x, b.x), Math.max(a.y, b.y)];
|
|
22
|
+
}
|
|
23
|
+
/** Inline colour swatch (`:swatch{…}`): a square of `sidePx` on the
|
|
24
|
+
* baseline, filled with `fill` (hex) when resolved and outlined in `ink`. */
|
|
25
|
+
export function drawSwatchPx(ctx, xPx, baselinePx, sidePx, fill, ink) {
|
|
26
|
+
const { scale, pageHeightPt } = ctx;
|
|
27
|
+
const strokePx = Math.max(0.5, sidePx * 0.06);
|
|
28
|
+
const x = (xPx + strokePx / 2) * scale;
|
|
29
|
+
const y = pageHeightPt - (baselinePx - strokePx / 2) * scale;
|
|
30
|
+
const side = (sidePx - strokePx) * scale;
|
|
31
|
+
ctx.page.drawRectangle({
|
|
32
|
+
x,
|
|
33
|
+
y,
|
|
34
|
+
width: side,
|
|
35
|
+
height: side,
|
|
36
|
+
...(fill ? { color: colorFromHex(fill, ctx.colorSpace) } : {}),
|
|
37
|
+
borderColor: ink,
|
|
38
|
+
borderWidth: Math.max(0.01, strokePx * scale),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export function makeScale(dpi) {
|
|
42
|
+
return 72 / dpi;
|
|
43
|
+
}
|
|
44
|
+
export function whiteColor(colorSpace) {
|
|
45
|
+
if (colorSpace === 'cmyk')
|
|
46
|
+
return cmyk(0, 0, 0, 0);
|
|
47
|
+
if (colorSpace === 'grayscale')
|
|
48
|
+
return grayscale(1);
|
|
49
|
+
return rgb(1, 1, 1);
|
|
50
|
+
}
|
|
51
|
+
// Memoized: called per text segment during rendering, while a document only
|
|
52
|
+
// uses a handful of colors. pdf-lib Color objects are plain immutable
|
|
53
|
+
// descriptors, so sharing instances is safe.
|
|
54
|
+
const colorCache = new Map();
|
|
55
|
+
export function colorFromHex(hex, colorSpace) {
|
|
56
|
+
const key = `${colorSpace}|${hex}`;
|
|
57
|
+
const cached = colorCache.get(key);
|
|
58
|
+
if (cached)
|
|
59
|
+
return cached;
|
|
60
|
+
const c = hexToRgb(hex);
|
|
61
|
+
let color;
|
|
62
|
+
if (colorSpace === 'cmyk') {
|
|
63
|
+
const k = rgbToCmyk(c);
|
|
64
|
+
color = cmyk(k.c, k.m, k.y, k.k);
|
|
65
|
+
}
|
|
66
|
+
else if (colorSpace === 'grayscale') {
|
|
67
|
+
color = grayscale(rgbToGrayscale(c));
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
color = rgb(c.r, c.g, c.b);
|
|
71
|
+
}
|
|
72
|
+
colorCache.set(key, color);
|
|
73
|
+
return color;
|
|
74
|
+
}
|
|
75
|
+
/** Back-compat alias — defaults to RGB. */
|
|
76
|
+
export function rgbFromHex(hex) {
|
|
77
|
+
return colorFromHex(hex, 'rgb');
|
|
78
|
+
}
|
|
79
|
+
export function fillRectPx(ctx, xPx, yPx, wPx, hPx, color, blendMode) {
|
|
80
|
+
const { scale, pageHeightPt } = ctx;
|
|
81
|
+
const x = xPx * scale;
|
|
82
|
+
const y = pageHeightPt - (yPx + hPx) * scale;
|
|
83
|
+
const width = wPx * scale;
|
|
84
|
+
const height = hPx * scale;
|
|
85
|
+
ctx.page.drawRectangle({
|
|
86
|
+
x,
|
|
87
|
+
y,
|
|
88
|
+
width,
|
|
89
|
+
height,
|
|
90
|
+
color,
|
|
91
|
+
...(blendMode ? { blendMode } : {}),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export function drawLinePx(ctx, x1Px, y1Px, x2Px, y2Px, color, thicknessPx) {
|
|
95
|
+
const { scale, pageHeightPt } = ctx;
|
|
96
|
+
ctx.page.drawLine({
|
|
97
|
+
start: { x: x1Px * scale, y: pageHeightPt - y1Px * scale },
|
|
98
|
+
end: { x: x2Px * scale, y: pageHeightPt - y2Px * scale },
|
|
99
|
+
color,
|
|
100
|
+
thickness: Math.max(0.01, thicknessPx * scale),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// Text is drawn a word at a time (the layout engine positions every
|
|
104
|
+
// word), and pdf-lib's `drawText` shapes each call afresh through fontkit —
|
|
105
|
+
// the same words, over and over. The encoded glyph string of a (font, text)
|
|
106
|
+
// pair never changes, so it is shaped once and reused; the font's resource
|
|
107
|
+
// key on a page likewise.
|
|
108
|
+
const encodedByFont = new WeakMap();
|
|
109
|
+
const ENCODE_CACHE_SLOTS = 50_000;
|
|
110
|
+
function encodeCached(font, text) {
|
|
111
|
+
let cache = encodedByFont.get(font);
|
|
112
|
+
if (!cache) {
|
|
113
|
+
cache = new Map();
|
|
114
|
+
encodedByFont.set(font, cache);
|
|
115
|
+
}
|
|
116
|
+
const hit = cache.get(text);
|
|
117
|
+
if (hit)
|
|
118
|
+
return hit;
|
|
119
|
+
// `encodeText` also registers the glyphs with the font's subset; a first
|
|
120
|
+
// call per text keeps that side effect.
|
|
121
|
+
const encoded = font.encodeText(text);
|
|
122
|
+
if (cache.size >= ENCODE_CACHE_SLOTS)
|
|
123
|
+
cache.clear();
|
|
124
|
+
cache.set(text, encoded);
|
|
125
|
+
return encoded;
|
|
126
|
+
}
|
|
127
|
+
const fontKeysByPage = new WeakMap();
|
|
128
|
+
function fontKeyOn(page, font) {
|
|
129
|
+
let keys = fontKeysByPage.get(page);
|
|
130
|
+
if (!keys) {
|
|
131
|
+
keys = new Map();
|
|
132
|
+
fontKeysByPage.set(page, keys);
|
|
133
|
+
}
|
|
134
|
+
let key = keys.get(font);
|
|
135
|
+
if (!key) {
|
|
136
|
+
key = page.node.newFontDictionary(font.name, font.ref);
|
|
137
|
+
keys.set(font, key);
|
|
138
|
+
}
|
|
139
|
+
return key;
|
|
140
|
+
}
|
|
141
|
+
export function drawTextPx(ctx, text, xPx, baselinePx, font, sizePx, color) {
|
|
142
|
+
if (!text)
|
|
143
|
+
return;
|
|
144
|
+
const { scale, pageHeightPt } = ctx;
|
|
145
|
+
// The operators pdf-lib's `drawText` emits, with the encoding cached.
|
|
146
|
+
ctx.page.pushOperators(pushGraphicsState(), beginText(), setFillingColor(color), setFontAndSize(fontKeyOn(ctx.page, font), sizePx * scale), setTextMatrix(1, 0, 0, 1, xPx * scale, pageHeightPt - baselinePx * scale), showText(encodeCached(font, text)), endText(), popGraphicsState());
|
|
147
|
+
}
|
|
148
|
+
export function pushClipRect(ctx, xPx, yPx, wPx, hPx) {
|
|
149
|
+
const { scale, pageHeightPt } = ctx;
|
|
150
|
+
const x = xPx * scale;
|
|
151
|
+
const y = pageHeightPt - (yPx + hPx) * scale;
|
|
152
|
+
const width = wPx * scale;
|
|
153
|
+
const height = hPx * scale;
|
|
154
|
+
// Marked content must nest inside the graphics state it was opened in.
|
|
155
|
+
ctx.tags?.close();
|
|
156
|
+
ctx.page.pushOperators(pushGraphicsState(), rectangle(x, y, width, height), clip(), endPath());
|
|
157
|
+
}
|
|
158
|
+
export function popClip(ctx) {
|
|
159
|
+
ctx.tags?.close();
|
|
160
|
+
ctx.page.pushOperators(popGraphicsState());
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=primitives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../src/pdf-backend/primitives.ts"],"names":[],"mappings":"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"}
|