@laminapdf/sdk 0.2.0-alpha.2 → 0.2.0-alpha.4

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 (454) hide show
  1. package/README.md +63 -8
  2. package/dist/api.d.ts +8 -3
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +4 -2
  5. package/dist/api.js.map +1 -1
  6. package/dist/builder.d.ts +43 -22
  7. package/dist/builder.d.ts.map +1 -1
  8. package/dist/builder.js +122 -83
  9. package/dist/builder.js.map +1 -1
  10. package/dist/document.d.ts +89 -22
  11. package/dist/document.d.ts.map +1 -1
  12. package/dist/document.js +177 -67
  13. package/dist/document.js.map +1 -1
  14. package/dist/errors.d.ts +5 -5
  15. package/dist/errors.d.ts.map +1 -1
  16. package/dist/errors.js +10 -16
  17. package/dist/errors.js.map +1 -1
  18. package/dist/extract-job.d.ts +100 -0
  19. package/dist/extract-job.d.ts.map +1 -0
  20. package/dist/extract-job.js +177 -0
  21. package/dist/extract-job.js.map +1 -0
  22. package/dist/extract.d.ts +57 -0
  23. package/dist/extract.d.ts.map +1 -0
  24. package/dist/extract.js +5 -0
  25. package/dist/extract.js.map +1 -0
  26. package/dist/font.d.ts +13 -6
  27. package/dist/font.d.ts.map +1 -1
  28. package/dist/font.js +50 -20
  29. package/dist/font.js.map +1 -1
  30. package/dist/generated/builder-enums.d.ts +3 -3
  31. package/dist/generated/builder-enums.d.ts.map +1 -1
  32. package/dist/generated/builder-enums.js +10 -0
  33. package/dist/generated/builder-enums.js.map +1 -1
  34. package/dist/generated/codes.d.ts +18 -6
  35. package/dist/generated/codes.d.ts.map +1 -1
  36. package/dist/generated/codes.js +114 -5
  37. package/dist/generated/codes.js.map +1 -1
  38. package/dist/generated/explain.d.ts.map +1 -1
  39. package/dist/generated/explain.js +45 -11
  40. package/dist/generated/explain.js.map +1 -1
  41. package/dist/generated/extract.d.ts +282 -0
  42. package/dist/generated/extract.d.ts.map +1 -0
  43. package/dist/generated/extract.js +4 -0
  44. package/dist/generated/extract.js.map +1 -0
  45. package/dist/init.d.ts +13 -5
  46. package/dist/init.d.ts.map +1 -1
  47. package/dist/init.js +23 -11
  48. package/dist/init.js.map +1 -1
  49. package/dist/internal/handle.d.ts +58 -0
  50. package/dist/internal/handle.d.ts.map +1 -0
  51. package/dist/internal/handle.js +113 -0
  52. package/dist/internal/handle.js.map +1 -0
  53. package/dist/internal/instance.d.ts +56 -0
  54. package/dist/internal/instance.d.ts.map +1 -0
  55. package/dist/internal/instance.js +125 -0
  56. package/dist/internal/instance.js.map +1 -0
  57. package/dist/source/http.d.ts +1 -1
  58. package/dist/source/http.js +2 -2
  59. package/dist/source/http.js.map +1 -1
  60. package/dist/source/range.d.ts +6 -1
  61. package/dist/source/range.d.ts.map +1 -1
  62. package/dist/source/range.js +10 -6
  63. package/dist/source/range.js.map +1 -1
  64. package/dist/text.d.ts +3 -3
  65. package/dist/text.d.ts.map +1 -1
  66. package/dist/text.js +3 -3
  67. package/dist/text.js.map +1 -1
  68. package/dist/types.d.ts +19 -1
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/version.d.ts +1 -1
  71. package/dist/version.js +2 -2
  72. package/dist/version.js.map +1 -1
  73. package/dist/worker/client.d.ts +3 -2
  74. package/dist/worker/client.d.ts.map +1 -1
  75. package/dist/worker/client.js +6 -4
  76. package/dist/worker/client.js.map +1 -1
  77. package/dist/worker/entry.js +1 -1
  78. package/dist/worker/entry.js.map +1 -1
  79. package/dist/worker/server.d.ts.map +1 -1
  80. package/dist/worker/server.js +42 -9
  81. package/dist/worker/server.js.map +1 -1
  82. package/dist/worker/support.d.ts +13 -3
  83. package/dist/worker/support.d.ts.map +1 -1
  84. package/dist/worker/support.js +5 -0
  85. package/dist/worker/support.js.map +1 -1
  86. package/dist/worker/types.d.ts +8 -1
  87. package/dist/worker/types.d.ts.map +1 -1
  88. package/docs/AGENTS.md +14 -0
  89. package/docs/api/README.md +166 -0
  90. package/docs/api/classes/Builder.md +467 -0
  91. package/docs/api/classes/Document.md +854 -0
  92. package/docs/api/classes/ExtractJob.md +236 -0
  93. package/docs/api/classes/Font.md +74 -0
  94. package/docs/api/classes/Image.md +140 -0
  95. package/docs/api/classes/LaminaPdfError.md +189 -0
  96. package/docs/api/classes/Page.md +178 -0
  97. package/docs/api/classes/PageRef.md +253 -0
  98. package/docs/api/classes/PageText.md +129 -0
  99. package/docs/api/classes/PageTextRun.md +167 -0
  100. package/docs/api/classes/PendingPath.md +97 -0
  101. package/docs/api/classes/SaveJob.md +205 -0
  102. package/docs/api/classes/Surface.md +331 -0
  103. package/docs/api/classes/Transaction.md +111 -0
  104. package/docs/api/functions/callbackSource.md +33 -0
  105. package/docs/api/functions/extractWithModels.md +70 -0
  106. package/docs/api/functions/httpRangeSource.md +48 -0
  107. package/docs/api/functions/init.md +36 -0
  108. package/docs/api/functions/isExtractLoaded.md +21 -0
  109. package/docs/api/functions/isInitialized.md +19 -0
  110. package/docs/api/functions/isLaminaPdfError.md +41 -0
  111. package/docs/api/functions/isTextLoaded.md +19 -0
  112. package/docs/api/functions/loadExtract.md +28 -0
  113. package/docs/api/functions/loadText.md +28 -0
  114. package/docs/api/functions/onLeak.md +29 -0
  115. package/docs/api/functions/reset.md +22 -0
  116. package/docs/api/functions/wasmMemory.md +22 -0
  117. package/docs/api/interfaces/BuilderOptions.md +108 -0
  118. package/docs/api/interfaces/ByteRange.md +29 -0
  119. package/docs/api/interfaces/ChunkOptions.md +37 -0
  120. package/docs/api/interfaces/Diagnostic.md +67 -0
  121. package/docs/api/interfaces/ExtractOptions.md +92 -0
  122. package/docs/api/interfaces/ExtractResult.md +37 -0
  123. package/docs/api/interfaces/FontInfo.md +37 -0
  124. package/docs/api/interfaces/HostModels.md +57 -0
  125. package/docs/api/interfaces/HttpRangeOptions.md +78 -0
  126. package/docs/api/interfaces/InitOptions.md +40 -0
  127. package/docs/api/interfaces/LayoutRegion.md +38 -0
  128. package/docs/api/interfaces/Leak.md +21 -0
  129. package/docs/api/interfaces/Location.md +53 -0
  130. package/docs/api/interfaces/ModelInfo.md +45 -0
  131. package/docs/api/interfaces/ModelRequest.md +45 -0
  132. package/docs/api/interfaces/Models.md +45 -0
  133. package/docs/api/interfaces/OcrWord.md +37 -0
  134. package/docs/api/interfaces/OpLog.md +25 -0
  135. package/docs/api/interfaces/OpenOptions.md +37 -0
  136. package/docs/api/interfaces/PageTextOptions.md +21 -0
  137. package/docs/api/interfaces/PathBuilder.md +195 -0
  138. package/docs/api/interfaces/QuadPoint.md +25 -0
  139. package/docs/api/interfaces/RangeOptions.md +54 -0
  140. package/docs/api/interfaces/RangeSource.md +59 -0
  141. package/docs/api/interfaces/StrokeStyle.md +61 -0
  142. package/docs/api/interfaces/TagSpec.md +69 -0
  143. package/docs/api/interfaces/TextBoxOptions.md +93 -0
  144. package/docs/api/interfaces/TextGlyph.md +29 -0
  145. package/docs/api/interfaces/TextOptions.md +101 -0
  146. package/docs/api/interfaces/WasmMemory.md +37 -0
  147. package/docs/api/type-aliases/AfRelationship.md +15 -0
  148. package/docs/api/type-aliases/Align.md +15 -0
  149. package/docs/api/type-aliases/ArtifactKind.md +15 -0
  150. package/docs/api/type-aliases/AttachmentOptions.md +15 -0
  151. package/docs/api/type-aliases/BlendMode.md +15 -0
  152. package/docs/api/type-aliases/BoxRect.md +15 -0
  153. package/docs/api/type-aliases/BuildOptions.md +15 -0
  154. package/docs/api/type-aliases/Cell.md +71 -0
  155. package/docs/api/type-aliases/Chunk.md +79 -0
  156. package/docs/api/type-aliases/Color.md +16 -0
  157. package/docs/api/type-aliases/Coordinates.md +55 -0
  158. package/docs/api/type-aliases/Direction.md +15 -0
  159. package/docs/api/type-aliases/DocumentInfo.md +15 -0
  160. package/docs/api/type-aliases/DropReason.md +15 -0
  161. package/docs/api/type-aliases/Dropped.md +59 -0
  162. package/docs/api/type-aliases/Edited.md +15 -0
  163. package/docs/api/type-aliases/ErrorCode.md +15 -0
  164. package/docs/api/type-aliases/ErrorKind.md +15 -0
  165. package/docs/api/type-aliases/ExtractFormat.md +15 -0
  166. package/docs/api/type-aliases/ExtractJobOptions.md +31 -0
  167. package/docs/api/type-aliases/ExtractStep.md +61 -0
  168. package/docs/api/type-aliases/ExtractedBlock.md +94 -0
  169. package/docs/api/type-aliases/ExtractedPage.md +73 -0
  170. package/docs/api/type-aliases/ExtractedSource.md +48 -0
  171. package/docs/api/type-aliases/Extraction.md +22 -0
  172. package/docs/api/type-aliases/FillRule.md +15 -0
  173. package/docs/api/type-aliases/Fit.md +15 -0
  174. package/docs/api/type-aliases/Flags.md +15 -0
  175. package/docs/api/type-aliases/Generator.md +43 -0
  176. package/docs/api/type-aliases/GlyphQuad.md +15 -0
  177. package/docs/api/type-aliases/InfoPatch.md +15 -0
  178. package/docs/api/type-aliases/LaminaPdfWarning.md +16 -0
  179. package/docs/api/type-aliases/LimitName.md +15 -0
  180. package/docs/api/type-aliases/Limits.md +15 -0
  181. package/docs/api/type-aliases/LineBox.md +15 -0
  182. package/docs/api/type-aliases/LineCap.md +15 -0
  183. package/docs/api/type-aliases/LineJoin.md +15 -0
  184. package/docs/api/type-aliases/LinkTarget.md +15 -0
  185. package/docs/api/type-aliases/Metadata.md +15 -0
  186. package/docs/api/type-aliases/ModelResult.md +15 -0
  187. package/docs/api/type-aliases/Op.md +15 -0
  188. package/docs/api/type-aliases/OutlineEntry.md +15 -0
  189. package/docs/api/type-aliases/OutlineNode.md +15 -0
  190. package/docs/api/type-aliases/Overflow.md +15 -0
  191. package/docs/api/type-aliases/PageInfo.md +15 -0
  192. package/docs/api/type-aliases/PageLabel.md +15 -0
  193. package/docs/api/type-aliases/PageSizeName.md +15 -0
  194. package/docs/api/type-aliases/Point.md +15 -0
  195. package/docs/api/type-aliases/Profile.md +15 -0
  196. package/docs/api/type-aliases/Progress.md +15 -0
  197. package/docs/api/type-aliases/ReadingOrder.md +15 -0
  198. package/docs/api/type-aliases/Rect.md +15 -0
  199. package/docs/api/type-aliases/Region.md +31 -0
  200. package/docs/api/type-aliases/RegionLabel.md +15 -0
  201. package/docs/api/type-aliases/RenderMode.md +15 -0
  202. package/docs/api/type-aliases/Rotation.md +15 -0
  203. package/docs/api/type-aliases/SaveOptions.md +15 -0
  204. package/docs/api/type-aliases/SaveReport.md +15 -0
  205. package/docs/api/type-aliases/Span.md +74 -0
  206. package/docs/api/type-aliases/SplitOn.md +15 -0
  207. package/docs/api/type-aliases/Standard14.md +15 -0
  208. package/docs/api/type-aliases/StructRef.md +41 -0
  209. package/docs/api/type-aliases/StructSource.md +17 -0
  210. package/docs/api/type-aliases/StructureKid.md +15 -0
  211. package/docs/api/type-aliases/StructureNode.md +16 -0
  212. package/docs/api/type-aliases/TableDetector.md +15 -0
  213. package/docs/api/type-aliases/TableMode.md +15 -0
  214. package/docs/api/type-aliases/TableScope.md +15 -0
  215. package/docs/api/type-aliases/Tag.md +15 -0
  216. package/docs/api/type-aliases/TagName.md +15 -0
  217. package/docs/api/type-aliases/Target.md +15 -0
  218. package/docs/api/type-aliases/TargetView.md +18 -0
  219. package/docs/api/type-aliases/TextLayer.md +72 -0
  220. package/docs/api/type-aliases/TextLayerStatus.md +15 -0
  221. package/docs/api/type-aliases/TextLayout.md +15 -0
  222. package/docs/api/type-aliases/TextRange.md +33 -0
  223. package/docs/api/type-aliases/TextRunInfo.md +15 -0
  224. package/docs/api/type-aliases/Transform.md +15 -0
  225. package/docs/api/type-aliases/UndoOutcome.md +15 -0
  226. package/docs/api/type-aliases/ViewerPreferences.md +15 -0
  227. package/docs/api/type-aliases/WarningCode.md +15 -0
  228. package/docs/api/type-aliases/WasmSource.md +16 -0
  229. package/docs/api/variables/Matrix.md +99 -0
  230. package/docs/api/variables/PAGE_SIZES.md +15 -0
  231. package/docs/api/variables/TAG_NAMES.md +15 -0
  232. package/docs/errors/README.md +173 -0
  233. package/docs/errors/aes-padding-invalid.md +34 -0
  234. package/docs/errors/already-initialized.md +34 -0
  235. package/docs/errors/binary-output-to-terminal.md +35 -0
  236. package/docs/errors/builder-finished.md +35 -0
  237. package/docs/errors/cancelled.md +35 -0
  238. package/docs/errors/cmap-invalid.md +42 -0
  239. package/docs/errors/collection-index.md +33 -0
  240. package/docs/errors/color-components.md +33 -0
  241. package/docs/errors/content-bad-operands.md +36 -0
  242. package/docs/errors/content-path-unpainted.md +36 -0
  243. package/docs/errors/content-resource-missing.md +37 -0
  244. package/docs/errors/content-syntax.md +36 -0
  245. package/docs/errors/content-unbalanced-bt.md +36 -0
  246. package/docs/errors/content-unbalanced-marked.md +36 -0
  247. package/docs/errors/content-unbalanced-q.md +36 -0
  248. package/docs/errors/content-unknown-operator.md +37 -0
  249. package/docs/errors/covered-text.md +33 -0
  250. package/docs/errors/data-pending.md +34 -0
  251. package/docs/errors/decompress.md +34 -0
  252. package/docs/errors/device-color-without-output-intent.md +33 -0
  253. package/docs/errors/direct-page.md +34 -0
  254. package/docs/errors/disposed.md +34 -0
  255. package/docs/errors/document-changed.md +34 -0
  256. package/docs/errors/embedded-file-forbidden.md +35 -0
  257. package/docs/errors/embedded-file-without-mime-type.md +36 -0
  258. package/docs/errors/encoding-full.md +34 -0
  259. package/docs/errors/encrypted-base.md +33 -0
  260. package/docs/errors/extract-column-order-uncertain.md +38 -0
  261. package/docs/errors/extract-limit-blocks.md +35 -0
  262. package/docs/errors/extract-module-not-loaded.md +37 -0
  263. package/docs/errors/extract-needs-ocr.md +37 -0
  264. package/docs/errors/extract-reading-order-ambiguous.md +32 -0
  265. package/docs/errors/extract-struct-tree-ignored.md +32 -0
  266. package/docs/errors/extract-table-ambiguous.md +32 -0
  267. package/docs/errors/extract-table-limit.md +35 -0
  268. package/docs/errors/extract-untagged-content.md +32 -0
  269. package/docs/errors/fetch-failed.md +34 -0
  270. package/docs/errors/flate-truncated.md +34 -0
  271. package/docs/errors/flow-content-too-large.md +34 -0
  272. package/docs/errors/flow-keep-broken.md +34 -0
  273. package/docs/errors/flow-layout-unstable.md +38 -0
  274. package/docs/errors/font-invalid.md +36 -0
  275. package/docs/errors/font-mismatch.md +34 -0
  276. package/docs/errors/font-not-embeddable.md +34 -0
  277. package/docs/errors/font-not-embedded.md +35 -0
  278. package/docs/errors/font-not-shapable.md +33 -0
  279. package/docs/errors/glyph-out-of-range.md +34 -0
  280. package/docs/errors/glyph-without-unicode.md +37 -0
  281. package/docs/errors/heading-level-skipped.md +36 -0
  282. package/docs/errors/image-data-length.md +33 -0
  283. package/docs/errors/image-too-large.md +32 -0
  284. package/docs/errors/inline-image-unterminated.md +36 -0
  285. package/docs/errors/input-unreadable.md +37 -0
  286. package/docs/errors/instance-reset.md +34 -0
  287. package/docs/errors/invalid-argument.md +33 -0
  288. package/docs/errors/invalid-axis-value.md +32 -0
  289. package/docs/errors/invalid-box.md +34 -0
  290. package/docs/errors/invalid-color.md +32 -0
  291. package/docs/errors/invalid-command-line.md +44 -0
  292. package/docs/errors/invalid-date.md +34 -0
  293. package/docs/errors/invalid-entry.md +34 -0
  294. package/docs/errors/invalid-feature.md +32 -0
  295. package/docs/errors/invalid-font.md +32 -0
  296. package/docs/errors/invalid-geometry.md +32 -0
  297. package/docs/errors/invalid-icc-profile.md +32 -0
  298. package/docs/errors/invalid-image.md +33 -0
  299. package/docs/errors/invalid-op-log.md +33 -0
  300. package/docs/errors/invalid-page-label.md +34 -0
  301. package/docs/errors/invalid-page-labels.md +32 -0
  302. package/docs/errors/invalid-page-range.md +37 -0
  303. package/docs/errors/invalid-rotate.md +34 -0
  304. package/docs/errors/invalid-spans.md +39 -0
  305. package/docs/errors/invalid-structure-nesting.md +38 -0
  306. package/docs/errors/invalid-structure.md +34 -0
  307. package/docs/errors/invalid-text-range.md +33 -0
  308. package/docs/errors/job-finished.md +34 -0
  309. package/docs/errors/limit-exceeded.md +38 -0
  310. package/docs/errors/link-without-contents.md +33 -0
  311. package/docs/errors/link-without-structure.md +37 -0
  312. package/docs/errors/markdown-html-ignored.md +33 -0
  313. package/docs/errors/markdown-image-missing.md +34 -0
  314. package/docs/errors/missing-alt-text.md +33 -0
  315. package/docs/errors/missing-glyph.md +33 -0
  316. package/docs/errors/missing-header.md +37 -0
  317. package/docs/errors/missing-lang.md +32 -0
  318. package/docs/errors/missing-root.md +34 -0
  319. package/docs/errors/missing-title.md +32 -0
  320. package/docs/errors/model-failed.md +33 -0
  321. package/docs/errors/model-needs-host.md +40 -0
  322. package/docs/errors/model-result-unexpected.md +36 -0
  323. package/docs/errors/name-tree-node-skipped.md +34 -0
  324. package/docs/errors/nested-transaction.md +34 -0
  325. package/docs/errors/no-pending-save.md +32 -0
  326. package/docs/errors/no-transaction.md +33 -0
  327. package/docs/errors/not-initialized.md +35 -0
  328. package/docs/errors/not-pdf.md +33 -0
  329. package/docs/errors/not-rebased.md +35 -0
  330. package/docs/errors/object-number-out-of-range.md +38 -0
  331. package/docs/errors/objstm-index-mismatch.md +36 -0
  332. package/docs/errors/out-of-memory.md +38 -0
  333. package/docs/errors/outline-cycle.md +34 -0
  334. package/docs/errors/outline-item-skipped.md +34 -0
  335. package/docs/errors/output-unwritable.md +37 -0
  336. package/docs/errors/overwrite-refused.md +36 -0
  337. package/docs/errors/page-count-mismatch.md +34 -0
  338. package/docs/errors/page-index-out-of-range.md +34 -0
  339. package/docs/errors/page-tree-node-skipped.md +35 -0
  340. package/docs/errors/password-required.md +36 -0
  341. package/docs/errors/path-outside-roots.md +32 -0
  342. package/docs/errors/perms-mismatch.md +34 -0
  343. package/docs/errors/profile-version-conflict.md +35 -0
  344. package/docs/errors/redaction-not-applied.md +32 -0
  345. package/docs/errors/reference-cycle.md +35 -0
  346. package/docs/errors/render-backend-unavailable.md +32 -0
  347. package/docs/errors/render-failed.md +33 -0
  348. package/docs/errors/render-too-large.md +36 -0
  349. package/docs/errors/repaired-base.md +34 -0
  350. package/docs/errors/requires-rewrite.md +38 -0
  351. package/docs/errors/revision-index-out-of-range.md +34 -0
  352. package/docs/errors/saved-not-rebased.md +34 -0
  353. package/docs/errors/sink-not-empty.md +33 -0
  354. package/docs/errors/sink.md +31 -0
  355. package/docs/errors/source-budget-exceeded.md +34 -0
  356. package/docs/errors/source-changed.md +33 -0
  357. package/docs/errors/source.md +30 -0
  358. package/docs/errors/stale-generation.md +34 -0
  359. package/docs/errors/stream-length-recovered.md +37 -0
  360. package/docs/errors/strict.md +34 -0
  361. package/docs/errors/subset-failed.md +31 -0
  362. package/docs/errors/syntax.md +34 -0
  363. package/docs/errors/tag-element-not-open.md +41 -0
  364. package/docs/errors/tag-element-unclosed.md +34 -0
  365. package/docs/errors/text-in-earlier-revision.md +36 -0
  366. package/docs/errors/text-module-not-loaded.md +36 -0
  367. package/docs/errors/text-overflow.md +34 -0
  368. package/docs/errors/tounicode-conflict.md +32 -0
  369. package/docs/errors/type.md +34 -0
  370. package/docs/errors/unexpected-eof.md +34 -0
  371. package/docs/errors/unknown-axis.md +33 -0
  372. package/docs/errors/unknown-code.md +36 -0
  373. package/docs/errors/unknown-destination.md +33 -0
  374. package/docs/errors/unknown-font.md +33 -0
  375. package/docs/errors/unknown-option.md +33 -0
  376. package/docs/errors/unknown-page.md +34 -0
  377. package/docs/errors/unmapped-glyph.md +36 -0
  378. package/docs/errors/unnumbered-heading-misused.md +34 -0
  379. package/docs/errors/unset-object.md +30 -0
  380. package/docs/errors/unsupported-filter.md +34 -0
  381. package/docs/errors/unsupported-image.md +33 -0
  382. package/docs/errors/unsupported-layout-option.md +33 -0
  383. package/docs/errors/unsupported-security-handler.md +34 -0
  384. package/docs/errors/unsupported-version.md +32 -0
  385. package/docs/errors/untagged-content.md +35 -0
  386. package/docs/errors/warnings-truncated.md +35 -0
  387. package/docs/errors/wasm-trap.md +37 -0
  388. package/docs/errors/whole-font-rebuilt.md +30 -0
  389. package/docs/errors/worker-crashed.md +33 -0
  390. package/docs/errors/worker-failed.md +32 -0
  391. package/docs/errors/worker-version-mismatch.md +34 -0
  392. package/docs/errors/would-invalidate-signatures.md +38 -0
  393. package/docs/errors/wrong-document.md +33 -0
  394. package/docs/errors/wrong-password.md +34 -0
  395. package/docs/errors/xobject-cycle.md +36 -0
  396. package/docs/errors/xref-repaired.md +36 -0
  397. package/docs/errors/xrefstm-ignored.md +34 -0
  398. package/docs/llms.txt +94 -0
  399. package/docs/pages/concepts/dependencies.md +44 -0
  400. package/docs/pages/concepts/drawing-pages.md +76 -0
  401. package/docs/pages/concepts/errors-and-warnings.md +68 -0
  402. package/docs/pages/concepts/how-lamina-thinks.md +98 -0
  403. package/docs/pages/concepts/pages-and-coordinates.md +75 -0
  404. package/docs/pages/guides/accessible-pdfs.md +262 -0
  405. package/docs/pages/guides/archival-pdfs.md +433 -0
  406. package/docs/pages/guides/edit-a-pdf.md +143 -0
  407. package/docs/pages/guides/flowing-pages.md +379 -0
  408. package/docs/pages/guides/fonts-and-text.md +204 -0
  409. package/docs/pages/guides/images-and-vectors.md +221 -0
  410. package/docs/pages/guides/keep-the-page-responsive.md +85 -0
  411. package/docs/pages/guides/links-outlines-and-metadata.md +224 -0
  412. package/docs/pages/guides/open-large-files.md +69 -0
  413. package/docs/pages/guides/password-protected-files.md +70 -0
  414. package/docs/pages/guides/save-a-pdf.md +154 -0
  415. package/docs/pages/guides/test-generated-pdfs.md +324 -0
  416. package/docs/pages/guides/untrusted-files.md +82 -0
  417. package/docs/pages/index.md +33 -0
  418. package/docs/pages/install.md +79 -0
  419. package/docs/pages/quick-start/browser.md +71 -0
  420. package/docs/pages/quick-start/bun.md +64 -0
  421. package/docs/pages/quick-start/deno.md +62 -0
  422. package/docs/pages/quick-start/node.md +65 -0
  423. package/docs/pages/quick-start/rust.md +62 -0
  424. package/docs/pages/quick-start/workers.md +139 -0
  425. package/docs/pages/recipes/cloudflare-worker.md +115 -0
  426. package/docs/pages/recipes/element-flow.md +248 -0
  427. package/docs/pages/recipes/extract-markdown.md +152 -0
  428. package/docs/pages/recipes/generate-then-edit.md +142 -0
  429. package/docs/pages/recipes/hello.md +101 -0
  430. package/docs/pages/recipes/images-and-vectors.md +216 -0
  431. package/docs/pages/recipes/invoice.md +233 -0
  432. package/docs/pages/recipes/links-and-outlines.md +222 -0
  433. package/docs/pages/recipes/multilingual.md +196 -0
  434. package/docs/pages/recipes/open-untrusted.md +65 -0
  435. package/docs/pages/recipes/pdf-a-archive.md +212 -0
  436. package/docs/pages/recipes/pdf-a3-invoice-with-xml.md +229 -0
  437. package/docs/pages/recipes/pdf-ua-report.md +244 -0
  438. package/docs/pages/recipes/report.md +125 -0
  439. package/docs/pages/recipes/web-worker-client.md +64 -0
  440. package/docs/pages/recipes.md +48 -0
  441. package/docs/pages/reference/benchmarks.md +93 -0
  442. package/docs/pages/reference/changelog.md +134 -0
  443. package/docs/pages/reference/codes.md +14 -0
  444. package/docs/pages/reference/glossary.md +108 -0
  445. package/docs/pages/reference/rust.md +36 -0
  446. package/docs/pages/reference/stability.md +59 -0
  447. package/docs/pages/start/coding-agents.md +45 -0
  448. package/docs/pages/start/first-pdf.md +81 -0
  449. package/docs/pages/troubleshooting.md +74 -0
  450. package/docs/renames.json +86 -0
  451. package/docs/schemas/error.schema.json +322 -0
  452. package/docs/schemas/renames.schema.json +29 -0
  453. package/package.json +7 -3
  454. package/schemas/error.schema.json +37 -3
