@unisim/doc 0.6.0 → 0.8.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/README.md +11 -0
- package/dist/bidi.d.ts +51 -0
- package/dist/bidi.d.ts.map +1 -0
- package/dist/bidi.js +587 -0
- package/dist/bidi.js.map +1 -0
- package/dist/convert.d.ts +2 -1
- package/dist/convert.d.ts.map +1 -1
- package/dist/convert.js +4 -3
- package/dist/convert.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/pdfcore.d.ts +45 -3
- package/dist/pdfcore.d.ts.map +1 -1
- package/dist/pdfcore.js +300 -32
- package/dist/pdfcore.js.map +1 -1
- package/dist/truetype.d.ts +33 -0
- package/dist/truetype.d.ts.map +1 -0
- package/dist/truetype.js +289 -0
- package/dist/truetype.js.map +1 -0
- package/dist/write/pdf.d.ts +17 -1
- package/dist/write/pdf.d.ts.map +1 -1
- package/dist/write/pdf.js +193 -23
- package/dist/write/pdf.js.map +1 -1
- package/package.json +1 -1
package/dist/truetype.js
ADDED
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Just enough of a TrueType font to embed one in a PDF.
|
|
3
|
+
//
|
|
4
|
+
// WHY THIS EXISTS
|
|
5
|
+
// ---------------
|
|
6
|
+
// The base-14 fonts every PDF reader already has can spell Latin-1 and the
|
|
7
|
+
// Windows-1252 extras, and nothing else. `pdfcore` gives ASCII stand-ins to the
|
|
8
|
+
// symbols that have a fair one — an arrow, a box-drawing rule, a warning sign —
|
|
9
|
+
// but there is no stand-in for an ALPHABET. Cyrillic, Greek and Hebrew were
|
|
10
|
+
// written as a row of '?' and reported as lost, and the only way to write them
|
|
11
|
+
// is to put a font in the file.
|
|
12
|
+
//
|
|
13
|
+
// WHAT IT DELIBERATELY DOES NOT DO
|
|
14
|
+
// --------------------------------
|
|
15
|
+
// * NO SUBSETTING. Rebuilding `glyf`/`loca`/`cmap`/`hmtx` for a subset is the
|
|
16
|
+
// hard, bug-prone half of a font toolkit, and its payoff is output size on
|
|
17
|
+
// the minority of documents that need a font at all. The whole face is
|
|
18
|
+
// embedded, once, and only into documents that use it.
|
|
19
|
+
// * NO SHAPING. There is no GSUB/GPOS here, so scripts that REQUIRE shaping to
|
|
20
|
+
// be legible — Arabic's joining forms, the Indic scripts — are not made
|
|
21
|
+
// readable by embedding a font and must not be claimed. Cyrillic, Greek and
|
|
22
|
+
// Hebrew need none: they are one code point, one glyph, left to right (and
|
|
23
|
+
// Hebrew's direction is the reader's business, not the encoding's).
|
|
24
|
+
// * NO `post` GLYPH NAMES, NO KERNING. Identity-H addresses glyphs by index,
|
|
25
|
+
// so names are never needed; kerning is a refinement the layout engine
|
|
26
|
+
// above this has never had for the base-14 either.
|
|
27
|
+
//
|
|
28
|
+
// ⚠️ THE UNITS TRAP. A font's own numbers are in `unitsPerEm`, which is 2048 for
|
|
29
|
+
// most TrueType faces and 1000 for most PostScript ones. PDF text space is
|
|
30
|
+
// ALWAYS 1/1000. Everything this module hands out is already converted, so a
|
|
31
|
+
// caller never sees `unitsPerEm` — the one number that would silently scale
|
|
32
|
+
// every advance by 2.048 if it leaked.
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
class Reader {
|
|
35
|
+
bytes;
|
|
36
|
+
view;
|
|
37
|
+
constructor(bytes) {
|
|
38
|
+
this.bytes = bytes;
|
|
39
|
+
this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
40
|
+
}
|
|
41
|
+
u8(at) { return this.view.getUint8(at); }
|
|
42
|
+
u16(at) { return this.view.getUint16(at); }
|
|
43
|
+
i16(at) { return this.view.getInt16(at); }
|
|
44
|
+
u32(at) { return this.view.getUint32(at); }
|
|
45
|
+
/** A 16.16 fixed-point number, which is how `post` stores the italic angle. */
|
|
46
|
+
fixed(at) { return this.view.getInt32(at) / 65536; }
|
|
47
|
+
}
|
|
48
|
+
export class FontFormatError extends Error {
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Parse a `.ttf`.
|
|
52
|
+
*
|
|
53
|
+
* ⚠️ Rejects `.otf` (CFF outlines, `OTTO`) and both flavours of WOFF. All three
|
|
54
|
+
* are real fonts a person might reasonably hand over, and NONE can go into a
|
|
55
|
+
* `/FontFile2` — that key means "a TrueType font program", and a reader given
|
|
56
|
+
* CFF bytes under it will either draw nothing or refuse the file. Failing here
|
|
57
|
+
* with a sentence is much better than producing a PDF that opens blank.
|
|
58
|
+
*/
|
|
59
|
+
export function readTrueType(bytes) {
|
|
60
|
+
if (bytes.length < 12)
|
|
61
|
+
throw new FontFormatError('That font file is too short to be a font.');
|
|
62
|
+
const r = new Reader(bytes);
|
|
63
|
+
const tag = r.u32(0);
|
|
64
|
+
if (tag === 0x4f54544f) {
|
|
65
|
+
throw new FontFormatError('That is an OpenType/CFF font (.otf). A PDF needs TrueType outlines (.ttf).');
|
|
66
|
+
}
|
|
67
|
+
if (tag === 0x774f4646 || tag === 0x774f4632) {
|
|
68
|
+
throw new FontFormatError('That is a WOFF web font. Uncompress it to a .ttf first.');
|
|
69
|
+
}
|
|
70
|
+
// 0x00010000 is the ordinary TrueType version; 'true' is Apple's old variant.
|
|
71
|
+
if (tag !== 0x00010000 && tag !== 0x74727565) {
|
|
72
|
+
throw new FontFormatError('That file does not start like a TrueType font.');
|
|
73
|
+
}
|
|
74
|
+
const tables = new Map();
|
|
75
|
+
const count = r.u16(4);
|
|
76
|
+
for (let i = 0; i < count; i += 1) {
|
|
77
|
+
const at = 12 + i * 16;
|
|
78
|
+
const name = String.fromCharCode(r.u8(at), r.u8(at + 1), r.u8(at + 2), r.u8(at + 3));
|
|
79
|
+
tables.set(name, { off: r.u32(at + 8), len: r.u32(at + 12) });
|
|
80
|
+
}
|
|
81
|
+
const need = (name) => {
|
|
82
|
+
const t = tables.get(name);
|
|
83
|
+
if (!t)
|
|
84
|
+
throw new FontFormatError(`That font has no '${name}' table, so it cannot be embedded.`);
|
|
85
|
+
return t;
|
|
86
|
+
};
|
|
87
|
+
const head = need('head').off;
|
|
88
|
+
const unitsPerEm = r.u16(head + 18);
|
|
89
|
+
if (!unitsPerEm)
|
|
90
|
+
throw new FontFormatError('That font declares no units per em.');
|
|
91
|
+
// The conversion every number below goes through, and the reason no caller
|
|
92
|
+
// ever sees `unitsPerEm`.
|
|
93
|
+
const toThousandths = (value) => Math.round((value * 1000) / unitsPerEm);
|
|
94
|
+
const numGlyphs = r.u16(need('maxp').off + 4);
|
|
95
|
+
const hhea = need('hhea').off;
|
|
96
|
+
const numberOfHMetrics = r.u16(hhea + 34);
|
|
97
|
+
const hmtx = need('hmtx').off;
|
|
98
|
+
const advances = new Int32Array(numGlyphs);
|
|
99
|
+
let last = 0;
|
|
100
|
+
for (let g = 0; g < numGlyphs; g += 1) {
|
|
101
|
+
if (g < numberOfHMetrics)
|
|
102
|
+
last = r.u16(hmtx + g * 4);
|
|
103
|
+
advances[g] = toThousandths(last);
|
|
104
|
+
}
|
|
105
|
+
const cmap = readCmap(r, need('cmap').off);
|
|
106
|
+
// OS/2 is optional in the spec and present in practice. Where it is missing,
|
|
107
|
+
// hhea's ascender/descender are the same measurements by another name.
|
|
108
|
+
const os2 = tables.get('OS/2')?.off;
|
|
109
|
+
let capHeight = 0;
|
|
110
|
+
let ascent = toThousandths(r.i16(hhea + 4));
|
|
111
|
+
let descent = toThousandths(r.i16(hhea + 6));
|
|
112
|
+
let italic = false;
|
|
113
|
+
if (os2 !== undefined) {
|
|
114
|
+
const version = r.u16(os2);
|
|
115
|
+
ascent = toThousandths(r.i16(os2 + 68)) || ascent; // sTypoAscender
|
|
116
|
+
descent = toThousandths(r.i16(os2 + 70)) || descent; // sTypoDescender
|
|
117
|
+
italic = (r.u16(os2 + 62) & 1) !== 0; // fsSelection bit 0
|
|
118
|
+
if (version >= 2)
|
|
119
|
+
capHeight = toThousandths(r.i16(os2 + 88));
|
|
120
|
+
}
|
|
121
|
+
// A missing cap height is not worth refusing over — readers use it for
|
|
122
|
+
// small-caps substitution and hinting hints, and 70% of the ascent is the
|
|
123
|
+
// conventional stand-in.
|
|
124
|
+
if (!capHeight)
|
|
125
|
+
capHeight = Math.round(ascent * 0.7);
|
|
126
|
+
const post = tables.get('post')?.off;
|
|
127
|
+
const italicAngle = post !== undefined ? r.fixed(post + 4) : 0;
|
|
128
|
+
// /Flags, per PDF 32000-1 table 123. Bit 3 (value 4) is "symbolic", bit 6
|
|
129
|
+
// (32) "non-symbolic"; they are mutually exclusive and a text face is the
|
|
130
|
+
// second. Bit 1 (1) is fixed-pitch, bit 7 (64) italic.
|
|
131
|
+
let flags = 32;
|
|
132
|
+
if (italic || italicAngle !== 0)
|
|
133
|
+
flags |= 64;
|
|
134
|
+
if (numberOfHMetrics === 1)
|
|
135
|
+
flags |= 1;
|
|
136
|
+
return {
|
|
137
|
+
bytes,
|
|
138
|
+
postScriptName: readPostScriptName(r, tables.get('name')?.off) ?? 'EmbeddedFallback',
|
|
139
|
+
numGlyphs,
|
|
140
|
+
ascent,
|
|
141
|
+
descent,
|
|
142
|
+
capHeight,
|
|
143
|
+
italicAngle,
|
|
144
|
+
bbox: [
|
|
145
|
+
toThousandths(r.i16(head + 36)),
|
|
146
|
+
toThousandths(r.i16(head + 38)),
|
|
147
|
+
toThousandths(r.i16(head + 40)),
|
|
148
|
+
toThousandths(r.i16(head + 42)),
|
|
149
|
+
],
|
|
150
|
+
flags,
|
|
151
|
+
glyphFor: (codePoint) => cmap.get(codePoint),
|
|
152
|
+
advanceOf: (glyph) => (glyph >= 0 && glyph < numGlyphs ? advances[glyph] : 0),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The character map, as one plain Map.
|
|
157
|
+
*
|
|
158
|
+
* Built eagerly rather than searched per lookup. A face this package would
|
|
159
|
+
* embed has a few thousand mapped code points; the Map costs a few hundred
|
|
160
|
+
* kilobytes of heap once, and the alternative is a binary search through the
|
|
161
|
+
* segment arrays on every character of every line, including the re-measure the
|
|
162
|
+
* line-breaker does when a word does not fit.
|
|
163
|
+
*
|
|
164
|
+
* ⚠️ Subtable preference is (3,10) then (3,1) then (0,·) — Microsoft's UCS-4
|
|
165
|
+
* table first, because a font that has both puts everything above U+FFFF in it
|
|
166
|
+
* and only that one can address them.
|
|
167
|
+
*/
|
|
168
|
+
function readCmap(r, at) {
|
|
169
|
+
const count = r.u16(at + 2);
|
|
170
|
+
let chosen = null;
|
|
171
|
+
let rank = -1;
|
|
172
|
+
for (let i = 0; i < count; i += 1) {
|
|
173
|
+
const entry = at + 4 + i * 8;
|
|
174
|
+
const platform = r.u16(entry);
|
|
175
|
+
const encoding = r.u16(entry + 2);
|
|
176
|
+
const offset = at + r.u32(entry + 4);
|
|
177
|
+
const score = platform === 3 && encoding === 10 ? 3 :
|
|
178
|
+
platform === 3 && encoding === 1 ? 2 :
|
|
179
|
+
platform === 0 ? 1 : 0;
|
|
180
|
+
if (score > rank) {
|
|
181
|
+
rank = score;
|
|
182
|
+
chosen = offset;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const map = new Map();
|
|
186
|
+
if (chosen === null)
|
|
187
|
+
return map;
|
|
188
|
+
const format = r.u16(chosen);
|
|
189
|
+
if (format === 4)
|
|
190
|
+
readCmap4(r, chosen, map);
|
|
191
|
+
else if (format === 12)
|
|
192
|
+
readCmap12(r, chosen, map);
|
|
193
|
+
else if (format === 6)
|
|
194
|
+
readCmap6(r, chosen, map);
|
|
195
|
+
return map;
|
|
196
|
+
}
|
|
197
|
+
/** Format 4: segmented, BMP only. What almost every font uses. */
|
|
198
|
+
function readCmap4(r, at, map) {
|
|
199
|
+
const segments = r.u16(at + 6) / 2;
|
|
200
|
+
const endAt = at + 14;
|
|
201
|
+
const startAt = endAt + segments * 2 + 2;
|
|
202
|
+
const deltaAt = startAt + segments * 2;
|
|
203
|
+
const rangeAt = deltaAt + segments * 2;
|
|
204
|
+
for (let s = 0; s < segments; s += 1) {
|
|
205
|
+
const end = r.u16(endAt + s * 2);
|
|
206
|
+
const start = r.u16(startAt + s * 2);
|
|
207
|
+
const delta = r.i16(deltaAt + s * 2);
|
|
208
|
+
const rangeOffset = r.u16(rangeAt + s * 2);
|
|
209
|
+
// The last segment is the required 0xFFFF terminator, not a character.
|
|
210
|
+
for (let code = start; code <= end && code !== 0xffff; code += 1) {
|
|
211
|
+
let glyph;
|
|
212
|
+
if (rangeOffset === 0) {
|
|
213
|
+
glyph = (code + delta) & 0xffff;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
// The one genuinely strange piece of the format: `idRangeOffset` is a
|
|
217
|
+
// byte offset from ITS OWN slot, not from the start of the array.
|
|
218
|
+
const g = r.u16(rangeAt + s * 2 + rangeOffset + (code - start) * 2);
|
|
219
|
+
glyph = g === 0 ? 0 : (g + delta) & 0xffff;
|
|
220
|
+
}
|
|
221
|
+
if (glyph)
|
|
222
|
+
map.set(code, glyph);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/** Format 12: flat groups, the whole of Unicode. */
|
|
227
|
+
function readCmap12(r, at, map) {
|
|
228
|
+
const groups = r.u32(at + 12);
|
|
229
|
+
for (let g = 0; g < groups; g += 1) {
|
|
230
|
+
const entry = at + 16 + g * 12;
|
|
231
|
+
const start = r.u32(entry);
|
|
232
|
+
const end = r.u32(entry + 4);
|
|
233
|
+
const firstGlyph = r.u32(entry + 8);
|
|
234
|
+
// A malformed group could otherwise spin for four billion iterations.
|
|
235
|
+
if (end < start || end - start > 0x10ffff)
|
|
236
|
+
continue;
|
|
237
|
+
for (let code = start; code <= end; code += 1)
|
|
238
|
+
map.set(code, firstGlyph + (code - start));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/** Format 6: one dense range. Rare, and three lines. */
|
|
242
|
+
function readCmap6(r, at, map) {
|
|
243
|
+
const first = r.u16(at + 6);
|
|
244
|
+
const count = r.u16(at + 8);
|
|
245
|
+
for (let i = 0; i < count; i += 1) {
|
|
246
|
+
const glyph = r.u16(at + 10 + i * 2);
|
|
247
|
+
if (glyph)
|
|
248
|
+
map.set(first + i, glyph);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Name ID 6 — the PostScript name — for `/BaseFont`.
|
|
253
|
+
*
|
|
254
|
+
* Both encodings are read because fonts disagree: platform 3 stores UTF-16BE,
|
|
255
|
+
* platform 1 stores single bytes. A name that comes back with a NUL between
|
|
256
|
+
* every letter is the classic symptom of reading one as the other.
|
|
257
|
+
*/
|
|
258
|
+
function readPostScriptName(r, at) {
|
|
259
|
+
if (at === undefined)
|
|
260
|
+
return null;
|
|
261
|
+
const count = r.u16(at + 2);
|
|
262
|
+
const storage = at + r.u16(at + 4);
|
|
263
|
+
let fallback = null;
|
|
264
|
+
for (let i = 0; i < count; i += 1) {
|
|
265
|
+
const entry = at + 6 + i * 12;
|
|
266
|
+
if (r.u16(entry + 6) !== 6)
|
|
267
|
+
continue;
|
|
268
|
+
const platform = r.u16(entry);
|
|
269
|
+
const length = r.u16(entry + 8);
|
|
270
|
+
const offset = storage + r.u16(entry + 10);
|
|
271
|
+
let name = '';
|
|
272
|
+
if (platform === 3) {
|
|
273
|
+
for (let b = 0; b + 1 < length; b += 2)
|
|
274
|
+
name += String.fromCharCode(r.u16(offset + b));
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
for (let b = 0; b < length; b += 1)
|
|
278
|
+
name += String.fromCharCode(r.u8(offset + b));
|
|
279
|
+
}
|
|
280
|
+
// A PostScript name may not contain a space or any PDF delimiter.
|
|
281
|
+
name = name.replace(/[\s()<>[\]{}/%]/g, '');
|
|
282
|
+
if (platform === 3 && name)
|
|
283
|
+
return name;
|
|
284
|
+
if (name && !fallback)
|
|
285
|
+
fallback = name;
|
|
286
|
+
}
|
|
287
|
+
return fallback;
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=truetype.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truetype.js","sourceRoot":"","sources":["../src/truetype.ts"],"names":[],"mappings":"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"}
|
package/dist/write/pdf.d.ts
CHANGED
|
@@ -6,5 +6,21 @@ export interface PdfResult {
|
|
|
6
6
|
/** Characters no base-14 font can spell, for an honest warning. */
|
|
7
7
|
dropped: string[];
|
|
8
8
|
}
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Where the fallback face comes from.
|
|
11
|
+
*
|
|
12
|
+
* A FUNCTION, and an optional one, because the font is the caller's to supply
|
|
13
|
+
* and the caller's to deliver. This package has no runtime dependencies and
|
|
14
|
+
* ships no font: a 350 KB face compiled into it would be paid for by every app
|
|
15
|
+
* that imports the package and by every document that never needed it. The app
|
|
16
|
+
* decides where the bytes live and whether they are worth fetching.
|
|
17
|
+
*
|
|
18
|
+
* ⚠️ It is called ONLY when the document actually contains something WinAnsi
|
|
19
|
+
* cannot write, so an English document never touches the network. Returning
|
|
20
|
+
* `null` — or throwing, or being offline — is a supported answer: the document
|
|
21
|
+
* comes out exactly as it did before any of this existed, with the unwritable
|
|
22
|
+
* characters as '?' and named in `dropped`.
|
|
23
|
+
*/
|
|
24
|
+
export type FallbackFontLoader = () => Promise<Uint8Array | null>;
|
|
25
|
+
export declare function docToPdf(doc: RichDoc, settings: PdfSettings, loadFallbackFont?: FallbackFontLoader): Promise<PdfResult>;
|
|
10
26
|
//# sourceMappingURL=pdf.d.ts.map
|
package/dist/write/pdf.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/write/pdf.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/write/pdf.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAS,OAAO,EAAO,MAAM,aAAa,CAAA;AAOtD,OAAO,KAAK,EAAyB,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAqD1E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB;AAID;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;AAyBjE,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,WAAW,EACrB,gBAAgB,CAAC,EAAE,kBAAkB,GACpC,OAAO,CAAC,SAAS,CAAC,CA6CpB"}
|