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

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 (401) hide show
  1. package/README.md +42 -7
  2. package/dist/api.d.ts +5 -2
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +3 -2
  5. package/dist/api.js.map +1 -1
  6. package/dist/builder.d.ts +35 -19
  7. package/dist/builder.d.ts.map +1 -1
  8. package/dist/builder.js +114 -80
  9. package/dist/builder.js.map +1 -1
  10. package/dist/document.d.ts +47 -21
  11. package/dist/document.d.ts.map +1 -1
  12. package/dist/document.js +112 -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.d.ts +57 -0
  19. package/dist/extract.d.ts.map +1 -0
  20. package/dist/extract.js +5 -0
  21. package/dist/extract.js.map +1 -0
  22. package/dist/font.d.ts +13 -6
  23. package/dist/font.d.ts.map +1 -1
  24. package/dist/font.js +50 -20
  25. package/dist/font.js.map +1 -1
  26. package/dist/generated/codes.d.ts +18 -6
  27. package/dist/generated/codes.d.ts.map +1 -1
  28. package/dist/generated/codes.js +59 -4
  29. package/dist/generated/codes.js.map +1 -1
  30. package/dist/generated/explain.d.ts.map +1 -1
  31. package/dist/generated/explain.js +27 -10
  32. package/dist/generated/explain.js.map +1 -1
  33. package/dist/generated/extract.d.ts +235 -0
  34. package/dist/generated/extract.d.ts.map +1 -0
  35. package/dist/generated/extract.js +4 -0
  36. package/dist/generated/extract.js.map +1 -0
  37. package/dist/init.d.ts +13 -5
  38. package/dist/init.d.ts.map +1 -1
  39. package/dist/init.js +23 -11
  40. package/dist/init.js.map +1 -1
  41. package/dist/internal/handle.d.ts +58 -0
  42. package/dist/internal/handle.d.ts.map +1 -0
  43. package/dist/internal/handle.js +113 -0
  44. package/dist/internal/handle.js.map +1 -0
  45. package/dist/internal/instance.d.ts +56 -0
  46. package/dist/internal/instance.d.ts.map +1 -0
  47. package/dist/internal/instance.js +125 -0
  48. package/dist/internal/instance.js.map +1 -0
  49. package/dist/source/http.js +1 -1
  50. package/dist/source/http.js.map +1 -1
  51. package/dist/source/range.d.ts +6 -1
  52. package/dist/source/range.d.ts.map +1 -1
  53. package/dist/source/range.js +10 -6
  54. package/dist/source/range.js.map +1 -1
  55. package/dist/text.d.ts +3 -3
  56. package/dist/text.d.ts.map +1 -1
  57. package/dist/text.js +3 -3
  58. package/dist/text.js.map +1 -1
  59. package/dist/version.d.ts +1 -1
  60. package/dist/version.js +2 -2
  61. package/dist/version.js.map +1 -1
  62. package/dist/worker/client.d.ts +3 -2
  63. package/dist/worker/client.d.ts.map +1 -1
  64. package/dist/worker/client.js +6 -4
  65. package/dist/worker/client.js.map +1 -1
  66. package/dist/worker/entry.js +1 -1
  67. package/dist/worker/entry.js.map +1 -1
  68. package/dist/worker/server.d.ts.map +1 -1
  69. package/dist/worker/server.js +42 -9
  70. package/dist/worker/server.js.map +1 -1
  71. package/dist/worker/support.d.ts +6 -2
  72. package/dist/worker/support.d.ts.map +1 -1
  73. package/dist/worker/support.js +1 -0
  74. package/dist/worker/support.js.map +1 -1
  75. package/dist/worker/types.d.ts +8 -1
  76. package/dist/worker/types.d.ts.map +1 -1
  77. package/docs/AGENTS.md +14 -0
  78. package/docs/api/README.md +147 -0
  79. package/docs/api/classes/Builder.md +467 -0
  80. package/docs/api/classes/Document.md +742 -0
  81. package/docs/api/classes/Font.md +74 -0
  82. package/docs/api/classes/Image.md +140 -0
  83. package/docs/api/classes/LaminaPdfError.md +189 -0
  84. package/docs/api/classes/Page.md +178 -0
  85. package/docs/api/classes/PageRef.md +253 -0
  86. package/docs/api/classes/PageText.md +129 -0
  87. package/docs/api/classes/PageTextRun.md +167 -0
  88. package/docs/api/classes/PendingPath.md +97 -0
  89. package/docs/api/classes/SaveJob.md +205 -0
  90. package/docs/api/classes/Surface.md +326 -0
  91. package/docs/api/classes/Transaction.md +111 -0
  92. package/docs/api/functions/callbackSource.md +33 -0
  93. package/docs/api/functions/httpRangeSource.md +48 -0
  94. package/docs/api/functions/init.md +36 -0
  95. package/docs/api/functions/isExtractLoaded.md +21 -0
  96. package/docs/api/functions/isInitialized.md +19 -0
  97. package/docs/api/functions/isLaminaPdfError.md +41 -0
  98. package/docs/api/functions/isTextLoaded.md +19 -0
  99. package/docs/api/functions/loadExtract.md +28 -0
  100. package/docs/api/functions/loadText.md +28 -0
  101. package/docs/api/functions/onLeak.md +29 -0
  102. package/docs/api/functions/reset.md +22 -0
  103. package/docs/api/functions/wasmMemory.md +22 -0
  104. package/docs/api/interfaces/BuilderOptions.md +108 -0
  105. package/docs/api/interfaces/ByteRange.md +29 -0
  106. package/docs/api/interfaces/ChunkOptions.md +37 -0
  107. package/docs/api/interfaces/Diagnostic.md +67 -0
  108. package/docs/api/interfaces/ExtractOptions.md +92 -0
  109. package/docs/api/interfaces/ExtractResult.md +37 -0
  110. package/docs/api/interfaces/FontInfo.md +37 -0
  111. package/docs/api/interfaces/HttpRangeOptions.md +78 -0
  112. package/docs/api/interfaces/InitOptions.md +40 -0
  113. package/docs/api/interfaces/Leak.md +21 -0
  114. package/docs/api/interfaces/Location.md +53 -0
  115. package/docs/api/interfaces/OpLog.md +25 -0
  116. package/docs/api/interfaces/OpenOptions.md +37 -0
  117. package/docs/api/interfaces/PageTextOptions.md +21 -0
  118. package/docs/api/interfaces/PathBuilder.md +195 -0
  119. package/docs/api/interfaces/QuadPoint.md +25 -0
  120. package/docs/api/interfaces/RangeOptions.md +54 -0
  121. package/docs/api/interfaces/RangeSource.md +59 -0
  122. package/docs/api/interfaces/StrokeStyle.md +61 -0
  123. package/docs/api/interfaces/TagSpec.md +69 -0
  124. package/docs/api/interfaces/TextBoxOptions.md +93 -0
  125. package/docs/api/interfaces/TextGlyph.md +29 -0
  126. package/docs/api/interfaces/TextOptions.md +101 -0
  127. package/docs/api/interfaces/WasmMemory.md +37 -0
  128. package/docs/api/type-aliases/AfRelationship.md +15 -0
  129. package/docs/api/type-aliases/Align.md +15 -0
  130. package/docs/api/type-aliases/ArtifactKind.md +15 -0
  131. package/docs/api/type-aliases/AttachmentOptions.md +15 -0
  132. package/docs/api/type-aliases/BlendMode.md +15 -0
  133. package/docs/api/type-aliases/BoxRect.md +15 -0
  134. package/docs/api/type-aliases/BuildOptions.md +15 -0
  135. package/docs/api/type-aliases/Cell.md +71 -0
  136. package/docs/api/type-aliases/Chunk.md +79 -0
  137. package/docs/api/type-aliases/Color.md +16 -0
  138. package/docs/api/type-aliases/Coordinates.md +55 -0
  139. package/docs/api/type-aliases/Direction.md +15 -0
  140. package/docs/api/type-aliases/DocumentInfo.md +15 -0
  141. package/docs/api/type-aliases/DropReason.md +15 -0
  142. package/docs/api/type-aliases/Dropped.md +59 -0
  143. package/docs/api/type-aliases/Edited.md +15 -0
  144. package/docs/api/type-aliases/ErrorCode.md +15 -0
  145. package/docs/api/type-aliases/ErrorKind.md +15 -0
  146. package/docs/api/type-aliases/ExtractFormat.md +15 -0
  147. package/docs/api/type-aliases/ExtractedBlock.md +82 -0
  148. package/docs/api/type-aliases/ExtractedPage.md +65 -0
  149. package/docs/api/type-aliases/ExtractedSource.md +48 -0
  150. package/docs/api/type-aliases/Extraction.md +22 -0
  151. package/docs/api/type-aliases/FillRule.md +15 -0
  152. package/docs/api/type-aliases/Fit.md +15 -0
  153. package/docs/api/type-aliases/Flags.md +15 -0
  154. package/docs/api/type-aliases/Generator.md +41 -0
  155. package/docs/api/type-aliases/GlyphQuad.md +15 -0
  156. package/docs/api/type-aliases/InfoPatch.md +15 -0
  157. package/docs/api/type-aliases/LaminaPdfWarning.md +16 -0
  158. package/docs/api/type-aliases/LimitName.md +15 -0
  159. package/docs/api/type-aliases/Limits.md +15 -0
  160. package/docs/api/type-aliases/LineBox.md +15 -0
  161. package/docs/api/type-aliases/LineCap.md +15 -0
  162. package/docs/api/type-aliases/LineJoin.md +15 -0
  163. package/docs/api/type-aliases/LinkTarget.md +15 -0
  164. package/docs/api/type-aliases/Metadata.md +15 -0
  165. package/docs/api/type-aliases/Op.md +15 -0
  166. package/docs/api/type-aliases/OutlineEntry.md +15 -0
  167. package/docs/api/type-aliases/Overflow.md +15 -0
  168. package/docs/api/type-aliases/PageInfo.md +15 -0
  169. package/docs/api/type-aliases/PageLabel.md +15 -0
  170. package/docs/api/type-aliases/PageSizeName.md +15 -0
  171. package/docs/api/type-aliases/Point.md +15 -0
  172. package/docs/api/type-aliases/Profile.md +15 -0
  173. package/docs/api/type-aliases/Progress.md +15 -0
  174. package/docs/api/type-aliases/ReadingOrder.md +15 -0
  175. package/docs/api/type-aliases/Rect.md +15 -0
  176. package/docs/api/type-aliases/Region.md +31 -0
  177. package/docs/api/type-aliases/RenderMode.md +15 -0
  178. package/docs/api/type-aliases/Rotation.md +15 -0
  179. package/docs/api/type-aliases/SaveOptions.md +15 -0
  180. package/docs/api/type-aliases/SaveReport.md +15 -0
  181. package/docs/api/type-aliases/Span.md +63 -0
  182. package/docs/api/type-aliases/SplitOn.md +15 -0
  183. package/docs/api/type-aliases/Standard14.md +15 -0
  184. package/docs/api/type-aliases/StructRef.md +41 -0
  185. package/docs/api/type-aliases/StructSource.md +17 -0
  186. package/docs/api/type-aliases/TableDetector.md +15 -0
  187. package/docs/api/type-aliases/TableMode.md +15 -0
  188. package/docs/api/type-aliases/TableScope.md +15 -0
  189. package/docs/api/type-aliases/Tag.md +15 -0
  190. package/docs/api/type-aliases/TagName.md +15 -0
  191. package/docs/api/type-aliases/TextLayout.md +15 -0
  192. package/docs/api/type-aliases/TextRange.md +33 -0
  193. package/docs/api/type-aliases/TextRunInfo.md +15 -0
  194. package/docs/api/type-aliases/Transform.md +15 -0
  195. package/docs/api/type-aliases/UndoOutcome.md +15 -0
  196. package/docs/api/type-aliases/ViewerPreferences.md +15 -0
  197. package/docs/api/type-aliases/WarningCode.md +15 -0
  198. package/docs/api/type-aliases/WasmSource.md +16 -0
  199. package/docs/api/variables/Matrix.md +99 -0
  200. package/docs/api/variables/PAGE_SIZES.md +15 -0
  201. package/docs/api/variables/TAG_NAMES.md +15 -0
  202. package/docs/errors/README.md +156 -0
  203. package/docs/errors/aes-padding-invalid.md +34 -0
  204. package/docs/errors/already-initialized.md +34 -0
  205. package/docs/errors/binary-output-to-terminal.md +35 -0
  206. package/docs/errors/builder-finished.md +35 -0
  207. package/docs/errors/cancelled.md +35 -0
  208. package/docs/errors/cmap-invalid.md +42 -0
  209. package/docs/errors/collection-index.md +33 -0
  210. package/docs/errors/color-components.md +33 -0
  211. package/docs/errors/content-bad-operands.md +36 -0
  212. package/docs/errors/content-path-unpainted.md +36 -0
  213. package/docs/errors/content-resource-missing.md +37 -0
  214. package/docs/errors/content-syntax.md +36 -0
  215. package/docs/errors/content-unbalanced-bt.md +36 -0
  216. package/docs/errors/content-unbalanced-marked.md +36 -0
  217. package/docs/errors/content-unbalanced-q.md +36 -0
  218. package/docs/errors/content-unknown-operator.md +37 -0
  219. package/docs/errors/data-pending.md +34 -0
  220. package/docs/errors/decompress.md +34 -0
  221. package/docs/errors/device-color-without-output-intent.md +33 -0
  222. package/docs/errors/direct-page.md +34 -0
  223. package/docs/errors/disposed.md +34 -0
  224. package/docs/errors/document-changed.md +34 -0
  225. package/docs/errors/embedded-file-forbidden.md +35 -0
  226. package/docs/errors/embedded-file-without-mime-type.md +36 -0
  227. package/docs/errors/encoding-full.md +34 -0
  228. package/docs/errors/encrypted-base.md +33 -0
  229. package/docs/errors/extract-limit-blocks.md +35 -0
  230. package/docs/errors/extract-module-not-loaded.md +37 -0
  231. package/docs/errors/extract-reading-order-ambiguous.md +32 -0
  232. package/docs/errors/extract-struct-tree-ignored.md +32 -0
  233. package/docs/errors/extract-table-ambiguous.md +32 -0
  234. package/docs/errors/extract-table-limit.md +35 -0
  235. package/docs/errors/extract-untagged-content.md +32 -0
  236. package/docs/errors/fetch-failed.md +34 -0
  237. package/docs/errors/flate-truncated.md +34 -0
  238. package/docs/errors/font-invalid.md +36 -0
  239. package/docs/errors/font-mismatch.md +34 -0
  240. package/docs/errors/font-not-embeddable.md +34 -0
  241. package/docs/errors/font-not-embedded.md +35 -0
  242. package/docs/errors/font-not-shapable.md +33 -0
  243. package/docs/errors/glyph-out-of-range.md +34 -0
  244. package/docs/errors/glyph-without-unicode.md +35 -0
  245. package/docs/errors/heading-level-skipped.md +36 -0
  246. package/docs/errors/image-data-length.md +33 -0
  247. package/docs/errors/image-too-large.md +32 -0
  248. package/docs/errors/inline-image-unterminated.md +36 -0
  249. package/docs/errors/input-unreadable.md +37 -0
  250. package/docs/errors/instance-reset.md +34 -0
  251. package/docs/errors/invalid-argument.md +33 -0
  252. package/docs/errors/invalid-axis-value.md +32 -0
  253. package/docs/errors/invalid-box.md +34 -0
  254. package/docs/errors/invalid-color.md +32 -0
  255. package/docs/errors/invalid-command-line.md +44 -0
  256. package/docs/errors/invalid-date.md +34 -0
  257. package/docs/errors/invalid-entry.md +34 -0
  258. package/docs/errors/invalid-feature.md +32 -0
  259. package/docs/errors/invalid-font.md +32 -0
  260. package/docs/errors/invalid-geometry.md +32 -0
  261. package/docs/errors/invalid-icc-profile.md +32 -0
  262. package/docs/errors/invalid-image.md +33 -0
  263. package/docs/errors/invalid-op-log.md +33 -0
  264. package/docs/errors/invalid-page-label.md +34 -0
  265. package/docs/errors/invalid-page-labels.md +32 -0
  266. package/docs/errors/invalid-page-range.md +37 -0
  267. package/docs/errors/invalid-rotate.md +34 -0
  268. package/docs/errors/invalid-structure-nesting.md +38 -0
  269. package/docs/errors/invalid-structure.md +34 -0
  270. package/docs/errors/invalid-text-range.md +33 -0
  271. package/docs/errors/job-finished.md +34 -0
  272. package/docs/errors/limit-exceeded.md +38 -0
  273. package/docs/errors/link-without-contents.md +33 -0
  274. package/docs/errors/link-without-structure.md +37 -0
  275. package/docs/errors/missing-alt-text.md +33 -0
  276. package/docs/errors/missing-glyph.md +33 -0
  277. package/docs/errors/missing-header.md +37 -0
  278. package/docs/errors/missing-lang.md +32 -0
  279. package/docs/errors/missing-root.md +34 -0
  280. package/docs/errors/missing-title.md +32 -0
  281. package/docs/errors/name-tree-node-skipped.md +34 -0
  282. package/docs/errors/nested-transaction.md +34 -0
  283. package/docs/errors/no-pending-save.md +32 -0
  284. package/docs/errors/no-transaction.md +33 -0
  285. package/docs/errors/not-initialized.md +35 -0
  286. package/docs/errors/not-pdf.md +33 -0
  287. package/docs/errors/not-rebased.md +35 -0
  288. package/docs/errors/object-number-out-of-range.md +38 -0
  289. package/docs/errors/objstm-index-mismatch.md +36 -0
  290. package/docs/errors/out-of-memory.md +38 -0
  291. package/docs/errors/outline-cycle.md +34 -0
  292. package/docs/errors/outline-item-skipped.md +34 -0
  293. package/docs/errors/output-unwritable.md +37 -0
  294. package/docs/errors/overwrite-refused.md +36 -0
  295. package/docs/errors/page-count-mismatch.md +34 -0
  296. package/docs/errors/page-index-out-of-range.md +34 -0
  297. package/docs/errors/page-tree-node-skipped.md +35 -0
  298. package/docs/errors/password-required.md +36 -0
  299. package/docs/errors/path-outside-roots.md +32 -0
  300. package/docs/errors/perms-mismatch.md +34 -0
  301. package/docs/errors/profile-version-conflict.md +35 -0
  302. package/docs/errors/reference-cycle.md +35 -0
  303. package/docs/errors/render-backend-unavailable.md +32 -0
  304. package/docs/errors/render-failed.md +33 -0
  305. package/docs/errors/render-too-large.md +36 -0
  306. package/docs/errors/repaired-base.md +34 -0
  307. package/docs/errors/requires-rewrite.md +38 -0
  308. package/docs/errors/saved-not-rebased.md +34 -0
  309. package/docs/errors/sink-not-empty.md +33 -0
  310. package/docs/errors/sink.md +31 -0
  311. package/docs/errors/source-budget-exceeded.md +34 -0
  312. package/docs/errors/source-changed.md +33 -0
  313. package/docs/errors/source.md +30 -0
  314. package/docs/errors/stale-generation.md +34 -0
  315. package/docs/errors/stream-length-recovered.md +37 -0
  316. package/docs/errors/strict.md +34 -0
  317. package/docs/errors/subset-failed.md +31 -0
  318. package/docs/errors/syntax.md +34 -0
  319. package/docs/errors/text-module-not-loaded.md +36 -0
  320. package/docs/errors/text-overflow.md +34 -0
  321. package/docs/errors/tounicode-conflict.md +32 -0
  322. package/docs/errors/type.md +34 -0
  323. package/docs/errors/unexpected-eof.md +34 -0
  324. package/docs/errors/unknown-axis.md +33 -0
  325. package/docs/errors/unknown-code.md +36 -0
  326. package/docs/errors/unknown-destination.md +33 -0
  327. package/docs/errors/unknown-font.md +33 -0
  328. package/docs/errors/unknown-option.md +33 -0
  329. package/docs/errors/unknown-page.md +34 -0
  330. package/docs/errors/unmapped-glyph.md +36 -0
  331. package/docs/errors/unnumbered-heading-misused.md +34 -0
  332. package/docs/errors/unset-object.md +30 -0
  333. package/docs/errors/unsupported-filter.md +34 -0
  334. package/docs/errors/unsupported-image.md +33 -0
  335. package/docs/errors/unsupported-layout-option.md +33 -0
  336. package/docs/errors/unsupported-security-handler.md +34 -0
  337. package/docs/errors/unsupported-version.md +32 -0
  338. package/docs/errors/untagged-content.md +35 -0
  339. package/docs/errors/warnings-truncated.md +35 -0
  340. package/docs/errors/wasm-trap.md +37 -0
  341. package/docs/errors/whole-font-rebuilt.md +30 -0
  342. package/docs/errors/worker-crashed.md +33 -0
  343. package/docs/errors/worker-failed.md +32 -0
  344. package/docs/errors/worker-version-mismatch.md +34 -0
  345. package/docs/errors/would-invalidate-signatures.md +38 -0
  346. package/docs/errors/wrong-document.md +33 -0
  347. package/docs/errors/wrong-password.md +34 -0
  348. package/docs/errors/xobject-cycle.md +36 -0
  349. package/docs/errors/xref-repaired.md +36 -0
  350. package/docs/errors/xrefstm-ignored.md +34 -0
  351. package/docs/llms.txt +88 -0
  352. package/docs/pages/concepts/dependencies.md +44 -0
  353. package/docs/pages/concepts/errors-and-warnings.md +64 -0
  354. package/docs/pages/concepts/how-lamina-thinks.md +86 -0
  355. package/docs/pages/concepts/pages-and-coordinates.md +67 -0
  356. package/docs/pages/guides/accessible-pdfs.md +260 -0
  357. package/docs/pages/guides/archival-pdfs.md +429 -0
  358. package/docs/pages/guides/edit-a-pdf.md +137 -0
  359. package/docs/pages/guides/fonts-and-text.md +202 -0
  360. package/docs/pages/guides/images-and-vectors.md +219 -0
  361. package/docs/pages/guides/keep-the-page-responsive.md +81 -0
  362. package/docs/pages/guides/links-outlines-and-metadata.md +222 -0
  363. package/docs/pages/guides/password-protected-files.md +70 -0
  364. package/docs/pages/guides/save-a-pdf.md +144 -0
  365. package/docs/pages/guides/untrusted-files.md +80 -0
  366. package/docs/pages/index.md +33 -0
  367. package/docs/pages/install.md +75 -0
  368. package/docs/pages/quick-start/browser.md +67 -0
  369. package/docs/pages/quick-start/bun.md +60 -0
  370. package/docs/pages/quick-start/deno.md +58 -0
  371. package/docs/pages/quick-start/node.md +61 -0
  372. package/docs/pages/quick-start/rust.md +58 -0
  373. package/docs/pages/quick-start/workers.md +139 -0
  374. package/docs/pages/recipes/cloudflare-worker.md +115 -0
  375. package/docs/pages/recipes/extract-markdown.md +114 -0
  376. package/docs/pages/recipes/generate-then-edit.md +135 -0
  377. package/docs/pages/recipes/hello.md +94 -0
  378. package/docs/pages/recipes/images-and-vectors.md +209 -0
  379. package/docs/pages/recipes/invoice.md +226 -0
  380. package/docs/pages/recipes/links-and-outlines.md +215 -0
  381. package/docs/pages/recipes/multilingual.md +189 -0
  382. package/docs/pages/recipes/open-untrusted.md +65 -0
  383. package/docs/pages/recipes/pdf-a-archive.md +205 -0
  384. package/docs/pages/recipes/pdf-a3-invoice-with-xml.md +222 -0
  385. package/docs/pages/recipes/pdf-ua-report.md +237 -0
  386. package/docs/pages/recipes/report.md +125 -0
  387. package/docs/pages/recipes/web-worker-client.md +64 -0
  388. package/docs/pages/recipes.md +47 -0
  389. package/docs/pages/reference/changelog.md +86 -0
  390. package/docs/pages/reference/codes.md +14 -0
  391. package/docs/pages/reference/glossary.md +108 -0
  392. package/docs/pages/reference/rust.md +36 -0
  393. package/docs/pages/reference/stability.md +59 -0
  394. package/docs/pages/start/coding-agents.md +45 -0
  395. package/docs/pages/start/first-pdf.md +77 -0
  396. package/docs/pages/troubleshooting.md +74 -0
  397. package/docs/renames.json +86 -0
  398. package/docs/schemas/error.schema.json +305 -0
  399. package/docs/schemas/renames.schema.json +29 -0
  400. package/package.json +5 -3
  401. package/schemas/error.schema.json +19 -2
