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

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 (279) 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 +107 -13
  28. package/dist/api/structure.js +187 -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 +139 -11
  126. package/dist/elements/text-element.js +234 -57
  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/glyph-coverage.d.ts +15 -0
  225. package/dist/text/glyph-coverage.js +77 -0
  226. package/dist/text/line-breaker.d.ts +50 -12
  227. package/dist/text/line-breaker.js +200 -54
  228. package/dist/text/line-metrics.d.ts +49 -0
  229. package/dist/text/line-metrics.js +57 -0
  230. package/dist/text/orphans-widows.d.ts +27 -0
  231. package/dist/text/orphans-widows.js +53 -0
  232. package/dist/text/shape.d.ts +29 -0
  233. package/dist/text/shape.js +67 -0
  234. package/dist/text/text-decoration.d.ts +50 -0
  235. package/dist/text/text-decoration.js +62 -0
  236. package/dist/text/text-style.d.ts +60 -0
  237. package/dist/text/text-style.js +79 -0
  238. package/dist/text/whitespace.d.ts +4 -0
  239. package/dist/text/whitespace.js +43 -0
  240. package/dist/utils/afm-parser.d.ts +34 -0
  241. package/dist/utils/afm-parser.js +76 -17
  242. package/dist/utils/bytes.d.ts +24 -0
  243. package/dist/utils/bytes.js +76 -0
  244. package/dist/utils/dest-registry.d.ts +22 -0
  245. package/dist/utils/dest-registry.js +32 -0
  246. package/dist/utils/flex-layout.d.ts +36 -9
  247. package/dist/utils/flex-layout.js +207 -30
  248. package/dist/utils/font-metrics.d.ts +26 -1
  249. package/dist/utils/font-metrics.js +1 -2
  250. package/dist/utils/font-path.js +3 -6
  251. package/dist/utils/gsub.d.ts +36 -0
  252. package/dist/utils/gsub.js +178 -0
  253. package/dist/utils/image-helper.d.ts +6 -5
  254. package/dist/utils/image-helper.js +101 -111
  255. package/dist/utils/inflate.d.ts +16 -0
  256. package/dist/utils/inflate.js +52 -0
  257. package/dist/utils/md5.d.ts +4 -0
  258. package/dist/utils/md5.js +79 -0
  259. package/dist/utils/outline.d.ts +21 -0
  260. package/dist/utils/outline.js +79 -0
  261. package/dist/utils/pdf-object-manager.d.ts +127 -8
  262. package/dist/utils/pdf-object-manager.js +615 -141
  263. package/dist/utils/renderer-registry.d.ts +13 -1
  264. package/dist/utils/renderer-registry.js +23 -6
  265. package/dist/utils/struct-tree.d.ts +44 -0
  266. package/dist/utils/struct-tree.js +129 -0
  267. package/dist/utils/ttf-parser.d.ts +134 -2
  268. package/dist/utils/ttf-parser.js +873 -50
  269. package/dist/utils/ttf-subsetter.d.ts +1 -1
  270. package/dist/utils/ttf-subsetter.js +40 -42
  271. package/dist/utils/ua-xmp.d.ts +9 -0
  272. package/dist/utils/ua-xmp.js +32 -0
  273. package/dist/utils/utf8-to-windows1252-encoder.d.ts +6 -0
  274. package/dist/utils/utf8-to-windows1252-encoder.js +11 -4
  275. package/dist/utils/woff.d.ts +10 -0
  276. package/dist/utils/woff.js +116 -0
  277. package/dist/validators/element-validator.d.ts +2 -2
  278. package/dist/validators/element-validator.js +31 -26
  279. package/package.json +22 -2
