@jasy/pdf 1.0.0-alpha.1 → 1.0.0-alpha.10

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 (275) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -21
  3. package/dist/api/args.d.ts +1 -1
  4. package/dist/api/args.js +2 -5
  5. package/dist/api/color.d.ts +4 -4
  6. package/dist/api/color.js +11 -17
  7. package/dist/api/content.d.ts +20 -13
  8. package/dist/api/content.js +44 -29
  9. package/dist/api/descriptor.d.ts +2 -2
  10. package/dist/api/descriptor.js +121 -31
  11. package/dist/api/dimension.d.ts +76 -0
  12. package/dist/api/dimension.js +43 -0
  13. package/dist/api/font-url.d.ts +28 -0
  14. package/dist/api/font-url.js +134 -0
  15. package/dist/api/forms.d.ts +347 -0
  16. package/dist/api/forms.js +189 -0
  17. package/dist/api/gradient.d.ts +53 -0
  18. package/dist/api/gradient.js +97 -0
  19. package/dist/api/index.d.ts +13 -8
  20. package/dist/api/index.js +13 -24
  21. package/dist/api/insets.d.ts +19 -12
  22. package/dist/api/insets.js +19 -12
  23. package/dist/api/layout.d.ts +149 -25
  24. package/dist/api/layout.js +182 -51
  25. package/dist/api/page-builder.d.ts +40 -0
  26. package/dist/api/page-builder.js +44 -0
  27. package/dist/api/structure.d.ts +100 -13
  28. package/dist/api/structure.js +179 -88
  29. package/dist/api/table.d.ts +5 -5
  30. package/dist/api/table.js +38 -26
  31. package/dist/api/text.d.ts +90 -4
  32. package/dist/api/text.js +116 -31
  33. package/dist/assets/font-data.d.ts +2 -0
  34. package/dist/assets/font-data.js +21 -0
  35. package/dist/assets/font-data.ts +37 -0
  36. package/dist/common/color.js +1 -5
  37. package/dist/constants/page-sizes.js +3 -6
  38. package/dist/constants/pdf-parts.js +1 -4
  39. package/dist/crypto/legacy-handler.d.ts +43 -0
  40. package/dist/crypto/legacy-handler.js +145 -0
  41. package/dist/crypto/security-handler.d.ts +62 -0
  42. package/dist/crypto/security-handler.js +155 -0
  43. package/dist/crypto/webcrypto.d.ts +11 -0
  44. package/dist/crypto/webcrypto.js +62 -0
  45. package/dist/edit/acroform-reader.d.ts +70 -0
  46. package/dist/edit/acroform-reader.js +126 -0
  47. package/dist/edit/appearance.d.ts +47 -0
  48. package/dist/edit/appearance.js +171 -0
  49. package/dist/edit/document.d.ts +145 -0
  50. package/dist/edit/document.js +642 -0
  51. package/dist/edit/fill.d.ts +65 -0
  52. package/dist/edit/fill.js +424 -0
  53. package/dist/edit/flatten.d.ts +54 -0
  54. package/dist/edit/flatten.js +462 -0
  55. package/dist/edit/index.d.ts +20 -0
  56. package/dist/edit/index.js +18 -0
  57. package/dist/edit/lexer.d.ts +30 -0
  58. package/dist/edit/lexer.js +285 -0
  59. package/dist/edit/objects.d.ts +68 -0
  60. package/dist/edit/objects.js +83 -0
  61. package/dist/edit/writer.d.ts +60 -0
  62. package/dist/edit/writer.js +283 -0
  63. package/dist/elements/container-element.d.ts +50 -5
  64. package/dist/elements/container-element.js +100 -39
  65. package/dist/elements/forms/checkbox-element.d.ts +51 -0
  66. package/dist/elements/forms/checkbox-element.js +48 -0
  67. package/dist/elements/forms/choice-element.d.ts +53 -0
  68. package/dist/elements/forms/choice-element.js +59 -0
  69. package/dist/elements/forms/push-button-element.d.ts +56 -0
  70. package/dist/elements/forms/push-button-element.js +49 -0
  71. package/dist/elements/forms/radio-element.d.ts +52 -0
  72. package/dist/elements/forms/radio-element.js +49 -0
  73. package/dist/elements/forms/signature-element.d.ts +54 -0
  74. package/dist/elements/forms/signature-element.js +47 -0
  75. package/dist/elements/forms/text-field-element.d.ts +61 -0
  76. package/dist/elements/forms/text-field-element.js +54 -0
  77. package/dist/elements/image-element.d.ts +58 -6
  78. package/dist/elements/image-element.js +145 -111
  79. package/dist/elements/index.d.ts +26 -10
  80. package/dist/elements/index.js +26 -28
  81. package/dist/elements/layout/anchor-element.d.ts +23 -0
  82. package/dist/elements/layout/anchor-element.js +27 -0
  83. package/dist/elements/layout/bookmark-element.d.ts +27 -0
  84. package/dist/elements/layout/bookmark-element.js +30 -0
  85. package/dist/elements/layout/default-text-style-element.d.ts +30 -0
  86. package/dist/elements/layout/default-text-style-element.js +47 -0
  87. package/dist/elements/layout/deferred-element.d.ts +3 -3
  88. package/dist/elements/layout/deferred-element.js +4 -8
  89. package/dist/elements/layout/expanded-element.d.ts +6 -4
  90. package/dist/elements/layout/expanded-element.js +22 -17
  91. package/dist/elements/layout/keep-together-element.d.ts +42 -0
  92. package/dist/elements/layout/keep-together-element.js +85 -0
  93. package/dist/elements/layout/link-element.d.ts +33 -0
  94. package/dist/elements/layout/link-element.js +39 -0
  95. package/dist/elements/layout/padding-element.d.ts +10 -5
  96. package/dist/elements/layout/padding-element.js +25 -16
  97. package/dist/elements/layout/page-break-element.d.ts +17 -0
  98. package/dist/elements/layout/page-break-element.js +24 -0
  99. package/dist/elements/layout/page-builder-element.d.ts +32 -0
  100. package/dist/elements/layout/page-builder-element.js +45 -0
  101. package/dist/elements/layout/positioned-element.d.ts +47 -0
  102. package/dist/elements/layout/positioned-element.js +73 -0
  103. package/dist/elements/layout/repeating-header-element.d.ts +3 -3
  104. package/dist/elements/layout/repeating-header-element.js +8 -12
  105. package/dist/elements/layout/rotated-box-element.d.ts +35 -0
  106. package/dist/elements/layout/rotated-box-element.js +54 -0
  107. package/dist/elements/layout/rotated-element.d.ts +32 -0
  108. package/dist/elements/layout/rotated-element.js +41 -0
  109. package/dist/elements/layout/sized-container-element.d.ts +2 -2
  110. package/dist/elements/layout/sized-container-element.js +6 -11
  111. package/dist/elements/layout/struct-group.d.ts +28 -0
  112. package/dist/elements/layout/struct-group.js +42 -0
  113. package/dist/elements/line-element.d.ts +3 -3
  114. package/dist/elements/line-element.js +5 -10
  115. package/dist/elements/page-element.d.ts +26 -6
  116. package/dist/elements/page-element.js +72 -27
  117. package/dist/elements/pdf-document-element.d.ts +10 -4
  118. package/dist/elements/pdf-document-element.js +11 -10
  119. package/dist/elements/pdf-element.d.ts +150 -4
  120. package/dist/elements/pdf-element.js +138 -20
  121. package/dist/elements/rectangle-element.d.ts +52 -11
  122. package/dist/elements/rectangle-element.js +129 -36
  123. package/dist/elements/row-element.d.ts +45 -4
  124. package/dist/elements/row-element.js +66 -18
  125. package/dist/elements/text-element.d.ts +132 -11
  126. package/dist/elements/text-element.js +206 -56
  127. package/dist/forms/acroform.d.ts +63 -0
  128. package/dist/forms/acroform.js +427 -0
  129. package/dist/forms/appearance.d.ts +58 -0
  130. package/dist/forms/appearance.js +204 -0
  131. package/dist/forms/field.d.ts +164 -0
  132. package/dist/forms/field.js +1 -0
  133. package/dist/forms/pdf.d.ts +19 -0
  134. package/dist/forms/pdf.js +28 -0
  135. package/dist/index.d.ts +3 -3
  136. package/dist/index.js +3 -19
  137. package/dist/ir/display-list.d.ts +197 -8
  138. package/dist/ir/display-list.js +8 -2
  139. package/dist/layout/alignment.d.ts +10 -0
  140. package/dist/layout/alignment.js +6 -0
  141. package/dist/layout/box-constraints.d.ts +61 -0
  142. package/dist/layout/box-constraints.js +88 -6
  143. package/dist/layout/collect-images.d.ts +9 -0
  144. package/dist/layout/collect-images.js +34 -0
  145. package/dist/layout/fragmentation.d.ts +20 -1
  146. package/dist/layout/fragmentation.js +74 -18
  147. package/dist/layout/insets.d.ts +28 -0
  148. package/dist/layout/insets.js +20 -0
  149. package/dist/platform/browser-fs.d.ts +2 -0
  150. package/dist/platform/browser-fs.js +9 -0
  151. package/dist/platform/browser-image.d.ts +5 -0
  152. package/dist/platform/browser-image.js +13 -0
  153. package/dist/platform/node-fs.d.ts +2 -0
  154. package/dist/platform/node-fs.js +10 -0
  155. package/dist/platform/node-image.d.ts +5 -0
  156. package/dist/platform/node-image.js +9 -0
  157. package/dist/renderer/anchor-renderer.d.ts +6 -0
  158. package/dist/renderer/anchor-renderer.js +11 -0
  159. package/dist/renderer/bookmark-renderer.d.ts +6 -0
  160. package/dist/renderer/bookmark-renderer.js +11 -0
  161. package/dist/renderer/container-renderer.d.ts +3 -3
  162. package/dist/renderer/container-renderer.js +11 -28
  163. package/dist/renderer/default-text-style-renderer.d.ts +6 -0
  164. package/dist/renderer/default-text-style-renderer.js +10 -0
  165. package/dist/renderer/deferred-renderer.d.ts +3 -3
  166. package/dist/renderer/deferred-renderer.js +8 -23
  167. package/dist/renderer/emoji-image.d.ts +9 -0
  168. package/dist/renderer/emoji-image.js +68 -0
  169. package/dist/renderer/expanded-renderer.d.ts +3 -3
  170. package/dist/renderer/expanded-renderer.js +6 -21
  171. package/dist/renderer/form-field-renderer.d.ts +20 -0
  172. package/dist/renderer/form-field-renderer.js +12 -0
  173. package/dist/renderer/image-renderer.d.ts +4 -4
  174. package/dist/renderer/image-renderer.js +86 -75
  175. package/dist/renderer/index.d.ts +10 -10
  176. package/dist/renderer/index.js +10 -26
  177. package/dist/renderer/keep-together-renderer.d.ts +10 -0
  178. package/dist/renderer/keep-together-renderer.js +12 -0
  179. package/dist/renderer/line-renderer.d.ts +3 -3
  180. package/dist/renderer/line-renderer.js +13 -28
  181. package/dist/renderer/link-renderer.d.ts +6 -0
  182. package/dist/renderer/link-renderer.js +11 -0
  183. package/dist/renderer/padding-renderer.d.ts +3 -3
  184. package/dist/renderer/padding-renderer.js +6 -21
  185. package/dist/renderer/page-break-renderer.d.ts +14 -0
  186. package/dist/renderer/page-break-renderer.js +15 -0
  187. package/dist/renderer/page-builder-renderer.d.ts +6 -0
  188. package/dist/renderer/page-builder-renderer.js +11 -0
  189. package/dist/renderer/page-renderer.d.ts +2 -2
  190. package/dist/renderer/page-renderer.js +115 -77
  191. package/dist/renderer/pdf-backend.d.ts +31 -4
  192. package/dist/renderer/pdf-backend.js +287 -49
  193. package/dist/renderer/pdf-config.js +4 -7
  194. package/dist/renderer/pdf-document-class.d.ts +5 -5
  195. package/dist/renderer/pdf-document-class.js +27 -41
  196. package/dist/renderer/pdf-document-renderer.d.ts +19 -10
  197. package/dist/renderer/pdf-document-renderer.js +135 -91
  198. package/dist/renderer/pdf-renderer.d.ts +2 -2
  199. package/dist/renderer/pdf-renderer.js +165 -90
  200. package/dist/renderer/positioned-renderer.d.ts +6 -0
  201. package/dist/renderer/positioned-renderer.js +10 -0
  202. package/dist/renderer/rectangle-renderer.d.ts +3 -3
  203. package/dist/renderer/rectangle-renderer.js +49 -44
  204. package/dist/renderer/repeating-header-renderer.d.ts +3 -3
  205. package/dist/renderer/repeating-header-renderer.js +10 -26
  206. package/dist/renderer/rotated-renderer.d.ts +7 -0
  207. package/dist/renderer/rotated-renderer.js +29 -0
  208. package/dist/renderer/row-renderer.d.ts +3 -3
  209. package/dist/renderer/row-renderer.js +11 -28
  210. package/dist/renderer/struct-group-renderer.d.ts +10 -0
  211. package/dist/renderer/struct-group-renderer.js +24 -0
  212. package/dist/renderer/text-renderer.d.ts +9 -5
  213. package/dist/renderer/text-renderer.js +437 -89
  214. package/dist/text/advance.d.ts +34 -0
  215. package/dist/text/advance.js +45 -0
  216. package/dist/text/arabic.d.ts +20 -0
  217. package/dist/text/arabic.js +101 -0
  218. package/dist/text/bidi.d.ts +33 -0
  219. package/dist/text/bidi.js +94 -0
  220. package/dist/text/emoji-codepoints.d.ts +1 -0
  221. package/dist/text/emoji-codepoints.js +29 -0
  222. package/dist/text/font-fallback.d.ts +25 -0
  223. package/dist/text/font-fallback.js +38 -0
  224. package/dist/text/line-breaker.d.ts +50 -12
  225. package/dist/text/line-breaker.js +158 -37
  226. package/dist/text/line-metrics.d.ts +49 -0
  227. package/dist/text/line-metrics.js +57 -0
  228. package/dist/text/orphans-widows.d.ts +27 -0
  229. package/dist/text/orphans-widows.js +53 -0
  230. package/dist/text/shape.d.ts +29 -0
  231. package/dist/text/shape.js +67 -0
  232. package/dist/text/text-decoration.d.ts +50 -0
  233. package/dist/text/text-decoration.js +62 -0
  234. package/dist/text/text-style.d.ts +60 -0
  235. package/dist/text/text-style.js +79 -0
  236. package/dist/utils/afm-parser.d.ts +34 -0
  237. package/dist/utils/afm-parser.js +76 -17
  238. package/dist/utils/bytes.d.ts +24 -0
  239. package/dist/utils/bytes.js +76 -0
  240. package/dist/utils/dest-registry.d.ts +22 -0
  241. package/dist/utils/dest-registry.js +32 -0
  242. package/dist/utils/flex-layout.d.ts +36 -9
  243. package/dist/utils/flex-layout.js +207 -30
  244. package/dist/utils/font-metrics.d.ts +20 -1
  245. package/dist/utils/font-metrics.js +1 -2
  246. package/dist/utils/font-path.js +3 -6
  247. package/dist/utils/gsub.d.ts +36 -0
  248. package/dist/utils/gsub.js +178 -0
  249. package/dist/utils/image-helper.d.ts +6 -5
  250. package/dist/utils/image-helper.js +101 -111
  251. package/dist/utils/inflate.d.ts +16 -0
  252. package/dist/utils/inflate.js +52 -0
  253. package/dist/utils/md5.d.ts +4 -0
  254. package/dist/utils/md5.js +79 -0
  255. package/dist/utils/outline.d.ts +21 -0
  256. package/dist/utils/outline.js +79 -0
  257. package/dist/utils/pdf-object-manager.d.ts +110 -8
  258. package/dist/utils/pdf-object-manager.js +583 -141
  259. package/dist/utils/renderer-registry.d.ts +13 -1
  260. package/dist/utils/renderer-registry.js +23 -6
  261. package/dist/utils/struct-tree.d.ts +44 -0
  262. package/dist/utils/struct-tree.js +129 -0
  263. package/dist/utils/ttf-parser.d.ts +134 -2
  264. package/dist/utils/ttf-parser.js +873 -50
  265. package/dist/utils/ttf-subsetter.d.ts +1 -1
  266. package/dist/utils/ttf-subsetter.js +40 -42
  267. package/dist/utils/ua-xmp.d.ts +9 -0
  268. package/dist/utils/ua-xmp.js +32 -0
  269. package/dist/utils/utf8-to-windows1252-encoder.d.ts +6 -0
  270. package/dist/utils/utf8-to-windows1252-encoder.js +11 -4
  271. package/dist/utils/woff.d.ts +10 -0
  272. package/dist/utils/woff.js +116 -0
  273. package/dist/validators/element-validator.d.ts +2 -2
  274. package/dist/validators/element-validator.js +31 -26
  275. package/package.json +22 -2
