@laminapdf/sdk 0.2.0-alpha.3 → 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 (408) hide show
  1. package/README.md +21 -1
  2. package/dist/api.d.ts +4 -2
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +1 -0
  5. package/dist/api.js.map +1 -1
  6. package/dist/builder.d.ts +8 -3
  7. package/dist/builder.d.ts.map +1 -1
  8. package/dist/builder.js +8 -3
  9. package/dist/builder.js.map +1 -1
  10. package/dist/document.d.ts +42 -1
  11. package/dist/document.d.ts.map +1 -1
  12. package/dist/document.js +65 -0
  13. package/dist/document.js.map +1 -1
  14. package/dist/extract-job.d.ts +100 -0
  15. package/dist/extract-job.d.ts.map +1 -0
  16. package/dist/extract-job.js +177 -0
  17. package/dist/extract-job.js.map +1 -0
  18. package/dist/extract.d.ts +1 -1
  19. package/dist/extract.d.ts.map +1 -1
  20. package/dist/extract.js.map +1 -1
  21. package/dist/generated/builder-enums.d.ts +3 -3
  22. package/dist/generated/builder-enums.d.ts.map +1 -1
  23. package/dist/generated/builder-enums.js +10 -0
  24. package/dist/generated/builder-enums.js.map +1 -1
  25. package/dist/generated/codes.d.ts +2 -2
  26. package/dist/generated/codes.d.ts.map +1 -1
  27. package/dist/generated/codes.js +55 -1
  28. package/dist/generated/codes.js.map +1 -1
  29. package/dist/generated/explain.d.ts.map +1 -1
  30. package/dist/generated/explain.js +19 -2
  31. package/dist/generated/explain.js.map +1 -1
  32. package/dist/generated/extract.d.ts +50 -3
  33. package/dist/generated/extract.d.ts.map +1 -1
  34. package/dist/source/http.d.ts +1 -1
  35. package/dist/source/http.js +1 -1
  36. package/dist/types.d.ts +19 -1
  37. package/dist/types.d.ts.map +1 -1
  38. package/dist/version.d.ts +1 -1
  39. package/dist/version.js +1 -1
  40. package/dist/worker/support.d.ts +7 -1
  41. package/dist/worker/support.d.ts.map +1 -1
  42. package/dist/worker/support.js +4 -0
  43. package/dist/worker/support.js.map +1 -1
  44. package/docs/AGENTS.md +1 -1
  45. package/docs/api/README.md +20 -1
  46. package/docs/api/classes/Builder.md +1 -1
  47. package/docs/api/classes/Document.md +113 -1
  48. package/docs/api/classes/ExtractJob.md +236 -0
  49. package/docs/api/classes/Font.md +1 -1
  50. package/docs/api/classes/Image.md +1 -1
  51. package/docs/api/classes/LaminaPdfError.md +1 -1
  52. package/docs/api/classes/Page.md +1 -1
  53. package/docs/api/classes/PageRef.md +1 -1
  54. package/docs/api/classes/PageText.md +1 -1
  55. package/docs/api/classes/PageTextRun.md +1 -1
  56. package/docs/api/classes/PendingPath.md +1 -1
  57. package/docs/api/classes/SaveJob.md +1 -1
  58. package/docs/api/classes/Surface.md +10 -5
  59. package/docs/api/classes/Transaction.md +1 -1
  60. package/docs/api/functions/callbackSource.md +1 -1
  61. package/docs/api/functions/extractWithModels.md +70 -0
  62. package/docs/api/functions/httpRangeSource.md +2 -2
  63. package/docs/api/functions/init.md +1 -1
  64. package/docs/api/functions/isExtractLoaded.md +1 -1
  65. package/docs/api/functions/isInitialized.md +1 -1
  66. package/docs/api/functions/isLaminaPdfError.md +1 -1
  67. package/docs/api/functions/isTextLoaded.md +1 -1
  68. package/docs/api/functions/loadExtract.md +1 -1
  69. package/docs/api/functions/loadText.md +1 -1
  70. package/docs/api/functions/onLeak.md +1 -1
  71. package/docs/api/functions/reset.md +1 -1
  72. package/docs/api/functions/wasmMemory.md +1 -1
  73. package/docs/api/interfaces/BuilderOptions.md +1 -1
  74. package/docs/api/interfaces/ByteRange.md +1 -1
  75. package/docs/api/interfaces/ChunkOptions.md +1 -1
  76. package/docs/api/interfaces/Diagnostic.md +1 -1
  77. package/docs/api/interfaces/ExtractOptions.md +1 -1
  78. package/docs/api/interfaces/ExtractResult.md +1 -1
  79. package/docs/api/interfaces/FontInfo.md +1 -1
  80. package/docs/api/interfaces/HostModels.md +57 -0
  81. package/docs/api/interfaces/HttpRangeOptions.md +1 -1
  82. package/docs/api/interfaces/InitOptions.md +1 -1
  83. package/docs/api/interfaces/LayoutRegion.md +38 -0
  84. package/docs/api/interfaces/Leak.md +1 -1
  85. package/docs/api/interfaces/Location.md +1 -1
  86. package/docs/api/interfaces/ModelInfo.md +45 -0
  87. package/docs/api/interfaces/ModelRequest.md +45 -0
  88. package/docs/api/interfaces/Models.md +45 -0
  89. package/docs/api/interfaces/OcrWord.md +37 -0
  90. package/docs/api/interfaces/OpLog.md +1 -1
  91. package/docs/api/interfaces/OpenOptions.md +1 -1
  92. package/docs/api/interfaces/PageTextOptions.md +1 -1
  93. package/docs/api/interfaces/PathBuilder.md +1 -1
  94. package/docs/api/interfaces/QuadPoint.md +1 -1
  95. package/docs/api/interfaces/RangeOptions.md +1 -1
  96. package/docs/api/interfaces/RangeSource.md +1 -1
  97. package/docs/api/interfaces/StrokeStyle.md +1 -1
  98. package/docs/api/interfaces/TagSpec.md +3 -3
  99. package/docs/api/interfaces/TextBoxOptions.md +1 -1
  100. package/docs/api/interfaces/TextGlyph.md +1 -1
  101. package/docs/api/interfaces/TextOptions.md +1 -1
  102. package/docs/api/interfaces/WasmMemory.md +1 -1
  103. package/docs/api/type-aliases/AfRelationship.md +1 -1
  104. package/docs/api/type-aliases/Align.md +1 -1
  105. package/docs/api/type-aliases/ArtifactKind.md +2 -2
  106. package/docs/api/type-aliases/AttachmentOptions.md +1 -1
  107. package/docs/api/type-aliases/BlendMode.md +1 -1
  108. package/docs/api/type-aliases/BoxRect.md +1 -1
  109. package/docs/api/type-aliases/BuildOptions.md +1 -1
  110. package/docs/api/type-aliases/Cell.md +1 -1
  111. package/docs/api/type-aliases/Chunk.md +1 -1
  112. package/docs/api/type-aliases/Color.md +1 -1
  113. package/docs/api/type-aliases/Coordinates.md +1 -1
  114. package/docs/api/type-aliases/Direction.md +1 -1
  115. package/docs/api/type-aliases/DocumentInfo.md +1 -1
  116. package/docs/api/type-aliases/DropReason.md +2 -2
  117. package/docs/api/type-aliases/Dropped.md +1 -1
  118. package/docs/api/type-aliases/Edited.md +1 -1
  119. package/docs/api/type-aliases/ErrorCode.md +2 -2
  120. package/docs/api/type-aliases/ErrorKind.md +1 -1
  121. package/docs/api/type-aliases/ExtractFormat.md +1 -1
  122. package/docs/api/type-aliases/ExtractJobOptions.md +31 -0
  123. package/docs/api/type-aliases/ExtractStep.md +61 -0
  124. package/docs/api/type-aliases/ExtractedBlock.md +13 -1
  125. package/docs/api/type-aliases/ExtractedPage.md +9 -1
  126. package/docs/api/type-aliases/ExtractedSource.md +1 -1
  127. package/docs/api/type-aliases/Extraction.md +1 -1
  128. package/docs/api/type-aliases/FillRule.md +1 -1
  129. package/docs/api/type-aliases/Fit.md +1 -1
  130. package/docs/api/type-aliases/Flags.md +1 -1
  131. package/docs/api/type-aliases/Generator.md +5 -3
  132. package/docs/api/type-aliases/GlyphQuad.md +1 -1
  133. package/docs/api/type-aliases/InfoPatch.md +1 -1
  134. package/docs/api/type-aliases/LaminaPdfWarning.md +1 -1
  135. package/docs/api/type-aliases/LimitName.md +1 -1
  136. package/docs/api/type-aliases/Limits.md +1 -1
  137. package/docs/api/type-aliases/LineBox.md +1 -1
  138. package/docs/api/type-aliases/LineCap.md +1 -1
  139. package/docs/api/type-aliases/LineJoin.md +1 -1
  140. package/docs/api/type-aliases/LinkTarget.md +1 -1
  141. package/docs/api/type-aliases/Metadata.md +1 -1
  142. package/docs/api/type-aliases/ModelResult.md +15 -0
  143. package/docs/api/type-aliases/Op.md +1 -1
  144. package/docs/api/type-aliases/OutlineEntry.md +1 -1
  145. package/docs/api/type-aliases/OutlineNode.md +15 -0
  146. package/docs/api/type-aliases/Overflow.md +1 -1
  147. package/docs/api/type-aliases/PageInfo.md +1 -1
  148. package/docs/api/type-aliases/PageLabel.md +1 -1
  149. package/docs/api/type-aliases/PageSizeName.md +1 -1
  150. package/docs/api/type-aliases/Point.md +1 -1
  151. package/docs/api/type-aliases/Profile.md +1 -1
  152. package/docs/api/type-aliases/Progress.md +1 -1
  153. package/docs/api/type-aliases/ReadingOrder.md +1 -1
  154. package/docs/api/type-aliases/Rect.md +1 -1
  155. package/docs/api/type-aliases/Region.md +1 -1
  156. package/docs/api/type-aliases/RegionLabel.md +15 -0
  157. package/docs/api/type-aliases/RenderMode.md +1 -1
  158. package/docs/api/type-aliases/Rotation.md +1 -1
  159. package/docs/api/type-aliases/SaveOptions.md +1 -1
  160. package/docs/api/type-aliases/SaveReport.md +1 -1
  161. package/docs/api/type-aliases/Span.md +12 -1
  162. package/docs/api/type-aliases/SplitOn.md +1 -1
  163. package/docs/api/type-aliases/Standard14.md +1 -1
  164. package/docs/api/type-aliases/StructRef.md +1 -1
  165. package/docs/api/type-aliases/StructSource.md +1 -1
  166. package/docs/api/type-aliases/StructureKid.md +15 -0
  167. package/docs/api/type-aliases/StructureNode.md +16 -0
  168. package/docs/api/type-aliases/TableDetector.md +1 -1
  169. package/docs/api/type-aliases/TableMode.md +1 -1
  170. package/docs/api/type-aliases/TableScope.md +1 -1
  171. package/docs/api/type-aliases/Tag.md +1 -1
  172. package/docs/api/type-aliases/TagName.md +1 -1
  173. package/docs/api/type-aliases/Target.md +15 -0
  174. package/docs/api/type-aliases/TargetView.md +18 -0
  175. package/docs/api/type-aliases/TextLayer.md +72 -0
  176. package/docs/api/type-aliases/TextLayerStatus.md +15 -0
  177. package/docs/api/type-aliases/TextLayout.md +1 -1
  178. package/docs/api/type-aliases/TextRange.md +1 -1
  179. package/docs/api/type-aliases/TextRunInfo.md +1 -1
  180. package/docs/api/type-aliases/Transform.md +1 -1
  181. package/docs/api/type-aliases/UndoOutcome.md +1 -1
  182. package/docs/api/type-aliases/ViewerPreferences.md +1 -1
  183. package/docs/api/type-aliases/WarningCode.md +2 -2
  184. package/docs/api/type-aliases/WasmSource.md +1 -1
  185. package/docs/api/variables/Matrix.md +1 -1
  186. package/docs/api/variables/PAGE_SIZES.md +1 -1
  187. package/docs/api/variables/TAG_NAMES.md +2 -2
  188. package/docs/errors/README.md +18 -1
  189. package/docs/errors/aes-padding-invalid.md +1 -1
  190. package/docs/errors/already-initialized.md +1 -1
  191. package/docs/errors/binary-output-to-terminal.md +1 -1
  192. package/docs/errors/builder-finished.md +1 -1
  193. package/docs/errors/cancelled.md +1 -1
  194. package/docs/errors/cmap-invalid.md +1 -1
  195. package/docs/errors/collection-index.md +1 -1
  196. package/docs/errors/color-components.md +1 -1
  197. package/docs/errors/content-bad-operands.md +1 -1
  198. package/docs/errors/content-path-unpainted.md +1 -1
  199. package/docs/errors/content-resource-missing.md +1 -1
  200. package/docs/errors/content-syntax.md +1 -1
  201. package/docs/errors/content-unbalanced-bt.md +1 -1
  202. package/docs/errors/content-unbalanced-marked.md +1 -1
  203. package/docs/errors/content-unbalanced-q.md +1 -1
  204. package/docs/errors/content-unknown-operator.md +1 -1
  205. package/docs/errors/covered-text.md +33 -0
  206. package/docs/errors/data-pending.md +1 -1
  207. package/docs/errors/decompress.md +1 -1
  208. package/docs/errors/device-color-without-output-intent.md +1 -1
  209. package/docs/errors/direct-page.md +1 -1
  210. package/docs/errors/disposed.md +1 -1
  211. package/docs/errors/document-changed.md +1 -1
  212. package/docs/errors/embedded-file-forbidden.md +1 -1
  213. package/docs/errors/embedded-file-without-mime-type.md +1 -1
  214. package/docs/errors/encoding-full.md +1 -1
  215. package/docs/errors/encrypted-base.md +1 -1
  216. package/docs/errors/extract-column-order-uncertain.md +38 -0
  217. package/docs/errors/extract-limit-blocks.md +1 -1
  218. package/docs/errors/extract-module-not-loaded.md +1 -1
  219. package/docs/errors/extract-needs-ocr.md +37 -0
  220. package/docs/errors/extract-reading-order-ambiguous.md +1 -1
  221. package/docs/errors/extract-struct-tree-ignored.md +1 -1
  222. package/docs/errors/extract-table-ambiguous.md +1 -1
  223. package/docs/errors/extract-table-limit.md +1 -1
  224. package/docs/errors/extract-untagged-content.md +1 -1
  225. package/docs/errors/fetch-failed.md +3 -3
  226. package/docs/errors/flate-truncated.md +1 -1
  227. package/docs/errors/flow-content-too-large.md +34 -0
  228. package/docs/errors/flow-keep-broken.md +34 -0
  229. package/docs/errors/flow-layout-unstable.md +38 -0
  230. package/docs/errors/font-invalid.md +1 -1
  231. package/docs/errors/font-mismatch.md +1 -1
  232. package/docs/errors/font-not-embeddable.md +1 -1
  233. package/docs/errors/font-not-embedded.md +1 -1
  234. package/docs/errors/font-not-shapable.md +1 -1
  235. package/docs/errors/glyph-out-of-range.md +1 -1
  236. package/docs/errors/glyph-without-unicode.md +7 -5
  237. package/docs/errors/heading-level-skipped.md +1 -1
  238. package/docs/errors/image-data-length.md +1 -1
  239. package/docs/errors/image-too-large.md +1 -1
  240. package/docs/errors/inline-image-unterminated.md +1 -1
  241. package/docs/errors/input-unreadable.md +1 -1
  242. package/docs/errors/instance-reset.md +1 -1
  243. package/docs/errors/invalid-argument.md +1 -1
  244. package/docs/errors/invalid-axis-value.md +1 -1
  245. package/docs/errors/invalid-box.md +1 -1
  246. package/docs/errors/invalid-color.md +1 -1
  247. package/docs/errors/invalid-command-line.md +1 -1
  248. package/docs/errors/invalid-date.md +1 -1
  249. package/docs/errors/invalid-entry.md +1 -1
  250. package/docs/errors/invalid-feature.md +1 -1
  251. package/docs/errors/invalid-font.md +1 -1
  252. package/docs/errors/invalid-geometry.md +1 -1
  253. package/docs/errors/invalid-icc-profile.md +1 -1
  254. package/docs/errors/invalid-image.md +1 -1
  255. package/docs/errors/invalid-op-log.md +1 -1
  256. package/docs/errors/invalid-page-label.md +1 -1
  257. package/docs/errors/invalid-page-labels.md +1 -1
  258. package/docs/errors/invalid-page-range.md +1 -1
  259. package/docs/errors/invalid-rotate.md +1 -1
  260. package/docs/errors/invalid-spans.md +39 -0
  261. package/docs/errors/invalid-structure-nesting.md +1 -1
  262. package/docs/errors/invalid-structure.md +1 -1
  263. package/docs/errors/invalid-text-range.md +1 -1
  264. package/docs/errors/job-finished.md +1 -1
  265. package/docs/errors/limit-exceeded.md +1 -1
  266. package/docs/errors/link-without-contents.md +1 -1
  267. package/docs/errors/link-without-structure.md +1 -1
  268. package/docs/errors/markdown-html-ignored.md +33 -0
  269. package/docs/errors/markdown-image-missing.md +34 -0
  270. package/docs/errors/missing-alt-text.md +1 -1
  271. package/docs/errors/missing-glyph.md +1 -1
  272. package/docs/errors/missing-header.md +1 -1
  273. package/docs/errors/missing-lang.md +1 -1
  274. package/docs/errors/missing-root.md +1 -1
  275. package/docs/errors/missing-title.md +1 -1
  276. package/docs/errors/model-failed.md +33 -0
  277. package/docs/errors/model-needs-host.md +40 -0
  278. package/docs/errors/model-result-unexpected.md +36 -0
  279. package/docs/errors/name-tree-node-skipped.md +1 -1
  280. package/docs/errors/nested-transaction.md +1 -1
  281. package/docs/errors/no-pending-save.md +1 -1
  282. package/docs/errors/no-transaction.md +1 -1
  283. package/docs/errors/not-initialized.md +1 -1
  284. package/docs/errors/not-pdf.md +1 -1
  285. package/docs/errors/not-rebased.md +1 -1
  286. package/docs/errors/object-number-out-of-range.md +1 -1
  287. package/docs/errors/objstm-index-mismatch.md +1 -1
  288. package/docs/errors/out-of-memory.md +1 -1
  289. package/docs/errors/outline-cycle.md +1 -1
  290. package/docs/errors/outline-item-skipped.md +1 -1
  291. package/docs/errors/output-unwritable.md +1 -1
  292. package/docs/errors/overwrite-refused.md +1 -1
  293. package/docs/errors/page-count-mismatch.md +1 -1
  294. package/docs/errors/page-index-out-of-range.md +1 -1
  295. package/docs/errors/page-tree-node-skipped.md +1 -1
  296. package/docs/errors/password-required.md +1 -1
  297. package/docs/errors/path-outside-roots.md +1 -1
  298. package/docs/errors/perms-mismatch.md +1 -1
  299. package/docs/errors/profile-version-conflict.md +1 -1
  300. package/docs/errors/redaction-not-applied.md +32 -0
  301. package/docs/errors/reference-cycle.md +1 -1
  302. package/docs/errors/render-backend-unavailable.md +1 -1
  303. package/docs/errors/render-failed.md +1 -1
  304. package/docs/errors/render-too-large.md +1 -1
  305. package/docs/errors/repaired-base.md +1 -1
  306. package/docs/errors/requires-rewrite.md +1 -1
  307. package/docs/errors/revision-index-out-of-range.md +34 -0
  308. package/docs/errors/saved-not-rebased.md +1 -1
  309. package/docs/errors/sink-not-empty.md +1 -1
  310. package/docs/errors/sink.md +1 -1
  311. package/docs/errors/source-budget-exceeded.md +1 -1
  312. package/docs/errors/source-changed.md +1 -1
  313. package/docs/errors/source.md +1 -1
  314. package/docs/errors/stale-generation.md +1 -1
  315. package/docs/errors/stream-length-recovered.md +1 -1
  316. package/docs/errors/strict.md +1 -1
  317. package/docs/errors/subset-failed.md +1 -1
  318. package/docs/errors/syntax.md +1 -1
  319. package/docs/errors/tag-element-not-open.md +41 -0
  320. package/docs/errors/tag-element-unclosed.md +34 -0
  321. package/docs/errors/text-in-earlier-revision.md +36 -0
  322. package/docs/errors/text-module-not-loaded.md +1 -1
  323. package/docs/errors/text-overflow.md +1 -1
  324. package/docs/errors/tounicode-conflict.md +1 -1
  325. package/docs/errors/type.md +1 -1
  326. package/docs/errors/unexpected-eof.md +1 -1
  327. package/docs/errors/unknown-axis.md +1 -1
  328. package/docs/errors/unknown-code.md +1 -1
  329. package/docs/errors/unknown-destination.md +1 -1
  330. package/docs/errors/unknown-font.md +1 -1
  331. package/docs/errors/unknown-option.md +1 -1
  332. package/docs/errors/unknown-page.md +1 -1
  333. package/docs/errors/unmapped-glyph.md +1 -1
  334. package/docs/errors/unnumbered-heading-misused.md +1 -1
  335. package/docs/errors/unset-object.md +1 -1
  336. package/docs/errors/unsupported-filter.md +1 -1
  337. package/docs/errors/unsupported-image.md +1 -1
  338. package/docs/errors/unsupported-layout-option.md +1 -1
  339. package/docs/errors/unsupported-security-handler.md +1 -1
  340. package/docs/errors/unsupported-version.md +1 -1
  341. package/docs/errors/untagged-content.md +1 -1
  342. package/docs/errors/warnings-truncated.md +1 -1
  343. package/docs/errors/wasm-trap.md +1 -1
  344. package/docs/errors/whole-font-rebuilt.md +1 -1
  345. package/docs/errors/worker-crashed.md +1 -1
  346. package/docs/errors/worker-failed.md +1 -1
  347. package/docs/errors/worker-version-mismatch.md +1 -1
  348. package/docs/errors/would-invalidate-signatures.md +1 -1
  349. package/docs/errors/wrong-document.md +1 -1
  350. package/docs/errors/wrong-password.md +1 -1
  351. package/docs/errors/xobject-cycle.md +1 -1
  352. package/docs/errors/xref-repaired.md +1 -1
  353. package/docs/errors/xrefstm-ignored.md +1 -1
  354. package/docs/llms.txt +7 -1
  355. package/docs/pages/concepts/dependencies.md +2 -2
  356. package/docs/pages/concepts/drawing-pages.md +76 -0
  357. package/docs/pages/concepts/errors-and-warnings.md +6 -2
  358. package/docs/pages/concepts/how-lamina-thinks.md +13 -1
  359. package/docs/pages/concepts/pages-and-coordinates.md +9 -1
  360. package/docs/pages/guides/accessible-pdfs.md +3 -1
  361. package/docs/pages/guides/archival-pdfs.md +5 -1
  362. package/docs/pages/guides/edit-a-pdf.md +8 -2
  363. package/docs/pages/guides/flowing-pages.md +379 -0
  364. package/docs/pages/guides/fonts-and-text.md +3 -1
  365. package/docs/pages/guides/images-and-vectors.md +3 -1
  366. package/docs/pages/guides/keep-the-page-responsive.md +8 -4
  367. package/docs/pages/guides/links-outlines-and-metadata.md +3 -1
  368. package/docs/pages/guides/open-large-files.md +69 -0
  369. package/docs/pages/guides/password-protected-files.md +1 -1
  370. package/docs/pages/guides/save-a-pdf.md +12 -2
  371. package/docs/pages/guides/test-generated-pdfs.md +324 -0
  372. package/docs/pages/guides/untrusted-files.md +3 -1
  373. package/docs/pages/index.md +2 -2
  374. package/docs/pages/install.md +9 -5
  375. package/docs/pages/quick-start/browser.md +5 -1
  376. package/docs/pages/quick-start/bun.md +5 -1
  377. package/docs/pages/quick-start/deno.md +5 -1
  378. package/docs/pages/quick-start/node.md +5 -1
  379. package/docs/pages/quick-start/rust.md +6 -2
  380. package/docs/pages/quick-start/workers.md +2 -2
  381. package/docs/pages/recipes/cloudflare-worker.md +1 -1
  382. package/docs/pages/recipes/element-flow.md +248 -0
  383. package/docs/pages/recipes/extract-markdown.md +44 -6
  384. package/docs/pages/recipes/generate-then-edit.md +13 -6
  385. package/docs/pages/recipes/hello.md +13 -6
  386. package/docs/pages/recipes/images-and-vectors.md +13 -6
  387. package/docs/pages/recipes/invoice.md +13 -6
  388. package/docs/pages/recipes/links-and-outlines.md +13 -6
  389. package/docs/pages/recipes/multilingual.md +13 -6
  390. package/docs/pages/recipes/open-untrusted.md +1 -1
  391. package/docs/pages/recipes/pdf-a-archive.md +13 -6
  392. package/docs/pages/recipes/pdf-a3-invoice-with-xml.md +13 -6
  393. package/docs/pages/recipes/pdf-ua-report.md +13 -6
  394. package/docs/pages/recipes/report.md +2 -2
  395. package/docs/pages/recipes/web-worker-client.md +1 -1
  396. package/docs/pages/recipes.md +3 -2
  397. package/docs/pages/reference/benchmarks.md +93 -0
  398. package/docs/pages/reference/changelog.md +49 -1
  399. package/docs/pages/reference/codes.md +1 -1
  400. package/docs/pages/reference/glossary.md +1 -1
  401. package/docs/pages/reference/rust.md +11 -11
  402. package/docs/pages/reference/stability.md +3 -3
  403. package/docs/pages/start/coding-agents.md +1 -1
  404. package/docs/pages/start/first-pdf.md +6 -2
  405. package/docs/pages/troubleshooting.md +1 -1
  406. package/docs/schemas/error.schema.json +18 -1
  407. package/package.json +4 -2
  408. package/schemas/error.schema.json +18 -1
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: "extract-column-order-uncertain"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/extract-column-order-uncertain/"
5
+ ---
6
+
7
+ # extract-column-order-uncertain
8
+
9
+ - Type: warning
10
+ - Kind: `unsupported` (something Lamina PDF can't do yet)
11
+
12
+ ## What happened
13
+
14
+ Extraction read the page's columns in an order its layout rules had to guess, so the page's blocks may be in the wrong order. The blocks the guess concerns have a `confidence` of 0.5 instead of 0.75; the order itself is the rules' best one.
15
+
16
+ ## Why
17
+
18
+ A PDF stores where each piece of text is drawn, not the order to read it in, so extraction works the order out from the layout: columns first, top to bottom. Three layouts leave that order in doubt, and the warning's `reason` names which one it found:
19
+
20
+ - `narrow-gutter`: two columns sit closer together than a font size, so lines may have been read straight across both columns.
21
+ - `columns-revisited`: a block across the gutter, such as a pull quote with the text wrapped round it, cut the columns into rows, so the order leaves a column and comes back to it.
22
+ - `near-grid`: blocks that look like an unruled table, with one cell wrapped onto a second line, were read column by column; read by rows, the order would differ.
23
+
24
+ A page that mixes horizontal and vertical writing raises [`extract-reading-order-ambiguous`](extract-reading-order-ambiguous.md) instead.
25
+
26
+ ## How to fix
27
+
28
+ Check the page's text, or send the page to a layout model, which reads columns from the page's image. A tagged file read in its structure tree's order never raises this warning. Like every warning, it fails the call in strict mode.
29
+
30
+ ## Example
31
+
32
+ A newsletter page with two columns set 7 pt apart: each line of the extracted text runs across both columns, and the page is warned with `narrow-gutter`.
33
+
34
+ ## Data fields
35
+
36
+ - `reason`: `narrow-gutter`, `columns-revisited` or `near-grid`, the first check that doubted the order.
37
+
38
+ The `location` has the page's `pageIndex`.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "extract-limit-blocks"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/extract-limit-blocks/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "extract-module-not-loaded"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/extract-module-not-loaded/"
5
5
  ---
6
6
 
@@ -0,0 +1,37 @@
1
+ ---
2
+ title: "extract-needs-ocr"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/extract-needs-ocr/"
5
+ ---
6
+
7
+ # extract-needs-ocr
8
+
9
+ - Type: warning
10
+ - Kind: `unsupported` (something Lamina PDF can't do yet)
11
+
12
+ ## What happened
13
+
14
+ The page has no text that extraction can use, so the page's Markdown, text and blocks are empty or close to it. Each page's `textLayer` in the extraction says why, and this warning names the pages whose status is `needs-ocr` or `ocr-layer`.
15
+
16
+ ## Why
17
+
18
+ A page's text comes from its fonts. Some pages draw their words in other ways:
19
+
20
+ - a scanned page is one image, with no text at all;
21
+ - a page made searchable by OCR has an image under invisible text, which extraction leaves out of the blocks because a reader can't see it;
22
+ - outlined text is drawn as shapes, not glyphs;
23
+ - a font without a Unicode mapping draws glyphs that extraction can't turn into characters.
24
+
25
+ ## How to fix
26
+
27
+ Send the pages this warning names to OCR or a vision model. On an `ocr-layer` page you can instead keep the existing OCR layer: extraction lists its text under `dropped` as `invisible` when you set `drop: { keepSpans: true }` (`DropOptions::keep_spans` in Rust). Like every warning, it fails the call in strict mode.
28
+
29
+ ## Example
30
+
31
+ A scanned contract: every page is `needs-ocr`, and the extraction's Markdown is empty.
32
+
33
+ ## Data fields
34
+
35
+ - `status`: the page's text-layer status, `needs-ocr` or `ocr-layer`.
36
+
37
+ The `location` has the page's `pageIndex`.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "extract-reading-order-ambiguous"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/extract-reading-order-ambiguous/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "extract-struct-tree-ignored"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/extract-struct-tree-ignored/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "extract-table-ambiguous"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/extract-table-ambiguous/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "extract-table-limit"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/extract-table-limit/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "extract-untagged-content"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/extract-untagged-content/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "fetch-failed"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/fetch-failed/"
5
5
  ---
6
6
 
@@ -15,11 +15,11 @@ A range source of `@laminapdf/sdk` (`httpRangeSource`) couldn't get bytes it ask
15
15
 
16
16
  ## Why
17
17
 
18
- Opening a remote file range by range depends on the server: it must allow the `Range` request (and, across origins, expose `Content-Range`, `Content-Length` and `ETag` through CORS), and must not compress the response (`Content-Encoding` breaks byte ranges). Lamina PDF never retries on its own; the error says the bytes are not available.
18
+ Opening a remote file range by range depends on the server: it must allow the `Range` request and must not compress the response (`Content-Encoding` breaks byte ranges). Across origins, it must also allow the `If-Range` header that every request after the first carries, and expose `Content-Range`, `Content-Length` and `ETag` through CORS. Lamina PDF never retries on its own; the error says the bytes are not available.
19
19
 
20
20
  ## How to fix
21
21
 
22
- Check that the URL is reachable from where the code runs and that the server sends `Access-Control-Allow-Origin`, `Access-Control-Allow-Headers: Range` and `Access-Control-Expose-Headers: Content-Range, Content-Length, ETag`. Serve PDFs without `Content-Encoding`. Retry the call yourself if the failure was transient.
22
+ Check that the URL is reachable from where the code runs and that the server sends `Access-Control-Allow-Origin`, `Access-Control-Allow-Headers: Range, If-Range` and `Access-Control-Expose-Headers: Content-Range, Content-Length, ETag`. Serve PDFs without `Content-Encoding`. Retry the call yourself if the failure was transient.
23
23
 
24
24
  ## Example
25
25
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "flate-truncated"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/flate-truncated/"
5
5
  ---
6
6
 
@@ -0,0 +1,34 @@
1
+ ---
2
+ title: "flow-content-too-large"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/flow-content-too-large/"
5
+ ---
6
+
7
+ # flow-content-too-large
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ `Builder::flow` found a figure, a single line of text or a table row taller than the body of a page: the space between the top and bottom margins. No page can hold it, so the flow stopped and added no pages. A line or row counts together with the footnotes it cites, since its notes go at the foot of its page.
15
+
16
+ ## Why
17
+
18
+ A flow moves a figure to the next page when it doesn't fit, and splits a paragraph only between lines. A figure or a line taller than a whole page would fit on no page at all, and cutting it would hide part of it.
19
+
20
+ ## How to fix
21
+
22
+ Make the figure narrower with `Figure::with_width`, so its height shrinks with it. For a line, use a smaller text size or a smaller line height. For a footnote, shorten the note or split it into two. Or give the page more room with a taller page size or smaller top and bottom margins.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ let tall = Image::rgba(1, 10, &[0; 40])?; // ten times as tall as it is wide
28
+ let flow = Flow::new(PageTemplate::new(PageSize::A6)).block(FlowBlock::Figure(Figure::new(tall, "A bar")));
29
+ builder.flow(&flow)?; // flow-content-too-large
30
+ ```
31
+
32
+ ## Data fields
33
+
34
+ - `what`: what is too tall: `line`, `figure`, `table row`, or `footnote` when a line or table row and its footnotes fit on no page together.
@@ -0,0 +1,34 @@
1
+ ---
2
+ title: "flow-keep-broken"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/flow-keep-broken/"
5
+ ---
6
+
7
+ # flow-keep-broken
8
+
9
+ - Type: warning
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ `Builder::flow` met blocks it was asked to keep on one page, and together they are taller than a page. The flow split them across pages anyway. Blocks are kept together by a `FlowBlock::Keep` group, or by a heading or a paragraph set to keep with the block after it.
15
+
16
+ ## Why
17
+
18
+ Blocks that can't fit on one page can't be kept on one page. No layout can keep them together, so the flow doesn't look for one. It lays them out as it would without the rule, and every page still ends on a whole line.
19
+
20
+ ## How to fix
21
+
22
+ Keep fewer blocks together: split a long `Keep` group into smaller ones, or turn off `keep_with_next` on a paragraph in a long chain. Or make the page taller, or its margins smaller, so the group fits.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ let group = FlowBlock::Keep(vec![long_intro, long_paragraph]); // taller than a page
28
+ let report = builder.flow(&Flow::new(template).block(group))?;
29
+ assert_eq!(report.warnings[0].code(), "flow-keep-broken");
30
+ ```
31
+
32
+ ## Data fields
33
+
34
+ - `page`: the page the blocks start on, counted from 0 within the flow.
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: "flow-layout-unstable"
3
+ version: "0.2.0-alpha.4"
4
+ url: "https://docs.laminapdf.com/reference/codes/flow-layout-unstable/"
5
+ ---
6
+
7
+ # flow-layout-unstable
8
+
9
+ - Type: error
10
+ - Kind: `internal` (a bug in Lamina PDF or a broken invariant)
11
+
12
+ ## What happened
13
+
14
+ `Builder::flow` laid out a flow with a contents page four times, and the page numbers on the contents page still changed. The flow stopped and added no pages.
15
+
16
+ ## Why
17
+
18
+ A contents page lists each heading with the page it starts on, but those pages aren't known until the flow is laid out. So the flow lays everything out, writes the numbers it found into the contents page, and lays out again to check them. Each entry keeps the same room for its number however wide the number is, so the contents page's length never depends on the numbers, and the second layout finds the same pages.
19
+
20
+ The flow still checks up to four layouts. This error means the numbers kept changing anyway, which points to a fault in Lamina PDF's layout rather than in your document.
21
+
22
+ ## How to fix
23
+
24
+ Report the flow that fails, with the blocks and page template that produce it. Until it is fixed, a page break after the contents block may avoid the error, since the headings after it then start on pages of their own.
25
+
26
+ ## Example
27
+
28
+ ```rust
29
+ let flow = Flow::new(template)
30
+ .block(FlowBlock::Contents(Contents::new(&style)))
31
+ .block(FlowBlock::PageBreak) // the headings start on their own pages
32
+ .block(FlowBlock::Heading(1, Paragraph::plain("Introduction", &heading)));
33
+ builder.flow(&flow)?;
34
+ ```
35
+
36
+ ## Data fields
37
+
38
+ None.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "font-invalid"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/font-invalid/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "font-mismatch"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/font-mismatch/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "font-not-embeddable"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/font-not-embeddable/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "font-not-embedded"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/font-not-embedded/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "font-not-shapable"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/font-not-shapable/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "glyph-out-of-range"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/glyph-out-of-range/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "glyph-without-unicode"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/glyph-without-unicode/"
5
5
  ---
6
6
 
@@ -11,20 +11,22 @@ url: "https://docs.laminapdf.com/reference/codes/glyph-without-unicode/"
11
11
 
12
12
  ## What happened
13
13
 
14
- Under PDF/A-2u or PDF/UA-1, a glyph was drawn that stands for no text of its own, or whose text is U+0000, U+FEFF or U+FFFE. Shaping can draw one cluster (a group of characters that display as one unit) with several glyphs. The text then belongs to the first glyph, and the others stand for none.
14
+ Under PDF/A-2u or PDF/UA-1, a glyph was drawn with no Unicode value, or with one that holds U+0000, U+FEFF or U+FFFE.
15
+
16
+ A glyph that maps to the empty value doesn't fail. Shaping can draw one character with several glyphs: Noto Sans Arabic draws a beh as a dotless body and a dot. The body then carries the letter and the dot maps to the empty value, so the letter is read once.
15
17
 
16
18
  ## Why
17
19
 
18
- Software can search, copy or read text aloud only when every glyph maps to a usable Unicode value. The PDF/A-2u archival standard (ISO 19005-2 §6.2.11.7.2) and the PDF/UA-1 standard for accessible PDF (ISO 14289-1 §7.21.7) both need that mapping. These are conditions 31-027 to 31-029 of the Matterhorn Protocol, the PDF Association's checklist of PDF/UA failures. Lamina PDF maps a glyph that stands for no text to an empty value, which these profiles reject.
20
+ Software can search, copy or read text aloud only when every glyph maps to a usable Unicode value. The PDF/A-2u archival standard (ISO 19005-2 §6.2.11.7.2) and the PDF/UA-1 standard for accessible PDF (ISO 14289-1 §7.21.7) both need that mapping. These are conditions 31-027 to 31-029 of the Matterhorn Protocol, the PDF Association's checklist of PDF/UA failures.
19
21
 
20
22
  ## How to fix
21
23
 
22
- Check the text for control characters and byte-order marks. If shaping draws several glyphs for one cluster, choose a font that draws each cluster as one glyph. An archive that needs no accessibility can use PDF/A-2b instead, which doesn't need Unicode for every glyph. PDF/UA-1 has no such relaxed variant, so a PDF/UA-1 document needs the font change.
24
+ Remove the NUL characters (U+0000) from the text, and check what it was decoded from: a NUL usually means a UTF-16 string read as UTF-8, or the end of a C string. An archive that needs no accessibility can use PDF/A-2b instead, which doesn't need Unicode for every glyph. PDF/UA-1 has no such relaxed variant.
23
25
 
24
26
  ## Example
25
27
 
26
28
  ```rust
27
- surface.text("\u{FEFF}Report", &font, Pt::new(12.0), at)?;
29
+ surface.text("\u{0}Report", &font, Pt::new(12.0), at)?;
28
30
  builder.finish()?; // glyph-without-unicode under Profile::PdfA2u
29
31
  ```
30
32
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "heading-level-skipped"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/heading-level-skipped/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "image-data-length"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/image-data-length/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "image-too-large"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/image-too-large/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "inline-image-unterminated"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/inline-image-unterminated/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "input-unreadable"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/input-unreadable/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "instance-reset"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/instance-reset/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-argument"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-argument/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-axis-value"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-axis-value/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-box"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-box/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-color"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-color/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-command-line"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-command-line/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-date"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-date/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-entry"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-entry/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-feature"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-feature/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-font"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-font/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-geometry"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-geometry/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-icc-profile"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-icc-profile/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-image"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-image/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-op-log"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-op-log/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-page-label"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-page-label/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-page-labels"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-page-labels/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-page-range"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-page-range/"
5
5
  ---
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-rotate"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-rotate/"
5
5
  ---
6
6
 
@@ -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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "invalid-structure-nesting"
3
- version: "0.2.0-alpha.3"
3
+ version: "0.2.0-alpha.4"
4
4
  url: "https://docs.laminapdf.com/reference/codes/invalid-structure-nesting/"
5
5
  ---
6
6