@@ -0,0 +1,79 @@
1
+ // A PDF literal string escape (same rule as elsewhere): backslash first, then the string delimiters.
2
+ const num = (n) => Number(n.toFixed(2));
3
+ /**
4
+ * Builds the PDF document outline (`/Outlines`) - the viewer's bookmark panel. Entries are collected
5
+ * flat in reading order with a 1-based `level`; `finalize` nests each entry under the nearest preceding
6
+ * entry of a smaller level (so level 2s hang under the last level 1), emits the outline objects and
7
+ * returns the catalog addition `/Outlines N 0 R`. A no-op returning "" when nothing was added, so a
8
+ * document without bookmarks stays byte-identical.
9
+ */
10
+ export class OutlineBuilder {
11
+ constructor() {
12
+ this.entries = [];
13
+ }
14
+ add(entry) {
15
+ this.entries.push(entry);
16
+ }
17
+ get isEmpty() {
18
+ return this.entries.length === 0;
19
+ }
20
+ finalize(om) {
21
+ if (this.entries.length === 0)
22
+ return "";
23
+ // Nest by level: a stack where stack[i] is the last open node at level i+1. An entry at level L
24
+ // becomes a child of stack[L-2] (the enclosing smaller level), or a root when L is 1. Levels that
25
+ // skip a step (1 -> 3) are clamped to one deeper than the current stack so nothing is orphaned.
26
+ const roots = [];
27
+ const stack = [];
28
+ for (const e of this.entries) {
29
+ const level = Math.max(1, Math.min(e.level, stack.length + 1));
30
+ stack.length = level - 1; // pop back to this entry's parent depth
31
+ const node = { ...e, children: [] };
32
+ if (level === 1)
33
+ roots.push(node);
34
+ else
35
+ stack[level - 2].children.push(node);
36
+ stack[level - 1] = node;
37
+ }
38
+ // Reserve an object number for every node up front - parent/child/prev/next all cross-reference.
39
+ const objOf = new Map();
40
+ const walk = (nodes) => {
41
+ for (const n of nodes) {
42
+ objOf.set(n, om.addObject(""));
43
+ walk(n.children);
44
+ }
45
+ };
46
+ walk(roots);
47
+ const rootNum = om.addObject(""); // the /Outlines dictionary itself
48
+ // Count of all descendants of a node (used for the /Count of an open item, which shows them all).
49
+ const descendantCount = (n) => n.children.reduce((sum, c) => sum + 1 + descendantCount(c), 0);
50
+ const totalCount = roots.reduce((sum, r) => sum + 1 + descendantCount(r), 0);
51
+ // Emit each item dict, wired to its parent, siblings (prev/next) and first/last child.
52
+ const emit = (nodes, parentNum) => {
53
+ nodes.forEach((n, i) => {
54
+ const parts = [`/Title ${om.pdfString(n.title)}`, `/Parent ${parentNum} 0 R`];
55
+ if (i > 0)
56
+ parts.push(`/Prev ${objOf.get(nodes[i - 1])} 0 R`);
57
+ if (i < nodes.length - 1)
58
+ parts.push(`/Next ${objOf.get(nodes[i + 1])} 0 R`);
59
+ if (n.children.length > 0) {
60
+ parts.push(`/First ${objOf.get(n.children[0])} 0 R`);
61
+ parts.push(`/Last ${objOf.get(n.children[n.children.length - 1])} 0 R`);
62
+ parts.push(`/Count ${descendantCount(n)}`); // positive = shown open
63
+ }
64
+ // /Dest: jump to this page, scrolling the target's top into view; null left/zoom keep the
65
+ // viewer's current horizontal position and magnification. Guard the top: a non-finite value
66
+ // (e.g. a bookmark under a Spacer in an unbounded column) would emit invalid PDF, so fall back
67
+ // to the page top (0 flips to the page top edge).
68
+ const top = Number.isFinite(n.top) ? num(n.top) : 0;
69
+ parts.push(`/Dest [${n.pageObjNum} 0 R /XYZ null ${top} null]`);
70
+ om.replaceObject(objOf.get(n), `<< ${parts.join(" ")} >>`);
71
+ emit(n.children, objOf.get(n));
72
+ });
73
+ };
74
+ emit(roots, rootNum);
75
+ om.replaceObject(rootNum, `<< /Type /Outlines /First ${objOf.get(roots[0])} 0 R ` +
76
+ `/Last ${objOf.get(roots[roots.length - 1])} 0 R /Count ${totalCount} >>`);
77
+ return `/Outlines ${rootNum} 0 R`;
78
+ }
79
+ }
@@ -1,5 +1,16 @@
1
- import type { PDFConfig } from "../renderer/pdf-document-class";
2
- import type { FontMetrics } from "./font-metrics";
1
+ import type { OverflowPolicy } from "../layout/fragmentation.js";
2
+ import { TTFParser } from "./ttf-parser.js";
3
+ import { type ShapedGlyph } from "../text/shape.js";
4
+ import type { SecurityHandler } from "../crypto/security-handler.js";
5
+ import type { Gradient } from "../ir/display-list.js";
6
+ import type { FontVerticals } from "../text/line-metrics.js";
7
+ import type { FontDecoration } from "../text/text-decoration.js";
8
+ import { StructTree } from "./struct-tree.js";
9
+ import { OutlineBuilder } from "./outline.js";
10
+ import { DestRegistry } from "./dest-registry.js";
11
+ import { AcroFormCollector } from "../forms/acroform.js";
12
+ import type { PDFConfig } from "../renderer/pdf-document-class.js";
13
+ import type { FontMetrics } from "./font-metrics.js";
3
14
  interface FontIndexes {
4
15
  fontIndex: number;
5
16
  resourceIndex: number;
@@ -19,31 +30,79 @@ export declare class PDFObjectManager implements FontMetrics {
19
30
  private fonts;
20
31
  private images;
21
32
  private extGStates;
33
+ private shadings;
34
+ private emojiFontName?;
35
+ private emojiImage?;
22
36
  private pdfConfig;
23
37
  pageFormat: [number, number];
24
38
  private afmParsers;
25
39
  private customFonts;
40
+ private verticalsCache;
41
+ private decorationCache;
26
42
  private customFontEmit;
43
+ private shapeCache;
44
+ private shapedOrigins;
27
45
  private attachments;
28
46
  private xmpMetadata?;
29
47
  private outputIntent?;
30
48
  private pdfVersion;
31
49
  private documentId;
32
50
  private compress;
51
+ private overflowPolicy;
52
+ private security?;
53
+ private encJobs;
54
+ private strJobs;
55
+ private encryptObjNum?;
56
+ private _struct;
57
+ get struct(): StructTree;
58
+ private _outline;
59
+ get outline(): OutlineBuilder;
60
+ private _dests;
61
+ get dests(): DestRegistry;
62
+ private _acroform;
63
+ get acroform(): AcroFormCollector;
33
64
  constructor();
34
65
  addObject(content: string): number;
35
66
  replaceObject(objectNumber: number, content: string): void;
36
67
  setCompress(on: boolean): void;
68
+ /**
69
+ * Code points no font in the document could draw, so they were removed rather than emitted as
70
+ * `.notdef` (which PDF/A forbids). Collected here because this object is the one thing threaded
71
+ * through BOTH passes; the caller gets them back with the bytes, so an application can say which
72
+ * character went missing instead of a server log nobody reads.
73
+ */
74
+ private readonly missingGlyphs;
75
+ reportMissingGlyph(codePoints: number[]): void;
76
+ /** The dropped code points, in the order first seen. Empty for a document that hit none. */
77
+ getMissingGlyphs(): number[];
78
+ setOverflowPolicy(policy: OverflowPolicy): void;
79
+ getOverflowPolicy(): OverflowPolicy;
80
+ private encToken;
81
+ private strToken;
82
+ /**
83
+ * The single choke-point every literal string in an OBJECT goes through - a field's `/T` and `/V`, a
84
+ * bookmark `/Title`, a link `/URI`, an `/Alt` text, a destination name.
85
+ *
86
+ * Without a security handler this is the escaped literal we have always written, so output stays
87
+ * byte-identical. With one, the raw bytes are registered for the finalize pass and a placeholder takes
88
+ * their place: ISO 32000-1 7.6.2 requires ALL strings and streams to be encrypted, and the ones missed
89
+ * here were exactly the values a password is supposed to protect (ISSUE-7).
90
+ *
91
+ * A string INSIDE a content stream needs none of this - the stream is enciphered as a whole.
92
+ */
93
+ pdfString(text: string): string;
94
+ private streamPayload;
37
95
  private stream;
38
96
  addContentStream(content: string): number;
97
+ addFormXObject(bbox: string, content: string, resources?: string): number;
39
98
  changePDFConfig(config: PDFConfig): void;
40
99
  getPDFConfig(): PDFConfig;
41
100
  private fillConfigWithStandardValues;
42
101
  private getCurrentByteLength;
43
102
  setParentObjectNumber(number: number): void;
44
103
  getParentObjectNumber(): number;
45
- registerImage(width: number, height: number, imageType: string, imageData: string): number;
46
- attachFile(name: string, data: Buffer, opts?: {
104
+ registerImage(width: number, height: number, imageType: string, imageData: string, smaskData?: string): number;
105
+ attachFile(name: string, data: Uint8Array, opts?: {
47
106
  relationship?: string;
48
107
  mimeType?: string;
49
108
  description?: string;
@@ -54,7 +113,7 @@ export declare class PDFObjectManager implements FontMetrics {
54
113
  }[];
55
114
  setXmpMetadata(xml: string): void;
56
115
  getXmpMetadata(): string | undefined;
57
- setOutputIntent(icc: Buffer, opts?: {
116
+ setOutputIntent(icc: Uint8Array, opts?: {
58
117
  identifier?: string;
59
118
  info?: string;
60
119
  }): void;
@@ -63,10 +122,15 @@ export declare class PDFObjectManager implements FontMetrics {
63
122
  getPdfVersion(): string;
64
123
  getHeader(): string;
65
124
  enableDocumentId(): void;
125
+ setSecurityHandler(handler: SecurityHandler): void;
126
+ finalizeEncryption(): Promise<void>;
66
127
  registerExtGState(fillAlpha: number, strokeAlpha: number): string;
67
128
  getAllExtGStatesRaw(): Map<string, number>;
129
+ registerShading(g: Gradient): string;
130
+ private buildShadingFunction;
131
+ getAllShadingsRaw(): Map<string, number>;
68
132
  registerFont(fontName: string, fontStyle?: FontStyle, fullName?: string): FontIndexes;
69
- registerCustomFont(name: string, data: Buffer, style?: FontStyle): void;
133
+ registerCustomFont(name: string, data: Uint8Array, style?: FontStyle): void;
70
134
  private ensureEmitted;
71
135
  finalizeCustomFonts(): void;
72
136
  private subsetTag;
@@ -74,18 +138,73 @@ export declare class PDFObjectManager implements FontMetrics {
74
138
  private resolveCustomStyle;
75
139
  private getCustomFont;
76
140
  isCustomFont(name?: string, style?: FontStyle): boolean;
141
+ getColorFont(name: string, style?: FontStyle): TTFParser | undefined;
142
+ setEmojiFont(name: string): void;
143
+ getEmojiFont(): string | undefined;
144
+ setEmojiImageSource(url: string, format: string): void;
145
+ getEmojiImageSource(): {
146
+ url: string;
147
+ format: string;
148
+ } | undefined;
149
+ /**
150
+ * Whether a family can draw this code point at all. An embedded face answers from its `cmap`; a
151
+ * standard-14 one can only draw what Windows-1252 encodes, which is what its `/Widths` array covers.
152
+ * Used to pick a family out of a fallback stack, per code point.
153
+ */
154
+ hasGlyph(codePoint: number, fontFamily: string, fontStyle?: FontStyle): boolean;
155
+ /**
156
+ * Whether the document draws this code point through the colour-emoji path instead of the text
157
+ * font - a fallback emoji FONT, or an image source (`Document({ emoji })`). Such a code point is
158
+ * missing from the text font ON PURPOSE, so glyph coverage must leave it alone. Mirrors exactly
159
+ * what `getCharWidth` measures it as, or a dropped emoji would have been measured and not drawn.
160
+ */
161
+ rendersAsEmoji(codePoint: number, fontFamily: string, fontStyle: FontStyle): boolean;
162
+ private colorRenders;
77
163
  getCustomFontResource(name: string, style?: FontStyle): FontIndexes | undefined;
164
+ /** How many glyphs a run draws - its code-point count unless a ligature merged some. `letterSpacing`
165
+ * is per glyph (`Tc`), so this is what it multiplies. */
166
+ shapedGlyphCount(text: string, fontFamily?: string, fontStyle?: FontStyle): number | undefined;
167
+ /**
168
+ * The shaped glyphs of a run, or undefined when nothing needed shaping. The ONE place shaping is
169
+ * decided, so measuring and drawing cannot disagree. Memoised: a paragraph is measured several
170
+ * times (layout, pagination, drawing).
171
+ */
172
+ shapeText(text: string, fontFamily?: string, fontStyle?: FontStyle): ShapedGlyph[] | undefined;
173
+ /** Hex Identity-H for glyphs the producer already resolved (a shaped run), which cannot be given as
174
+ * text. Recording each keeps it in the subset. */
175
+ registerGlyphs(name: string, glyphs: readonly number[], style?: FontStyle): string;
78
176
  encodeCustomText(name: string, text: string, style?: FontStyle): string;
79
177
  private buildFontFile2;
80
178
  private buildFontDescriptor;
81
179
  private buildCIDFont;
82
180
  private buildToUnicode;
83
181
  private buildType0;
182
+ getFontVerticals(fontFamily: string, fontStyle: FontStyle): FontVerticals;
183
+ getFontDecoration(fontFamily: string, fontStyle: FontStyle): FontDecoration;
184
+ kerningEnabled: boolean;
185
+ setKerning(enabled: boolean): void;
186
+ /**
187
+ * The kerning adjustment for each adjacent code-point pair of `text`, in em/1000 (the sign the
188
+ * font declares: negative tightens). Length is `codePointCount - 1`. Zero at any pair next to a
189
+ * space - letters are never kerned against a space, which also keeps a per-word measure equal to a
190
+ * whole-line one (the space pairs contribute nothing either way).
191
+ *
192
+ * Standard-14 answers from the AFM `KPX` pairs. An embedded font has no kerning yet (its `kern` /
193
+ * `GPOS` tables are unparsed), so it returns zeros - never a wrong value, just no adjustment.
194
+ */
195
+ getKernPairs(text: string, fontFamily: string, fontStyle: FontStyle): number[];
196
+ /**
197
+ * Where the glyphs of `text` put ink inside a horizontal band, as x-intervals in POINTS measured
198
+ * from the start of the run. This is what an underline steps around ("skip-ink").
199
+ *
200
+ * `bandTop` / `bandBottom` are in points relative to the baseline, y UP (so both negative under
201
+ * it). Only an EMBEDDED font can answer: the standard-14 outlines live in the viewer, not here.
202
+ * Callers must check `isCustomFont` first rather than treat an empty result as "no descenders".
203
+ */
204
+ getInkSpansInBand(text: string, fontSize: number, fontFamily: string, fontStyle: FontStyle, bandTop: number, bandBottom: number, letterSpacing?: number): Array<[number, number]>;
84
205
  getStringWidth(text: string, fontFamily: string, fontSize: number, fontStyle: FontStyle): number;
85
- private getCharCode;
86
206
  private getAVMParserByFont;
87
207
  getCharWidth(char: string, fontSize: number, fullFontName?: string, fontName?: string, fontStyle?: FontStyle): number;
88
- private getKerning;
89
208
  getAllFontsRaw(): Map<string, FontIndexes>;
90
209
  getAllImagesRaw(): Map<string, number>;
91
210
  getRenderedObjects(): string;