@@ -1,17 +1,73 @@
1
- import { TextElement, TextSegment } from "../elements/text-element";
2
- import { ColorInput } from "./color";
1
+ import { TextElement, TextRole, TextSegment, type VerticalTextAlign } from "../elements/text-element.js";
2
+ import { TextOverflow } from "../text/line-breaker.js";
3
+ import type { Direction } from "../text/bidi.js";
4
+ import { ResolvedTextStyle, type TextTransform } from "../text/text-style.js";
5
+ import { ColorInput } from "./color.js";
6
+ export type { TextOverflow };
3
7
  /** Text styling shared by `Text`, `Paragraph` and `span`. `bold`/`italic` are booleans
4
8
  * (locked §7.3) and combine into one engine `FontStyle`. */
5
9
  export interface TextStyle {
6
10
  size?: number;
7
- font?: string;
11
+ /** Font family, or a STACK: each code point is drawn by the first family in the list that has a
12
+ * glyph for it, so `["Inter", "NotoSansCJK"]` sets mixed-script text without splitting it by hand. */
13
+ font?: string | string[];
8
14
  bold?: boolean;
9
15
  italic?: boolean;
10
16
  color?: ColorInput;
17
+ /** Draw a line under the text. Its position and thickness come from the font, not from a guess.
18
+ * A `Link` is NOT underlined automatically - say so if you want it. */
19
+ underline?: boolean;
20
+ /** Draw a line through the text, at half its x-height (where a browser puts it). */
21
+ strikethrough?: boolean;
22
+ /** Let the underline step around descenders, like a browser (`text-decoration-skip-ink`). Needs an
23
+ * EMBEDDED font - the standard-14 outlines live in the viewer, so we cannot see where their ink
24
+ * is. Asking for it with a standard font is an error, not a silent no-op. */
25
+ skipInk?: boolean;
26
+ /** Extra space after every glyph, in points (CSS `letter-spacing`). Negative tightens. Default 0. */
27
+ letterSpacing?: number;
28
+ /** Base writing direction (CSS `direction`): `"rtl"` starts the line on the right, for Hebrew or
29
+ * Arabic. Mixed text is reordered per Unicode UAX #9 either way, so Hebrew inside an `ltr`
30
+ * paragraph already comes out right - this decides where the LINE starts. */
31
+ direction?: Direction;
32
+ /** CSS `text-transform`: recase the text. `capitalize` upper-cases the first letter of each word. */
33
+ textTransform?: TextTransform;
34
+ /** CSS `word-spacing`, in points: extra advance at every space. Negative tightens. */
35
+ wordSpacing?: number;
36
+ /** CSS `text-indent`, in points: how far the FIRST line of a paragraph starts in. */
37
+ textIndent?: number;
38
+ /** CSS `vertical-align` for a SPAN: raises a footnote marker or lowers an index. It shifts the
39
+ * baseline only - pass a smaller `size` too if you want the browser's `<sup>` look. */
40
+ verticalAlign?: VerticalTextAlign;
41
+ /** External URL - makes this run an inline hyperlink (a /Link annotation over its glyphs). On a
42
+ * `span` it links just that run; on a whole `Text` (plain string) it links the whole text. */
43
+ href?: string;
44
+ /** Internal jump target - the `name` of an `Anchor` elsewhere in the document (like `href`, but a
45
+ * same-document /GoTo instead of a URL). Use for a clickable table of contents / cross-reference. */
46
+ to?: string;
11
47
  }
