pretext-pdf 0.9.3 → 1.0.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/CHANGELOG.md +99 -0
- package/README.md +874 -795
- package/dist/assets.d.ts +4 -2
- package/dist/assets.d.ts.map +1 -1
- package/dist/assets.js +22 -1
- package/dist/assets.js.map +1 -1
- package/dist/benchmarks/corpora.d.ts +11 -0
- package/dist/benchmarks/corpora.d.ts.map +1 -0
- package/dist/benchmarks/corpora.js +228 -0
- package/dist/benchmarks/corpora.js.map +1 -0
- package/dist/builder.d.ts +10 -2
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +12 -4
- package/dist/builder.js.map +1 -1
- package/dist/cli.js +19 -19
- package/dist/element-types.d.ts +16 -0
- package/dist/element-types.d.ts.map +1 -0
- package/dist/element-types.js +16 -0
- package/dist/element-types.js.map +1 -0
- package/dist/errors.d.ts +8 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +4 -0
- package/dist/errors.js.map +1 -1
- package/dist/fonts.d.ts +2 -1
- package/dist/fonts.d.ts.map +1 -1
- package/dist/fonts.js.map +1 -1
- package/dist/index.d.ts +21 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -309
- package/dist/index.js.map +1 -1
- package/dist/layout-state.d.ts +39 -0
- package/dist/layout-state.d.ts.map +1 -0
- package/dist/layout-state.js +46 -0
- package/dist/layout-state.js.map +1 -0
- package/dist/measure-blocks.d.ts +2 -1
- package/dist/measure-blocks.d.ts.map +1 -1
- package/dist/measure-blocks.js.map +1 -1
- package/dist/measure.d.ts +4 -2
- package/dist/measure.d.ts.map +1 -1
- package/dist/measure.js +15 -5
- package/dist/measure.js.map +1 -1
- package/dist/page-sizes.d.ts +1 -0
- package/dist/page-sizes.d.ts.map +1 -1
- package/dist/page-sizes.js.map +1 -1
- package/dist/paginate.d.ts +1 -1
- package/dist/paginate.d.ts.map +1 -1
- package/dist/paginate.js +11 -2
- package/dist/paginate.js.map +1 -1
- package/dist/pipeline-footnotes.d.ts +18 -0
- package/dist/pipeline-footnotes.d.ts.map +1 -0
- package/dist/pipeline-footnotes.js +98 -0
- package/dist/pipeline-footnotes.js.map +1 -0
- package/dist/pipeline-toc.d.ts +11 -0
- package/dist/pipeline-toc.d.ts.map +1 -0
- package/dist/pipeline-toc.js +28 -0
- package/dist/pipeline-toc.js.map +1 -0
- package/dist/pipeline.d.ts +24 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +116 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/plugin-registry.d.ts +40 -0
- package/dist/plugin-registry.d.ts.map +1 -0
- package/dist/plugin-registry.js +104 -0
- package/dist/plugin-registry.js.map +1 -0
- package/dist/plugin-types.d.ts +185 -0
- package/dist/plugin-types.d.ts.map +1 -0
- package/dist/plugin-types.js +27 -0
- package/dist/plugin-types.js.map +1 -0
- package/dist/post-process.d.ts +16 -0
- package/dist/post-process.d.ts.map +1 -0
- package/dist/post-process.js +80 -0
- package/dist/post-process.js.map +1 -0
- package/dist/render-blocks.d.ts +2 -1
- package/dist/render-blocks.d.ts.map +1 -1
- package/dist/render-blocks.js.map +1 -1
- package/dist/render-extras.d.ts +2 -2
- package/dist/render-extras.d.ts.map +1 -1
- package/dist/render-extras.js.map +1 -1
- package/dist/render.d.ts +4 -2
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +23 -4
- package/dist/render.js.map +1 -1
- package/dist/types-internal.d.ts +302 -0
- package/dist/types-internal.d.ts.map +1 -0
- package/dist/types-internal.js +9 -0
- package/dist/types-internal.js.map +1 -0
- package/dist/types-public.d.ts +1031 -0
- package/dist/types-public.d.ts.map +1 -0
- package/dist/types-public.js +2 -0
- package/dist/types-public.js.map +1 -0
- package/dist/types.d.ts +6 -1224
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -1
- package/dist/validate.d.ts +6 -4
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +35 -4
- package/dist/validate.js.map +1 -1
- package/package.json +192 -184
- package/docs/screenshots/showcase-invoice.png +0 -0
- package/docs/screenshots/showcase-report.png +0 -0
- package/docs/screenshots/showcase-resume.png +0 -0
package/dist/index.js
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { PDFDocument, PDFName, PDFString } from '@cantoo/pdf-lib';
|
|
1
|
+
import { PDFDocument } from '@cantoo/pdf-lib';
|
|
3
2
|
import { PretextPdfError } from './errors.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { loadFonts } from './fonts.js';
|
|
7
|
-
import { loadImages } from './assets.js';
|
|
8
|
-
import { measureAllBlocks, measureHeaderFooterHeight } from './measure.js';
|
|
9
|
-
import { LINE_HEIGHT_COMPACT } from './render-utils.js';
|
|
10
|
-
import { paginate } from './paginate.js';
|
|
11
|
-
import { renderDocument } from './render.js';
|
|
3
|
+
import { runPipeline } from './pipeline.js';
|
|
4
|
+
import { applyPostProcessing } from './post-process.js';
|
|
12
5
|
export { PretextPdfError } from './errors.js';
|
|
13
6
|
export { createPdf } from './builder.js';
|
|
14
7
|
export { validate } from './validate.js';
|
|
@@ -20,6 +13,10 @@ let _fnSetCounter = 0;
|
|
|
20
13
|
* - `id`: unique string for use as `InlineSpan.footnoteRef`
|
|
21
14
|
* - `def`: a `FootnoteDefElement` ready to push into `doc.content`
|
|
22
15
|
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* IDs are generated using a module-level counter and are unique within a process.
|
|
18
|
+
* They are not stable across separate module loads.
|
|
19
|
+
*
|
|
23
20
|
* @example
|
|
24
21
|
* ```ts
|
|
25
22
|
* const fns = createFootnoteSet([
|
|
@@ -27,9 +24,10 @@ let _fnSetCounter = 0;
|
|
|
27
24
|
* { text: 'Ibid., p. 42.' },
|
|
28
25
|
* ])
|
|
29
26
|
* // In content:
|
|
30
|
-
* // { type: 'rich-paragraph', spans: [{ text: 'Text', footnoteRef: fns[0].id }] }
|
|
27
|
+
* // \{ type: 'rich-paragraph', spans: [\{ text: 'Text', footnoteRef: fns[0].id \}] \}
|
|
31
28
|
* // ...fns.map(f => f.def)
|
|
32
29
|
* ```
|
|
30
|
+
* @beta
|
|
33
31
|
*/
|
|
34
32
|
export function createFootnoteSet(items) {
|
|
35
33
|
const base = _fnSetCounter++;
|
|
@@ -38,232 +36,37 @@ export function createFootnoteSet(items) {
|
|
|
38
36
|
return { id, def: { type: 'footnote-def', id, ...item } };
|
|
39
37
|
});
|
|
40
38
|
}
|
|
41
|
-
/**
|
|
42
|
-
* Resolve the active header and footer for a given 1-based page number.
|
|
43
|
-
* The first matching section (fromPage/toPage range) wins; falls back to
|
|
44
|
-
* doc.header / doc.footer when no section matches.
|
|
45
|
-
* Internal — used by the render pipeline. Not part of the public API.
|
|
46
|
-
*/
|
|
47
|
-
function resolveHeaderFooter(doc, pageNumber) {
|
|
48
|
-
const section = doc.sections?.find(s => {
|
|
49
|
-
const from = s.fromPage ?? 1;
|
|
50
|
-
const to = s.toPage ?? Infinity;
|
|
51
|
-
return pageNumber >= from && pageNumber <= to;
|
|
52
|
-
});
|
|
53
|
-
return {
|
|
54
|
-
header: section?.header ?? doc.header,
|
|
55
|
-
footer: section?.footer ?? doc.footer,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
39
|
/**
|
|
59
40
|
* Render a PdfDocument to PDF bytes.
|
|
60
41
|
*
|
|
61
|
-
* Works in Node.js (requires
|
|
42
|
+
* Works in Node.js (requires `@napi-rs/canvas` peer dep) and in the browser.
|
|
62
43
|
*
|
|
63
44
|
* @example
|
|
64
45
|
* ```ts
|
|
65
46
|
* import { render } from 'pretext-pdf'
|
|
66
47
|
*
|
|
67
|
-
* const pdf = await render({
|
|
48
|
+
* const pdf = await render(\{
|
|
68
49
|
* content: [
|
|
69
|
-
* { type: 'heading', level: 1, text: 'Hello World' },
|
|
70
|
-
* { type: 'paragraph', text: 'This is a paragraph.' },
|
|
71
|
-
* { type: 'hr' },
|
|
72
|
-
* { type: 'list', style: 'unordered', items: [{ text: 'Item one' }, { text: 'Item two' }] },
|
|
50
|
+
* \{ type: 'heading', level: 1, text: 'Hello World' \},
|
|
51
|
+
* \{ type: 'paragraph', text: 'This is a paragraph.' \},
|
|
73
52
|
* ]
|
|
74
|
-
* })
|
|
53
|
+
* \})
|
|
75
54
|
* fs.writeFileSync('output.pdf', pdf)
|
|
76
55
|
* ```
|
|
56
|
+
* @public
|
|
77
57
|
*/
|
|
78
58
|
export async function render(doc, options) {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (typeof OffscreenCanvas === 'undefined' && typeof window === 'undefined') {
|
|
82
|
-
const { installNodePolyfill } = await import('./node-polyfill.js');
|
|
83
|
-
await installNodePolyfill();
|
|
84
|
-
}
|
|
85
|
-
// ── Stage 1: Validate ─────────────────────────────────────────────────────────
|
|
86
|
-
validate(doc, options);
|
|
87
|
-
// ── Resolve page geometry ──────────────────────────────────────────────────────
|
|
88
|
-
const [pageWidth, pageHeight] = resolvePageDimensions(doc.pageSize);
|
|
89
|
-
const margins = {
|
|
90
|
-
top: doc.margins?.top ?? 72,
|
|
91
|
-
bottom: doc.margins?.bottom ?? 72,
|
|
92
|
-
left: doc.margins?.left ?? 72,
|
|
93
|
-
right: doc.margins?.right ?? 72,
|
|
94
|
-
};
|
|
95
|
-
const contentWidth = pageWidth - margins.left - margins.right;
|
|
96
|
-
if (contentWidth <= 0) {
|
|
97
|
-
throw new PretextPdfError('PAGE_TOO_SMALL', `Content width is ${contentWidth}pt after applying margins. Reduce margins or increase page size.`);
|
|
98
|
-
}
|
|
99
|
-
// ── Stage 2: Load Fonts + Images ──────────────────────────────────────────────
|
|
100
|
-
// pdfDoc is created ONCE here and passed to all stages.
|
|
101
|
-
const pdfDoc = await PDFDocument.create();
|
|
102
|
-
// Set PDF metadata before loading anything else
|
|
103
|
-
if (doc.metadata) {
|
|
104
|
-
const m = doc.metadata;
|
|
105
|
-
if (m.title)
|
|
106
|
-
pdfDoc.setTitle(m.title);
|
|
107
|
-
if (m.author)
|
|
108
|
-
pdfDoc.setAuthor(m.author);
|
|
109
|
-
if (m.subject)
|
|
110
|
-
pdfDoc.setSubject(m.subject);
|
|
111
|
-
if (m.keywords)
|
|
112
|
-
pdfDoc.setKeywords(m.keywords);
|
|
113
|
-
pdfDoc.setCreator(m.creator ?? 'pretext-pdf');
|
|
114
|
-
if (m.producer)
|
|
115
|
-
pdfDoc.setProducer(m.producer);
|
|
116
|
-
if (m.language) {
|
|
117
|
-
// Set PDF language attribute via catalog
|
|
118
|
-
pdfDoc.catalog.set(PDFName.of('Lang'), PDFString.of(m.language));
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// Set PDF creation/modification date
|
|
122
|
-
const creationDate = doc.renderDate
|
|
123
|
-
? (doc.renderDate instanceof Date ? doc.renderDate : new Date(doc.renderDate))
|
|
124
|
-
: new Date();
|
|
125
|
-
pdfDoc.setCreationDate(creationDate);
|
|
126
|
-
pdfDoc.setModificationDate(creationDate);
|
|
127
|
-
// Load fonts and images in parallel — both are I/O-bound and independent
|
|
128
|
-
const [fontMap, imageMap] = await Promise.all([
|
|
129
|
-
loadFonts(doc, pdfDoc),
|
|
130
|
-
loadImages(doc, pdfDoc, contentWidth),
|
|
131
|
-
]);
|
|
132
|
-
// ── Measure header/footer heights (needed to compute available content area) ───
|
|
133
|
-
const defaultFont = doc.defaultFont ?? 'Inter';
|
|
134
|
-
const headerHeight = doc.header
|
|
135
|
-
? await measureHeaderFooterHeight(doc.header.text, doc.header.fontSize ?? 10, doc.header.fontFamily ?? defaultFont, contentWidth, (doc.header.fontSize ?? 10) * LINE_HEIGHT_COMPACT) + 8 // 8pt padding between header and content
|
|
136
|
-
: 0;
|
|
137
|
-
const footerHeight = doc.footer
|
|
138
|
-
? await measureHeaderFooterHeight(doc.footer.text, doc.footer.fontSize ?? 10, doc.footer.fontFamily ?? defaultFont, contentWidth, (doc.footer.fontSize ?? 10) * LINE_HEIGHT_COMPACT) + 8
|
|
139
|
-
: 0;
|
|
140
|
-
const contentHeight = pageHeight - margins.top - margins.bottom - headerHeight - footerHeight;
|
|
141
|
-
if (contentHeight <= 0) {
|
|
142
|
-
throw new PretextPdfError('PAGE_TOO_SMALL', `Content height is ${contentHeight}pt after applying margins + header/footer. Try reducing margins, header/footer font size, or increasing page size.`);
|
|
143
|
-
}
|
|
144
|
-
// ── Stage 3: Measure ──────────────────────────────────────────────────────────
|
|
145
|
-
// measureAllBlocks handles:
|
|
146
|
-
// - image key resolution (content index → img-N key)
|
|
147
|
-
// - list flattening (1 ListElement → N MeasuredBlocks)
|
|
148
|
-
// - all other elements (direct 1:1 mapping)
|
|
149
|
-
let measuredBlocks = await measureAllBlocks(doc, contentWidth, imageMap, contentHeight);
|
|
150
|
-
// ── Two-Pass TOC (if document contains a toc element) ───────────────────────────
|
|
151
|
-
const { buildTocEntryBlocks } = await import('./measure.js');
|
|
152
|
-
const tocIndex = doc.content.findIndex(el => el.type === 'toc');
|
|
153
|
-
if (tocIndex !== -1) {
|
|
154
|
-
const tocElement = doc.content[tocIndex];
|
|
155
|
-
if (!tocElement || tocElement.type !== 'toc')
|
|
156
|
-
throw new Error('TOC element type mismatch'); // Type guard
|
|
157
|
-
// Pass 1: paginate without real TOC content to collect heading page numbers
|
|
158
|
-
const draftPaginatedDoc = paginate(measuredBlocks, contentHeight);
|
|
159
|
-
// Build real TOC entry blocks using draft page numbers
|
|
160
|
-
const tocEntryBlocks = await buildTocEntryBlocks(draftPaginatedDoc.headings, tocElement, contentWidth, doc);
|
|
161
|
-
// Splice TOC entries into measuredBlocks at the placeholder index
|
|
162
|
-
// The placeholder (zero-height) block at tocIndex is replaced by the entry blocks
|
|
163
|
-
measuredBlocks = [
|
|
164
|
-
...measuredBlocks.slice(0, tocIndex),
|
|
165
|
-
...tocEntryBlocks,
|
|
166
|
-
...measuredBlocks.slice(tocIndex + 1),
|
|
167
|
-
];
|
|
59
|
+
if (typeof Intl?.Segmenter !== 'function') {
|
|
60
|
+
throw new PretextPdfError('RENDER_FAILED', 'Intl.Segmenter is not available in this runtime. Upgrade to Node.js 18+ or set NODE_ICU_DATA to a full-icu data file.');
|
|
168
61
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
const paginateConfig = { minOrphanLines: 2, minWidowLines: 2 };
|
|
172
|
-
// ── Footnote two-pass orchestration ───────────────────────────────────────────
|
|
173
|
-
const footnoteDefElements = doc.content.filter(el => el.type === 'footnote-def');
|
|
174
|
-
let paginatedDoc;
|
|
175
|
-
if (footnoteDefElements.length === 0) {
|
|
176
|
-
// No footnotes — single pass, normal flow
|
|
177
|
-
paginatedDoc = paginate(measuredBlocks, contentHeight, paginateConfig);
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
// Build a map of def id → measured height (already measured in measuredBlocks)
|
|
181
|
-
const footnoteDefHeightMap = new Map();
|
|
182
|
-
for (const block of measuredBlocks) {
|
|
183
|
-
if (block.element.type === 'footnote-def') {
|
|
184
|
-
const def = block.element;
|
|
185
|
-
footnoteDefHeightMap.set(def.id, block.height + (block.spaceAfter ?? 0));
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
// Strip footnote-def blocks from the block stream (defs are not placed in flow)
|
|
189
|
-
const flowBlocks = measuredBlocks.filter(b => b.element.type !== 'footnote-def');
|
|
190
|
-
// Build document-order footnote numbering before pagination (controls rendering order)
|
|
191
|
-
const footnoteNumbering = buildFootnoteNumbering(doc.content);
|
|
192
|
-
// PASS 1: Paginate without any footnote zone reservation
|
|
193
|
-
const pass1 = paginate(flowBlocks, contentHeight, paginateConfig);
|
|
194
|
-
// Determine which footnote refs land on which page
|
|
195
|
-
const pageFootnoteRefs = new Map();
|
|
196
|
-
for (let pageIdx = 0; pageIdx < pass1.pages.length; pageIdx++) {
|
|
197
|
-
const page = pass1.pages[pageIdx];
|
|
198
|
-
const refsOnPageSet = new Set();
|
|
199
|
-
for (const pagedBlock of page.blocks) {
|
|
200
|
-
const el = pagedBlock.measuredBlock.element;
|
|
201
|
-
if (el.type === 'rich-paragraph') {
|
|
202
|
-
for (const span of el.spans) {
|
|
203
|
-
if (span.footnoteRef)
|
|
204
|
-
refsOnPageSet.add(span.footnoteRef);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
if (refsOnPageSet.size > 0) {
|
|
209
|
-
pageFootnoteRefs.set(pageIdx, [...refsOnPageSet]);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
// Build per-page footnote zone heights
|
|
213
|
-
const SEPARATOR_HEIGHT = 16; // separator line + padding above/below
|
|
214
|
-
const footnoteZones = new Map();
|
|
215
|
-
for (const [pageIdx, refIds] of pageFootnoteRefs) {
|
|
216
|
-
let zoneHeight = SEPARATOR_HEIGHT;
|
|
217
|
-
for (const refId of refIds) {
|
|
218
|
-
zoneHeight += footnoteDefHeightMap.get(refId) ?? 0;
|
|
219
|
-
}
|
|
220
|
-
footnoteZones.set(pageIdx, zoneHeight);
|
|
221
|
-
}
|
|
222
|
-
// PASS 2: Paginate with zones reserved
|
|
223
|
-
const pass2Config = { ...paginateConfig, footnoteZones };
|
|
224
|
-
paginatedDoc = paginate(flowBlocks, contentHeight, pass2Config);
|
|
225
|
-
paginatedDoc.footnoteNumbering = footnoteNumbering;
|
|
226
|
-
// Annotate each RenderedPage with its footnote items
|
|
227
|
-
for (const [pageIdx, refIds] of pageFootnoteRefs) {
|
|
228
|
-
if (pageIdx >= paginatedDoc.pages.length) {
|
|
229
|
-
throw new PretextPdfError('PAGINATION_FAILED', `Footnote zone computed for page ${pageIdx} but document only has ${paginatedDoc.pages.length} pages. This is a pagination bug.`);
|
|
230
|
-
}
|
|
231
|
-
const page = paginatedDoc.pages[pageIdx];
|
|
232
|
-
if (!page) {
|
|
233
|
-
throw new PretextPdfError('PAGINATION_FAILED', `Footnote zone computed for page ${pageIdx} but document only has ${paginatedDoc.pages.length} pages. This is a pagination bug.`);
|
|
234
|
-
}
|
|
235
|
-
{
|
|
236
|
-
page.footnoteItems = refIds
|
|
237
|
-
.map(id => {
|
|
238
|
-
const def = footnoteDefElements.find(d => d.id === id);
|
|
239
|
-
const num = footnoteNumbering.get(id) ?? 0;
|
|
240
|
-
return def ? { def, number: num } : null;
|
|
241
|
-
})
|
|
242
|
-
.filter(Boolean);
|
|
243
|
-
const zoneHeight = footnoteZones.get(pageIdx);
|
|
244
|
-
if (zoneHeight !== undefined)
|
|
245
|
-
page.footnoteZoneHeight = zoneHeight;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
// ── Stage 5: Render ───────────────────────────────────────────────────────────
|
|
250
|
-
const geo = {
|
|
251
|
-
pageWidth,
|
|
252
|
-
pageHeight,
|
|
253
|
-
margins,
|
|
254
|
-
contentWidth,
|
|
255
|
-
contentHeight,
|
|
256
|
-
headerHeight,
|
|
257
|
-
footerHeight,
|
|
258
|
-
};
|
|
259
|
-
const rawBytes = await renderDocument(paginatedDoc, doc, fontMap, imageMap, pdfDoc, geo);
|
|
260
|
-
const signedBytes = (doc.signature?.p12) ? await applySignature(rawBytes, doc.signature) : rawBytes;
|
|
261
|
-
return doc.encryption ? await applyEncryption(signedBytes, doc.encryption) : signedBytes;
|
|
62
|
+
const rawBytes = await runPipeline(doc, options);
|
|
63
|
+
return applyPostProcessing(rawBytes, doc);
|
|
262
64
|
}
|
|
263
65
|
/**
|
|
264
66
|
* Merge multiple pre-rendered PDFs into a single PDF.
|
|
265
|
-
* @param pdfs Array of Uint8Array PDF bytes to combine
|
|
67
|
+
* @param pdfs - Array of Uint8Array PDF bytes to combine
|
|
266
68
|
* @returns Combined PDF bytes
|
|
69
|
+
* @public
|
|
267
70
|
*/
|
|
268
71
|
export async function merge(pdfs) {
|
|
269
72
|
if (!pdfs || pdfs.length === 0) {
|
|
@@ -285,8 +88,9 @@ export async function merge(pdfs) {
|
|
|
285
88
|
}
|
|
286
89
|
/**
|
|
287
90
|
* Assemble a PDF from a mix of new documents and pre-rendered PDF parts.
|
|
288
|
-
* @param parts Array of AssemblyPart — each is either a doc to render or raw PDF bytes
|
|
91
|
+
* @param parts - Array of AssemblyPart — each is either a doc to render or raw PDF bytes
|
|
289
92
|
* @returns Combined PDF bytes
|
|
93
|
+
* @public
|
|
290
94
|
*/
|
|
291
95
|
export async function assemble(parts) {
|
|
292
96
|
if (!parts || parts.length === 0) {
|
|
@@ -310,94 +114,6 @@ export async function assemble(parts) {
|
|
|
310
114
|
}
|
|
311
115
|
return target.save();
|
|
312
116
|
}
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
* Requires the optional peer dep @signpdf/signpdf.
|
|
316
|
-
*/
|
|
317
|
-
async function applySignature(pdfBytes, sig) {
|
|
318
|
-
let signpdfMod;
|
|
319
|
-
try {
|
|
320
|
-
signpdfMod = await import('@signpdf/signpdf');
|
|
321
|
-
}
|
|
322
|
-
catch {
|
|
323
|
-
throw new PretextPdfError('SIGNATURE_DEP_MISSING', 'Cryptographic signing requires the @signpdf/signpdf package. Install it: npm install @signpdf/signpdf');
|
|
324
|
-
}
|
|
325
|
-
const { SignPdf, pdflibAddPlaceholder } = signpdfMod;
|
|
326
|
-
// Load P12 certificate bytes
|
|
327
|
-
let p12Buffer;
|
|
328
|
-
try {
|
|
329
|
-
if (sig.p12 instanceof Uint8Array) {
|
|
330
|
-
p12Buffer = Buffer.from(sig.p12);
|
|
331
|
-
}
|
|
332
|
-
else {
|
|
333
|
-
const p12Path = sig.p12;
|
|
334
|
-
if (!path.isAbsolute(p12Path)) {
|
|
335
|
-
throw new PretextPdfError('SIGNATURE_P12_LOAD_FAILED', 'P12 path must be absolute');
|
|
336
|
-
}
|
|
337
|
-
const { promises: fs } = await import('node:fs');
|
|
338
|
-
p12Buffer = await fs.readFile(p12Path);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
catch (e) {
|
|
342
|
-
if (e instanceof PretextPdfError)
|
|
343
|
-
throw e;
|
|
344
|
-
throw new PretextPdfError('SIGNATURE_P12_LOAD_FAILED', 'Failed to load P12 certificate');
|
|
345
|
-
}
|
|
346
|
-
// Re-load into PDFDocument to inject the byte-range placeholder dict
|
|
347
|
-
const pdfDoc = await PDFDocument.load(pdfBytes);
|
|
348
|
-
pdflibAddPlaceholder({
|
|
349
|
-
pdfDoc,
|
|
350
|
-
reason: sig.reason ?? 'Signed',
|
|
351
|
-
contactInfo: sig.contactInfo ?? '',
|
|
352
|
-
name: sig.signerName ?? '',
|
|
353
|
-
location: sig.location ?? '',
|
|
354
|
-
});
|
|
355
|
-
const pdfWithPlaceholder = await pdfDoc.save({ useObjectStreams: false });
|
|
356
|
-
const signer = new SignPdf();
|
|
357
|
-
let signedBuffer;
|
|
358
|
-
try {
|
|
359
|
-
signedBuffer = await signer.sign(Buffer.from(pdfWithPlaceholder), p12Buffer, sig.passphrase !== undefined ? { passphrase: sig.passphrase } : undefined);
|
|
360
|
-
}
|
|
361
|
-
catch (e) {
|
|
362
|
-
throw new PretextPdfError('SIGNATURE_FAILED', `PDF signing failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
363
|
-
}
|
|
364
|
-
return new Uint8Array(signedBuffer);
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* Stage 6: Apply encryption (post-process).
|
|
368
|
-
* @cantoo/pdf-lib is now a direct dependency — no lazy-load needed.
|
|
369
|
-
*/
|
|
370
|
-
async function applyEncryption(pdfBytes, enc) {
|
|
371
|
-
const encDoc = await PDFDocument.load(pdfBytes);
|
|
372
|
-
encDoc.encrypt({
|
|
373
|
-
userPassword: enc.userPassword ?? '',
|
|
374
|
-
ownerPassword: enc.ownerPassword ?? (await import('node:crypto')).randomUUID(),
|
|
375
|
-
permissions: {
|
|
376
|
-
printing: enc.permissions?.printing ?? true,
|
|
377
|
-
copying: enc.permissions?.copying ?? true,
|
|
378
|
-
modifying: enc.permissions?.modifying ?? false,
|
|
379
|
-
annotating: enc.permissions?.annotating ?? true,
|
|
380
|
-
},
|
|
381
|
-
});
|
|
382
|
-
// useObjectStreams: false is required for Adobe Reader compatibility with encrypted PDFs
|
|
383
|
-
return encDoc.save({ useObjectStreams: false });
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* Build document-order footnote numbering by scanning rich-paragraphs in content order.
|
|
387
|
-
* This step happens before paginate so that render order is stable and decoupled from pagination.
|
|
388
|
-
*/
|
|
389
|
-
function buildFootnoteNumbering(content) {
|
|
390
|
-
const numbering = new Map();
|
|
391
|
-
let counter = 1;
|
|
392
|
-
for (const el of content) {
|
|
393
|
-
if (el.type === 'rich-paragraph') {
|
|
394
|
-
for (const span of el.spans) {
|
|
395
|
-
if (span.footnoteRef && !numbering.has(span.footnoteRef)) {
|
|
396
|
-
numbering.set(span.footnoteRef, counter++);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
return numbering;
|
|
402
|
-
}
|
|
117
|
+
// ─── Schema reflection ────────────────────────────────────────────────────────
|
|
118
|
+
export { ELEMENT_TYPES } from './element-types.js';
|
|
403
119
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout inspection API — run the pipeline up to pagination without rendering.
|
|
3
|
+
* @internal Not part of the stable public API. Subject to change without a semver bump.
|
|
4
|
+
*/
|
|
5
|
+
import { PDFDocument } from '@cantoo/pdf-lib';
|
|
6
|
+
import type { PdfDocument, RenderOptions } from './types-public.js';
|
|
7
|
+
import type { MeasuredBlock, PaginatedDocument, PageGeometry, FontMap, ImageMap } from './types-internal.js';
|
|
8
|
+
export interface LayoutState {
|
|
9
|
+
doc: PdfDocument;
|
|
10
|
+
measuredBlocks: MeasuredBlock[];
|
|
11
|
+
paginatedDoc: PaginatedDocument;
|
|
12
|
+
pdfDoc: PDFDocument;
|
|
13
|
+
fontMap: FontMap;
|
|
14
|
+
imageMap: ImageMap;
|
|
15
|
+
pageGeometry: PageGeometry;
|
|
16
|
+
}
|
|
17
|
+
export interface LayoutTrace {
|
|
18
|
+
document: {
|
|
19
|
+
contentCount: number;
|
|
20
|
+
};
|
|
21
|
+
measuredBlocks: Array<{
|
|
22
|
+
type: string;
|
|
23
|
+
height: number;
|
|
24
|
+
isRTL: boolean;
|
|
25
|
+
}>;
|
|
26
|
+
pages: Array<{
|
|
27
|
+
blockCount: number;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Run pipeline stages 1-4 (validate → init → loadAssets → measure → paginate)
|
|
32
|
+
* without rendering. Returns intermediate state for inspection and testing.
|
|
33
|
+
*/
|
|
34
|
+
export declare function prepareLayoutState(doc: PdfDocument, options?: RenderOptions): Promise<LayoutState>;
|
|
35
|
+
/**
|
|
36
|
+
* Produce a JSON-serializable summary of a LayoutState for debugging and contracts.
|
|
37
|
+
*/
|
|
38
|
+
export declare function summarizeLayoutState(state: LayoutState): LayoutTrace;
|
|
39
|
+
//# sourceMappingURL=layout-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-state.d.ts","sourceRoot":"","sources":["../src/layout-state.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAI5G,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,WAAW,CAAA;IAChB,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,YAAY,EAAE,iBAAiB,CAAA;IAC/B,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,QAAQ,CAAA;IAClB,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;IAClC,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IACvE,KAAK,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACrC;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBxG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAcpE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { stageValidate, stageInit, stageLoadAssets, stageFinalizeGeo, stageMeasure, stagePaginate } from './pipeline.js';
|
|
2
|
+
import { PretextPdfError } from './errors.js';
|
|
3
|
+
/**
|
|
4
|
+
* Run pipeline stages 1-4 (validate → init → loadAssets → measure → paginate)
|
|
5
|
+
* without rendering. Returns intermediate state for inspection and testing.
|
|
6
|
+
*/
|
|
7
|
+
export async function prepareLayoutState(doc, options) {
|
|
8
|
+
if (typeof Intl?.Segmenter !== 'function') {
|
|
9
|
+
throw new PretextPdfError('RENDER_FAILED', 'Intl.Segmenter is not available in this runtime. Upgrade to Node.js 18+ or set NODE_ICU_DATA to a full-icu data file.');
|
|
10
|
+
}
|
|
11
|
+
if (typeof OffscreenCanvas === 'undefined' && typeof window === 'undefined') {
|
|
12
|
+
try {
|
|
13
|
+
const { installNodePolyfill } = await import('./node-polyfill.js');
|
|
14
|
+
await installNodePolyfill();
|
|
15
|
+
}
|
|
16
|
+
catch (e) {
|
|
17
|
+
throw new PretextPdfError('CANVAS_UNAVAILABLE', `Failed to initialize Node.js canvas polyfill: ${e instanceof Error ? e.message : String(e)}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
stageValidate(doc, options);
|
|
21
|
+
const { pdfDoc, geo: partialGeo, defaultFont } = await stageInit(doc);
|
|
22
|
+
const { fontMap, imageMap } = await stageLoadAssets(doc, pdfDoc, partialGeo.contentWidth, options?.plugins);
|
|
23
|
+
const geo = await stageFinalizeGeo(doc, partialGeo, defaultFont);
|
|
24
|
+
const measuredBlocks = await stageMeasure(doc, geo.contentWidth, imageMap, geo.contentHeight, options?.plugins);
|
|
25
|
+
const paginatedDoc = stagePaginate(measuredBlocks, geo.contentHeight, doc);
|
|
26
|
+
return { doc, measuredBlocks, paginatedDoc, pdfDoc, fontMap, imageMap, pageGeometry: geo };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Produce a JSON-serializable summary of a LayoutState for debugging and contracts.
|
|
30
|
+
*/
|
|
31
|
+
export function summarizeLayoutState(state) {
|
|
32
|
+
return {
|
|
33
|
+
document: {
|
|
34
|
+
contentCount: state.doc.content.length,
|
|
35
|
+
},
|
|
36
|
+
measuredBlocks: state.measuredBlocks.map(block => ({
|
|
37
|
+
type: block.element.type,
|
|
38
|
+
height: block.height,
|
|
39
|
+
isRTL: 'dir' in block.element && block.element.dir === 'rtl',
|
|
40
|
+
})),
|
|
41
|
+
pages: state.paginatedDoc.pages.map(page => ({
|
|
42
|
+
blockCount: page.blocks.length,
|
|
43
|
+
})),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=layout-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-state.js","sourceRoot":"","sources":["../src/layout-state.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACxH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAkB7C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAgB,EAAE,OAAuB;IAChF,IAAI,OAAO,IAAI,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;QAC1C,MAAM,IAAI,eAAe,CAAC,eAAe,EAAE,uHAAuH,CAAC,CAAA;IACrK,CAAC;IACD,IAAI,OAAO,eAAe,KAAK,WAAW,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAC5E,IAAI,CAAC;YACH,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;YAClE,MAAM,mBAAmB,EAAE,CAAA;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,eAAe,CAAC,oBAAoB,EAAE,iDAAiD,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAChJ,CAAC;IACH,CAAC;IAED,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAE3B,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;IACrE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC3G,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,CAAC,CAAA;IAChE,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAC/G,MAAM,YAAY,GAAG,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IAE1E,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,CAAA;AAC5F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAkB;IACrD,OAAO;QACL,QAAQ,EAAE;YACR,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM;SACvC;QACD,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,IAAK,KAAK,CAAC,OAA4B,CAAC,GAAG,KAAK,KAAK;SACnF,CAAC,CAAC;QACH,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;SAC/B,CAAC,CAAC;KACJ,CAAA;AACH,CAAC"}
|
package/dist/measure-blocks.d.ts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* measure-blocks.ts — Per-element-type measurement functions
|
|
3
3
|
* All the specific measurer functions for different content types.
|
|
4
4
|
*/
|
|
5
|
-
import type { ContentElement,
|
|
5
|
+
import type { ContentElement, ColumnDef, PdfDocument } from './types.js';
|
|
6
|
+
import type { MeasuredBlock, ImageMap } from './types-internal.js';
|
|
6
7
|
import { HyphenatorOpts } from './measure-text.js';
|
|
7
8
|
export declare function measureBlock(element: ContentElement, contentWidth: number, doc: PdfDocument, hyphenatorOpts?: HyphenatorOpts): Promise<MeasuredBlock | MeasuredBlock[]>;
|
|
8
9
|
/** Measure an image element with its known imageMap key */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"measure-blocks.d.ts","sourceRoot":"","sources":["../src/measure-blocks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"measure-blocks.d.ts","sourceRoot":"","sources":["../src/measure-blocks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,cAAc,EAAE,SAAS,EAAgB,WAAW,EACrD,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EACV,aAAa,EAEb,QAAQ,EACT,MAAM,qBAAqB,CAAA;AAI5B,OAAO,EAAe,cAAc,EAAmC,MAAM,mBAAmB,CAAA;AAwBhG,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,WAAW,EAChB,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,aAAa,GAAG,aAAa,EAAE,CAAC,CAmgB1C;AAMD,2DAA2D;AAC3D,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,YAAY,EAAE,YAAY,EAC1C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,aAAa,CAAC,CAqExB;AAID,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,YAAY,EAAE,YAAY,EAC1C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EACzB,GAAG,EAAE,OAAO,YAAY,EAAE,WAAW,GACpC,OAAO,CAAC,aAAa,CAAC,CAiFxB;AAID,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,YAAY,EAAE,iBAAiB,EAC/C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,MAAM,EACpB,iBAAiB,EAAE,MAAM,EACzB,GAAG,EAAE,WAAW,EAChB,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,aAAa,CAAC,CA8GxB;AAmaD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,EAAE,EACpB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,MAAM,EAAE,CA4EV;AA8ND;;;GAGG"}
|