postext-pdf 1.8.5 → 1.9.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.
Files changed (145) hide show
  1. package/README.md +1 -1
  2. package/dist/__tests__/accessibility.test.js +44 -0
  3. package/dist/__tests__/accessibility.test.js.map +1 -1
  4. package/dist/__tests__/chinesePageLabels.test.d.ts +2 -0
  5. package/dist/__tests__/chinesePageLabels.test.d.ts.map +1 -0
  6. package/dist/__tests__/chinesePageLabels.test.js +58 -0
  7. package/dist/__tests__/chinesePageLabels.test.js.map +1 -0
  8. package/dist/__tests__/cjkAnnotations.test.d.ts +2 -0
  9. package/dist/__tests__/cjkAnnotations.test.d.ts.map +1 -0
  10. package/dist/__tests__/cjkAnnotations.test.js +83 -0
  11. package/dist/__tests__/cjkAnnotations.test.js.map +1 -0
  12. package/dist/__tests__/cjkDashRule.test.d.ts +2 -0
  13. package/dist/__tests__/cjkDashRule.test.d.ts.map +1 -0
  14. package/dist/__tests__/cjkDashRule.test.js +101 -0
  15. package/dist/__tests__/cjkDashRule.test.js.map +1 -0
  16. package/dist/__tests__/cjkFontFiles.test.d.ts +2 -0
  17. package/dist/__tests__/cjkFontFiles.test.d.ts.map +1 -0
  18. package/dist/__tests__/cjkFontFiles.test.js +302 -0
  19. package/dist/__tests__/cjkFontFiles.test.js.map +1 -0
  20. package/dist/__tests__/cjkGrid.test.d.ts +2 -0
  21. package/dist/__tests__/cjkGrid.test.d.ts.map +1 -0
  22. package/dist/__tests__/cjkGrid.test.js +57 -0
  23. package/dist/__tests__/cjkGrid.test.js.map +1 -0
  24. package/dist/__tests__/cjkPunctuation.test.d.ts +2 -0
  25. package/dist/__tests__/cjkPunctuation.test.d.ts.map +1 -0
  26. package/dist/__tests__/cjkPunctuation.test.js +143 -0
  27. package/dist/__tests__/cjkPunctuation.test.js.map +1 -0
  28. package/dist/__tests__/cjkTracking.test.d.ts +2 -0
  29. package/dist/__tests__/cjkTracking.test.d.ts.map +1 -0
  30. package/dist/__tests__/cjkTracking.test.js +100 -0
  31. package/dist/__tests__/cjkTracking.test.js.map +1 -0
  32. package/dist/__tests__/documentLanguage.test.js +13 -3
  33. package/dist/__tests__/documentLanguage.test.js.map +1 -1
  34. package/dist/__tests__/fallbackSpaces.test.js +49 -0
  35. package/dist/__tests__/fallbackSpaces.test.js.map +1 -1
  36. package/dist/__tests__/outlineTitles.test.js +87 -0
  37. package/dist/__tests__/outlineTitles.test.js.map +1 -1
  38. package/dist/__tests__/pdfWorker.test.js +17 -0
  39. package/dist/__tests__/pdfWorker.test.js.map +1 -1
  40. package/dist/__tests__/renderOptionsDocs.test.d.ts +2 -0
  41. package/dist/__tests__/renderOptionsDocs.test.d.ts.map +1 -0
  42. package/dist/__tests__/renderOptionsDocs.test.js +32 -0
  43. package/dist/__tests__/renderOptionsDocs.test.js.map +1 -0
  44. package/dist/__tests__/rightBinding.test.d.ts +2 -0
  45. package/dist/__tests__/rightBinding.test.d.ts.map +1 -0
  46. package/dist/__tests__/rightBinding.test.js +112 -0
  47. package/dist/__tests__/rightBinding.test.js.map +1 -0
  48. package/dist/__tests__/verticalDesignImage.test.d.ts +2 -0
  49. package/dist/__tests__/verticalDesignImage.test.d.ts.map +1 -0
  50. package/dist/__tests__/verticalDesignImage.test.js +152 -0
  51. package/dist/__tests__/verticalDesignImage.test.js.map +1 -0
  52. package/dist/__tests__/verticalText.test.d.ts +2 -0
  53. package/dist/__tests__/verticalText.test.d.ts.map +1 -0
  54. package/dist/__tests__/verticalText.test.js +380 -0
  55. package/dist/__tests__/verticalText.test.js.map +1 -0
  56. package/dist/faceFiles.d.ts +70 -0
  57. package/dist/faceFiles.d.ts.map +1 -0
  58. package/dist/faceFiles.js +154 -0
  59. package/dist/faceFiles.js.map +1 -0
  60. package/dist/fontCache.d.ts +101 -7
  61. package/dist/fontCache.d.ts.map +1 -1
  62. package/dist/fontCache.js +178 -26
  63. package/dist/fontCache.js.map +1 -1
  64. package/dist/fontFamilies.d.ts +12 -0
  65. package/dist/fontFamilies.d.ts.map +1 -0
  66. package/dist/fontFamilies.js +12 -0
  67. package/dist/fontFamilies.js.map +1 -0
  68. package/dist/index.d.ts +1 -1
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js.map +1 -1
  71. package/dist/pdf-backend/annotations.d.ts +29 -0
  72. package/dist/pdf-backend/annotations.d.ts.map +1 -0
  73. package/dist/pdf-backend/annotations.js +133 -0
  74. package/dist/pdf-backend/annotations.js.map +1 -0
  75. package/dist/pdf-backend/blockRender.d.ts.map +1 -1
  76. package/dist/pdf-backend/blockRender.js +160 -30
  77. package/dist/pdf-backend/blockRender.js.map +1 -1
  78. package/dist/pdf-backend/fallbackSpaces.d.ts +21 -2
  79. package/dist/pdf-backend/fallbackSpaces.d.ts.map +1 -1
  80. package/dist/pdf-backend/fallbackSpaces.js +43 -6
  81. package/dist/pdf-backend/fallbackSpaces.js.map +1 -1
  82. package/dist/pdf-backend/fontHelpers.d.ts +12 -0
  83. package/dist/pdf-backend/fontHelpers.d.ts.map +1 -1
  84. package/dist/pdf-backend/fontHelpers.js +49 -11
  85. package/dist/pdf-backend/fontHelpers.js.map +1 -1
  86. package/dist/pdf-backend/headerFooter.d.ts +8 -3
  87. package/dist/pdf-backend/headerFooter.d.ts.map +1 -1
  88. package/dist/pdf-backend/headerFooter.js +74 -16
  89. package/dist/pdf-backend/headerFooter.js.map +1 -1
  90. package/dist/pdf-backend/index.d.ts +74 -8
  91. package/dist/pdf-backend/index.d.ts.map +1 -1
  92. package/dist/pdf-backend/index.js +121 -25
  93. package/dist/pdf-backend/index.js.map +1 -1
  94. package/dist/pdf-backend/inkScale.d.ts +12 -0
  95. package/dist/pdf-backend/inkScale.d.ts.map +1 -0
  96. package/dist/pdf-backend/inkScale.js +16 -0
  97. package/dist/pdf-backend/inkScale.js.map +1 -0
  98. package/dist/pdf-backend/outlines.d.ts +12 -1
  99. package/dist/pdf-backend/outlines.d.ts.map +1 -1
  100. package/dist/pdf-backend/outlines.js +46 -16
  101. package/dist/pdf-backend/outlines.js.map +1 -1
  102. package/dist/pdf-backend/pageDecorations.d.ts +5 -1
  103. package/dist/pdf-backend/pageDecorations.d.ts.map +1 -1
  104. package/dist/pdf-backend/pageDecorations.js +22 -1
  105. package/dist/pdf-backend/pageDecorations.js.map +1 -1
  106. package/dist/pdf-backend/pageLabels.d.ts +3 -1
  107. package/dist/pdf-backend/pageLabels.d.ts.map +1 -1
  108. package/dist/pdf-backend/pageLabels.js +12 -6
  109. package/dist/pdf-backend/pageLabels.js.map +1 -1
  110. package/dist/pdf-backend/primitives.d.ts +153 -6
  111. package/dist/pdf-backend/primitives.d.ts.map +1 -1
  112. package/dist/pdf-backend/primitives.js +269 -28
  113. package/dist/pdf-backend/primitives.js.map +1 -1
  114. package/dist/pdf-backend/renderResourceBlock.d.ts +4 -0
  115. package/dist/pdf-backend/renderResourceBlock.d.ts.map +1 -1
  116. package/dist/pdf-backend/renderResourceBlock.js +105 -26
  117. package/dist/pdf-backend/renderResourceBlock.js.map +1 -1
  118. package/dist/pdf-backend/structureFlow.d.ts +5 -0
  119. package/dist/pdf-backend/structureFlow.d.ts.map +1 -1
  120. package/dist/pdf-backend/structureFlow.js +8 -0
  121. package/dist/pdf-backend/structureFlow.js.map +1 -1
  122. package/dist/pdf-backend/svgVector.d.ts.map +1 -1
  123. package/dist/pdf-backend/svgVector.js +13 -2
  124. package/dist/pdf-backend/svgVector.js.map +1 -1
  125. package/dist/pdf-backend/tagging.d.ts +8 -1
  126. package/dist/pdf-backend/tagging.d.ts.map +1 -1
  127. package/dist/pdf-backend/tagging.js +7 -1
  128. package/dist/pdf-backend/tagging.js.map +1 -1
  129. package/dist/pdf-backend/verticalText.d.ts +43 -0
  130. package/dist/pdf-backend/verticalText.d.ts.map +1 -0
  131. package/dist/pdf-backend/verticalText.js +284 -0
  132. package/dist/pdf-backend/verticalText.js.map +1 -0
  133. package/dist/verticalFonts.d.ts +75 -0
  134. package/dist/verticalFonts.d.ts.map +1 -0
  135. package/dist/verticalFonts.js +136 -0
  136. package/dist/verticalFonts.js.map +1 -0
  137. package/dist/worker/client.d.ts +1 -1
  138. package/dist/worker/client.d.ts.map +1 -1
  139. package/dist/worker/client.js +7 -5
  140. package/dist/worker/client.js.map +1 -1
  141. package/dist/worker/pdf.worker.js +8 -4
  142. package/dist/worker/pdf.worker.js.map +1 -1
  143. package/dist/worker/protocol.d.ts +10 -5
  144. package/dist/worker/protocol.d.ts.map +1 -1
  145. package/package.json +3 -3
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Vertical text in the PDF (issue #191).
3
+ *
4
+ * A vertical page's flow is drawn through the page's frame (a quarter turn
5
+ * clockwise, `renderPage`), where text drawn as it is comes out turned:
6
+ * right for Latin words and long numbers (sideways), wrong for Chinese
7
+ * characters, which stand upright, each in a cell of one em down the
8
+ * column. The painter here cuts the text into the runs the layout measured
9
+ * (`verticalRuns`, with the document's `cjk.uprightDigits`, or the runs an
10
+ * author forced with `:tcy` / `:upright` / `:sideways`) and draws:
11
+ *
12
+ * - sideways runs with the horizontal font, as they are;
13
+ * - upright characters with the font's vertical twin (`Identity-V`, see
14
+ * `verticalFonts.ts`): one text object per run of cells, its text matrix
15
+ * turned back (`0 1 −1 0`), the glyphs shaped with `vert` and advancing
16
+ * one em down the column by themselves, tracking as `TJ` numbers (in
17
+ * WMode 1 a positive number moves the pen down); the pen is placed so
18
+ * each glyph's em box is centred on the column's central axis
19
+ * (`VDTFlowFrame.centralBaselines`);
20
+ * - marks with no vertical form in the font as the canvas draws them:
21
+ * brackets and quotes turned about their em box, a mainland pause mark
22
+ * moved to the top right of its cell;
23
+ * - dashes, ellipses and the interpunct turned about their em box (a dash
24
+ * stretched to its cell);
25
+ * - a number set in one cell (tate-chu-yoko) upright, squeezed across to
26
+ * one em when wider.
27
+ *
28
+ * Every cell is placed where the layout measured it, one em (or its cell)
29
+ * apart plus the tracking, so the PDF matches the canvas and the HTML.
30
+ */
31
+ import { beginText, endText, PDFArray, PDFHexString, PDFNumber, PDFOperator, PDFOperatorNames, popGraphicsState, pushGraphicsState, setCharacterSpacing, setFillingColor, setFontAndSize, setLineWidth, setStrokingColor, setTextMatrix, setTextRenderingMode, TextRenderingMode, } from 'pdf-lib';
32
+ import { CORNER_OFFSET_EM, DEFAULT_CENTRAL_BASELINE, forcedVerticalRuns, graphemesOf, verticalRuns, } from 'postext';
33
+ import { alphaOf, alphaStateOp, fontKeyOn, opt, registerVerticalPainter, showTextShaped, textAdvancePx, withActualText, } from './primitives';
34
+ import { fileRuns, noteMissingGlyphs } from '../faceFiles';
35
+ import { fontFamilyOf } from '../fontFamilies';
36
+ import { VERTICAL_ORIGIN, verticalTwinOf } from '../verticalFonts';
37
+ const twinKeys = new WeakMap();
38
+ /** The resource name of `font`'s vertical twin on `page`. */
39
+ function twinKeyOn(page, font, twin) {
40
+ let keys = twinKeys.get(page);
41
+ if (!keys) {
42
+ keys = new Map();
43
+ twinKeys.set(page, keys);
44
+ }
45
+ let key = keys.get(font);
46
+ if (!key) {
47
+ key = page.node.newFontDictionary(`${font.name}V`, twin.ref);
48
+ keys.set(font, key);
49
+ }
50
+ return key;
51
+ }
52
+ /**
53
+ * Paint `text` down a vertical line from `xPx` (along the line) on
54
+ * `baselinePx` (the line's alphabetic baseline across the column), in the
55
+ * frame of the page's flow. The tracking set on the context
56
+ * (`ctx.trackingPx`) follows every cell and every glyph of a sideways run;
57
+ * a number set in one cell takes it once. `actualText` is what the glyphs
58
+ * read as.
59
+ */
60
+ export function drawVerticalTextPx(ctx, text, xPx, baselinePx, font, sizePx, color, outline, actualText, orient) {
61
+ const v = ctx.vertical;
62
+ if (!v || !text)
63
+ return;
64
+ const { scale, pageHeightPt } = ctx;
65
+ const em = sizePx;
66
+ const family = fontFamilyOf(font);
67
+ const central = (family !== undefined ? v.axes?.[family] : undefined) ?? DEFAULT_CENTRAL_BASELINE;
68
+ const centralPx = central * em;
69
+ const axis = baselinePx - centralPx;
70
+ const tracking = ctx.trackingPx ?? 0;
71
+ const X = (px) => px * scale;
72
+ const Y = (py) => pageHeightPt - py * scale;
73
+ const sizePt = sizePx * scale;
74
+ const graphemes = graphemesOf(text);
75
+ const runs = orient ? forcedVerticalRuns(graphemes, orient) : verticalRuns(graphemes, v.region, v.uprightDigits);
76
+ const body = [];
77
+ let currentKey;
78
+ let currentTc = Number.NaN;
79
+ const useFont = (key) => {
80
+ if (key !== currentKey) {
81
+ body.push(setFontAndSize(key, sizePt));
82
+ currentKey = key;
83
+ }
84
+ };
85
+ const useTc = (px) => {
86
+ if (px !== currentTc) {
87
+ body.push(setCharacterSpacing(px * scale));
88
+ currentTc = px;
89
+ }
90
+ };
91
+ // Consecutive upright cells of one em: one show per file of the face.
92
+ let pending = [];
93
+ let pendingStart = 0;
94
+ const flushUpright = () => {
95
+ if (pending.length === 0)
96
+ return;
97
+ let cellStart = pendingStart;
98
+ // In WMode 1 the pen stands at the glyph's vertical origin, `VERTICAL_ORIGIN`
99
+ // above its baseline: the em box's centre sits on the cell's centre
100
+ // when the pen is that far above the axis's own height.
101
+ const penOffset = em * (0.5 - (VERTICAL_ORIGIN / 1000 - central));
102
+ const trackTj = tracking === 0 ? 0 : Math.round((tracking / em) * 1000 * 100) / 100;
103
+ for (const show of pending) {
104
+ useFont(twinKeyOn(ctx.page, show.file, show.twin));
105
+ useTc(0);
106
+ noteMissingGlyphs(show.file, show.text);
107
+ const cells = graphemesOf(show.text);
108
+ const { hex } = show.twin.encode(show.text, show.vertical, cells);
109
+ body.push(setTextMatrix(0, 1, -1, 0, X(cellStart + penOffset), Y(axis)));
110
+ const count = hex.length / 4;
111
+ if (trackTj === 0 || count === 1) {
112
+ body.push(PDFOperator.of(PDFOperatorNames.ShowText, [PDFHexString.of(hex)]));
113
+ }
114
+ else {
115
+ const array = PDFArray.withContext(ctx.page.doc.context);
116
+ for (let i = 0; i < count; i++) {
117
+ array.push(PDFHexString.of(hex.slice(i * 4, i * 4 + 4)));
118
+ if (i < count - 1)
119
+ array.push(PDFNumber.of(trackTj));
120
+ }
121
+ body.push(PDFOperator.of(PDFOperatorNames.ShowTextAdjusted, [array]));
122
+ }
123
+ cellStart += cells.length * (em + tracking);
124
+ }
125
+ pending = [];
126
+ };
127
+ const queueUpright = (g, at, vertical) => {
128
+ if (pending.length === 0)
129
+ pendingStart = at;
130
+ for (const { font: file, text: part } of fileRuns(font, g)) {
131
+ const twin = verticalTwinOf(file);
132
+ if (!twin)
133
+ continue;
134
+ const last = pending[pending.length - 1];
135
+ if (last && last.file === file && last.vertical === vertical)
136
+ last.text += part;
137
+ else
138
+ pending.push({ file, twin, text: part, vertical });
139
+ }
140
+ };
141
+ /** A glyph drawn with the horizontal font under its own text matrix. */
142
+ const drawHorizontal = (t, m, spacingPx) => {
143
+ let first = true;
144
+ for (const { font: file, text: part } of fileRuns(font, t)) {
145
+ useFont(fontKeyOn(ctx.page, file));
146
+ if (first) {
147
+ useTc(spacingPx);
148
+ body.push(setTextMatrix(...m));
149
+ first = false;
150
+ }
151
+ body.push(showTextShaped(file, part));
152
+ }
153
+ };
154
+ let cx = xPx;
155
+ for (const run of runs) {
156
+ if (run.cell === undefined) {
157
+ // Sideways: the frame turns it; painted as it is.
158
+ flushUpright();
159
+ drawHorizontal(run.text, [1, 0, 0, 1, X(cx), Y(baselinePx)], tracking);
160
+ cx += textAdvancePx(font, run.text, sizePx, tracking).advance;
161
+ continue;
162
+ }
163
+ const cell = em * run.cell;
164
+ const kind = cellKind(run.glyph, run.text, font);
165
+ if ((kind === 'upright' || kind === 'alternate' || kind === 'dash') && shapesApart(font, run.text, kind !== 'upright')) {
166
+ // A cluster of several glyphs (a combining mark the font does not
167
+ // compose, an emoji sequence it does not ligate): in a show each
168
+ // glyph would advance one em down the column. Set as the canvas sets
169
+ // it: the cluster shaped horizontally, stood upright, centred on its
170
+ // cell.
171
+ flushUpright();
172
+ const w = textAdvancePx(font, run.text, sizePx).advance;
173
+ drawHorizontal(run.text, [0, 1, -1, 0, X(cx + cell / 2) + centralPx * scale, Y(axis) - (w * scale) / 2], 0);
174
+ cx += cell + tracking;
175
+ continue;
176
+ }
177
+ if (kind === 'upright' || kind === 'alternate' || kind === 'dash') {
178
+ // A character that stands upright as it is keeps its horizontal
179
+ // glyph, as on the canvas; a vertical form comes from `vert` (with
180
+ // `fwid` for a dash whose form Noto keys to both).
181
+ // A dash is shaped alone: `fwid` with `vert` would join two of them
182
+ // into one long glyph where the canvas sets one per cell.
183
+ if (kind === 'dash')
184
+ flushUpright();
185
+ queueUpright(run.text, cx, kind !== 'upright');
186
+ if (kind === 'dash')
187
+ flushUpright();
188
+ cx += cell + tracking;
189
+ continue;
190
+ }
191
+ flushUpright();
192
+ if (kind === 'tcy') {
193
+ // Upright, side by side, squeezed across to the em.
194
+ const w = textAdvancePx(font, run.text, sizePx).advance;
195
+ const k = w > em ? em / w : 1;
196
+ drawHorizontal(run.text, [0, k, -1, 0, X(cx + em / 2) + centralPx * scale, Y(axis) - (k * w * scale) / 2], 0);
197
+ }
198
+ else if (kind === 'rotate') {
199
+ // Turned with the frame; a dash stretched to fill its cell. A bracket
200
+ // or a quote turns about the em box's centre, so it hugs the character
201
+ // it belongs to; a dash, an ellipsis, an interpunct is centred on the
202
+ // axis by its ink, as on the canvas.
203
+ const char = run.glyph.orient === 'alternate' && run.glyph.substitute ? run.glyph.substitute : run.text;
204
+ const w = textAdvancePx(font, char, sizePx).advance;
205
+ const k = run.glyph.stretch && w > 0 && w < cell ? cell / w : 1;
206
+ const lift = run.glyph.orient === 'rotate' ? inkLiftPx(font, char, sizePx) ?? centralPx : centralPx;
207
+ drawHorizontal(char, [k, 0, 0, 1, X(cx + cell / 2 - (k * w) / 2), Y(axis + lift)], 0);
208
+ }
209
+ else {
210
+ // A mainland pause mark the font has no vertical form for: the
211
+ // upright glyph moved to the top right of its cell.
212
+ const offset = run.glyph.offset ?? CORNER_OFFSET_EM;
213
+ const penOffset = em * (0.5 - (VERTICAL_ORIGIN / 1000 - central));
214
+ for (const { font: file, text: part } of fileRuns(font, run.text)) {
215
+ const twin = verticalTwinOf(file);
216
+ if (!twin)
217
+ continue;
218
+ useFont(twinKeyOn(ctx.page, file, twin));
219
+ useTc(0);
220
+ noteMissingGlyphs(file, part);
221
+ body.push(setTextMatrix(0, 1, -1, 0, X(cx + penOffset + offset.y * em), Y(axis) + offset.x * em * scale));
222
+ body.push(PDFOperator.of(PDFOperatorNames.ShowText, [PDFHexString.of(twin.encode(part, false).hex)]));
223
+ }
224
+ }
225
+ cx += cell + tracking;
226
+ }
227
+ flushUpright();
228
+ if (body.length === 0)
229
+ return;
230
+ const outlineOps = outline && outline.widthPx > 0
231
+ ? [
232
+ setStrokingColor(outline.color),
233
+ setLineWidth(outline.widthPx * scale),
234
+ setTextRenderingMode(outline.hollow ? TextRenderingMode.Outline : TextRenderingMode.FillAndOutline),
235
+ ]
236
+ : [];
237
+ ctx.page.pushOperators(pushGraphicsState(), ...opt(alphaStateOp(ctx, alphaOf(color), outlineOps.length > 0 ? alphaOf(outline.color) : 1)), ...outlineOps, beginText(), setFillingColor(color), ...(actualText === undefined ? body : withActualText(ctx, actualText, body)), endText(), popGraphicsState());
238
+ }
239
+ /** How far above the baseline the ink of `ch` is centred, px, as the face
240
+ * of `font` that has it draws it (undefined when it has no ink). */
241
+ function inkLiftPx(font, ch, sizePx) {
242
+ const file = fileRuns(font, ch)[0]?.font ?? font;
243
+ const face = file.embedder?.font;
244
+ const bbox = face?.layout(ch).glyphs[0]?.bbox;
245
+ if (!face || !bbox || !Number.isFinite(bbox.minY) || !(bbox.maxY > bbox.minY))
246
+ return undefined;
247
+ return ((bbox.minY + bbox.maxY) / 2 / face.unitsPerEm) * sizePx;
248
+ }
249
+ /** Whether the grapheme `g` cannot be shown as one glyph of a twin's run:
250
+ * it shapes to more than one glyph (in its vertical forms when
251
+ * `vertical`), or its characters come from different files of the face. */
252
+ function shapesApart(font, g, vertical) {
253
+ // A single UTF-16 unit maps to one glyph through the cmap; only a
254
+ // cluster can shape to more (fast path for Han and the marks).
255
+ if (g.length === 1)
256
+ return false;
257
+ const runs = fileRuns(font, g);
258
+ if (runs.length !== 1)
259
+ return runs.length > 1;
260
+ const twin = verticalTwinOf(runs[0].font);
261
+ return twin !== undefined && twin.glyphCount(g, vertical) > 1;
262
+ }
263
+ /** How a cell is drawn: upright through the vertical twin, as it is
264
+ * (`upright`), in the font's vertical form (`alternate`), or a dash, an
265
+ * ellipsis or a wave dash in its vertical form (`dash`); turned; moved to
266
+ * the corner of its cell (a mainland pause mark the font has no vertical
267
+ * form for); or as a number set in one cell. */
268
+ function cellKind(glyph, ch, font) {
269
+ if (glyph.orient === 'tcy')
270
+ return 'tcy';
271
+ if (glyph.orient === 'rotate') {
272
+ const file = fileRuns(font, ch)[0]?.font ?? font;
273
+ return verticalTwinOf(file)?.hasVerticalForm(ch) ? 'dash' : 'rotate';
274
+ }
275
+ if (glyph.orient === 'alternate') {
276
+ const file = fileRuns(font, ch)[0]?.font ?? font;
277
+ if (verticalTwinOf(file)?.hasVerticalForm(ch))
278
+ return 'alternate';
279
+ return glyph.fallback === 'corner' ? 'corner' : 'rotate';
280
+ }
281
+ return 'upright';
282
+ }
283
+ registerVerticalPainter(drawVerticalTextPx);
284
+ //# sourceMappingURL=verticalText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verticalText.js","sourceRoot":"","sources":["../../src/pdf-backend/verticalText.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Vertical twins of embedded fonts (issue #191).
3
+ *
4
+ * pdf-lib writes every custom font as a Type0 font with `Encoding
5
+ * /Identity-H`. Characters that stand upright in vertical text are shown
6
+ * with a second Type0 dictionary over the same CIDFont — the same font
7
+ * file, the same widths and the same ToUnicode map — whose encoding is
8
+ * `/Identity-V` (WMode 1): the glyphs of one run then advance down the
9
+ * column by themselves (`DW2 [880 −1000]`, one em each), pdf.js and Poppler
10
+ * read the run as one vertical text item, and nothing of the font is
11
+ * embedded twice.
12
+ *
13
+ * The glyphs are shaped with OpenType `vert` into the same subset as the
14
+ * horizontal text (the ids a subset font gives, or the face's own ids for a
15
+ * font embedded whole), so brackets, quotes and the mainland pause marks
16
+ * take the font's vertical forms. fontkit keeps each substituted glyph's
17
+ * source characters, so the shared ToUnicode map reads them back; where one
18
+ * vertical glyph stands for two characters (Noto Serif SC sets “ and 『
19
+ * with one glyph), the line's `/ActualText` gives the text as written.
20
+ *
21
+ * fontkit misreads the `vhea` table of Noto CJK fonts (it reports no
22
+ * vertical metrics), so nothing here reads vertical advances or origins
23
+ * from it: every upright character is one em down the column, as the
24
+ * layout measured it, and the painter places the pen itself.
25
+ */
26
+ import { PDFRef, type PDFFont } from 'pdf-lib';
27
+ /** The vertical origin (`DW2`'s first number) every twin is written with,
28
+ * in thousandths of the em: the ideographic em box's top above the
29
+ * baseline in Noto and Source Han, and what viewers assume when a font
30
+ * says nothing. The painter places each run's pen from it and the
31
+ * document's measured central axis, so any face lines up. */
32
+ export declare const VERTICAL_ORIGIN = 880;
33
+ interface ShapedGlyph {
34
+ id: number;
35
+ advanceWidth: number;
36
+ codePoints: number[];
37
+ }
38
+ /** A font's vertical twin: its dictionary's reference and the encoder of
39
+ * upright text into the shared glyph ids. */
40
+ export interface VerticalTwin {
41
+ ref: PDFRef;
42
+ /** The hex glyph codes of `text` and the shaped glyphs (their ids in the
43
+ * face): in the font's vertical forms (OpenType `vert` with `fwid`, as
44
+ * the canvas's twin face sets them: Noto CJK keys the vertical form of
45
+ * its dashes to both, and the marks are full-width already), or as it
46
+ * is when `vertical` is false. With `cells` (the graphemes of `text`,
47
+ * each set in a cell of its own), one glyph per cell: the text is shaped
48
+ * whole when that gives as many glyphs as cells, else cell by cell, so a
49
+ * ligature (f + i in `:upright[fi]`) never takes two cells' places. */
50
+ encode(text: string, vertical?: boolean, cells?: readonly string[]): {
51
+ hex: string;
52
+ glyphs: ShapedGlyph[];
53
+ };
54
+ /** Whether the font has a vertical form for `ch`: a glyph `vert` gives
55
+ * on top of what `fwid` alone gives. */
56
+ hasVerticalForm(ch: string): boolean;
57
+ /** How many glyphs `text` (one grapheme) shapes to, as {@link encode}
58
+ * would shape it, without adding them to the subset. In WMode 1 every
59
+ * glyph of a show advances one em, so a cluster of more than one (a
60
+ * combining mark the font does not compose, an emoji sequence it does
61
+ * not ligate) cannot be shown in one cell of a run. */
62
+ glyphCount(text: string, vertical?: boolean): number;
63
+ }
64
+ /**
65
+ * The vertical twin of an embedded custom font, made on first use:
66
+ * undefined for a font pdf-lib does not embed through fontkit (a standard
67
+ * font). The twin's dictionary is written with the font (pdf-lib builds the
68
+ * horizontal one on save; the twin is filled in right after it).
69
+ */
70
+ export declare function verticalTwinOf(font: PDFFont): VerticalTwin | undefined;
71
+ /** The reference of `font`'s vertical twin, when one was made: a page that
72
+ * shows text through the twin uses the font. */
73
+ export declare function verticalTwinRefOf(font: PDFFont): string | undefined;
74
+ export {};
75
+ //# sourceMappingURL=verticalFonts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verticalFonts.d.ts","sourceRoot":"","sources":["../src/verticalFonts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAA8B,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAE3E;;;;8DAI8D;AAC9D,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAgBD;8CAC8C;AAC9C,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;;4EAOwE;IACxE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC;IAC5G;6CACyC;IACzC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC;;;;4DAIwD;IACxD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACtD;AAiBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAyEtE;AAED;iDACiD;AACjD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEnE"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Vertical twins of embedded fonts (issue #191).
3
+ *
4
+ * pdf-lib writes every custom font as a Type0 font with `Encoding
5
+ * /Identity-H`. Characters that stand upright in vertical text are shown
6
+ * with a second Type0 dictionary over the same CIDFont — the same font
7
+ * file, the same widths and the same ToUnicode map — whose encoding is
8
+ * `/Identity-V` (WMode 1): the glyphs of one run then advance down the
9
+ * column by themselves (`DW2 [880 −1000]`, one em each), pdf.js and Poppler
10
+ * read the run as one vertical text item, and nothing of the font is
11
+ * embedded twice.
12
+ *
13
+ * The glyphs are shaped with OpenType `vert` into the same subset as the
14
+ * horizontal text (the ids a subset font gives, or the face's own ids for a
15
+ * font embedded whole), so brackets, quotes and the mainland pause marks
16
+ * take the font's vertical forms. fontkit keeps each substituted glyph's
17
+ * source characters, so the shared ToUnicode map reads them back; where one
18
+ * vertical glyph stands for two characters (Noto Serif SC sets “ and 『
19
+ * with one glyph), the line's `/ActualText` gives the text as written.
20
+ *
21
+ * fontkit misreads the `vhea` table of Noto CJK fonts (it reports no
22
+ * vertical metrics), so nothing here reads vertical advances or origins
23
+ * from it: every upright character is one em down the column, as the
24
+ * layout measured it, and the painter places the pen itself.
25
+ */
26
+ import { PDFArray, PDFDict, PDFName } from 'pdf-lib';
27
+ /** The vertical origin (`DW2`'s first number) every twin is written with,
28
+ * in thousandths of the em: the ideographic em box's top above the
29
+ * baseline in Noto and Source Han, and what viewers assume when a font
30
+ * says nothing. The painter places each run's pen from it and the
31
+ * document's measured central axis, so any face lines up. */
32
+ export const VERTICAL_ORIGIN = 880;
33
+ const twins = new WeakMap();
34
+ const twinRefs = new WeakMap();
35
+ function embedderOf(font) {
36
+ const e = font.embedder;
37
+ return e && e.font && typeof e.font.layout === 'function' && typeof e.embedFontDict === 'function' ? e : undefined;
38
+ }
39
+ /** The features `vert` shaping runs with: the font's own plus `vert`. */
40
+ function verticalFeatures(features) {
41
+ if (Array.isArray(features))
42
+ return [...new Set([...features, 'vert'])];
43
+ if (features && typeof features === 'object')
44
+ return { ...features, vert: true };
45
+ return ['vert'];
46
+ }
47
+ /**
48
+ * The vertical twin of an embedded custom font, made on first use:
49
+ * undefined for a font pdf-lib does not embed through fontkit (a standard
50
+ * font). The twin's dictionary is written with the font (pdf-lib builds the
51
+ * horizontal one on save; the twin is filled in right after it).
52
+ */
53
+ export function verticalTwinOf(font) {
54
+ const known = twins.get(font);
55
+ if (known)
56
+ return known;
57
+ const embedder = embedderOf(font);
58
+ if (!embedder)
59
+ return undefined;
60
+ const context = font.doc.context;
61
+ const ref = context.nextRef();
62
+ const embedFontDict = embedder.embedFontDict.bind(embedder);
63
+ embedder.embedFontDict = async (ctx, hRef) => {
64
+ const written = await embedFontDict(ctx, hRef);
65
+ const h = context.lookup(written, PDFDict);
66
+ const descendants = h.lookup(PDFName.of('DescendantFonts'), PDFArray);
67
+ const cid = descendants.lookup(0, PDFDict);
68
+ cid.set(PDFName.of('DW2'), context.obj([VERTICAL_ORIGIN, -1000]));
69
+ context.assign(ref, context.obj({
70
+ Type: 'Font',
71
+ Subtype: 'Type0',
72
+ BaseFont: h.get(PDFName.of('BaseFont')),
73
+ Encoding: 'Identity-V',
74
+ DescendantFonts: h.get(PDFName.of('DescendantFonts')),
75
+ ToUnicode: h.get(PDFName.of('ToUnicode')),
76
+ }));
77
+ return written;
78
+ };
79
+ const plain = embedder.fontFeatures;
80
+ const withFwid = (f) => (Array.isArray(f) ? [...new Set([...f, 'fwid'])] : { ...(f ?? {}), fwid: true });
81
+ const vertical = withFwid(verticalFeatures(plain));
82
+ const fullWidth = withFwid(plain);
83
+ const idsOf = (ch, features) => embedder.font.layout(ch, features).glyphs.map((g) => g.id).join(',');
84
+ const formCache = new Map();
85
+ const countCache = new Map();
86
+ const twin = {
87
+ ref,
88
+ encode(text, upright = true, cells) {
89
+ const features = upright ? vertical : plain;
90
+ let glyphs = embedder.font.layout(text, features).glyphs;
91
+ if (cells && cells.length > 1 && glyphs.length !== cells.length)
92
+ glyphs = cells.flatMap((c) => embedder.font.layout(c, features).glyphs);
93
+ let hex = '';
94
+ for (const g of glyphs) {
95
+ let id = g.id;
96
+ if (embedder.subset && embedder.glyphs && embedder.glyphIdMap) {
97
+ id = embedder.subset.includeGlyph(g);
98
+ embedder.glyphs[id - 1] = g;
99
+ embedder.glyphIdMap.set(g.id, id);
100
+ }
101
+ hex += id.toString(16).padStart(4, '0');
102
+ }
103
+ embedder.glyphCache?.invalidate();
104
+ // pdf-lib writes a font only once text was encoded with it.
105
+ font.modified = true;
106
+ return { hex, glyphs };
107
+ },
108
+ glyphCount(text, upright = true) {
109
+ const key = `${upright ? 'v' : 'h'}${text}`;
110
+ let n = countCache.get(key);
111
+ if (n === undefined) {
112
+ n = embedder.font.layout(text, upright ? vertical : plain).glyphs.length;
113
+ countCache.set(key, n);
114
+ }
115
+ return n;
116
+ },
117
+ hasVerticalForm(ch) {
118
+ const hit = formCache.get(ch);
119
+ if (hit !== undefined)
120
+ return hit;
121
+ const v = idsOf(ch, vertical);
122
+ const has = v !== idsOf(ch, plain) && v !== idsOf(ch, fullWidth);
123
+ formCache.set(ch, has);
124
+ return has;
125
+ },
126
+ };
127
+ twins.set(font, twin);
128
+ twinRefs.set(font, ref.toString());
129
+ return twin;
130
+ }
131
+ /** The reference of `font`'s vertical twin, when one was made: a page that
132
+ * shows text through the twin uses the font. */
133
+ export function verticalTwinRefOf(font) {
134
+ return twinRefs.get(font);
135
+ }
136
+ //# sourceMappingURL=verticalFonts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verticalFonts.js","sourceRoot":"","sources":["../src/verticalFonts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAwB,MAAM,SAAS,CAAC;AAE3E;;;;8DAI8D;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AA8CnC,MAAM,KAAK,GAAG,IAAI,OAAO,EAAyB,CAAC;AACnD,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAmB,CAAC;AAEhD,SAAS,UAAU,CAAC,IAAa;IAC/B,MAAM,CAAC,GAAI,IAA2C,CAAC,QAAQ,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,OAAO,CAAC,CAAC,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACrH,CAAC;AAED,yEAAyE;AACzE,SAAS,gBAAgB,CAAC,QAAiB;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAI,QAAoC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9G,OAAO,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5D,QAAQ,CAAC,aAAa,GAAG,KAAK,EAAE,GAAY,EAAE,IAAa,EAAmB,EAAE;QAC9E,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3C,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;YAC9B,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,CAAE;YACxC,QAAQ,EAAE,YAAY;YACtB,eAAe,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAE;YACtD,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAE;SAC3C,CAAC,CAAC,CAAC;QACJ,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC;IACpC,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAE,CAAyC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpK,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,QAAiB,EAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9H,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,MAAM,IAAI,GAAiB;QACzB,GAAG;QACH,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,KAAK;YAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;YAC5C,IAAI,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC;YACzD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;gBAAE,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;YACzI,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;gBACd,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;oBAC9D,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;oBACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC5B,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACpC,CAAC;gBACD,GAAG,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC1C,CAAC;YACD,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC;YAClC,4DAA4D;YAC3D,IAAyC,CAAC,QAAQ,GAAG,IAAI,CAAC;YAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QACzB,CAAC;QACD,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;YAC7B,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACpB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;gBACzE,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,eAAe,CAAC,EAAE;YAChB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,GAAG,CAAC;YAClC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;YACjE,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACvB,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;IACF,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;iDACiD;AACjD,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
@@ -2,7 +2,7 @@ import type { VDTDocument } from 'postext';
2
2
  import type { PdfFontProvider } from '../fontCache';