12
48
  export interface TextOptions extends TextStyle {
13
49
  /** Text-internal alignment (left/center/right) - independent of a parent's `cross` (§5). */
14
- align?: "left" | "center" | "right";
50
+ align?: "left" | "center" | "right" | "justify";
51
+ /** Cap the number of wrapped lines (default: unlimited - the text grows down as far as it needs,
52
+ * paginating onto the next page). Needs a bounded width (a Column/Expanded/`Box({ width })`). */
53
+ maxLines?: number;
54
+ /**
55
+ * Minimum lines that must stay behind at a page break (CSS `orphans`), and minimum that must carry
56
+ * over (CSS `widows`). Both default to 2, the CSS initial value: a single line stranded at the foot of
57
+ * a page - or alone at the top of the next - reads as a mistake. Set both to 1 to switch the protection
58
+ * off and let a paragraph break wherever the page ends.
59
+ */
60
+ orphans?: number;
61
+ widows?: number;
62
+ /** What happens past `maxLines`: `"clip"` (default) cuts hard, `"ellipsis"` ends with "…". */
63
+ overflow?: TextOverflow;
64
+ /** Line-height multiplier: each line is `size * lineHeight` tall. Unset means the font's own
65
+ * natural line height (`ascent + descent + lineGap`), like CSS `line-height: normal` - which is
66
+ * what you want for body copy. `1` gives exactly one em, which most faces overflow slightly. */
67
+ lineHeight?: number;
68
+ /** Accessibility role for the tagged structure tree (only when rendered with `accessible`): a heading
69
+ * level `"h1"`..`"h6"` or `"p"` (default). Purely semantic - it does not change the visual style. */
70
+ role?: TextRole;
15
71
  }