@@ -0,0 +1,75 @@
1
+ ---
2
+ title: "Pages and coordinates"
3
+ description: "Points from the top-left corner of the page as it's displayed, y going down, and pages numbered from 0."
4
+ version: "0.2.0-alpha.4"
5
+ url: "https://docs.laminapdf.com/concepts/pages-and-coordinates/"
6
+ ---
7
+
8
+ # Pages and coordinates
9
+
10
+ Points from the top-left corner of the page as it's displayed, y going down, and pages numbered from 0.
11
+
12
+ Every position you pass Lamina PDF is in [page space](../../pages/reference/glossary.md#page-space): points measured from the top-left corner of the page, with y going down. It's the way a screen or a sheet of paper reads, so a number means the same thing in every part of the API.
13
+
14
+ ## Points
15
+
16
+ A point is 1/72 of an inch. An A4 page is about 595 × 842 points, and a US Letter page is 612 × 792. Some pages set a [user unit](../../pages/reference/glossary.md#user-unit), which scales the file's own units; Lamina PDF applies it, so a point is always 1/72 inch.
17
+
18
+ ## The top-left corner of the page you see
19
+
20
+ The origin is the top-left corner of the page as a viewer displays it: its visible area (its [crop box](../../pages/reference/glossary.md#crop-box)), turned the way the page is rotated. So `[72, 96]` is one inch from the left edge and 96 points from the top, whichever way the page is rotated in the file.
21
+
22
+ For text, the second number is the baseline, the line the letters sit on. Letters reach up from it, and descenders such as "g" and "p" hang below it.
23
+
24
+ This app places "Hello, world!" one inch from the top-left corner, with its baseline one text size lower:
25
+
26
+ **TypeScript**
27
+
28
+ `packages/sdk/examples/quick-start/node.ts`:
29
+
30
+ ```ts
31
+ // Builds a one-page PDF that says "Hello, world!" and writes it to hello.pdf, in Node.
32
+ import { writeFile } from "node:fs/promises";
33
+ import { Builder, type BuilderOptions, Font, init } from "@laminapdf/sdk";
34
+
35
+ /** The space between the page's edge and the text, in points (72 points = 1 inch). */
36
+ const MARGIN = 72;
37
+ /** The text's size in points; its baseline sits this far below the margin. */
38
+ const FONT_SIZE = 24;
39
+
40
+ /** Builds the page and hands its bytes to `save`, which writes hello.pdf unless you pass another `save` function. */
41
+ export async function hello(
42
+ save: (pdf: Uint8Array) => void | Promise<void> = (pdf) => writeFile("hello.pdf", pdf),
43
+ options: BuilderOptions = {},
44
+ ): Promise<void> {
45
+ await init({ text: true });
46
+ using builder = new Builder(options);
47
+ const page = builder.page("A4");
48
+ // Points from the page's top-left corner, y down; the text's baseline sits FONT_SIZE points below the margin.
49
+ page.surface().text("Hello, world!", {
50
+ font: Font.standard("Helvetica"),
51
+ size: FONT_SIZE,
52
+ at: [MARGIN, MARGIN + FONT_SIZE],
53
+ });
54
+ page.finish();
55
+ using doc = builder.finish();
56
+ await save(doc.save());
57
+ }
58
+
59
+ // `node hello.ts` runs it (Node 24.2 or newer); imported, it only exports `hello`.
60
+ if (import.meta.main) await hello();
61
+ ```
62
+
63
+ **Result:** [hello.pdf](https://docs.laminapdf.com/examples/pdf/hello.pdf)
64
+
65
+ ## Pages count from 0
66
+
67
+ The first page is page 0 everywhere: `doc.page(0)`, a link's target, a page label's start.
68
+
69
+ ## PDF's own coordinates
70
+
71
+ Inside the file, PDF measures from the bottom-left corner with y going up, before rotation. That's [user space](../../pages/reference/glossary.md#user-space). Lamina PDF converts for you, so you only meet it in Rust, in names that contain `UserSpace` or `user_space`.
72
+
73
+ *Page space starts at the top-left corner you see; PDF's user space starts at the bottom-left, before rotation.*
74
+
75
+ On an upright US Letter page, 612 by 792 points, page space starts at the top-left corner with y going down, and PDF's user space starts at the bottom-left corner with y going up. The point `[72, 96]` is one inch from the left edge and 96 points from the top, on the baseline of a heading whose box runs from `[72, 72]` to `[272, 100]`. With `/Rotate 90` a viewer shows the same page on its side, 792 by 612 points. Page space still starts at the top-left corner you see, so `[72, 96]` lands in the same place on the screen. User space starts at that corner too, with its x axis going down and its y axis going right. The heading in the file now runs down the right edge, from `[692, 72]` to `[720, 272]` in page space.
@@ -0,0 +1,262 @@
1
+ ---
2
+ title: "Accessible PDFs"
3
+ description: "Build PDF/UA-1 documents that screen readers can follow, with every machine-checkable rule checked when the builder finishes."
4
+ version: "0.2.0-alpha.4"
5
+ url: "https://docs.laminapdf.com/guides/accessible-pdfs/"
6
+ ---
7
+
8
+ # Accessible PDFs
9
+
10
+ Build PDF/UA-1 documents that screen readers can follow, with every machine-checkable rule checked when the builder finishes.
11
+
12
+ This guide builds a report that screen-reader users can read, which you need whenever a document has to meet accessibility law or a client's accessibility policy.
13
+
14
+ ## What PDF/UA asks for
15
+
16
+ PDF/UA-1 ("Universal Accessibility") is the standard for accessible PDF. A PDF/UA file is tagged: its structure tree says which content is a heading, a paragraph, a list, a table or a figure, and in what order to read it. Everything else, such as running headers and decorative rules, is marked as an artifact, which assistive technology skips. The file also needs a title, a language, alternate text for every figure, a description for every link and embedded fonts that map each glyph to characters.
17
+
18
+ Turn the profile on with one option: `profiles: ["PDF/UA-1"]` in TypeScript, `BuildOptions::default().with_profile(Profile::PdfUa1)` in Rust. Then `finish()` checks the rules a program can check and fails with a coded error for the first one the document breaks:
19
+
20
+ | Rule | Error |
21
+ | --- | --- |
22
+ | The metadata has a title | [`missing-title`](../../errors/missing-title.md) |
23
+ | The document has a language (`lang`) | [`missing-lang`](../../errors/missing-lang.md) |
24
+ | Everything drawn is tagged or an artifact | [`untagged-content`](../../errors/untagged-content.md) |
25
+ | Every figure and formula has alternate text | [`missing-alt-text`](../../errors/missing-alt-text.md) |
26
+ | Headings start at `H1` and skip no level going down | [`heading-level-skipped`](../../errors/heading-level-skipped.md) |
27
+ | One unnumbered `H` per section, never beside `H1`–`H6` | [`unnumbered-heading-misused`](../../errors/unnumbered-heading-misused.md) |
28
+ | Table cells sit in rows, rows in tables, list items in lists | [`invalid-structure-nesting`](../../errors/invalid-structure-nesting.md) |
29
+ | Every link has a `Link` element and a description | [`link-without-structure`](../../errors/link-without-structure.md), [`link-without-contents`](../../errors/link-without-contents.md) |
30
+ | Every font is embedded (no standard 14 font) | [`font-not-embedded`](../../errors/font-not-embedded.md) |
31
+ | Every glyph maps to Unicode | [`glyph-without-unicode`](../../errors/glyph-without-unicode.md) |
32
+ | The PDF version is 1.7 or lower | [`profile-version-conflict`](../../errors/profile-version-conflict.md) |
33
+
34
+ The builder writes the rest for you. It puts the PDF/UA identifier in the document's XMP metadata, the XML packet in the file that describes it. It also asks viewers to show the title instead of the file name, and orders links by the structure.
35
+
36
+ ## The example
37
+
38
+ The report below draws its running header as an artifact. Then come a heading, a paragraph, a table with header cells, a bar chart as a figure with alternate text, and a link with a description. A small `line` helper gives each line of text its structure element.
39
+
40
+ **TypeScript**
41
+
42
+ `packages/sdk/examples/pdf-ua-report.ts`:
43
+
44
+ ```ts
45
+ // An accessible report that screen readers can follow, checked against PDF/UA-1 when it is built.
46
+ import { Builder, Font, type Surface, type Tag, type TagName } from "@laminapdf/sdk";
47
+
48
+ const MARGIN = 56;
49
+ const ROW = 18;
50
+ const COLUMN = 144;
51
+ const HEADER_BASELINE = 40;
52
+ const TITLE_BASELINE = 90;
53
+ const TABLE_TOP = 150;
54
+ const LINK_BASELINE = 400;
55
+ const CHART_LEFT = 320;
56
+ const CHART_BASE = 360;
57
+ const BAR_WIDTH = 36;
58
+ const BAR_PITCH = 50;
59
+ const BODY = 11;
60
+ /** The font sizes of the title and the headings; other text is `BODY`. */
61
+ const SIZES: Partial<Record<TagName, number>> = { H1: 22, H2: 15 };
62
+ const BLUE = [0.12, 0.47, 0.78] as const;
63
+ const QUARTERS = [
64
+ ["Q1", 120],
65
+ ["Q2", 135],
66
+ ["Q3", 160],
67
+ ["Q4", 150],
68
+ ] as const;
69
+ const CHART_ALT = "Bar chart of sales by quarter: 120, 135, 160 and 150 thousand euros.";
70
+
71
+ /**
72
+ * The report's bytes. Needs `init({ text: true })`.
73
+ *
74
+ * @param notoSans - the bytes of the Noto Sans font file.
75
+ */
76
+ export function pdfUaReport(notoSans: Uint8Array): Uint8Array<ArrayBuffer> {
77
+ using b = new Builder({ profiles: ["PDF/UA-1"] });
78
+ b.metadata({ title: "Annual sales report 2026" });
79
+ b.lang("en-GB");
80
+ const font = Font.fromBytes(notoSans);
81
+ b.font(font);
82
+ const page = b.page("A4");
83
+ draw(page.surface(), font);
84
+ page.finish();
85
+ using doc = b.finish();
86
+ return doc.save();
87
+ }
88
+
89
+ /** One line of text with its baseline at `y`, as the structure element `tag`, sized by it. */
90
+ function line(s: Surface, font: Font, tag: Tag, text: string, x: number, y: number): void {
91
+ const size = (typeof tag === "string" ? SIZES[tag] : undefined) ?? BODY;
92
+ s.tag(tag, (s) => s.text(text, { font, size, at: [x, y] }));
93
+ }
94
+
95
+ function draw(s: Surface, font: Font): void {
96
+ // The running header is decoration: an artifact, which screen readers skip.
97
+ s.artifact("pagination", (s) => s.text("Acme Widgets", { font, size: BODY, at: [MARGIN, HEADER_BASELINE] }));
98
+ line(s, font, "H1", "Annual sales report 2026", MARGIN, TITLE_BASELINE);
99
+ line(s, font, "P", "Sales grew in three quarters of four.", MARGIN, TITLE_BASELINE + 2 * ROW);
100
+ table(s, font);
101
+ chart(s);
102
+ const link = {
103
+ target: { type: "uri", uri: "https://example.com/accounts" },
104
+ contents: "The full 2026 accounts",
105
+ } as const;
106
+ s.tag("P", (s) =>
107
+ s.text("The full accounts", { font, size: BODY, at: [MARGIN, LINK_BASELINE], fill: [...BLUE], link }),
108
+ );
109
+ }
110
+
111
+ /** A heading and a table of the quarters, whose first row holds the columns' header cells. */
112
+ function table(s: Surface, font: Font): void {
113
+ line(s, font, "H2", "Sales by quarter", MARGIN, TABLE_TOP);
114
+ const header: Tag = { type: "TH", scope: "column" };
115
+ s.tag("Table", (s) => {
116
+ s.tag("TR", (s) => {
117
+ line(s, font, header, "Quarter", MARGIN, TABLE_TOP + ROW);
118
+ line(s, font, header, "Sales (k€)", MARGIN + COLUMN, TABLE_TOP + ROW);
119
+ });
120
+ QUARTERS.forEach(([quarter, sales], i) => {
121
+ const y = TABLE_TOP + ROW * (i + 2);
122
+ s.tag("TR", (s) => {
123
+ line(s, font, "TD", quarter, MARGIN, y);
124
+ line(s, font, "TD", sales.toFixed(0), MARGIN + COLUMN, y);
125
+ });
126
+ });
127
+ });
128
+ }
129
+
130
+ /** The quarters as bars standing on the chart's base: one figure with alternate text. */
131
+ function chart(s: Surface): void {
132
+ s.tag({ type: "Figure", alt: CHART_ALT }, (s) => {
133
+ s.fillColor([...BLUE]);
134
+ QUARTERS.forEach(([, sales], i) => {
135
+ s.path((p) => p.rect([CHART_LEFT + BAR_PITCH * i, CHART_BASE - sales, BAR_WIDTH, sales])).fill();
136
+ });
137
+ });
138
+ }
139
+ ```
140
+
141
+ **Rust**
142
+
143
+ `crates/laminapdf/examples/pdf_ua_report.rs`:
144
+
145
+ ```rust
146
+ //! An accessible report that screen readers can follow, checked against PDF/UA-1 when it is built.
147
+
148
+ use laminapdf::{
149
+ ArtifactKind, BuildError, BuildOptions, Builder, Color, FillRule, FontHandle, LinkTarget, Metadata, PageSize,
150
+ PointPt, Profile, Pt, RectPt, SaveOptions, Surface, TableScope, Tag, TagKind,
151
+ };
152
+
153
+ const MARGIN: f64 = 56.0;
154
+ const ROW: f64 = 18.0;
155
+ const COLUMN: f64 = 144.0;
156
+ const HEADER_AT: PointPt = PointPt::from_points(MARGIN, 40.0);
157
+ const TITLE_BASELINE: f64 = 90.0;
158
+ const TABLE_TOP: f64 = 150.0;
159
+ const LINK_AT: PointPt = PointPt::from_points(MARGIN, 400.0);
160
+ const CHART_LEFT: f64 = 320.0;
161
+ const CHART_BASE: f64 = 360.0;
162
+ const BAR_WIDTH: Pt = Pt::new(36.0);
163
+ const BAR_PITCH: f64 = 50.0;
164
+ const BODY: Pt = Pt::new(11.0);
165
+ /// The font sizes of the title and the headings; other text is `BODY`.
166
+ const SIZES: [(TagKind, Pt); 2] = [(TagKind::H1, Pt::new(22.0)), (TagKind::H2, Pt::new(15.0))];
167
+ const BLUE: Color = Color::Rgb(0.12, 0.47, 0.78);
168
+ const QUARTERS: [(&str, f64); 4] = [("Q1", 120.0), ("Q2", 135.0), ("Q3", 160.0), ("Q4", 150.0)];
169
+ const CHART_ALT: &str = "Bar chart of sales by quarter: 120, 135, 160 and 150 thousand euros.";
170
+
171
+ fn main() -> Result<(), Box<dyn std::error::Error>> {
172
+ let mut args = std::env::args().skip(1);
173
+ let font = std::fs::read(args.next().ok_or("arguments: <font.ttf> [out-dir]")?)?;
174
+ let out = std::path::PathBuf::from(args.next().unwrap_or_else(|| "target/examples-out".into()));
175
+ std::fs::create_dir_all(&out)?;
176
+ Ok(std::fs::write(out.join("pdf_ua_report.pdf"), build(font)?)?)
177
+ }
178
+
179
+ pub(crate) fn build(font: Vec<u8>) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
180
+ let mut b = Builder::new(BuildOptions::new().with_profile(Profile::PdfUa1));
181
+ b.metadata(Metadata::default().with_title("Annual sales report 2026"));
182
+ b.lang("en-GB");
183
+ let font = b.font_bytes(font)?;
184
+ let mut page = b.page(PageSize::A4);
185
+ draw(page.surface(), &font)?;
186
+ page.finish()?;
187
+ Ok(b.finish()?.save(&SaveOptions::new())?.bytes)
188
+ }
189
+
190
+ /// One line of text with its baseline at `y`, as the structure element `tag`, sized by it.
191
+ fn line(s: &mut Surface, font: &FontHandle, tag: impl Into<Tag>, text: &str, x: f64, y: f64) -> Result<(), BuildError> {
192
+ let tag = tag.into();
193
+ let size = SIZES.iter().find(|e| e.0 == tag.kind()).map_or(BODY, |e| e.1);
194
+ s.tag(tag, |s| s.text(text, font, size, PointPt::from_points(x, y)).map(drop))
195
+ }
196
+
197
+ fn draw(s: &mut Surface, font: &FontHandle) -> Result<(), BuildError> {
198
+ // The running header is decoration: an artifact, which screen readers skip.
199
+ let header = |s: &mut Surface| s.text("Acme Widgets", font, BODY, HEADER_AT).map(drop);
200
+ s.artifact(ArtifactKind::Pagination, header)?;
201
+ line(s, font, TagKind::H1, "Annual sales report 2026", MARGIN, TITLE_BASELINE)?;
202
+ let summary = "Sales grew in three quarters of four.";
203
+ line(s, font, TagKind::P, summary, MARGIN, TITLE_BASELINE + 2.0 * ROW)?;
204
+ table(s, font)?;
205
+ chart(s)?;
206
+ let link = LinkTarget::Uri("https://example.com/accounts".into());
207
+ s.tag(TagKind::P, |s| {
208
+ let text = s.text("The full accounts", font, BODY, LINK_AT)?;
209
+ text.fill(BLUE).link(link, Some("The full 2026 accounts".into()));
210
+ Ok(())
211
+ })
212
+ }
213
+
214
+ /// A heading and a table of the quarters, whose first row holds the columns' header cells.
215
+ fn table(s: &mut Surface, font: &FontHandle) -> Result<(), BuildError> {
216
+ line(s, font, TagKind::H2, "Sales by quarter", MARGIN, TABLE_TOP)?;
217
+ let header = Tag::new(TagKind::TH).with_scope(TableScope::Column);
218
+ s.tag(TagKind::Table, |s| {
219
+ s.tag(TagKind::TR, |s| {
220
+ line(s, font, header.clone(), "Quarter", MARGIN, TABLE_TOP + ROW)?;
221
+ line(s, font, header.clone(), "Sales (k€)", MARGIN + COLUMN, TABLE_TOP + ROW)
222
+ })?;
223
+ for (row, (quarter, sales)) in (2_u8..).zip(QUARTERS) {
224
+ let y = TABLE_TOP + ROW * f64::from(row);
225
+ s.tag(TagKind::TR, |s| {
226
+ line(s, font, TagKind::TD, quarter, MARGIN, y)?;
227
+ line(s, font, TagKind::TD, &format!("{sales:.0}"), MARGIN + COLUMN, y)
228
+ })?;
229
+ }
230
+ Ok(())
231
+ })
232
+ }
233
+
234
+ /// The quarters as bars standing on the chart's base: one figure with alternate text.
235
+ fn chart(s: &mut Surface) -> Result<(), BuildError> {
236
+ s.tag(Tag::new(TagKind::Figure).with_alt(CHART_ALT), |s| {
237
+ s.fill_color(BLUE);
238
+ for (i, (_, sales)) in (0_u8..).zip(QUARTERS) {
239
+ let x = CHART_LEFT + BAR_PITCH * f64::from(i);
240
+ let bar = RectPt::from_xywh(Pt::new(x), Pt::new(CHART_BASE - sales), BAR_WIDTH, Pt::new(sales));
241
+ s.path(|p| _ = p.rect(bar)).fill(FillRule::NonZero);
242
+ }
243
+ Ok(())
244
+ })
245
+ }
246
+ ```
247
+
248
+ **Result:** [pdf_ua_report.pdf](https://docs.laminapdf.com/examples/pdf/pdf_ua_report.pdf)
249
+
250
+ [See the output](../../pages/recipes/pdf-ua-report.md).
251
+
252
+ ## What a program can't check
253
+
254
+ About half of PDF/UA's requirements need a person. Lamina PDF can check that a figure has alternate text, but not that the text describes the figure. It can check that headings go down one level at a time. It can't check that the right text is a heading, that the reading order makes sense or that colour isn't the only way the document conveys meaning. Read the document with a screen reader before you publish it.
255
+
256
+ ## How Lamina PDF checks its own output
257
+
258
+ Every example on this site that claims PDF/UA-1 is validated each night with veraPDF, the open-source validator the PDF Association backs.
259
+
260
+ > **Details:** PDF/UA-1 is ISO 14289-1. veraPDF checks it against the Matterhorn Protocol, the PDF Association's list of PDF/UA failure conditions; most of the builder's checks are Matterhorn conditions a program can test; the version check comes from PDF/UA-1's base, PDF 1.7.
261
+
262
+ Next: to make a document both accessible and archival, add a PDF/A profile next to `PDF/UA-1`, as [Archival PDFs](../../pages/guides/archival-pdfs.md) shows.