@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,32 @@
1
+ ---
2
+ title: "invalid-icc-profile"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-icc-profile/"
5
+ ---
6
+
7
+ # invalid-icc-profile
8
+
9
+ - Type: error
10
+ - Kind: `input` (the input is malformed beyond what tolerance repairs)
11
+
12
+ ## What happened
13
+
14
+ `IccProfile::new` (`laminapdf-build`) rejected the bytes.
15
+
16
+ ## Why
17
+
18
+ An ICC profile (ICC.1:2010) starts with a 128-byte header holding its size, the `acsp` signature, its class and its data colour space. PDF's `ICCBased` colour spaces (ISO 32000-2 §8.6.5.5) take Gray, RGB, CMYK and Lab profiles. The builder takes Gray, RGB and CMYK: Lab components fall outside `[0, 1]` and need a `/Range`, which it doesn't support yet. Device-link, abstract and named-colour profiles can't be used.
19
+
20
+ ## How to fix
21
+
22
+ Pass the complete bytes of an input, display, output or colour-space profile with a Gray, RGB or CMYK data colour space.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ let profile = IccProfile::new(b"not a profile".to_vec())?; // invalid-icc-profile
28
+ ```
29
+
30
+ ## Data fields
31
+
32
+ - `reason`: what was wrong (fixed text).
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: "invalid-image"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-image/"
5
+ ---
6
+
7
+ # invalid-image
8
+
9
+ - Type: error
10
+ - Kind: `input` (the input is malformed beyond what tolerance repairs)
11
+
12
+ ## What happened
13
+
14
+ `Image::jpeg`, `Image::png` or `Image::png_with` (`laminapdf-build`) could not read the bytes as an image of that format.
15
+
16
+ ## Why
17
+
18
+ A JPEG must start with a start-of-image marker and have a frame header (SOF) before its first scan, with every marker segment inside the data; a PNG must decode without errors (signature, chunk CRCs, zlib data, sizes).
19
+
20
+ ## How to fix
21
+
22
+ Pass the complete file. Check that the bytes are the format you called (a PNG passed to `Image::jpeg` fails here).
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ let img = Image::jpeg(std::fs::read("photo.png")?)?; // invalid-image: PNG bytes given as JPEG
28
+ ```
29
+
30
+ ## Data fields
31
+
32
+ - `format`: `Jpeg`, `Png` or `Rgba`.
33
+ - `reason`: what was wrong (fixed text).
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: "invalid-op-log"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-op-log/"
5
+ ---
6
+
7
+ # invalid-op-log
8
+
9
+ - Type: error
10
+ - Kind: `input` (the input is malformed beyond what tolerance repairs)
11
+
12
+ ## What happened
13
+
14
+ An op log does not parse: an unknown op or field, a bad value, or not JSON.
15
+
16
+ ## Why
17
+
18
+ Hand-written or corrupted op logs.
19
+
20
+ ## How to fix
21
+
22
+ Validate the log against the op schema; the samples in `fixtures/ops/v1/` show the format.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ doc.apply_log(r#"{ "v": 1, "ops": [{ "op": "rotate" }] }"#)?;
28
+ // invalid-op-log: "rotate" is not an op (it is "rotatePage"); data.detail has serde's message
29
+ ```
30
+
31
+ ## Data fields
32
+
33
+ `detail` (**untrusted**: may quote the log; the message never includes it).
@@ -0,0 +1,34 @@
1
+ ---
2
+ title: "invalid-page-label"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-page-label/"
5
+ ---
6
+
7
+ # invalid-page-label
8
+
9
+ - Type: warning
10
+ - Kind: `input` (the input is malformed beyond what tolerance repairs)
11
+
12
+ ## What happened
13
+
14
+ A `/PageLabels` entry is malformed; that part is dropped.
15
+
16
+ ## Why
17
+
18
+ A writer bug: a range that is not a dictionary, an unknown `/S` style, a non-string `/P` prefix or an `/St` below 1.
19
+
20
+ ## How to fix
21
+
22
+ Nothing; affected pages fall back to decimal labels.
23
+
24
+ ## Example
25
+
26
+ ```text
27
+ /PageLabels << /Nums [0 << /S /Fancy >> 4 << /S /r >>] >>
28
+ ```
29
+
30
+ `/Fancy` is not a numbering style, so pages 0–3 get decimal labels; the range starting at 4 is kept. `data` is `{ "start": 0 }`.
31
+
32
+ ## Data fields
33
+
34
+ `start`.
@@ -0,0 +1,32 @@
1
+ ---
2
+ title: "invalid-page-labels"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-page-labels/"
5
+ ---
6
+
7
+ # invalid-page-labels
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ The ranges given to `Builder::page_labels` can't be written as a `/PageLabels` number tree.
15
+
16
+ ## Why
17
+
18
+ ISO 32000-2 §7.7.2 and §12.4.2: the tree must have an entry for page index 0, its keys are page indexes in increasing order, and a label range's first number (`/St`) is at least 1. A range starting past the document's last page would label nothing.
19
+
20
+ ## How to fix
21
+
22
+ Give the ranges sorted by first page, the first starting at page 0, each start a page of the document, and numbers from 1 (`PageLabel::with_first`).
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ builder.page_labels([PageLabel::new(1, Some(LabelStyle::Decimal))]); // invalid-page-labels at finish: no range starts at page 0
28
+ ```
29
+
30
+ ## Data fields
31
+
32
+ - `what`: what is wrong (fixed text).
@@ -0,0 +1,37 @@
1
+ ---
2
+ title: "invalid-page-range"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-page-range/"
5
+ ---
6
+
7
+ # invalid-page-range
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ A page range doesn't fit the grammar, or it names a page the document doesn't have, such as page 9 of a 5-page file.
15
+
16
+ ## Why
17
+
18
+ Ranges count pages from 1, as people do. A range that can't be read, or that reaches past the last page, fails before anything is written, so a command never works on the wrong pages.
19
+
20
+ ## How to fix
21
+
22
+ Write pages as `1-5`, `z` for the last page, `r2` for the second from the end, `x3` to leave page 3 out, and `:odd` or `:even` at the end for every other page of the result. `data.position` is the character where the range went wrong.
23
+
24
+ ## Example
25
+
26
+ ```console
27
+ $ laminapdf pages rotate scan.pdf +90:1-9 -o out.pdf
28
+ error[invalid-page-range]: the document has 5 pages
29
+ = hint: write pages as 1-5, z for the last page, …
30
+ $ echo $?
31
+ 2
32
+ ```
33
+
34
+ ## Data fields
35
+
36
+ - `range`: the range given (untrusted: caller text, never in the message).
37
+ - `position`: the 1-based character of `range` where it went wrong.
@@ -0,0 +1,34 @@
1
+ ---
2
+ title: "invalid-rotate"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-rotate/"
5
+ ---
6
+
7
+ # invalid-rotate
8
+
9
+ - Type: warning
10
+ - Kind: `input` (the input is malformed beyond what tolerance repairs)
11
+
12
+ ## What happened
13
+
14
+ A page's `/Rotate` is not a multiple of 90; it reads as 0.
15
+
16
+ ## Why
17
+
18
+ A writer bug, or a viewer setting stored as an arbitrary angle.
19
+
20
+ ## How to fix
21
+
22
+ Nothing to do if the page displays upright. Otherwise set the rotation you want with the `rotatePage` op.
23
+
24
+ ## Example
25
+
26
+ ```text
27
+ 3 0 obj << /Type /Page /Rotate 45 … >>
28
+ ```
29
+
30
+ `/Rotate` must be a multiple of 90 (ISO 32000-2 §7.7.3.3); the page reads as unrotated.
31
+
32
+ ## Data fields
33
+
34
+ None.
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: "invalid-spans"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-spans/"
5
+ ---
6
+
7
+ # invalid-spans
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller passed something invalid)
11
+
12
+ ## What happened
13
+
14
+ The styled spans passed to `break_spans` don't cover the paragraph's text exactly once, in order, or name fonts it can't use. One of these is true:
15
+
16
+ - two spans leave a gap, overlap, or come out of order;
17
+ - the last span stops before the end of the text, or runs past it;
18
+ - a span starts or ends inside a character, or between a letter and its accent;
19
+ - a span lists no fonts, or a font index past the end of the list.
20
+
21
+ ## Why
22
+
23
+ Each character's font, size and language come from the span that holds it. A character in no span, or in two, would have no style or two styles, so Lamina PDF refuses the spans rather than guess. A letter and its accent are drawn as one glyph cluster, so they can't take two styles. An index past the end of the font list names no font.
24
+
25
+ ## How to fix
26
+
27
+ List the spans in the order of the text. Start the first at byte 0, start each span where the one before it ends, and end the last at the text's length. Take span ends from `grapheme_boundaries` or `str::len`, so that they fall between clusters. List at least one font per span, each an index into the font list. An empty text needs no spans.
28
+
29
+ ## Example
30
+
31
+ ```rust
32
+ let text = "Hello, world";
33
+ let spans = [StyledSpan::new(0..5), StyledSpan::new(6..12)]; // byte 5 is in no span
34
+ break_spans(&shaper, &fonts, text, &spans, &options)?; // invalid-spans
35
+ ```
36
+
37
+ ## Data fields
38
+
39
+ - `at`: the byte offset where the spans stop covering the text, or where the span with a bad font list starts.
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: "invalid-structure-nesting"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-structure-nesting/"
5
+ ---
6
+
7
+ # invalid-structure-nesting
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ Under PDF/UA-1, a table or list element sits in a parent its type doesn't allow. A table (`Table`) holds rows (`TR`), each holding header cells (`TH`) and data cells (`TD`); a list (`L`) holds list items (`LI`), each holding a label (`Lbl`, its bullet or number) and a body (`LBody`). Examples of a wrong parent: a `TD` or `TH` outside a `TR`, a `TR` outside a `Table`, an `LI` outside an `L`, or a paragraph directly inside a `Table`, `TR`, `L` or `LI`.
15
+
16
+ ## Why
17
+
18
+ ISO 32000-1 Tables 336 and 337 define how tables and lists are built, and assistive technology relies on that shape to announce rows, columns and list items. The PDF/UA-1 standard for accessible PDF (ISO 14289-1 §7.2) requires tables and lists to have that shape. These are conditions 09-004 and 09-005 of the Matterhorn Protocol, the PDF Association's checklist of PDF/UA failures.
19
+
20
+ ## How to fix
21
+
22
+ Nest tables as `Table` > `TR` > `TH` or `TD` (optionally with `THead`, `TBody` and `TFoot` around the rows, and a `Caption`), and lists as `L` > `LI` > `Lbl` and `LBody`. Put paragraphs and other content inside the cells and list bodies.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ s.tag(TagKind::Table, |s| {
28
+ s.text("Total", &font, Pt::new(11.0), at)?.tag(TagKind::TD); // a TD straight in the Table
29
+ Ok(())
30
+ })?;
31
+ builder.finish()?; // invalid-structure-nesting: wrap the cell in a TR
32
+ ```
33
+
34
+ ## Data fields
35
+
36
+ - `page`: the page's index (0-based).
37
+ - `kind`: the element's standard type, such as `TD`.
38
+ - `parent`: its parent's standard type (`Document` at the top level).
@@ -0,0 +1,34 @@
1
+ ---
2
+ title: "invalid-structure"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-structure/"
5
+ ---
6
+
7
+ # invalid-structure
8
+
9
+ - Type: error
10
+ - Kind: `input` (the input is malformed beyond what tolerance repairs)
11
+
12
+ ## What happened
13
+
14
+ An object stream, xref section or filter parameter was malformed or out of range.
15
+
16
+ ## Why
17
+
18
+ Malformed input: an object stream, xref section or filter parameter out of range.
19
+
20
+ ## How to fix
21
+
22
+ Use another copy of the file.
23
+
24
+ ## Example
25
+
26
+ ```text
27
+ 12 0 obj << /Type /ObjStm /N 3 /First -4 >>
28
+ ```
29
+
30
+ A negative `/First` makes the object stream unusable; `data.structure` says which structure was malformed.
31
+
32
+ ## Data fields
33
+
34
+ `structure`.
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: "invalid-text-range"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-text-range/"
5
+ ---
6
+
7
+ # invalid-text-range
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ A byte range of a text given to `Shaper::shape_range`, `BidiParagraph::visual_runs` or `BidiParagraph::line_levels`, or the range of a `ShapedRun` given to `pdf_run`, is past the end of the text or does not start and end on character boundaries.
15
+
16
+ ## Why
17
+
18
+ Ranges are byte offsets into UTF-8 text; a range that cuts a character in two (or reaches past the end) names no text.
19
+
20
+ ## How to fix
21
+
22
+ Take ranges from Lamina PDF's own results (`line_breaks`, `itemize`, `break_lines`, `ShapedRun::text_range`), or check them with `str::get` first, and pass the same text the range was computed on.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ shaper.shape_range(&font, "héllo", 0..2, &options)?; // byte 2 is inside 'é'
28
+ ```
29
+
30
+ ## Data fields
31
+
32
+ - `start`, `end`: the range (bytes).
33
+ - `len`: the text's length (bytes).
@@ -0,0 +1,34 @@
1
+ ---
2
+ title: "job-finished"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/job-finished/"
5
+ ---
6
+
7
+ # job-finished
8
+
9
+ - Type: error
10
+ - Kind: `state` (the call isn't valid in the object's current state)
11
+
12
+ ## What happened
13
+
14
+ `step` was called on a job that had already returned its result, failed or been cancelled.
15
+
16
+ ## Why
17
+
18
+ A job ends with its first `Step::Done`, or with its first error: an error ends the job. A step loop that keeps going after either reaches this.
19
+
20
+ ## How to fix
21
+
22
+ Stop stepping once a step returns `Done` or an error. To run the work again, create a new job.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ let mut job = doc.save_job(&laminapdf::SaveOptions::new());
28
+ while let laminapdf::Step::Progress { .. } = job.step(&mut doc, laminapdf::Budget::UNLIMITED)? {}
29
+ assert_eq!(job.step(&mut doc, laminapdf::Budget::UNLIMITED).unwrap_err().code(), "job-finished");
30
+ ```
31
+
32
+ ## Data fields
33
+
34
+ None.
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: "limit-exceeded"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/limit-exceeded/"
5
+ ---
6
+
7
+ # limit-exceeded
8
+
9
+ - Type: error
10
+ - Kind: `limit` (a `Limits` value or another resource bound was hit)
11
+
12
+ ## What happened
13
+
14
+ A hard `Limits` value was exceeded.
15
+
16
+ ## Why
17
+
18
+ Hostile or unusually large input.
19
+
20
+ ## How to fix
21
+
22
+ Raise the named limit only if you trust the input.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ let options = OpenOptions::new().with_limits(Limits::new().with_max_nesting_depth(1));
28
+ let doc = Document::open_bytes(bytes, options)?;
29
+ let err = doc.page_count().unwrap_err();
30
+ // { "code": "limit-exceeded", "kind": "limit", "data": { "limit": "max_nesting_depth" },
31
+ // "location": { "object": 9, "streamOffset": 89 }, … }
32
+ ```
33
+
34
+ ## Data fields
35
+
36
+ `limit` (the limit's name).
37
+
38
+ The `location` tells where the limit was hit. The nesting and string-length limits and the read window give `offset`, a file offset; the same limits inside an object stream give `object` with `streamOffset`. A reference chain gives `object` alone, and decoding budgets give no location.
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: "link-without-contents"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/link-without-contents/"
5
+ ---
6
+
7
+ # link-without-contents
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ Under PDF/UA-1, a link annotation has no description: `Surface::link` or `TextRun::link` was called with `None` (or an empty string) as its contents.
15
+
16
+ ## Why
17
+
18
+ A screen reader announces a link by its `/Contents`, its alternate description. The PDF/UA-1 standard for accessible PDF (ISO 14289-1 §7.18.5) requires one on every link. This is condition 28-012 of the Matterhorn Protocol, the PDF Association's checklist of PDF/UA failures.
19
+
20
+ ## How to fix
21
+
22
+ Pass a short description of where the link goes as the link's contents.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ surface.link(rect, LinkTarget::Uri("https://example.com/pay".into()), None);
28
+ builder.finish()?; // link-without-contents: pass Some("Pay the invoice online".into())
29
+ ```
30
+
31
+ ## Data fields
32
+
33
+ - `page`: the page's index (0-based).
@@ -0,0 +1,37 @@
1
+ ---
2
+ title: "link-without-structure"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/link-without-structure/"
5
+ ---
6
+
7
+ # link-without-structure
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ Under PDF/UA-1, a link annotation has no `Link` structure element. The builder gives every link one automatically, except a link drawn inside an artifact, which stays outside the structure.
15
+
16
+ ## Why
17
+
18
+ A screen reader finds links through the structure tree, so a link inside decoration can't be reached. The PDF/UA-1 standard for accessible PDF (ISO 14289-1 §7.18.5) requires each link annotation to be nested in a `Link` element. This is condition 28-011 of the Matterhorn Protocol, the PDF Association's checklist of PDF/UA failures.
19
+
20
+ ## How to fix
21
+
22
+ Draw the link outside `Surface::artifact`, next to the text it belongs to; the builder then wraps it in a `Link` element.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ surface.artifact(ArtifactKind::Layout, |s| {
28
+ s.link(rect, LinkTarget::Uri("https://example.com".into()), Some("Example".into()));
29
+ Ok(())
30
+ })?;
31
+ builder.finish()?; // link-without-structure
32
+ ```
33
+
34
+ ## Data fields
35
+
36
+ - `page`: the page's index (0-based).
37
+ - `count`: how many links on that page lack a `Link` element.
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: "markdown-html-ignored"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/markdown-html-ignored/"
5
+ ---
6
+
7
+ # markdown-html-ignored
8
+
9
+ - Type: warning
10
+ - Kind: `unsupported` (valid input that Lamina PDF can't handle yet)
11
+
12
+ ## What happened
13
+
14
+ `Builder::markdown` found raw HTML in the Markdown, such as a `<div>` block or an inline `<span>`, left it out of the PDF and laid out the rest as usual. The builder raises one warning for each HTML block and each inline HTML tag.
15
+
16
+ ## Why
17
+
18
+ Markdown lets authors mix in HTML, and a browser would draw it. Laying out HTML needs a web page's layout rules, which a PDF builder doesn't have. Rather than print the tags as text, the builder leaves the HTML out and says where it was.
19
+
20
+ ## How to fix
21
+
22
+ Write the content in Markdown instead: `**bold**` for `<b>`, a table for `<table>`, an image for `<img>`. If the HTML is only a comment, such as `<!-- draft -->`, remove it or ignore the warning.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ let report = builder.markdown("Hello <span>there</span>\n", &MarkdownBuildOptions::new())?;
28
+ assert_eq!(report.warnings[0].code(), "markdown-html-ignored");
29
+ ```
30
+
31
+ ## Data fields
32
+
33
+ - `offset`: where the HTML starts, as a byte offset into the Markdown.
@@ -0,0 +1,34 @@
1
+ ---
2
+ title: "markdown-image-missing"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/markdown-image-missing/"
5
+ ---
6
+
7
+ # markdown-image-missing
8
+
9
+ - Type: warning
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ `Builder::markdown` met an image, such as `![Chart](chart.png)`, whose bytes weren't passed in. It left the image out of the PDF and laid out the rest of the document as usual.
15
+
16
+ ## Why
17
+
18
+ The builder reads no files and fetches nothing from the network, so it can only draw images the caller supplies. An image path the options don't list, or a web address, has nothing behind it.
19
+
20
+ ## How to fix
21
+
22
+ Read the image yourself and pass it with `MarkdownBuildOptions::with_image`, under the same path the Markdown uses.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ let chart = Image::png(&std::fs::read("chart.png")?)?;
28
+ let options = MarkdownBuildOptions::new().with_image("chart.png", chart);
29
+ builder.markdown("![Chart](chart.png)\n", &options)?;
30
+ ```
31
+
32
+ ## Data fields
33
+
34
+ - `offset`: where the image starts, as a byte offset into the Markdown.
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: "missing-alt-text"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/missing-alt-text/"
5
+ ---
6
+
7
+ # missing-alt-text
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ Under PDF/UA-1, a page has a `Figure` or `Formula` element without alternate text: neither `/Alt` (`Tag::with_alt`) nor `/ActualText` (`Tag::with_actual_text`).
15
+
16
+ ## Why
17
+
18
+ A screen reader can't describe a picture or a formula by itself. The PDF/UA-1 standard for accessible PDF (ISO 14289-1 §7.3) requires every `Figure` and every `Formula` to carry a text alternative. These are conditions 13-004 and 17-002 of the Matterhorn Protocol, the PDF Association's checklist of PDF/UA failures. Lamina PDF checks only that a description exists; whether it describes the figure well is for a person to judge.
19
+
20
+ ## How to fix
21
+
22
+ Describe the figure with `Surface::figure(&image, rect, alt)` or `Tag::new(TagKind::Figure).with_alt(…)`. If the picture is decoration that carries no meaning, draw it inside `Surface::artifact` instead.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ surface.tag(TagKind::Figure, |s| { s.image(&chart, rect); Ok(()) })?;
28
+ builder.finish()?; // missing-alt-text: use Tag::new(TagKind::Figure).with_alt("Sales by month")
29
+ ```
30
+
31
+ ## Data fields
32
+
33
+ - `page`: the page's index (0-based).
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: "missing-glyph"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/missing-glyph/"
5
+ ---
6
+
7
+ # missing-glyph
8
+
9
+ - Type: error
10
+ - Kind: `input` (the input is malformed beyond what tolerance repairs)
11
+
12
+ ## What happened
13
+
14
+ Text contained a character the font has no glyph for. Lamina PDF never draws `.notdef` (an empty box) silently.
15
+
16
+ ## Why
17
+
18
+ The font's `cmap` does not map the character (for example a CJK character with a Latin font).
19
+
20
+ ## How to fix
21
+
22
+ Use a font that covers the character (check with `Font::glyph_for`), or split the text across fonts.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ registry.encode(latin_font, "東京")?; // missing-glyph: the font has no CJK glyphs
28
+ ```
29
+
30
+ ## Data fields
31
+
32
+ - `ch`: the character (**untrusted**: caller or document text).
33
+ - `font`: the font's PostScript name (**untrusted**: read from the font).