16
72
  /**
17
73
  * An inline run for mixed-style `Text` (`Text([span("a", {bold:true}), span("b")])`). Each
@@ -26,3 +82,33 @@ export declare function span(text: string, style?: TextStyle): TextSegment;
26
82
  export declare function Text(content: string | TextSegment[], opts?: TextOptions): TextElement;
27
83
  /** `Text` with body-paragraph defaults (same options; a separate name reads as intent). */
28
84
  export declare function Paragraph(content: string | TextSegment[], opts?: TextOptions): TextElement;
85
+ /** The inheritable text defaults a `Document` can set, using the same option names as `Text`.
86
+ * Unset fields stay out so they keep inheriting. */
87
+ export interface TextDefaults {
88
+ size?: number;
89
+ /** Font family, or a STACK: each code point is drawn by the first family in the list that has a
90
+ * glyph for it, so `["Inter", "NotoSansCJK"]` sets mixed-script text without splitting it by hand. */
91
+ font?: string | string[];
92
+ bold?: boolean;
93
+ italic?: boolean;
94
+ color?: ColorInput;
95
+ align?: "left" | "center" | "right" | "justify";
96
+ lineHeight?: number;
97
+ underline?: boolean;
98
+ strikethrough?: boolean;
99
+ skipInk?: boolean;
100
+ letterSpacing?: number;
101
+ /** Base writing direction (CSS `direction`): `"rtl"` starts the line on the right, for Hebrew or
102
+ * Arabic. Mixed text is reordered per Unicode UAX #9 either way, so Hebrew inside an `ltr`
103
+ * paragraph already comes out right - this decides where the LINE starts. */
104
+ direction?: Direction;
105
+ /** CSS `text-transform`: recase the text. `capitalize` upper-cases the first letter of each word. */
106
+ textTransform?: TextTransform;
107
+ /** CSS `word-spacing`, in points: extra advance at every space. Negative tightens. */
108
+ wordSpacing?: number;
109
+ /** CSS `text-indent`, in points: how far the FIRST line of a paragraph starts in. */
110
+ textIndent?: number;
111
+ }
112
+ /** Maps the `Text`-style option names onto a partial engine `ResolvedTextStyle` (only the set
113
+ * fields), for seeding the inheritance cascade. */
114
+ export declare function toTextStyleOverride(opts: TextDefaults): Partial<ResolvedTextStyle>;
package/dist/api/text.js CHANGED
@@ -1,42 +1,67 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.span = span;
4
- exports.Text = Text;
5
- exports.Paragraph = Paragraph;
6
- const text_element_1 = require("../elements/text-element");
7
- const pdf_element_1 = require("../elements/pdf-element");
8
- const pdf_object_manager_1 = require("../utils/pdf-object-manager");
9
- const color_1 = require("./color");
10
- /** Body-text default size when none is given (matches the engine default font). */
11
- const DEFAULT_SIZE = 12;
1
+ import { TextElement, } from "../elements/text-element.js";
2
+ import { HorizontalAlignment } from "../elements/pdf-element.js";
3
+ import { FontStyle } from "../utils/pdf-object-manager.js";
4
+ import { toColor } from "./color.js";
12
5
  /** bold + italic → the single engine `FontStyle`. */