@@ -0,0 +1,32 @@
1
+ ---
2
+ title: "invalid-axis-value"
3
+ version: "0.2.0-alpha.3"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-axis-value/"
5
+ ---
6
+
7
+ # invalid-axis-value
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ `Font::instance` was given a NaN or infinite axis value.
15
+
16
+ ## Why
17
+
18
+ Variation coordinates are user-space numbers such as `wght` 700; NaN and infinities have no position on an axis.
19
+
20
+ ## How to fix
21
+
22
+ Pass finite values; values outside the axis range are clamped, so there is no need for infinities.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ font.instance(&[(OpenTypeTag::WEIGHT, f32::NAN)])?; // invalid-axis-value
28
+ ```
29
+
30
+ ## Data fields
31
+
32
+ - `tag`: the axis.
@@ -0,0 +1,34 @@
1
+ ---
2
+ title: "invalid-box"
3
+ version: "0.2.0-alpha.3"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-box/"
5
+ ---
6
+
7
+ # invalid-box
8
+
9
+ - Type: warning
10
+ - Kind: `input` (the input is malformed beyond what tolerance repairs)
11
+
12
+ ## What happened
13
+
14
+ A page boundary box is not four numbers; it reads as absent.
15
+
16
+ ## Why
17
+
18
+ A writer bug: a box that is not an array of four numbers (too few, or names or strings in it).
19
+
20
+ ## How to fix
21
+
22
+ Nothing; the page uses the next box in the chain.
23
+
24
+ ## Example
25
+
26
+ ```text
27
+ 3 0 obj << /Type /Page /MediaBox [0 0 612 792] /CropBox [0 0 612] >>
28
+ ```
29
+
30
+ The CropBox has three numbers, so it reads as absent and the page uses its MediaBox. `data` is `{ "key": "CropBox" }`.
31
+
32
+ ## Data fields
33
+
34
+ `key` (which box, from Lamina PDF's fixed list).
@@ -0,0 +1,32 @@
1
+ ---
2
+ title: "invalid-color"
3
+ version: "0.2.0-alpha.3"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-color/"
5
+ ---
6
+
7
+ # invalid-color
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ `Color::hex` was given a string that is not `#rgb` or `#rrggbb`.
15
+
16
+ ## Why
17
+
18
+ Hex colours are a `#` followed by three or six hexadecimal digits, in either case.
19
+
20
+ ## How to fix
21
+
22
+ Write the colour as `#3366cc` or `#36c`, or use `Color::rgb`.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ let c = Color::hex("#12345")?; // invalid-color: 5 digits
28
+ ```
29
+
30
+ ## Data fields
31
+
32
+ - `text`: the string as given (untrusted: caller text, never in the message).
@@ -0,0 +1,44 @@
1
+ ---
2
+ title: "invalid-command-line"
3
+ version: "0.2.0-alpha.3"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-command-line/"
5
+ ---
6
+
7
+ # invalid-command-line
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ The command line didn't parse: a command or flag `laminapdf` doesn't have, a missing argument, a value of the wrong form, or `-` (standard input) named as more than one input.
15
+
16
+ ## Why
17
+
18
+ The CLI checks its whole command line before it reads any file, so a typo never runs half a command. Exit code 2 tells a script that the call itself was wrong, not the document.
19
+
20
+ ## How to fix
21
+
22
+ Run the command with `--help` to see its arguments, and `laminapdf --help` for the commands. Read standard input at most once per command.
23
+
24
+ ## Example
25
+
26
+ ```console
27
+ $ laminapdf info --pages 1 report.pdf
28
+ error[invalid-command-line]: unexpected argument '--pages' found
29
+
30
+ Usage: laminapdf info [OPTIONS] <INPUT>
31
+
32
+ For more information, try '--help'.
33
+ $ echo $?
34
+ 2
35
+ ```
36
+
37
+ With `--json`, the line on standard error has the message "the command line doesn't parse" and the parser's finding in `data.detail`.
38
+
39
+ ## Data fields
40
+
41
+ Which field is there depends on what was wrong:
42
+
43
+ - `detail`: when the parser refused the line, the kind of problem it found, such as `UnknownArgument` or `MissingRequiredArgument`.
44
+ - `argument`: when a value parsed but means nothing, the value given: the angle of `pages rotate`, a `help` topic or a `--fields` key (untrusted: caller text, never in the message).
@@ -0,0 +1,34 @@
1
+ ---
2
+ title: "invalid-date"
3
+ version: "0.2.0-alpha.3"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-date/"
5
+ ---
6
+
7
+ # invalid-date
8
+
9
+ - Type: warning
10
+ - Kind: `input` (the input is malformed beyond what tolerance repairs)
11
+
12
+ ## What happened
13
+
14
+ An Info date is not a valid PDF date (ISO 32000-2 §7.9.4); the raw string is kept.
15
+
16
+ ## Why
17
+
18
+ Writers that write free-form dates.
19
+
20
+ ## How to fix
21
+
22
+ The `Info` view keeps the raw string; read it there if you need it.
23
+
24
+ ## Example
25
+
26
+ ```text
27
+ << /CreationDate (last Tuesday) >>
28
+ ```
29
+
30
+ The Info view's `creation_date` is `None` and its raw string is kept; `data` is `{ "key": "CreationDate" }`.
31
+
32
+ ## Data fields
33
+
34
+ `key` (which entry).
@@ -0,0 +1,34 @@
1
+ ---
2
+ title: "invalid-entry"
3
+ version: "0.2.0-alpha.3"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-entry/"
5
+ ---
6
+
7
+ # invalid-entry
8
+
9
+ - Type: warning
10
+ - Kind: `input` (the input is malformed beyond what tolerance repairs)
11
+
12
+ ## What happened
13
+
14
+ An entry a view reads is unreadable or of the wrong type; it reads as absent or its default.
15
+
16
+ ## Why
17
+
18
+ A writer bug: an entry of the wrong type, or a reference that does not resolve.
19
+
20
+ ## How to fix
21
+
22
+ Nothing to do; the view uses the entry's default.
23
+
24
+ ## Example
25
+
26
+ ```text
27
+ 1 0 obj << /Type /Catalog /Pages 2 0 R /Outlines (none) >>
28
+ ```
29
+
30
+ `/Outlines` should be a dictionary; the outline reads as empty and `data` is `{ "key": "Outlines" }`.
31
+
32
+ ## Data fields
33
+
34
+ `key` (from Lamina PDF's fixed list).
@@ -0,0 +1,32 @@
1
+ ---
2
+ title: "invalid-feature"
3
+ version: "0.2.0-alpha.3"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-feature/"
5
+ ---
6
+
7
+ # invalid-feature
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ An OpenType feature setting given to the shaper (`"liga=0".parse::<Feature>()`) did not parse.
15
+
16
+ ## Why
17
+
18
+ Feature settings use HarfBuzz's syntax without ranges: `tag` or `+tag` (on), `-tag` (off), `tag=N`, `tag=on` or `tag=off`, where the tag is one to four printable ASCII characters. A sign together with a value (`+liga=1`), an empty or longer tag, or a value that is not a non-negative integer is refused.
19
+
20
+ ## How to fix
21
+
22
+ Write the setting as `liga=0`, `-liga`, `smcp` or `aalt=2`, or build it with `Feature::new(OpenTypeTag::new(b"liga"), 0)`.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ let f: Feature = "liga[3:5]=0".parse()?; // invalid-feature: ranges are not supported
28
+ ```
29
+
30
+ ## Data fields
31
+
32
+ - `feature`: the setting as given (**untrusted**: caller text).
@@ -0,0 +1,32 @@
1
+ ---
2
+ title: "invalid-font"
3
+ version: "0.2.0-alpha.3"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-font/"
5
+ ---
6
+
7
+ # invalid-font
8
+
9
+ - Type: error
10
+ - Kind: `input` (the input is malformed beyond what tolerance repairs)
11
+
12
+ ## What happened
13
+
14
+ Font bytes passed to `Font::from_bytes` or `Font::from_collection` (`laminapdf-text`) could not be read as a font.
15
+
16
+ ## Why
17
+
18
+ The bytes are not an OpenType/TrueType font or collection (WOFF/WOFF2 must be decompressed first), or a table every font needs (`head`, `hhea`, `hmtx`, `maxp`) is missing or malformed.
19
+
20
+ ## How to fix
21
+
22
+ Pass the bytes of a `.ttf`, `.otf`, `.ttc` or `.otc` file; check that the file is complete.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ let err = laminapdf::Font::from_bytes(std::fs::read("font.woff2")?).unwrap_err(); // invalid-font
28
+ ```
29
+
30
+ ## Data fields
31
+
32
+ - `index`: the collection member that was asked for (0 for a single font).
@@ -0,0 +1,32 @@
1
+ ---
2
+ title: "invalid-geometry"
3
+ version: "0.2.0-alpha.3"
4
+ url: "https://docs.laminapdf.com/reference/codes/invalid-geometry/"
5
+ ---
6
+
7
+ # invalid-geometry
8
+
9
+ - Type: error
10
+ - Kind: `usage` (the caller misused the API)
11
+
12
+ ## What happened
13
+
14
+ A page size, page box, `/UserUnit`, drawing value or image size given to the builder is not usable. Drawing values are checked as the `Surface` receives them and the first bad one is reported by `PageBuilder::finish`.
15
+
16
+ ## Why
17
+
18
+ Page sizes and `/UserUnit` must be finite and positive, and page boxes, path coordinates, matrices and image rectangles finite. Line widths and dash lengths must be finite and not negative, and a dash pattern not all zeros (ISO 32000-2 §8.4.3.6). Miter limits must be at least 1, images at least one pixel wide and tall, font sizes and line heights positive, text boxes wider than 0, and destination coordinates finite.
19
+
20
+ ## How to fix
21
+
22
+ Check the values passed to `Builder::page`, `PageBuilder::user_unit`, the box setters, the `Surface` (paths, `transform`, `StrokeStyle`, `image`, `text` and `text_box` sizes, positions, boxes and line heights, `link` rectangles), destinations (`Fit` coordinates) and `Image::rgba`.
23
+
24
+ ## Example
25
+
26
+ ```rust
27
+ let page = builder.page(PageSize::new(Pt::new(0.0), Pt::new(842.0))); // invalid-geometry at finish
28
+ ```
29
+
30
+ ## Data fields
31
+
32
+ - `what`: which value was invalid (fixed text).
@@ -0,0 +1,32 @@
1
+ ---
2
+ title: "invalid-icc-profile"
3
+ version: "0.2.0-alpha.3"
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.3"
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.3"
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.3"
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.3"
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.3"
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.3"
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,38 @@
1
+ ---
2
+ title: "invalid-structure-nesting"
3
+ version: "0.2.0-alpha.3"
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.3"
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.3"
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).