pretext-pdf 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +242 -0
  2. package/LICENSE +21 -0
  3. package/README.md +402 -0
  4. package/dist/assets.d.ts +14 -0
  5. package/dist/assets.d.ts.map +1 -0
  6. package/dist/assets.js +182 -0
  7. package/dist/assets.js.map +1 -0
  8. package/dist/builder.d.ts +53 -0
  9. package/dist/builder.d.ts.map +1 -0
  10. package/dist/builder.js +129 -0
  11. package/dist/builder.js.map +1 -0
  12. package/dist/errors.d.ts +7 -0
  13. package/dist/errors.d.ts.map +1 -0
  14. package/dist/errors.js +13 -0
  15. package/dist/errors.js.map +1 -0
  16. package/dist/fonts.d.ts +21 -0
  17. package/dist/fonts.d.ts.map +1 -0
  18. package/dist/fonts.js +310 -0
  19. package/dist/fonts.js.map +1 -0
  20. package/dist/index.d.ts +29 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +154 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/measure.d.ts +53 -0
  25. package/dist/measure.d.ts.map +1 -0
  26. package/dist/measure.js +1029 -0
  27. package/dist/measure.js.map +1 -0
  28. package/dist/node-polyfill.d.ts +7 -0
  29. package/dist/node-polyfill.d.ts.map +1 -0
  30. package/dist/node-polyfill.js +82 -0
  31. package/dist/node-polyfill.js.map +1 -0
  32. package/dist/page-sizes.d.ts +13 -0
  33. package/dist/page-sizes.d.ts.map +1 -0
  34. package/dist/page-sizes.js +24 -0
  35. package/dist/page-sizes.js.map +1 -0
  36. package/dist/paginate.d.ts +15 -0
  37. package/dist/paginate.d.ts.map +1 -0
  38. package/dist/paginate.js +395 -0
  39. package/dist/paginate.js.map +1 -0
  40. package/dist/render.d.ts +12 -0
  41. package/dist/render.d.ts.map +1 -0
  42. package/dist/render.js +1028 -0
  43. package/dist/render.js.map +1 -0
  44. package/dist/rich-text.d.ts +14 -0
  45. package/dist/rich-text.d.ts.map +1 -0
  46. package/dist/rich-text.js +183 -0
  47. package/dist/rich-text.js.map +1 -0
  48. package/dist/types.d.ts +697 -0
  49. package/dist/types.d.ts.map +1 -0
  50. package/dist/types.js +2 -0
  51. package/dist/types.js.map +1 -0
  52. package/dist/validate.d.ts +3 -0
  53. package/dist/validate.d.ts.map +1 -0
  54. package/dist/validate.js +786 -0
  55. package/dist/validate.js.map +1 -0
  56. package/package.json +79 -0