13
6
  function toFontStyle(bold, italic) {
14
7
  if (bold && italic)
15
- return pdf_object_manager_1.FontStyle.BoldItalic;
8
+ return FontStyle.BoldItalic;
16
9
  if (bold)
17
- return pdf_object_manager_1.FontStyle.Bold;
10
+ return FontStyle.Bold;
18
11
  if (italic)
19
- return pdf_object_manager_1.FontStyle.Italic;
20
- return pdf_object_manager_1.FontStyle.Normal;
12
+ return FontStyle.Italic;
13
+ return FontStyle.Normal;
21
14
  }
15
+ /** The family a run starts in - the first of a stack, or the single name given. */
16
+ const primaryFont = (font) => Array.isArray(font) ? font[0] : font;
17
+ /** The rest of the stack, tried in order for a code point the first family cannot draw. */
18
+ const fallbackFonts = (font) => Array.isArray(font) ? font.slice(1) : undefined;
22
19
  const ALIGN = {
23
- left: pdf_element_1.HorizontalAlignment.left,
24
- center: pdf_element_1.HorizontalAlignment.center,
25
- right: pdf_element_1.HorizontalAlignment.right,
20
+ left: HorizontalAlignment.left,
21
+ center: HorizontalAlignment.center,
22
+ right: HorizontalAlignment.right,
23
+ justify: HorizontalAlignment.justify,
26
24
  };