3
3
  import type { RenderToPdfOptions } from '../pdf-backend';
4
4
  import { type SvgRasterizer } from '../pdf-backend/renderResourceBlock';
5
- export type { PdfWarning, PdfFontFallbackWarning, RenderProgress } from '../pdf-backend';
5
+ export type { PdfWarning, PdfFontWarning, PdfFontFallbackWarning, PdfMissingGlyphWarning, PdfVariableFontWarning, PdfCffEmbeddedWholeWarning, RenderProgress, } from '../pdf-backend';
6
6
  export interface PdfWorkerRenderOptions extends Omit<RenderToPdfOptions, 'resourceBytes' | 'rasterizeSvg'> {
7
7
  /** Resource bytes by file id. Their buffers are transferred: pass copies
8
8
  * if the caller keeps them. */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/worker/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAG7F,YAAY,EAAE,UAAU,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEzF,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,eAAe,GAAG,cAAc,CAAC;IACxG;oCACgC;IAChC,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC;sBACkB;IAClB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,qEAAqE;IACrE,YAAY,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B;;;kEAG8D;IAC9D,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,EAAE,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChG,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC;sBACkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAQD,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,eAAe,CA0GjF"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/worker/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAG7F,YAAY,EACV,UAAU,EACV,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,0BAA0B,EAC1B,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,eAAe,GAAG,cAAc,CAAC;IACxG;oCACgC;IAChC,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC;sBACkB;IAClB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,qEAAqE;IACrE,YAAY,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B;;;kEAG8D;IAC9D,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,EAAE,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChG,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC;sBACkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAQD,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,eAAe,CA4GjF"}
