pretext-pdf 2.0.2 → 2.0.13
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 +227 -0
- package/dist/assets/loaders/images.d.ts.map +1 -1
- package/dist/assets/loaders/images.js +4 -1
- package/dist/assets/loaders/images.js.map +1 -1
- package/dist/assets/security/path-allowlist.d.ts.map +1 -1
- package/dist/assets/security/path-allowlist.js +10 -1
- package/dist/assets/security/path-allowlist.js.map +1 -1
- package/dist/assets/svg/resolve-content.d.ts.map +1 -1
- package/dist/assets/svg/resolve-content.js +4 -1
- package/dist/assets/svg/resolve-content.js.map +1 -1
- package/dist/builder.js +1 -1
- package/dist/builder.js.map +1 -1
- package/dist/compat/normalize.d.ts +13 -0
- package/dist/compat/normalize.d.ts.map +1 -0
- package/dist/compat/normalize.js +146 -0
- package/dist/compat/normalize.js.map +1 -0
- package/dist/compat/pdfmake-types.d.ts +91 -0
- package/dist/compat/pdfmake-types.d.ts.map +1 -0
- package/dist/compat/pdfmake-types.js +8 -0
- package/dist/compat/pdfmake-types.js.map +1 -0
- package/dist/compat/translate.d.ts +7 -0
- package/dist/compat/translate.d.ts.map +1 -0
- package/dist/compat/translate.js +205 -0
- package/dist/compat/translate.js.map +1 -0
- package/dist/compat.d.ts +6 -161
- package/dist/compat.d.ts.map +1 -1
- package/dist/compat.js +13 -404
- package/dist/compat.js.map +1 -1
- package/dist/fonts/bundled-paths.d.ts +13 -0
- package/dist/fonts/bundled-paths.d.ts.map +1 -0
- package/dist/fonts/bundled-paths.js +43 -0
- package/dist/fonts/bundled-paths.js.map +1 -0
- package/dist/fonts/collect-needed.d.ts +10 -0
- package/dist/fonts/collect-needed.d.ts.map +1 -0
- package/dist/fonts/collect-needed.js +85 -0
- package/dist/fonts/collect-needed.js.map +1 -0
- package/dist/fonts/collect-text.d.ts +9 -0
- package/dist/fonts/collect-text.d.ts.map +1 -0
- package/dist/fonts/collect-text.js +162 -0
- package/dist/fonts/collect-text.js.map +1 -0
- package/dist/fonts/load-bytes.d.ts +10 -0
- package/dist/fonts/load-bytes.d.ts.map +1 -0
- package/dist/fonts/load-bytes.js +56 -0
- package/dist/fonts/load-bytes.js.map +1 -0
- package/dist/fonts.d.ts +11 -10
- package/dist/fonts.d.ts.map +1 -1
- package/dist/fonts.js +17 -421
- package/dist/fonts.js.map +1 -1
- package/dist/pipeline-footnotes.d.ts +2 -2
- package/dist/pipeline-footnotes.d.ts.map +1 -1
- package/dist/pipeline-footnotes.js +5 -2
- package/dist/pipeline-footnotes.js.map +1 -1
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +9 -5
- package/dist/pipeline.js.map +1 -1
- package/dist/render-utils.d.ts +1 -7
- package/dist/render-utils.d.ts.map +1 -1
- package/dist/render-utils.js +9 -30
- package/dist/render-utils.js.map +1 -1
- package/dist/schema/document.d.ts +2115 -0
- package/dist/schema/document.d.ts.map +1 -0
- package/dist/schema/document.js +275 -0
- package/dist/schema/document.js.map +1 -0
- package/dist/schema/elements-block.d.ts +481 -0
- package/dist/schema/elements-block.d.ts.map +1 -0
- package/dist/schema/elements-block.js +155 -0
- package/dist/schema/elements-block.js.map +1 -0
- package/dist/schema/elements-media.d.ts +282 -0
- package/dist/schema/elements-media.d.ts.map +1 -0
- package/dist/schema/elements-media.js +83 -0
- package/dist/schema/elements-media.js.map +1 -0
- package/dist/schema/elements-table.d.ts +134 -0
- package/dist/schema/elements-table.d.ts.map +1 -0
- package/dist/schema/elements-table.js +60 -0
- package/dist/schema/elements-table.js.map +1 -0
- package/dist/schema/elements-text.d.ts +782 -0
- package/dist/schema/elements-text.d.ts.map +1 -0
- package/dist/schema/elements-text.js +260 -0
- package/dist/schema/elements-text.js.map +1 -0
- package/dist/schema/shared.d.ts +84 -0
- package/dist/schema/shared.d.ts.map +1 -0
- package/dist/schema/shared.js +29 -0
- package/dist/schema/shared.js.map +1 -0
- package/dist/schema.d.ts +10 -2116
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +10 -852
- package/dist/schema.js.map +1 -1
- package/dist/types-public/document.d.ts +99 -101
- package/dist/types-public/document.d.ts.map +1 -1
- package/dist/validate/document.d.ts.map +1 -1
- package/dist/validate/document.js +5 -1
- package/dist/validate/document.js.map +1 -1
- package/dist/validate/elements/media.d.ts.map +1 -1
- package/dist/validate/elements/media.js +14 -0
- package/dist/validate/elements/media.js.map +1 -1
- package/dist/validate/helpers.d.ts +6 -6
- package/dist/validate/helpers.d.ts.map +1 -1
- package/dist/validate/helpers.js +7 -7
- package/dist/validate/helpers.js.map +1 -1
- package/package.json +1 -1
package/dist/fonts.js
CHANGED
|
@@ -1,104 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Font loading, embedding, and subsetting.
|
|
3
|
+
* Public exports: loadFonts (pipeline stage 2), collectTextByFont (subsetting pre-pass).
|
|
4
|
+
*
|
|
5
|
+
* Implementation split across src/fonts/:
|
|
6
|
+
* bundled-paths.ts — IS_NODE, __dirname, resolveInterFile, BUNDLED_INTER_*_PATHS
|
|
7
|
+
* load-bytes.ts — loadFontBytes (file / Uint8Array / bundled-Inter loader)
|
|
8
|
+
* collect-needed.ts — collectNeededFonts (document font-variant scanner)
|
|
9
|
+
* collect-text.ts — collectTextByFont (text-by-font map for font subsetting)
|
|
10
|
+
*/
|
|
1
11
|
import { PDFDocument } from '@cantoo/pdf-lib';
|
|
2
12
|
import fontkit from '@pdf-lib/fontkit';
|
|
3
|
-
import fs from 'fs';
|
|
4
|
-
import path from 'path';
|
|
5
|
-
import { fileURLToPath } from 'url';
|
|
6
|
-
import { createRequire } from 'module';
|
|
7
13
|
import { PretextPdfError } from './errors.js';
|
|
8
14
|
import { buildFontKey } from './font-key.js';
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const IS_NODE = typeof window === 'undefined' && typeof process !== 'undefined' && !!(process.versions?.node);
|
|
14
|
-
const __dirname = IS_NODE ? path.dirname(fileURLToPath(import.meta.url)) : '';
|
|
15
|
-
const _require = IS_NODE ? createRequire(import.meta.url) : null;
|
|
16
|
-
/**
|
|
17
|
-
* Font loading strategy:
|
|
18
|
-
* - TTF files for pdf-lib embedding (fontkit handles TTF natively, woff2 has glyph corruption bugs)
|
|
19
|
-
* - woff2 for @napi-rs/canvas measurement (canvas handles woff2 perfectly via Skia)
|
|
20
|
-
*
|
|
21
|
-
* TTF priority: bundled fonts/ dir first, then @fontsource woff2 as fallback
|
|
22
|
-
*
|
|
23
|
-
* NOTE: @fontsource/inter is resolved via createRequire to handle npm hoisting correctly.
|
|
24
|
-
* When pretext-pdf is installed as a package, @fontsource/inter is hoisted to the
|
|
25
|
-
* consumer's node_modules, NOT to node_modules/pretext-pdf/node_modules/@fontsource/inter.
|
|
26
|
-
* path.join(__dirname, '..', 'node_modules', ...) would fail in that case.
|
|
27
|
-
*/
|
|
28
|
-
function resolveInterFile(filename) {
|
|
29
|
-
if (!_require)
|
|
30
|
-
return null;
|
|
31
|
-
try {
|
|
32
|
-
const pkgJson = _require.resolve('@fontsource/inter/package.json');
|
|
33
|
-
return path.join(path.dirname(pkgJson), 'files', filename);
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/** Path to bundled Inter 400 normal font — TTF preferred for pdf-lib (Node only) */
|
|
40
|
-
const BUNDLED_INTER_PATHS = IS_NODE ? [
|
|
41
|
-
path.join(__dirname, '..', 'fonts', 'Inter-Regular.ttf'),
|
|
42
|
-
resolveInterFile('inter-latin-400-normal.woff2'),
|
|
43
|
-
resolveInterFile('inter-all-400-normal.woff2'),
|
|
44
|
-
].filter(Boolean) : [];
|
|
45
|
-
/** Path to bundled Inter 700 (bold) font — TTF preferred for pdf-lib (Node only) */
|
|
46
|
-
const BUNDLED_INTER_BOLD_PATHS = IS_NODE ? [
|
|
47
|
-
path.join(__dirname, '..', 'fonts', 'Inter-Bold.ttf'),
|
|
48
|
-
resolveInterFile('inter-latin-700-normal.woff2'),
|
|
49
|
-
resolveInterFile('inter-all-700-normal.woff2'),
|
|
50
|
-
].filter(Boolean) : [];
|
|
51
|
-
/** Path to bundled Inter 400 italic font */
|
|
52
|
-
const BUNDLED_INTER_ITALIC_PATHS = IS_NODE ? [
|
|
53
|
-
path.join(__dirname, '..', 'fonts', 'Inter-Italic.ttf'),
|
|
54
|
-
resolveInterFile('inter-latin-400-italic.woff2'),
|
|
55
|
-
resolveInterFile('inter-all-400-italic.woff2'),
|
|
56
|
-
].filter(Boolean) : [];
|
|
57
|
-
/** Path to bundled Inter 700 italic font */
|
|
58
|
-
const BUNDLED_INTER_BOLD_ITALIC_PATHS = IS_NODE ? [
|
|
59
|
-
path.join(__dirname, '..', 'fonts', 'Inter-BoldItalic.ttf'),
|
|
60
|
-
resolveInterFile('inter-latin-700-italic.woff2'),
|
|
61
|
-
resolveInterFile('inter-all-700-italic.woff2'),
|
|
62
|
-
].filter(Boolean) : [];
|
|
15
|
+
import { collectNeededFonts } from './fonts/collect-needed.js';
|
|
16
|
+
import { loadFontBytes } from './fonts/load-bytes.js';
|
|
17
|
+
import { collectTextByFont } from './fonts/collect-text.js';
|
|
18
|
+
export { collectTextByFont } from './fonts/collect-text.js';
|
|
63
19
|
/**
|
|
64
20
|
* Stage 2: Load and embed all fonts.
|
|
65
21
|
* - Scans document for all font references
|
|
66
22
|
* - Loads font bytes (file system or Uint8Array)
|
|
67
23
|
* - Embeds each into pdfDoc via fontkit
|
|
68
24
|
* - Returns FontMap for use in measure + render stages
|
|
69
|
-
*
|
|
70
|
-
* NOTE: pdfDoc is already created by the caller. Fonts are embedded into it here.
|
|
71
|
-
* The same pdfDoc is used in Stage 5 (render).
|
|
72
25
|
*/
|
|
73
26
|
export async function loadFonts(doc, pdfDoc) {
|
|
74
27
|
pdfDoc.registerFontkit(fontkit);
|
|
75
28
|
const fontMap = new Map();
|
|
76
29
|
const defaultFamily = doc.defaultFont ?? 'Inter';
|
|
77
|
-
// Collect all font variants referenced in the document
|
|
78
30
|
const needed = collectNeededFonts(doc);
|
|
79
|
-
// Always ensure Inter 400 is available as the default fallback
|
|
80
31
|
if (!needed.has(buildFontKey('Inter', 400, 'normal'))) {
|
|
81
|
-
needed.set(buildFontKey('Inter', 400, 'normal'), {
|
|
82
|
-
family: 'Inter', weight: 400, style: 'normal', src: 'bundled'
|
|
83
|
-
});
|
|
32
|
+
needed.set(buildFontKey('Inter', 400, 'normal'), { family: 'Inter', weight: 400, style: 'normal', src: 'bundled' });
|
|
84
33
|
}
|
|
85
34
|
if (!needed.has(buildFontKey('Inter', 700, 'normal'))) {
|
|
86
|
-
needed.set(buildFontKey('Inter', 700, 'normal'), {
|
|
87
|
-
family: 'Inter', weight: 700, style: 'normal', src: 'bundled'
|
|
88
|
-
});
|
|
35
|
+
needed.set(buildFontKey('Inter', 700, 'normal'), { family: 'Inter', weight: 700, style: 'normal', src: 'bundled' });
|
|
89
36
|
}
|
|
90
|
-
// Load all font bytes in parallel
|
|
91
37
|
const loadPromises = Array.from(needed.entries()).map(async ([key, spec]) => {
|
|
92
38
|
const bytes = await loadFontBytes(spec, doc.allowedFileDirs);
|
|
93
39
|
return { key, bytes, spec };
|
|
94
40
|
});
|
|
95
41
|
const loaded = await Promise.all(loadPromises);
|
|
96
|
-
// Embed each font into pdfDoc (must be sequential — pdf-lib limitation)
|
|
97
42
|
for (const { key, bytes, spec } of loaded) {
|
|
98
43
|
try {
|
|
99
|
-
// Use fontkit's built-in subsetting for TTF fonts.
|
|
100
|
-
// TTF magic bytes: 0x00010000 (TrueType) or 0x74727565 ('true').
|
|
101
|
-
// woff2 starts with 0x774F4632 — fontkit has a known subsetting bug for woff2.
|
|
102
44
|
const isTTF = bytes.length >= 4 && ((bytes[0] === 0x00 && bytes[1] === 0x01 && bytes[2] === 0x00 && bytes[3] === 0x00) ||
|
|
103
45
|
(bytes[0] === 0x74 && bytes[1] === 0x72 && bytes[2] === 0x75 && bytes[3] === 0x65));
|
|
104
46
|
const pdfFont = await pdfDoc.embedFont(bytes, { subset: isTTF });
|
|
@@ -108,9 +50,6 @@ export async function loadFonts(doc, pdfDoc) {
|
|
|
108
50
|
throw new PretextPdfError('FONT_EMBED_FAILED', `Failed to embed font "${spec.family ?? key}": ${err instanceof Error ? err.message : String(err)}`);
|
|
109
51
|
}
|
|
110
52
|
}
|
|
111
|
-
// Pre-compute font subsets by encoding all document text.
|
|
112
|
-
// Calling pdfFont.encodeText() registers glyph IDs into the subset table
|
|
113
|
-
// before pdfDoc.save(), producing smaller and faster-to-save PDFs.
|
|
114
53
|
const textByFont = collectTextByFont(doc);
|
|
115
54
|
for (const [key, text] of textByFont) {
|
|
116
55
|
const pdfFont = fontMap.get(key);
|
|
@@ -123,356 +62,13 @@ export async function loadFonts(doc, pdfDoc) {
|
|
|
123
62
|
}
|
|
124
63
|
}
|
|
125
64
|
}
|
|
126
|
-
// Set default font
|
|
127
65
|
const defaultKey = buildFontKey(defaultFamily, 400, 'normal');
|
|
128
66
|
if (!fontMap.has(defaultKey)) {
|
|
129
|
-
// Default font wasn't explicitly added — try Inter as fallback
|
|
130
67
|
const interKey = buildFontKey('Inter', 400, 'normal');
|
|
131
68
|
const interFont = fontMap.get(interKey);
|
|
132
|
-
if (interFont)
|
|
69
|
+
if (interFont)
|
|
133
70
|
fontMap.set(defaultKey, interFont);
|
|
134
|
-
}
|
|
135
71
|
}
|
|
136
72
|
return fontMap;
|
|
137
73
|
}
|
|
138
|
-
/**
|
|
139
|
-
* Scan document to collect every unique font variant needed.
|
|
140
|
-
* Returns a Map from fontKey → FontSpec-like descriptor.
|
|
141
|
-
*/
|
|
142
|
-
function collectNeededFonts(doc) {
|
|
143
|
-
const needed = new Map();
|
|
144
|
-
const defaultFamily = doc.defaultFont ?? 'Inter';
|
|
145
|
-
// Build lookup from user-provided fonts
|
|
146
|
-
const userFonts = new Map();
|
|
147
|
-
for (const f of doc.fonts ?? []) {
|
|
148
|
-
const key = buildFontKey(f.family, f.weight ?? 400, f.style ?? 'normal');
|
|
149
|
-
userFonts.set(key, f);
|
|
150
|
-
}
|
|
151
|
-
const addFont = (family, weight, style) => {
|
|
152
|
-
const key = buildFontKey(family, weight, style);
|
|
153
|
-
if (needed.has(key))
|
|
154
|
-
return;
|
|
155
|
-
const userFont = userFonts.get(key);
|
|
156
|
-
if (userFont) {
|
|
157
|
-
needed.set(key, { ...userFont, src: userFont.src });
|
|
158
|
-
}
|
|
159
|
-
else if (family === 'Inter') {
|
|
160
|
-
needed.set(key, { family, weight, style, src: 'bundled' });
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
// Font variant referenced but not in doc.fonts.
|
|
164
|
-
// validate() should have caught this — if we reach here it's a bug in the validation layer.
|
|
165
|
-
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.`);
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
// Default font always needed
|
|
169
|
-
addFont(defaultFamily, 400, 'normal');
|
|
170
|
-
// Scan content — collect every font variant referenced by every element type
|
|
171
|
-
for (const el of doc.content) {
|
|
172
|
-
if (el.type === 'paragraph') {
|
|
173
|
-
const family = el.fontFamily ?? defaultFamily;
|
|
174
|
-
const weight = el.fontWeight ?? 400;
|
|
175
|
-
addFont(family, weight, 'normal');
|
|
176
|
-
}
|
|
177
|
-
else if (el.type === 'heading') {
|
|
178
|
-
const family = el.fontFamily ?? defaultFamily;
|
|
179
|
-
const weight = el.fontWeight ?? 700;
|
|
180
|
-
addFont(family, weight, 'normal');
|
|
181
|
-
}
|
|
182
|
-
else if (el.type === 'code') {
|
|
183
|
-
addFont(el.fontFamily, 400, 'normal');
|
|
184
|
-
}
|
|
185
|
-
else if (el.type === 'rich-paragraph') {
|
|
186
|
-
for (const span of el.spans) {
|
|
187
|
-
addFont(span.fontFamily ?? defaultFamily, span.fontWeight ?? 400, span.fontStyle ?? 'normal');
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
else if (el.type === 'list') {
|
|
191
|
-
for (const item of el.items) {
|
|
192
|
-
if ((item.fontWeight ?? 400) === 700)
|
|
193
|
-
addFont(defaultFamily, 700, 'normal');
|
|
194
|
-
for (const nested of item.items ?? []) {
|
|
195
|
-
if ((nested.fontWeight ?? 400) === 700)
|
|
196
|
-
addFont(defaultFamily, 700, 'normal');
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
else if (el.type === 'table') {
|
|
201
|
-
// Table cells can use bold (headers) or custom weights
|
|
202
|
-
addFont(defaultFamily, 400, 'normal');
|
|
203
|
-
for (const row of el.rows) {
|
|
204
|
-
for (const cell of row.cells) {
|
|
205
|
-
const cellFamily = cell.fontFamily ?? defaultFamily;
|
|
206
|
-
const cellWeight = cell.fontWeight ?? (row.isHeader ? 700 : 400);
|
|
207
|
-
addFont(cellFamily, cellWeight, 'normal');
|
|
208
|
-
}
|
|
209
|
-
if (row.isHeader)
|
|
210
|
-
addFont(defaultFamily, 700, 'normal');
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
else if (el.type === 'blockquote') {
|
|
214
|
-
const family = el.fontFamily ?? defaultFamily;
|
|
215
|
-
const weight = el.fontWeight ?? 400;
|
|
216
|
-
const style = el.fontStyle ?? 'normal';
|
|
217
|
-
addFont(family, weight, style);
|
|
218
|
-
}
|
|
219
|
-
else if (el.type === 'image' && el.floatFontFamily) {
|
|
220
|
-
addFont(el.floatFontFamily, 400, 'normal');
|
|
221
|
-
}
|
|
222
|
-
else if (el.type === 'footnote-def') {
|
|
223
|
-
const family = el.fontFamily ?? defaultFamily;
|
|
224
|
-
addFont(family, 400, 'normal');
|
|
225
|
-
}
|
|
226
|
-
// spacer, image, hr, page-break use default font (already added)
|
|
227
|
-
}
|
|
228
|
-
// Header/footer fonts
|
|
229
|
-
if (doc.header) {
|
|
230
|
-
const family = doc.header.fontFamily ?? defaultFamily;
|
|
231
|
-
addFont(family, doc.header.fontWeight ?? 400, 'normal');
|
|
232
|
-
}
|
|
233
|
-
if (doc.footer) {
|
|
234
|
-
const family = doc.footer.fontFamily ?? defaultFamily;
|
|
235
|
-
addFont(family, doc.footer.fontWeight ?? 400, 'normal');
|
|
236
|
-
}
|
|
237
|
-
// Watermark font (text watermark only)
|
|
238
|
-
if (doc.watermark?.text) {
|
|
239
|
-
const family = doc.watermark.fontFamily ?? defaultFamily;
|
|
240
|
-
addFont(family, doc.watermark.fontWeight ?? 400, 'normal');
|
|
241
|
-
}
|
|
242
|
-
return needed;
|
|
243
|
-
}
|
|
244
|
-
/** Load font bytes from file path, Uint8Array, or bundled Inter */
|
|
245
|
-
async function loadFontBytes(spec, allowedFileDirs) {
|
|
246
|
-
if (spec.src instanceof Uint8Array) {
|
|
247
|
-
return spec.src;
|
|
248
|
-
}
|
|
249
|
-
if (spec.src === 'bundled') {
|
|
250
|
-
if (!IS_NODE) {
|
|
251
|
-
throw new PretextPdfError('FONT_LOAD_FAILED', `Bundled Inter font is not available in the browser. Supply font bytes via doc.fonts: [{ family: 'Inter', weight: 400, src: <Uint8Array> }, { family: 'Inter', weight: 700, src: <Uint8Array> }]`);
|
|
252
|
-
}
|
|
253
|
-
const weight = spec.weight ?? 400;
|
|
254
|
-
const style = spec.style ?? 'normal';
|
|
255
|
-
let paths;
|
|
256
|
-
if (style === 'italic') {
|
|
257
|
-
paths = weight >= 600 ? BUNDLED_INTER_BOLD_ITALIC_PATHS : BUNDLED_INTER_ITALIC_PATHS;
|
|
258
|
-
}
|
|
259
|
-
else {
|
|
260
|
-
paths = weight >= 600 ? BUNDLED_INTER_BOLD_PATHS : BUNDLED_INTER_PATHS;
|
|
261
|
-
}
|
|
262
|
-
for (const p of paths) {
|
|
263
|
-
if (fs.existsSync(p)) {
|
|
264
|
-
try {
|
|
265
|
-
const buffer = fs.readFileSync(p);
|
|
266
|
-
return new Uint8Array(buffer);
|
|
267
|
-
}
|
|
268
|
-
catch {
|
|
269
|
-
// Try next
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
throw new PretextPdfError('FONT_LOAD_FAILED', `Bundled Inter font not found. Make sure @fontsource/inter is installed: npm install @fontsource/inter`);
|
|
274
|
-
}
|
|
275
|
-
// Browser context cannot read local file paths — only Uint8Array is supported
|
|
276
|
-
if (!IS_NODE) {
|
|
277
|
-
throw new PretextPdfError('FONT_LOAD_FAILED', `Font path "${spec.src}" is a string, but file paths cannot be read in the browser. Fetch the font yourself and pass the bytes as a Uint8Array in doc.fonts[].src.`);
|
|
278
|
-
}
|
|
279
|
-
// String path — relative paths will likely fail on different working directories
|
|
280
|
-
if (!path.isAbsolute(spec.src)) {
|
|
281
|
-
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.`);
|
|
282
|
-
}
|
|
283
|
-
const resolvedSrc = path.resolve(spec.src);
|
|
284
|
-
// Path traversal guard — delegates to shared assertPathAllowed (assets/security/path-allowlist.ts)
|
|
285
|
-
assertPathAllowed(resolvedSrc, allowedFileDirs, 'Font');
|
|
286
|
-
if (!fs.existsSync(resolvedSrc)) {
|
|
287
|
-
throw new PretextPdfError('FONT_LOAD_FAILED', `Font file not found: "${path.basename(spec.src)}". Check the path in doc.fonts[].src.`);
|
|
288
|
-
}
|
|
289
|
-
try {
|
|
290
|
-
const buffer = fs.readFileSync(resolvedSrc);
|
|
291
|
-
return new Uint8Array(buffer);
|
|
292
|
-
}
|
|
293
|
-
catch (err) {
|
|
294
|
-
throw new PretextPdfError('FONT_LOAD_FAILED', `Failed to read font file "${path.basename(spec.src)}": ${err instanceof Error ? err.message : String(err)}`);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Walk all content elements + header/footer and collect text strings grouped by font key.
|
|
299
|
-
* Used by font subsetting to determine which glyphs each font needs.
|
|
300
|
-
*
|
|
301
|
-
* Returns: Map<fontKey, concatenated text string>
|
|
302
|
-
*/
|
|
303
|
-
export function collectTextByFont(doc) {
|
|
304
|
-
const defaultFont = doc.defaultFont ?? 'Inter';
|
|
305
|
-
const textSets = new Map();
|
|
306
|
-
function addText(fontKey, text) {
|
|
307
|
-
if (!textSets.has(fontKey))
|
|
308
|
-
textSets.set(fontKey, new Set());
|
|
309
|
-
textSets.get(fontKey).add(text);
|
|
310
|
-
}
|
|
311
|
-
for (const el of doc.content) {
|
|
312
|
-
switch (el.type) {
|
|
313
|
-
case 'paragraph': {
|
|
314
|
-
const key = buildFontKey(el.fontFamily ?? defaultFont, el.fontWeight ?? 400, 'normal');
|
|
315
|
-
addText(key, el.text);
|
|
316
|
-
break;
|
|
317
|
-
}
|
|
318
|
-
case 'heading': {
|
|
319
|
-
const key = buildFontKey(el.fontFamily ?? defaultFont, el.fontWeight ?? 700, 'normal');
|
|
320
|
-
addText(key, el.text);
|
|
321
|
-
break;
|
|
322
|
-
}
|
|
323
|
-
case 'blockquote': {
|
|
324
|
-
const key = buildFontKey(el.fontFamily ?? defaultFont, el.fontWeight ?? 400, el.fontStyle ?? 'normal');
|
|
325
|
-
addText(key, el.text);
|
|
326
|
-
break;
|
|
327
|
-
}
|
|
328
|
-
case 'code': {
|
|
329
|
-
const key = buildFontKey(el.fontFamily, 400, 'normal');
|
|
330
|
-
addText(key, el.text);
|
|
331
|
-
break;
|
|
332
|
-
}
|
|
333
|
-
case 'rich-paragraph': {
|
|
334
|
-
for (const span of el.spans) {
|
|
335
|
-
const key = buildFontKey(span.fontFamily ?? defaultFont, span.fontWeight ?? 400, span.fontStyle ?? 'normal');
|
|
336
|
-
addText(key, span.text);
|
|
337
|
-
}
|
|
338
|
-
break;
|
|
339
|
-
}
|
|
340
|
-
case 'table': {
|
|
341
|
-
for (const row of el.rows) {
|
|
342
|
-
for (const cell of row.cells) {
|
|
343
|
-
const key = buildFontKey(cell.fontFamily ?? defaultFont, cell.fontWeight ?? (row.isHeader ? 700 : 400), 'normal');
|
|
344
|
-
addText(key, cell.text);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
break;
|
|
348
|
-
}
|
|
349
|
-
case 'list': {
|
|
350
|
-
// List marker characters: bullets (•, ◦) for unordered, digits+dot for ordered
|
|
351
|
-
const listFont = buildFontKey(defaultFont, 400, 'normal');
|
|
352
|
-
if (el.style === 'ordered') {
|
|
353
|
-
addText(listFont, '0123456789.');
|
|
354
|
-
}
|
|
355
|
-
else {
|
|
356
|
-
addText(listFont, el.marker ?? '•');
|
|
357
|
-
addText(listFont, '◦'); // nested unordered uses hollow bullet
|
|
358
|
-
}
|
|
359
|
-
const collectItems = (items) => {
|
|
360
|
-
for (const item of items) {
|
|
361
|
-
const key = buildFontKey(defaultFont, item.fontWeight ?? 400, 'normal');
|
|
362
|
-
addText(key, item.text);
|
|
363
|
-
if (item.items)
|
|
364
|
-
collectItems(item.items);
|
|
365
|
-
}
|
|
366
|
-
};
|
|
367
|
-
collectItems(el.items);
|
|
368
|
-
break;
|
|
369
|
-
}
|
|
370
|
-
case 'footnote-def': {
|
|
371
|
-
const key = buildFontKey(el.fontFamily ?? defaultFont, 400, 'normal');
|
|
372
|
-
addText(key, el.text);
|
|
373
|
-
break;
|
|
374
|
-
}
|
|
375
|
-
// Note: 'toc-entry' is intentionally not handled here. TocEntryElement is an
|
|
376
|
-
// internal synthesized type (not in the public ContentElement union) and
|
|
377
|
-
// never appears in user-supplied doc.content. TOC entry glyphs (digits,
|
|
378
|
-
// leader chars) are collected separately during the measurement pass.
|
|
379
|
-
case 'callout': {
|
|
380
|
-
const key = buildFontKey(el.fontFamily ?? defaultFont, el.fontWeight ?? 400, 'normal');
|
|
381
|
-
addText(key, el.content);
|
|
382
|
-
if (el.title) {
|
|
383
|
-
const titleKey = buildFontKey(el.fontFamily ?? defaultFont, 700, 'normal');
|
|
384
|
-
addText(titleKey, el.title);
|
|
385
|
-
}
|
|
386
|
-
break;
|
|
387
|
-
}
|
|
388
|
-
case 'form-field': {
|
|
389
|
-
const key = buildFontKey(defaultFont, 400, 'normal');
|
|
390
|
-
if (el.label)
|
|
391
|
-
addText(key, el.label);
|
|
392
|
-
if (el.fieldType === 'text') {
|
|
393
|
-
if (el.placeholder)
|
|
394
|
-
addText(key, el.placeholder);
|
|
395
|
-
if (typeof el.defaultValue === 'string')
|
|
396
|
-
addText(key, el.defaultValue);
|
|
397
|
-
}
|
|
398
|
-
if (el.fieldType === 'radio' || el.fieldType === 'dropdown') {
|
|
399
|
-
for (const opt of el.options)
|
|
400
|
-
addText(key, opt.label);
|
|
401
|
-
}
|
|
402
|
-
break;
|
|
403
|
-
}
|
|
404
|
-
case 'float-group': {
|
|
405
|
-
// Float-group contains multiple content elements — collect text from each
|
|
406
|
-
for (const contentEl of el.content) {
|
|
407
|
-
if (contentEl.type === 'paragraph') {
|
|
408
|
-
const key = buildFontKey(contentEl.fontFamily ?? defaultFont, contentEl.fontWeight ?? 400, 'normal');
|
|
409
|
-
addText(key, contentEl.text);
|
|
410
|
-
}
|
|
411
|
-
else if (contentEl.type === 'heading') {
|
|
412
|
-
const key = buildFontKey(contentEl.fontFamily ?? defaultFont, contentEl.fontWeight ?? 700, 'normal');
|
|
413
|
-
addText(key, contentEl.text);
|
|
414
|
-
}
|
|
415
|
-
else if (contentEl.type === 'rich-paragraph') {
|
|
416
|
-
for (const span of contentEl.spans) {
|
|
417
|
-
const key = buildFontKey(span.fontFamily ?? defaultFont, span.fontWeight ?? 400, span.fontStyle ?? 'normal');
|
|
418
|
-
addText(key, span.text);
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
break;
|
|
423
|
-
}
|
|
424
|
-
// spacer, hr, page-break, image, chart, barcode, qr, float-group (already
|
|
425
|
-
// handled above), svg, comment, toc-entry (internal): no text to collect.
|
|
426
|
-
// The explicit default arm ensures newly-added element types surface
|
|
427
|
-
// here at compile-time rather than silently skipping glyph collection.
|
|
428
|
-
default:
|
|
429
|
-
break;
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
// Header/footer: include static text + digits for {{pageNumber}}/{{totalPages}} expansion
|
|
433
|
-
const DIGITS = '0123456789';
|
|
434
|
-
if (doc.header) {
|
|
435
|
-
const key = buildFontKey(doc.header.fontFamily ?? defaultFont, doc.header.fontWeight ?? 400, 'normal');
|
|
436
|
-
addText(key, doc.header.text + DIGITS);
|
|
437
|
-
}
|
|
438
|
-
if (doc.footer) {
|
|
439
|
-
const key = buildFontKey(doc.footer.fontFamily ?? defaultFont, doc.footer.fontWeight ?? 400, 'normal');
|
|
440
|
-
addText(key, doc.footer.text + DIGITS);
|
|
441
|
-
}
|
|
442
|
-
// Section-specific header/footer overrides (per-page-range)
|
|
443
|
-
if (doc.sections) {
|
|
444
|
-
for (const section of doc.sections) {
|
|
445
|
-
if (section.header) {
|
|
446
|
-
const key = buildFontKey(section.header.fontFamily ?? defaultFont, section.header.fontWeight ?? 400, 'normal');
|
|
447
|
-
addText(key, section.header.text + DIGITS);
|
|
448
|
-
}
|
|
449
|
-
if (section.footer) {
|
|
450
|
-
const key = buildFontKey(section.footer.fontFamily ?? defaultFont, section.footer.fontWeight ?? 400, 'normal');
|
|
451
|
-
addText(key, section.footer.text + DIGITS);
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
// Watermark text (if present)
|
|
456
|
-
if (doc.watermark?.text) {
|
|
457
|
-
const key = buildFontKey(doc.watermark.fontFamily ?? defaultFont, doc.watermark.fontWeight ?? 400, 'normal');
|
|
458
|
-
addText(key, doc.watermark.text);
|
|
459
|
-
}
|
|
460
|
-
// Signature placeholder (renders labels + user text using Inter-400-normal)
|
|
461
|
-
if (doc.signature) {
|
|
462
|
-
const sigKey = buildFontKey(defaultFont, 400, 'normal');
|
|
463
|
-
addText(sigKey, 'Signed by: Signature Date');
|
|
464
|
-
if (doc.signature.signerName)
|
|
465
|
-
addText(sigKey, doc.signature.signerName);
|
|
466
|
-
if (doc.signature.reason)
|
|
467
|
-
addText(sigKey, doc.signature.reason);
|
|
468
|
-
if (doc.signature.location)
|
|
469
|
-
addText(sigKey, doc.signature.location);
|
|
470
|
-
}
|
|
471
|
-
// Concatenate all text for each font key into one string
|
|
472
|
-
const result = new Map();
|
|
473
|
-
for (const [key, texts] of textSets) {
|
|
474
|
-
result.set(key, Array.from(texts).join(''));
|
|
475
|
-
}
|
|
476
|
-
return result;
|
|
477
|
-
}
|
|
478
74
|
//# sourceMappingURL=fonts.js.map
|
package/dist/fonts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fonts.js","sourceRoot":"","sources":["../src/fonts.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fonts.js","sourceRoot":"","sources":["../src/fonts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ContentElement } from './types-public/index.js';
|
|
2
2
|
import type { MeasuredBlock, PaginatedDocument } from './types-internal.js';
|
|
3
3
|
/** Build document-order footnote numbering by scanning rich-paragraphs in content order. */
|
|
4
|
-
export declare function buildFootnoteNumbering(content: ContentElement[]): Map<string, number>;
|
|
4
|
+
export declare function buildFootnoteNumbering(content: readonly ContentElement[]): Map<string, number>;
|
|
5
5
|
/**
|
|
6
6
|
* Two-pass footnote pagination.
|
|
7
7
|
*
|
|
@@ -13,6 +13,6 @@ export declare function runFootnoteTwoPass(measuredBlocks: MeasuredBlock[], cont
|
|
|
13
13
|
minOrphanLines: number;
|
|
14
14
|
minWidowLines: number;
|
|
15
15
|
}, doc: {
|
|
16
|
-
content: ContentElement[];
|
|
16
|
+
content: readonly ContentElement[];
|
|
17
17
|
}): PaginatedDocument;
|
|
18
18
|
//# sourceMappingURL=pipeline-footnotes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-footnotes.d.ts","sourceRoot":"","sources":["../src/pipeline-footnotes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,yBAAyB,CAAA;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAM3E,4FAA4F;AAC5F,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"pipeline-footnotes.d.ts","sourceRoot":"","sources":["../src/pipeline-footnotes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,yBAAyB,CAAA;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAM3E,4FAA4F;AAC5F,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAa9F;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,aAAa,EAAE,EAC/B,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EACjE,GAAG,EAAE;IAAE,OAAO,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,GAC1C,iBAAiB,CAuFnB"}
|
|
@@ -85,8 +85,11 @@ export function runFootnoteTwoPass(measuredBlocks, contentHeight, paginateConfig
|
|
|
85
85
|
page.footnoteItems = refIds
|
|
86
86
|
.map(id => {
|
|
87
87
|
const def = footnoteDefElements.find(d => d.id === id);
|
|
88
|
-
const
|
|
89
|
-
|
|
88
|
+
const rawNum = footnoteNumbering.get(id);
|
|
89
|
+
if (rawNum === undefined) {
|
|
90
|
+
throw new PretextPdfError('PAGINATION_FAILED', `Footnote ref "${id}" has no assigned number — doc.content may have been mutated between pipeline stages`);
|
|
91
|
+
}
|
|
92
|
+
return def ? { def, number: rawNum } : null;
|
|
90
93
|
})
|
|
91
94
|
.filter(Boolean);
|
|
92
95
|
const zoneHeight = footnoteZones.get(pageIdx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-footnotes.js","sourceRoot":"","sources":["../src/pipeline-footnotes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,gBAAgB,GAAG,EAAE,CAAA,CAAE,uCAAuC;AAEpE,4FAA4F;AAC5F,MAAM,UAAU,sBAAsB,CAAC,
|
|
1
|
+
{"version":3,"file":"pipeline-footnotes.js","sourceRoot":"","sources":["../src/pipeline-footnotes.ts"],"names":[],"mappings":"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"}
|
package/dist/pipeline.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAoC,MAAM,iBAAiB,CAAA;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAW,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAUzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAI5D,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,CAE7E;AAID,wBAAsB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC;IACzD,MAAM,EAAE,WAAW,CAAA;IACnB,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC,CAAA;IAC1E,WAAW,EAAE,MAAM,CAAA;CACpB,CAAC,CAiED;AAID,wBAAsB,eAAe,CACnC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,OAAO,mBAAmB,EAAE,gBAAgB,EAAE,EACxD,MAAM,CAAC,EAAE,OAAO,yBAAyB,EAAE,MAAM,GAChD,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,CAAC,CAKnD;AAID,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC,EACjF,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAiCvB;AAID,wBAAsB,YAAY,CAChC,GAAG,EAAE,WAAW,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,OAAO,mBAAmB,EAAE,gBAAgB,EAAE,GACvD,OAAO,CAAC,aAAa,EAAE,CAAC,CAI1B;AAID,wBAAgB,aAAa,CAC3B,cAAc,EAAE,aAAa,EAAE,EAC/B,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,WAAW,GACf,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAGvC;AAID,wBAAsB,WAAW,CAC/B,YAAY,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,EAC9C,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,YAAY,EACjB,OAAO,CAAC,EAAE,OAAO,mBAAmB,EAAE,gBAAgB,EAAE,EACxD,MAAM,CAAC,EAAE,OAAO,yBAAyB,EAAE,MAAM,GAChD,OAAO,CAAC,UAAU,CAAC,CAErB;AAID;;;GAGG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAkBhG"}
|
package/dist/pipeline.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PDFDocument, PDFHexString, PDFName } from '@cantoo/pdf-lib';
|
|
1
|
+
import { PDFDocument, PDFHexString, PDFName, PDFString } from '@cantoo/pdf-lib';
|
|
2
2
|
import { PretextPdfError } from './errors.js';
|
|
3
3
|
import { resolvePageDimensions } from './page-sizes.js';
|
|
4
4
|
import { validate } from './validate/index.js';
|
|
@@ -30,9 +30,11 @@ export async function stageInit(doc) {
|
|
|
30
30
|
if (doc.metadata) {
|
|
31
31
|
const m = doc.metadata;
|
|
32
32
|
if (m.language) {
|
|
33
|
-
// Lang
|
|
34
|
-
//
|
|
35
|
-
|
|
33
|
+
// /Lang is a text string per PDF 32000 §14.9.2. PDFString (literal string) is correct
|
|
34
|
+
// here — matching pdf-lib's own setLanguage() behavior. BCP47 tags are validated to
|
|
35
|
+
// ASCII letters/digits/hyphens only (no parentheses), so literal-string injection risk
|
|
36
|
+
// is zero. PDFHexString.fromText() would add a UTF-16 BOM that some readers misparse.
|
|
37
|
+
pdfDoc.catalog.set(PDFName.of('Lang'), PDFString.of(m.language));
|
|
36
38
|
}
|
|
37
39
|
// Write all Info dict entries via PDFHexString to prevent PDF literal-string
|
|
38
40
|
// injection through unbalanced parentheses in user-controlled content (B3).
|
|
@@ -58,7 +60,9 @@ export async function stageInit(doc) {
|
|
|
58
60
|
if (m.semantic)
|
|
59
61
|
infoDict.set(PDFName.of('Semantic'), PDFHexString.fromText(JSON.stringify(m.semantic)));
|
|
60
62
|
}
|
|
61
|
-
catch {
|
|
63
|
+
catch (err) {
|
|
64
|
+
// getInfoDict() is not part of the official @cantoo/pdf-lib API surface — log before falling back.
|
|
65
|
+
console.warn('[pretext-pdf] metadata write via PDFHexString failed, using fallback:', err instanceof Error ? err.message : String(err));
|
|
62
66
|
// Fallback: convenience methods may use literal strings but are better than no metadata.
|
|
63
67
|
if (m.title)
|
|
64
68
|
pdfDoc.setTitle(m.title);
|