25
+ /**
26
+ * Validates a font `size` (a number of points). Rejects anything that would silently become a NaN
27
+ * height deep in layout - notably `Document({ size: "A4" })`, where `"A4"` is the PAGE size and belongs
28
+ * on `Page`, not a font size. `undefined` passes through (unset = inherit the cascade).
29
+ */
30
+ function toFontSize(size) {
31
+ if (size === undefined)
32
+ return undefined;
33
+ if (typeof size !== "number" || !Number.isFinite(size) || size <= 0) {
34
+ // Quote a string so "A4" reads as a string; show a bare number/NaN as-is (JSON turns NaN into null).
35
+ const shown = typeof size === "string" ? JSON.stringify(size) : String(size);
36
+ // The Page-vs-font-size mix-up only happens with a string like "A4"; for a plain bad number
37
+ // (NaN, negative, 0) the hint would just be noise, so keep the message generic there.
38
+ const hint = typeof size === "string"
39
+ ? ` Note: the page size goes on Page({ size: "A4" }), not on Document or Text.`
40
+ : "";
41
+ throw new Error(`Invalid font size ${shown} (expected a positive number of points).${hint}`);
42
+ }
43
+ return size;
44
+ }
27
45
  /**
28
46
  * An inline run for mixed-style `Text` (`Text([span("a", {bold:true}), span("b")])`). Each
29
47
  * field overrides the enclosing `Text`'s defaults for just this run; omitted fields inherit.
30
48
  */