@@ -18,9 +18,10 @@ export function createPdfWorker(options) {
18
18
  const answer = async (askId, job) => {
19
19
  try {
20
20
  const bytes = await job();
21
- // A copy: the provider may keep the original in a cache.
22
- const copy = bytes ? bytes.slice() : null;
23
- send({ kind: 'answer', askId, bytes: copy }, copy ? [copy.buffer] : undefined);
21
+ // Copies: the provider may keep the originals in a cache.
22
+ const copy = Array.isArray(bytes) ? bytes.map((b) => b.slice()) : bytes ? bytes.slice() : null;
23
+ const buffers = Array.isArray(copy) ? copy.map((b) => b.buffer) : copy ? [copy.buffer] : undefined;
24
+ send({ kind: 'answer', askId, bytes: copy }, buffers);
24
25
  }
25
26
  catch (err) {
26
27
  send({ kind: 'answer', askId, bytes: null, error: err instanceof Error ? err.message : String(err) });
@@ -31,7 +32,8 @@ export function createPdfWorker(options) {
31
32
  switch (msg.kind) {
32
33
  case 'font': {
33
34
  const job = current;
34
- void answer(msg.askId, () => (job ? job.options.fontProvider(msg.family, msg.weight, msg.style) : Promise.resolve(null)));
35
+ const request = msg.codePoints ? { codePoints: new Set(msg.codePoints) } : undefined;
36
+ void answer(msg.askId, () => (job ? job.options.fontProvider(msg.family, msg.weight, msg.style, request) : Promise.resolve(null)));
35
37
  return;
36
38
  }
37
39
  case 'rasterize': {
@@ -48,7 +50,7 @@ export function createPdfWorker(options) {
48
50
  const onWarning = pending.get(msg.id)?.options.onWarning;
49
51
  if (onWarning)
50
52
  onWarning(msg.warning);
51
- else if (msg.warning.kind === 'fontFallback')
53
+ else if ('message' in msg.warning)
52
54
  console.warn(msg.warning.message);
53
55
  return;
54
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/worker/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/worker/client.ts"],"names":[],"mappings":"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"}
@@ -36,13 +36,17 @@ ctx.addEventListener('message', async (event) => {
36
36
  try {
37
37
  const bytes = await renderToPdf(msg.docs, {
38
38
  ...msg.settings,
39
- fontProvider: async (family, weight, style) => {
40
- const answer = await ask({ kind: 'font', family, weight, style });
41
- if (!answer)
39
+ fontProvider: async (family, weight, style, request) => {
40
+ const codePoints = request ? [...request.codePoints] : undefined;
41
+ const answer = await ask({ kind: 'font', family, weight, style, ...(codePoints ? { codePoints } : {}) });
42
+ if (!answer || (Array.isArray(answer) && answer.length === 0))
42
43
  throw new Error(`postext-pdf: no bytes for font ${family} ${weight} ${style}`);
43
44
  return answer;
44
45
  },
45
- rasterizeSvg: (svg, widthPx, heightPx) => ask({ kind: 'rasterize', svg, widthPx, heightPx }).catch(() => null),
46
+ rasterizeSvg: async (svg, widthPx, heightPx) => {
47
+ const answer = await ask({ kind: 'rasterize', svg, widthPx, heightPx }).catch(() => null);
48
+ return answer instanceof Uint8Array ? answer : null;
49
+ },
46
50
  resourceBytes: (fileId) => bytesById.get(fileId),
47
51
  onProgress: (progress) => post({ kind: 'progress', id: msg.id, progress }),
48
52
  onWarning: (warning) => post({ kind: 'warning', id: msg.id, warning }),