package/dist/fonts.js ADDED
@@ -0,0 +1,310 @@
1
+ import fontkit from '@pdf-lib/fontkit';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { PretextPdfError } from './errors.js';
6
+ import { buildFontKey } from './measure.js';
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ /**
9
+ * Font loading strategy:
10
+ * - TTF files for pdf-lib embedding (fontkit handles TTF natively, woff2 has glyph corruption bugs)
11
+ * - woff2 for @napi-rs/canvas measurement (canvas handles woff2 perfectly via Skia)
12
+ *
13
+ * TTF priority: bundled fonts/ dir first, then @fontsource woff2 as fallback
14
+ */
15
+ /** Path to bundled Inter 400 normal font — TTF preferred for pdf-lib */
16
+ const BUNDLED_INTER_PATHS = [
17
+ path.join(__dirname, '..', 'fonts', 'Inter-Regular.ttf'),
18
+ path.join(__dirname, '..', 'node_modules', '@fontsource', 'inter', 'files', 'inter-latin-400-normal.woff2'),
19
+ path.join(__dirname, '..', 'node_modules', '@fontsource', 'inter', 'files', 'inter-all-400-normal.woff2'),
20
+ ];
21
+ /** Path to bundled Inter 700 (bold) font — TTF preferred for pdf-lib */
22
+ const BUNDLED_INTER_BOLD_PATHS = [
23
+ path.join(__dirname, '..', 'fonts', 'Inter-Bold.ttf'),
24
+ path.join(__dirname, '..', 'node_modules', '@fontsource', 'inter', 'files', 'inter-latin-700-normal.woff2'),
25
+ path.join(__dirname, '..', 'node_modules', '@fontsource', 'inter', 'files', 'inter-all-700-normal.woff2'),
26
+ ];
27
+ /**
28
+ * Stage 2: Load and embed all fonts.
29
+ * - Scans document for all font references
30
+ * - Loads font bytes (file system or Uint8Array)
31
+ * - Embeds each into pdfDoc via fontkit
32
+ * - Returns FontMap for use in measure + render stages
33
+ *
34
+ * NOTE: pdfDoc is already created by the caller. Fonts are embedded into it here.
35
+ * The same pdfDoc is used in Stage 5 (render).
36
+ */
37
+ export async function loadFonts(doc, pdfDoc) {
38
+ pdfDoc.registerFontkit(fontkit);
39
+ const fontMap = new Map();
40
+ const defaultFamily = doc.defaultFont ?? 'Inter';
41
+ // Collect all font variants referenced in the document
42
+ const needed = collectNeededFonts(doc);
43
+ // Always ensure Inter 400 is available as the default fallback
44
+ if (!needed.has(buildFontKey('Inter', 400, 'normal'))) {
45
+ needed.set(buildFontKey('Inter', 400, 'normal'), {
46
+ family: 'Inter', weight: 400, style: 'normal', src: 'bundled'
47
+ });
48
+ }
49
+ if (!needed.has(buildFontKey('Inter', 700, 'normal'))) {
50
+ needed.set(buildFontKey('Inter', 700, 'normal'), {
51
+ family: 'Inter', weight: 700, style: 'normal', src: 'bundled'
52
+ });
53
+ }
54
+ // Load all font bytes in parallel
55
+ const loadPromises = Array.from(needed.entries()).map(async ([key, spec]) => {
56
+ const bytes = await loadFontBytes(spec);
57
+ return { key, bytes, spec };
58
+ });
59
+ const loaded = await Promise.all(loadPromises);
60
+ // Embed each font into pdfDoc (must be sequential — pdf-lib limitation)
61
+ for (const { key, bytes, spec } of loaded) {
62
+ try {
63
+ // Phase 6D: Use fontkit's built-in subsetting for TTF fonts.
64
+ // TTF magic bytes: 0x00010000 (TrueType) or 0x74727565 ('true').
65
+ // woff2 starts with 0x774F4632 — fontkit has a known subsetting bug for woff2.
66
+ const isTTF = bytes.length >= 4 && ((bytes[0] === 0x00 && bytes[1] === 0x01 && bytes[2] === 0x00 && bytes[3] === 0x00) ||
67
+ (bytes[0] === 0x74 && bytes[1] === 0x72 && bytes[2] === 0x75 && bytes[3] === 0x65));
68
+ const pdfFont = await pdfDoc.embedFont(bytes, { subset: isTTF });
69
+ fontMap.set(key, pdfFont);
70
+ }
71
+ catch (err) {
72
+ throw new PretextPdfError('FONT_EMBED_FAILED', `Failed to embed font "${spec.family ?? key}": ${err instanceof Error ? err.message : String(err)}`);
73
+ }
74
+ }
75
+ // Set default font
76
+ const defaultKey = buildFontKey(defaultFamily, 400, 'normal');
77
+ if (!fontMap.has(defaultKey)) {
78
+ // Default font wasn't explicitly added — try Inter as fallback
79
+ const interKey = buildFontKey('Inter', 400, 'normal');
80
+ const interFont = fontMap.get(interKey);
81
+ if (interFont) {
82
+ fontMap.set(defaultKey, interFont);
83
+ }
84
+ }
85
+ return fontMap;
86
+ }
87
+ /**
88
+ * Scan document to collect every unique font variant needed.
89
+ * Returns a Map from fontKey → FontSpec-like descriptor.
90
+ */
91
+ function collectNeededFonts(doc) {
92
+ const needed = new Map();
93
+ const defaultFamily = doc.defaultFont ?? 'Inter';
94
+ // Build lookup from user-provided fonts
95
+ const userFonts = new Map();
96
+ for (const f of doc.fonts ?? []) {
97
+ const key = buildFontKey(f.family, f.weight ?? 400, f.style ?? 'normal');
98
+ userFonts.set(key, f);
99
+ }
100
+ const addFont = (family, weight, style) => {
101
+ const key = buildFontKey(family, weight, style);
102
+ if (needed.has(key))
103
+ return;
104
+ const userFont = userFonts.get(key);
105
+ if (userFont) {
106
+ needed.set(key, { ...userFont, src: userFont.src });
107
+ }
108
+ else if (family === 'Inter') {
109
+ needed.set(key, { family, weight, style, src: 'bundled' });
110
+ }
111
+ else {
112
+ // Font variant referenced but not in doc.fonts.
113
+ // validate() should have caught this — if we reach here it's a bug in the validation layer.
114
+ throw new PretextPdfError('FONT_EMBED_FAILED', `Font variant "${key}" is required by the document but was not found in doc.fonts and is not a bundled variant. This is a bug — font validation should have caught this.`);
115
+ }
116
+ };
117
+ // Default font always needed
118
+ addFont(defaultFamily, 400, 'normal');
119
+ // Scan content — collect every font variant referenced by every element type
120
+ for (const el of doc.content) {
121
+ if (el.type === 'paragraph') {
122
+ const family = el.fontFamily ?? defaultFamily;
123
+ const weight = el.fontWeight ?? 400;
124
+ addFont(family, weight, 'normal');
125
+ }
126
+ else if (el.type === 'heading') {
127
+ const family = el.fontFamily ?? defaultFamily;
128
+ const weight = el.fontWeight ?? 700;
129
+ addFont(family, weight, 'normal');
130
+ }
131
+ else if (el.type === 'code') {
132
+ addFont(el.fontFamily, 400, 'normal');
133
+ }
134
+ else if (el.type === 'rich-paragraph') {
135
+ for (const span of el.spans) {
136
+ addFont(span.fontFamily ?? defaultFamily, span.fontWeight ?? 400, span.fontStyle ?? 'normal');
137
+ }
138
+ }
139
+ else if (el.type === 'list') {
140
+ for (const item of el.items) {
141
+ if ((item.fontWeight ?? 400) === 700)
142
+ addFont(defaultFamily, 700, 'normal');
143
+ for (const nested of item.items ?? []) {
144
+ if ((nested.fontWeight ?? 400) === 700)
145
+ addFont(defaultFamily, 700, 'normal');
146
+ }
147
+ }
148
+ }
149
+ else if (el.type === 'table') {
150
+ // Table cells can use bold (headers) or custom weights
151
+ addFont(defaultFamily, 400, 'normal');
152
+ for (const row of el.rows) {
153
+ for (const cell of row.cells) {
154
+ const cellFamily = cell.fontFamily ?? defaultFamily;
155
+ const cellWeight = cell.fontWeight ?? (row.isHeader ? 700 : 400);
156
+ addFont(cellFamily, cellWeight, 'normal');
157
+ }
158
+ if (row.isHeader)
159
+ addFont(defaultFamily, 700, 'normal');
160
+ }
161
+ }
162
+ else if (el.type === 'blockquote') {
163
+ const family = el.fontFamily ?? defaultFamily;
164
+ const weight = el.fontWeight ?? 400;
165
+ const style = el.fontStyle ?? 'normal';
166
+ addFont(family, weight, style);
167
+ }
168
+ // spacer, image, hr, page-break use default font (already added)
169
+ }
170
+ // Header/footer fonts
171
+ if (doc.header) {
172
+ const family = doc.header.fontFamily ?? defaultFamily;
173
+ addFont(family, doc.header.fontWeight ?? 400, 'normal');
174
+ }
175
+ if (doc.footer) {
176
+ const family = doc.footer.fontFamily ?? defaultFamily;
177
+ addFont(family, doc.footer.fontWeight ?? 400, 'normal');
178
+ }
179
+ // Watermark font (text watermark only)
180
+ if (doc.watermark?.text) {
181
+ const family = doc.watermark.fontFamily ?? defaultFamily;
182
+ addFont(family, doc.watermark.fontWeight ?? 400, 'normal');
183
+ }
184
+ return needed;
185
+ }
186
+ /** Load font bytes from file path, Uint8Array, or bundled Inter */
187
+ async function loadFontBytes(spec) {
188
+ if (spec.src instanceof Uint8Array) {
189
+ return spec.src;
190
+ }
191
+ if (spec.src === 'bundled') {
192
+ const paths = (spec.weight ?? 400) >= 600 ? BUNDLED_INTER_BOLD_PATHS : BUNDLED_INTER_PATHS;
193
+ for (const p of paths) {
194
+ if (fs.existsSync(p)) {
195
+ try {
196
+ const buffer = fs.readFileSync(p);
197
+ return new Uint8Array(buffer);
198
+ }
199
+ catch {
200
+ // Try next
201
+ }
202
+ }
203
+ }
204
+ throw new PretextPdfError('FONT_LOAD_FAILED', `Bundled Inter font not found. Make sure @fontsource/inter is installed: npm install @fontsource/inter`);
205
+ }
206
+ // String path — relative paths will likely fail on different working directories
207
+ if (!path.isAbsolute(spec.src)) {
208
+ throw new PretextPdfError('FONT_LOAD_FAILED', `Font path "${spec.src}" is relative. Use an absolute path (e.g. path.join(__dirname, 'fonts/Roboto.ttf')) to avoid resolution issues.`);
209
+ }
210
+ if (!fs.existsSync(spec.src)) {
211
+ throw new PretextPdfError('FONT_LOAD_FAILED', `Font file not found: "${spec.src}". Check the path in doc.fonts[].src.`);
212
+ }
213
+ try {
214
+ const buffer = fs.readFileSync(spec.src);
215
+ return new Uint8Array(buffer);
216
+ }
217
+ catch (err) {
218
+ throw new PretextPdfError('FONT_LOAD_FAILED', `Failed to read font file "${spec.src}": ${err instanceof Error ? err.message : String(err)}`);
219
+ }
220
+ }
221
+ /**
222
+ * Walk all content elements + header/footer and collect text strings grouped by font key.
223
+ * Used by Phase 6D font subsetting to determine which glyphs each font needs.
224
+ *
225
+ * Returns: Map<fontKey, concatenated text string>
226
+ */
227
+ export function collectTextByFont(doc) {
228
+ const defaultFont = doc.defaultFont ?? 'Inter';
229
+ const textSets = new Map();
230
+ function addText(fontKey, text) {
231
+ if (!textSets.has(fontKey))
232
+ textSets.set(fontKey, new Set());
233
+ textSets.get(fontKey).add(text);
234
+ }
235
+ for (const el of doc.content) {
236
+ switch (el.type) {
237
+ case 'paragraph': {
238
+ const key = buildFontKey(el.fontFamily ?? defaultFont, el.fontWeight ?? 400, 'normal');
239
+ addText(key, el.text);
240
+ break;
241
+ }
242
+ case 'heading': {
243
+ const key = buildFontKey(el.fontFamily ?? defaultFont, el.fontWeight ?? 700, 'normal');
244
+ addText(key, el.text);
245
+ break;
246
+ }
247
+ case 'blockquote': {
248
+ const key = buildFontKey(el.fontFamily ?? defaultFont, el.fontWeight ?? 400, el.fontStyle ?? 'normal');
249
+ addText(key, el.text);
250
+ break;
251
+ }
252
+ case 'code': {
253
+ const key = buildFontKey(el.fontFamily, 400, 'normal');
254
+ addText(key, el.text);
255
+ break;
256
+ }
257
+ case 'rich-paragraph': {
258
+ for (const span of el.spans) {
259
+ const key = buildFontKey(span.fontFamily ?? defaultFont, span.fontWeight ?? 400, span.fontStyle ?? 'normal');
260
+ addText(key, span.text);
261
+ }
262
+ break;
263
+ }
264
+ case 'table': {
265
+ for (const row of el.rows) {
266
+ for (const cell of row.cells) {
267
+ const key = buildFontKey(cell.fontFamily ?? defaultFont, cell.fontWeight ?? (row.isHeader ? 700 : 400), 'normal');
268
+ addText(key, cell.text);
269
+ }
270
+ }
271
+ break;
272
+ }
273
+ case 'list': {
274
+ const collectItems = (items) => {
275
+ for (const item of items) {
276
+ const key = buildFontKey(defaultFont, item.fontWeight ?? 400, 'normal');
277
+ addText(key, item.text);
278
+ if (item.items)
279
+ collectItems(item.items);
280
+ }
281
+ };
282
+ collectItems(el.items);
283
+ break;
284
+ }
285
+ // spacer, hr, page-break, image: no text to collect
286
+ }
287
+ }
288
+ // Header/footer: include static text + digits for {{pageNumber}}/{{totalPages}} expansion
289
+ const DIGITS = '0123456789';
290
+ if (doc.header) {
291
+ const key = buildFontKey(doc.header.fontFamily ?? defaultFont, doc.header.fontWeight ?? 400, 'normal');
292
+ addText(key, doc.header.text + DIGITS);
293
+ }
294
+ if (doc.footer) {
295
+ const key = buildFontKey(doc.footer.fontFamily ?? defaultFont, doc.footer.fontWeight ?? 400, 'normal');
296
+ addText(key, doc.footer.text + DIGITS);
297
+ }
298
+ // Watermark text (if present)
299
+ if (doc.watermark?.text) {
300
+ const key = buildFontKey(doc.watermark.fontFamily ?? defaultFont, doc.watermark.fontWeight ?? 400, 'normal');
301
+ addText(key, doc.watermark.text);
302
+ }
303
+ // Concatenate all text for each font key into one string
304
+ const result = new Map();
305
+ for (const [key, texts] of textSets) {
306
+ result.set(key, Array.from(texts).join(''));
307
+ }
308
+ return result;
309
+ }
310
+ //# sourceMappingURL=fonts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.js","sourceRoot":"","sources":["../src/fonts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { PdfDocument } from './types.js';
2
+ export type { PdfDocument, DocumentMetadata, ContentElement, ParagraphElement, HeadingElement, SpacerElement, TableElement, ColumnDef, TableRow, TableCell, ImageElement, SvgElement, ListElement, ListItem, HorizontalRuleElement, PageBreakElement, CodeBlockElement, RichParagraphElement, BlockquoteElement, InlineSpan, RichLine, RichFragment, FontSpec, HeaderFooterSpec, WatermarkSpec, EncryptionSpec, BookmarkConfig, HyphenationConfig, Margins, } from './types.js';
3
+ export { PretextPdfError } from './errors.js';
4
+ export type { ErrorCode } from './errors.js';
5
+ export type { NamedPageSize } from './page-sizes.js';
6
+ export { createPdf } from './builder.js';
7
+ export type { PdfBuilderOptions } from './builder.js';
8
+ /**
9
+ * Render a PdfDocument to PDF bytes.
10
+ *
11
+ * Works in Node.js (requires @napi-rs/canvas peer dep) and in the browser.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { render } from 'pretext-pdf'
16
+ *
17
+ * const pdf = await render({
18
+ * content: [
19
+ * { type: 'heading', level: 1, text: 'Hello World' },
20
+ * { type: 'paragraph', text: 'This is a paragraph.' },
21
+ * { type: 'hr' },
22
+ * { type: 'list', style: 'unordered', items: [{ text: 'Item one' }, { text: 'Item two' }] },
23
+ * ]
24
+ * })
25
+ * fs.writeFileSync('output.pdf', pdf)
26
+ * ```
27
+ */
28
+ export declare function render(doc: PdfDocument): Promise<Uint8Array>;
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAmD,MAAM,YAAY,CAAA;AAY9F,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,UAAU,EACV,WAAW,EACX,QAAQ,EACR,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,OAAO,GACR,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAErD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAqIlE"}
package/dist/index.js ADDED
@@ -0,0 +1,154 @@
1
+ import { PDFDocument } from 'pdf-lib';
2
+ import { PretextPdfError } from './errors.js';
3
+ import { resolvePageDimensions } from './page-sizes.js';
4
+ import { validate } from './validate.js';
5
+ import { loadFonts } from './fonts.js';
6
+ import { loadImages } from './assets.js';
7
+ import { measureAllBlocks, measureHeaderFooterHeight } from './measure.js';
8
+ import { paginate } from './paginate.js';
9
+ import { renderDocument } from './render.js';
10
+ export { PretextPdfError } from './errors.js';
11
+ export { createPdf } from './builder.js';
12
+ /**
13
+ * Render a PdfDocument to PDF bytes.
14
+ *
15
+ * Works in Node.js (requires @napi-rs/canvas peer dep) and in the browser.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { render } from 'pretext-pdf'
20
+ *
21
+ * const pdf = await render({
22
+ * content: [
23
+ * { type: 'heading', level: 1, text: 'Hello World' },
24
+ * { type: 'paragraph', text: 'This is a paragraph.' },
25
+ * { type: 'hr' },
26
+ * { type: 'list', style: 'unordered', items: [{ text: 'Item one' }, { text: 'Item two' }] },
27
+ * ]
28
+ * })
29
+ * fs.writeFileSync('output.pdf', pdf)
30
+ * ```
31
+ */
32
+ export async function render(doc) {
33
+ // ── Install Node.js canvas polyfill FIRST, before any Pretext import ─────────
34
+ // This MUST happen before measure.ts lazily imports @chenglou/pretext.
35
+ if (typeof OffscreenCanvas === 'undefined' && typeof window === 'undefined') {
36
+ const { installNodePolyfill } = await import('./node-polyfill.js');
37
+ await installNodePolyfill();
38
+ }
39
+ // ── Stage 1: Validate ─────────────────────────────────────────────────────────
40
+ validate(doc);
41
+ // ── Resolve page geometry ──────────────────────────────────────────────────────
42
+ const [pageWidth, pageHeight] = resolvePageDimensions(doc.pageSize);
43
+ const margins = {
44
+ top: 72,
45
+ bottom: 72,
46
+ left: 72,
47
+ right: 72,
48
+ ...doc.margins,
49
+ };
50
+ const contentWidth = pageWidth - margins.left - margins.right;
51
+ if (contentWidth <= 0) {
52
+ throw new PretextPdfError('PAGE_TOO_SMALL', `Content width is ${contentWidth}pt after applying margins. Reduce margins or increase page size.`);
53
+ }
54
+ // ── Stage 2: Load Fonts + Images ──────────────────────────────────────────────
55
+ // pdfDoc is created ONCE here and passed to all stages.
56
+ const pdfDoc = await PDFDocument.create();
57
+ // Set PDF metadata before loading anything else
58
+ if (doc.metadata) {
59
+ const m = doc.metadata;
60
+ if (m.title)
61
+ pdfDoc.setTitle(m.title);
62
+ if (m.author)
63
+ pdfDoc.setAuthor(m.author);
64
+ if (m.subject)
65
+ pdfDoc.setSubject(m.subject);
66
+ if (m.keywords)
67
+ pdfDoc.setKeywords(m.keywords);
68
+ pdfDoc.setCreator(m.creator ?? 'pretext-pdf');
69
+ }
70
+ const fontMap = await loadFonts(doc, pdfDoc);
71
+ const imageMap = await loadImages(doc, pdfDoc, contentWidth);
72
+ // ── Measure header/footer heights (needed to compute available content area) ───
73
+ const defaultFont = doc.defaultFont ?? 'Inter';
74
+ const headerHeight = doc.header
75
+ ? await measureHeaderFooterHeight(doc.header.text, doc.header.fontSize ?? 10, doc.header.fontFamily ?? defaultFont, contentWidth, (doc.header.fontSize ?? 10) * 1.4) + 8 // 8pt padding between header and content
76
+ : 0;
77
+ const footerHeight = doc.footer
78
+ ? await measureHeaderFooterHeight(doc.footer.text, doc.footer.fontSize ?? 10, doc.footer.fontFamily ?? defaultFont, contentWidth, (doc.footer.fontSize ?? 10) * 1.4) + 8
79
+ : 0;
80
+ const contentHeight = pageHeight - margins.top - margins.bottom - headerHeight - footerHeight;
81
+ if (contentHeight <= 0) {
82
+ 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.`);
83
+ }
84
+ // ── Stage 3: Measure ──────────────────────────────────────────────────────────
85
+ // measureAllBlocks handles:
86
+ // - image key resolution (content index → img-N key)
87
+ // - list flattening (1 ListElement → N MeasuredBlocks)
88
+ // - all other elements (direct 1:1 mapping)
89
+ let measuredBlocks = await measureAllBlocks(doc, contentWidth, imageMap, contentHeight);
90
+ // ── Two-Pass TOC (if document contains a toc element) ───────────────────────────
91
+ const { buildTocEntryBlocks } = await import('./measure.js');
92
+ const tocIndex = doc.content.findIndex(el => el.type === 'toc');
93
+ if (tocIndex !== -1) {
94
+ const tocElement = doc.content[tocIndex]; // TocElement type
95
+ // Pass 1: paginate without real TOC content to collect heading page numbers
96
+ const draftPaginatedDoc = paginate(measuredBlocks, contentHeight);
97
+ // Build real TOC entry blocks using draft page numbers
98
+ const tocEntryBlocks = await buildTocEntryBlocks(draftPaginatedDoc.headings, tocElement, contentWidth, doc);
99
+ // Splice TOC entries into measuredBlocks at the placeholder index
100
+ // The placeholder (zero-height) block at tocIndex is replaced by the entry blocks
101
+ measuredBlocks = [
102
+ ...measuredBlocks.slice(0, tocIndex),
103
+ ...tocEntryBlocks,
104
+ ...measuredBlocks.slice(tocIndex + 1),
105
+ ];
106
+ }
107
+ // ────────────────────────────────────────────────────────────────────────────────
108
+ // ── Stage 4: Paginate (pure function) ─────────────────────────────────────────
109
+ const paginatedDoc = paginate(measuredBlocks, contentHeight, {
110
+ minOrphanLines: 2,
111
+ minWidowLines: 2,
112
+ });
113
+ // ── Stage 5: Render ───────────────────────────────────────────────────────────
114
+ const geo = {
115
+ pageWidth,
116
+ pageHeight,
117
+ margins,
118
+ contentWidth,
119
+ contentHeight,
120
+ headerHeight,
121
+ footerHeight,
122
+ };
123
+ const rawBytes = await renderDocument(paginatedDoc, doc, fontMap, imageMap, pdfDoc, geo);
124
+ return doc.encryption ? await applyEncryption(rawBytes, doc.encryption) : rawBytes;
125
+ }
126
+ /**
127
+ * Stage 6: Apply encryption (post-process).
128
+ * Lazy-loads @cantoo/pdf-lib only when encryption is needed.
129
+ * Uses dynamic import with 'as string' cast to bypass TypeScript module resolution.
130
+ */
131
+ async function applyEncryption(pdfBytes, enc) {
132
+ // Lazy-load @cantoo/pdf-lib — only imported when encryption is actually needed
133
+ let cantoo;
134
+ try {
135
+ cantoo = await import('@cantoo/pdf-lib');
136
+ }
137
+ catch {
138
+ throw new PretextPdfError('ENCRYPTION_NOT_AVAILABLE', 'doc.encryption requires @cantoo/pdf-lib. Install it: pnpm add @cantoo/pdf-lib');
139
+ }
140
+ const encDoc = await cantoo.PDFDocument.load(pdfBytes);
141
+ encDoc.encrypt({
142
+ userPassword: enc.userPassword ?? '',
143
+ ownerPassword: enc.ownerPassword ?? globalThis.crypto.randomUUID(),
144
+ permissions: {
145
+ printing: enc.permissions?.printing ?? true,
146
+ copying: enc.permissions?.copying ?? true,
147
+ modifying: enc.permissions?.modifying ?? false,
148
+ annotating: enc.permissions?.annotating ?? true,
149
+ },
150
+ });
151
+ // useObjectStreams: false is required for Adobe Reader compatibility with encrypted PDFs
152
+ return encDoc.save({ useObjectStreams: false });
153
+ }
154
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { PdfDocument, ContentElement, MeasuredBlock, ImageMap, ColumnDef } from './types.js';
2
+ type HypherInstance = {
3
+ hyphenate(word: string): string[];
4
+ };
5
+ type HyphenatorOpts = {
6
+ instance: HypherInstance;
7
+ minWordLength: number;
8
+ leftMin: number;
9
+ rightMin: number;
10
+ };
11
+ /**
12
+ * Stage 3: Measure a single content element.
13
+ *
14
+ * Returns MeasuredBlock for most types.
15
+ * Returns MeasuredBlock[] for 'list' (each item becomes an independent block).
16
+ *
17
+ * NOTE: Image elements cannot be measured here — use measureAllBlocks() instead,
18
+ * which resolves the content-index-based imageMap key before calling measureImageWithKey().
19
+ */
20
+ export declare function measureBlock(element: ContentElement, contentWidth: number, doc: PdfDocument, hyphenatorOpts?: HyphenatorOpts): Promise<MeasuredBlock | MeasuredBlock[]>;
21
+ /**
22
+ * Resolve column width definitions to concrete pt values.
23
+ * Fixed widths are used as-is. Star widths ('2*', '*') share the remaining space.
24
+ * 'auto' columns use naturalWidths[i] (measured content width) — caller must pre-compute these.
25
+ *
26
+ * naturalWidths is required if any column uses 'auto'. It maps column index → natural text width in pt
27
+ * (the minimum width needed to display cell text on one line, including cellPaddingH on both sides).
28
+ */
29
+ export declare function resolveColumnWidths(columns: ColumnDef[], contentWidth: number, cellPaddingH: number, borderWidth: number, naturalWidths?: number[]): number[];
30
+ /**
31
+ * Measure a short header/footer string — returns total height in pt.
32
+ */
33
+ export declare function measureHeaderFooterHeight(text: string, fontSize: number, fontFamily: string, contentWidth: number, lineHeight: number): Promise<number>;
34
+ /** Build a font map key from family + weight + style */
35
+ export declare function buildFontKey(family: string, weight: 400 | 700, style: 'normal' | 'italic'): string;
36
+ /**
37
+ * Build measured TOC entry blocks from collected headings.
38
+ * Called during two-pass mode after first pagination to generate the actual TOC content.
39
+ */
40
+ export declare function buildTocEntryBlocks(headings: Array<{
41
+ text: string;
42
+ level: 1 | 2 | 3 | 4;
43
+ pageIndex: number;
44
+ }>, tocElement: import('./types.js').TocElement, contentWidth: number, doc: PdfDocument): Promise<import('./types.js').MeasuredBlock[]>;
45
+ /**
46
+ * Measure all content elements in a document.
47
+ * Handles list flattening (lists return MeasuredBlock[]).
48
+ * Handles image key resolution (images need their content-index-based key).
49
+ * Initializes hyphenator if doc.hyphenation is configured.
50
+ */
51
+ export declare function measureAllBlocks(doc: PdfDocument, contentWidth: number, imageMap: ImageMap, pageContentHeight: number): Promise<MeasuredBlock[]>;
52
+ export {};
53
+ //# sourceMappingURL=measure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../src/measure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EAAE,cAAc,EAAE,aAAa,EAE7B,QAAQ,EAAE,SAAS,EACjC,MAAM,YAAY,CAAA;AAwBnB,KAAK,cAAc,GAAG;IAAE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,CAAA;AAC3D,KAAK,cAAc,GAAG;IAAE,QAAQ,EAAE,cAAc,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AA8F5G;;;;;;;;GAQG;AACH,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,CAiV1C;AAkWD;;;;;;;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;AA+MD;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAejB;AAED,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAElG;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,EAC1E,UAAU,EAAE,OAAO,YAAY,EAAE,UAAU,EAC3C,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,OAAO,YAAY,EAAE,aAAa,EAAE,CAAC,CAmD/C;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,EAClB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,aAAa,EAAE,CAAC,CA8C1B"}