31
- function span(text, style = {}) {
49
+ export function span(text, style = {}) {
32
50
  return {
33
51
  content: text,
34
- fontSize: style.size,
35
- fontFamily: style.font,
52
+ fontSize: toFontSize(style.size),
53
+ fontFamily: primaryFont(style.font),
54
+ fontFallback: fallbackFonts(style.font),
36
55
  fontStyle: style.bold !== undefined || style.italic !== undefined
37
56
  ? toFontStyle(style.bold, style.italic)
38
57
  : undefined,
39
- fontColor: style.color !== undefined ? (0, color_1.toColor)(style.color) : undefined,
58
+ fontColor: style.color !== undefined ? toColor(style.color) : undefined,
59
+ underline: style.underline,
60
+ strikethrough: style.strikethrough,
61
+ letterSpacing: style.letterSpacing,
62
+ verticalAlign: style.verticalAlign,
63
+ href: style.href,
64
+ dest: style.to,
40
65
  };
41
66
  }
42
67
  /**
@@ -44,18 +69,78 @@ function span(text, style = {}) {
44
69
  * options set the defaults (size/font/style/color) that any spans inherit, plus the
45
70
  * text-internal `align`.
46
71
  */
47
- function Text(content, opts = {}) {
48
- var _a;
49
- return new text_element_1.TextElement({
50
- content,
51
- fontSize: (_a = opts.size) !== null && _a !== void 0 ? _a : DEFAULT_SIZE,
52
- fontFamily: opts.font,
53
- fontStyle: toFontStyle(opts.bold, opts.italic),
54
- color: opts.color !== undefined ? (0, color_1.toColor)(opts.color) : undefined,
72
+ export function Text(content, opts = {}) {
73
+ // A plain string given an `href`/`to` becomes a single link span, so `Text("jasy.dev", { href })` (or
74
+ // `{ to }`) is a whole-text link (inline links use `span(...)`). This routes through the styled-segment
75
+ // path, which lays a single default-font segment out identically - only the /Link annotation is added.
76
+ const isLink = opts.href !== undefined || opts.to !== undefined;
77
+ const body = typeof content === "string" && isLink ? [span(content, opts)] : content;
78
+ // Unset properties are left undefined so they inherit the cascaded TextStyle (Document default /
79
+ // built-in). Only bold/italic that the caller actually set become an explicit FontStyle.
80
+ return new TextElement({
81
+ content: body,
82
+ fontSize: toFontSize(opts.size),
83
+ fontFamily: primaryFont(opts.font),
84
+ fontFallback: fallbackFonts(opts.font),
85
+ fontStyle: opts.bold !== undefined || opts.italic !== undefined
86
+ ? toFontStyle(opts.bold, opts.italic)
87
+ : undefined,
88
+ color: opts.color !== undefined ? toColor(opts.color) : undefined,
55
89
  textAlignment: opts.align ? ALIGN[opts.align] : undefined,
90
+ maxLines: opts.maxLines,
91
+ orphans: opts.orphans,
92
+ widows: opts.widows,
93
+ overflow: opts.overflow,
94
+ lineHeight: opts.lineHeight,
95
+ underline: opts.underline,
96
+ strikethrough: opts.strikethrough,
97
+ skipInk: opts.skipInk,
98
+ letterSpacing: opts.letterSpacing,
99
+ direction: opts.direction,
100
+ textTransform: opts.textTransform,
101
+ wordSpacing: opts.wordSpacing,
102
+ textIndent: opts.textIndent,
103
+ role: opts.role,
56
104
  });
57
105
  }
58
106
  /** `Text` with body-paragraph defaults (same options; a separate name reads as intent). */
59
- function Paragraph(content, opts = {}) {
107
+ export function Paragraph(content, opts = {}) {
60
108
  return Text(content, opts);
61
109
  }
110
+ /** Maps the `Text`-style option names onto a partial engine `ResolvedTextStyle` (only the set
111
+ * fields), for seeding the inheritance cascade. */
112
+ export function toTextStyleOverride(opts) {
113
+ const style = {};
114
+ if (opts.size !== undefined)
115
+ style.fontSize = toFontSize(opts.size);
116
+ if (opts.font !== undefined) {
117
+ style.fontFamily = primaryFont(opts.font);
118
+ style.fontFallback = fallbackFonts(opts.font);
119
+ }
120
+ if (opts.bold !== undefined || opts.italic !== undefined) {
121
+ style.fontStyle = toFontStyle(opts.bold, opts.italic);
122
+ }
123
+ if (opts.color !== undefined)
124
+ style.color = toColor(opts.color);
125
+ if (opts.align !== undefined)
126
+ style.textAlignment = ALIGN[opts.align];
127
+ if (opts.lineHeight !== undefined)
128
+ style.lineHeight = opts.lineHeight;
129
+ if (opts.underline !== undefined)
130
+ style.underline = opts.underline;
131
+ if (opts.strikethrough !== undefined)
132
+ style.strikethrough = opts.strikethrough;
133
+ if (opts.skipInk !== undefined)
134
+ style.skipInk = opts.skipInk;
135
+ if (opts.letterSpacing !== undefined)
136
+ style.letterSpacing = opts.letterSpacing;
137
+ if (opts.direction !== undefined)
138
+ style.direction = opts.direction;
139
+ if (opts.textTransform !== undefined)
140
+ style.textTransform = opts.textTransform;
141
+ if (opts.wordSpacing !== undefined)
142
+ style.wordSpacing = opts.wordSpacing;
143
+ if (opts.textIndent !== undefined)
144
+ style.textIndent = opts.textIndent;
145
+ return style;
146
+ }
@@ -0,0 +1,2 @@
1
+ export declare const STANDARD_AFM: Record<string, string>;
2
+ export declare const AGL: string;