@build-qube/papyra-native-wasm32-wasi 0.0.4 → 0.2.0

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@build-qube/papyra-native-wasm32-wasi",
3
- "version": "0.0.4",
3
+ "version": "0.2.0",
4
4
  "main": "papyra.wasi.cjs",
5
5
  "files": [
6
6
  "papyra.wasm32-wasi.wasm",
@@ -601,8 +601,12 @@ try {
601
601
  throw __attachCleanupErrors(error, cleanupErrors)
602
602
  }
603
603
  export default __napiModule.exports
604
+ export const PageImage = __napiModule.exports.PageImage
604
605
  export const PdfDocument = __napiModule.exports.PdfDocument
605
606
  export const backendName = __napiModule.exports.backendName
606
607
  export const configureThreadPool = __napiModule.exports.configureThreadPool
608
+ export const encodeBitmap = __napiModule.exports.encodeBitmap
609
+ export const encodeBitmapSync = __napiModule.exports.encodeBitmapSync
610
+ export const ImageFormat = __napiModule.exports.ImageFormat
607
611
  export const reserveMemory = __napiModule.exports.reserveMemory
608
612
  export const runtime = __napiModule.exports.runtime
package/papyra.wasi.cjs CHANGED
@@ -1,4 +1,4 @@
1
- // napi-rs-artifact-metadata:{"version":2,"rootEntry":"index.js","exports":["PdfDocument","backendName","configureThreadPool","reserveMemory","runtime"],"managedRootEntries":["browser.js","index.js","papyra.wasm","papyra.debug.wasm"]}
1
+ // napi-rs-artifact-metadata:{"version":2,"rootEntry":"index.js","exports":["PageImage","PdfDocument","backendName","configureThreadPool","encodeBitmap","encodeBitmapSync","ImageFormat","reserveMemory","runtime"],"managedRootEntries":["browser.js","index.js","papyra.wasm","papyra.debug.wasm"]}
2
2
  /* eslint-disable */
3
3
  /* prettier-ignore */
4
4
 
@@ -921,8 +921,12 @@ try {
921
921
  throw rollback.error
922
922
  }
923
923
  module.exports = __napiModule.exports
924
+ module.exports.PageImage = __napiModule.exports.PageImage
924
925
  module.exports.PdfDocument = __napiModule.exports.PdfDocument
925
926
  module.exports.backendName = __napiModule.exports.backendName
926
927
  module.exports.configureThreadPool = __napiModule.exports.configureThreadPool
928
+ module.exports.encodeBitmap = __napiModule.exports.encodeBitmap
929
+ module.exports.encodeBitmapSync = __napiModule.exports.encodeBitmapSync
930
+ module.exports.ImageFormat = __napiModule.exports.ImageFormat
927
931
  module.exports.reserveMemory = __napiModule.exports.reserveMemory
928
932
  module.exports.runtime = __napiModule.exports.runtime
package/papyra.wasi.d.cts CHANGED
@@ -1,16 +1,83 @@
1
1
  /* auto-generated by NAPI-RS */
2
2
  /* eslint-disable */
3
+ /**
4
+ * A rendered page kept in Rust, encoded on demand.
5
+ *
6
+ * The pixels deliberately never cross into JS. A 42x30in drawing at 150 DPI is 6.5 MB
7
+ * raw and a fraction of that encoded, so for export the raw buffer is pure overhead.
8
+ * There is no accessor for it: use `renderPageAsync` when you want the pixels, this
9
+ * when you want a file.
10
+ */
11
+ export declare class PageImage {
12
+ get width(): number
13
+ get height(): number
14
+ /** Size of the *raw* bitmap held in Rust. Encoded output is much smaller. */
15
+ get byteLength(): number
16
+ /** Encode off the JS thread. */
17
+ encode(format: ImageFormat, quality?: number | undefined | null, signal?: AbortSignal | undefined | null): Promise<Uint8Array>
18
+ /**
19
+ * Blocks the calling thread. Routed through the same `Task` as the async path so
20
+ * the two cannot drift.
21
+ */
22
+ encodeSync(format: ImageFormat, quality?: number | undefined | null): Uint8Array
23
+ /**
24
+ * Encode straight to a `data:` URL, so neither the pixels nor the encoded bytes
25
+ * cross the boundary — only the finished string does.
26
+ */
27
+ toDataUrl(format: ImageFormat, quality?: number | undefined | null, signal?: AbortSignal | undefined | null): Promise<string>
28
+ }
29
+
3
30
  export declare class PdfDocument {
4
31
  /** Load a PDF from raw bytes. */
5
32
  static load(data: Uint8Array): PdfDocument
6
33
  /** Load an encrypted PDF. */
7
34
  static loadWithPassword(data: Uint8Array, password: string): PdfDocument
8
35
  get pageCount(): number
36
+ /** The PDF specification version the file declares, e.g. `"1.7"`. */
37
+ get pdfVersion(): string | null
9
38
  pageSize(index: number): PageDimensions
10
39
  /** Render one page on the calling thread. Blocks; prefer `renderPageAsync`. */
11
40
  renderPage(index: number, dpi?: number | undefined | null): RenderedPage
12
41
  /** Render one page off the JS thread. Several of these run concurrently. */
13
42
  renderPageAsync(index: number, dpi?: number | undefined | null): Promise<RenderedPage>
43
+ /** Render one page and keep it in Rust, for encoding. The pixels never reach JS. */
44
+ renderPageImageAsync(index: number, dpi?: number | undefined | null, signal?: AbortSignal | undefined | null): Promise<PageImage>
45
+ /**
46
+ * Convert one page to a standalone SVG document, off the JS thread.
47
+ *
48
+ * There is no DPI: an SVG carries the page's own point dimensions and rasterises at
49
+ * whatever size it is drawn.
50
+ */
51
+ renderPageSvgAsync(index: number, whiteBackground?: boolean | undefined | null, signal?: AbortSignal | undefined | null): Promise<string>
52
+ /** Extract the text of one page, off the JS thread. */
53
+ pageTextAsync(index: number): Promise<PageText>
54
+ /** Extract `[start, end)` in one async task, parallelised internally with rayon. */
55
+ pageTextsAsync(start: number, end: number): Promise<Array<PageText>>
56
+ /**
57
+ * Read the document outline (bookmarks), in pre-order.
58
+ *
59
+ * Resolves to an empty array when the document has no outline, which is the
60
+ * common case.
61
+ */
62
+ outline(): Promise<Array<OutlineEntry>>
63
+ /**
64
+ * Read the document information dictionary.
65
+ *
66
+ * Synchronous: hayro parses it while loading, so this only decodes eight strings.
67
+ */
68
+ info(): DocumentInfo
69
+ /**
70
+ * Read the links on one page.
71
+ *
72
+ * Resolves to an empty array for a page with no links, which is most pages.
73
+ */
74
+ pageLinks(index: number): Promise<Array<PageLink>>
75
+ /**
76
+ * Read the label printed on each page, one entry per page.
77
+ *
78
+ * Resolves to an empty array when the document defines no `/PageLabels`.
79
+ */
80
+ pageLabels(): Promise<Array<string>>
14
81
  /** Render `[start, end)` in one async task, parallelised internally with rayon. */
15
82
  renderPagesAsync(start: number, end: number, dpi?: number | undefined | null): Promise<Array<RenderedPage>>
16
83
  }
@@ -27,6 +94,70 @@ export declare function backendName(): string
27
94
  */
28
95
  export declare function configureThreadPool(threads: number, stackSizeMb?: number | undefined | null): number
29
96
 
97
+ /** The document information dictionary. Every field is independently optional. */
98
+ export interface DocumentInfo {
99
+ title?: string
100
+ author?: string
101
+ subject?: string
102
+ keywords?: string
103
+ /** The application that authored the original document, e.g. `AutoCAD`. */
104
+ creator?: string
105
+ /** The application that wrote the PDF itself, e.g. `Ghostscript`. */
106
+ producer?: string
107
+ /** ISO 8601, converted from the PDF's own date form. */
108
+ created?: string
109
+ modified?: string
110
+ }
111
+
112
+ /** Encode a raw RGBA8 buffer off the JS thread. */
113
+ export declare function encodeBitmap(data: Uint8Array, width: number, height: number, stride: number, format: ImageFormat, quality?: number | undefined | null, signal?: AbortSignal | undefined | null): Promise<Uint8Array>
114
+
115
+ /** Blocks the calling thread. Same `Task` as [`encode_bitmap`]. */
116
+ export declare function encodeBitmapSync(data: Uint8Array, width: number, height: number, stride: number, format: ImageFormat, quality?: number | undefined | null): Uint8Array
117
+
118
+ /**
119
+ * Container for encoded output. Every encoder here is pure Rust, which is what keeps
120
+ * the wasm target buildable — so there is no lossy WebP and no AVIF.
121
+ */
122
+ export declare const enum ImageFormat {
123
+ /** Lossless VP8L. ~3x smaller than PNG on page content, for about the same cost. */
124
+ WebP = 'webp',
125
+ /** Lossless, universally supported. */
126
+ Png = 'png',
127
+ /** The only lossy option, and the only one with a quality knob. No alpha. */
128
+ Jpeg = 'jpeg'
129
+ }
130
+
131
+ /**
132
+ * Where an outline entry points. Coordinates are PDF points from the page's
133
+ * bottom-left; `null` means "leave this axis unchanged".
134
+ */
135
+ export interface OutlineDestination {
136
+ /** 0-based page index. */
137
+ page: number
138
+ /** `"XYZ"`, `"Fit"`, `"FitH"`, `"FitV"`, `"FitR"`, `"FitB"`, `"FitBH"` or `"FitBV"`. */
139
+ kind: string
140
+ left?: number
141
+ top?: number
142
+ right?: number
143
+ bottom?: number
144
+ /** Absent for every kind but `"XYZ"`, where a zoom of 0 also reads as absent. */
145
+ zoom?: number
146
+ }
147
+
148
+ /** One outline entry. Flat and in pre-order; `level` carries the tree. */
149
+ export interface OutlineEntry {
150
+ title: string
151
+ /** Nesting depth. Top-level bookmarks are 0. */
152
+ level: number
153
+ /** `null` for a container with no destination, or one that leaves this document. */
154
+ dest?: OutlineDestination
155
+ bold: boolean
156
+ italic: boolean
157
+ /** The entry should start expanded. */
158
+ open: boolean
159
+ }
160
+
30
161
  export interface PageDimensions {
31
162
  /** Width in PDF points (1/72 inch). */
32
163
  width: number
@@ -34,6 +165,43 @@ export interface PageDimensions {
34
165
  height: number
35
166
  }
36
167
 
168
+ /**
169
+ * One link annotation.
170
+ *
171
+ * The rectangle is in the page-as-rendered space — pixels from the top-left at
172
+ * 72 DPI, rotation and crop box applied — so it is the same space as `PageText` and
173
+ * scales to any render with one multiply.
174
+ */
175
+ export interface PageLink {
176
+ x0: number
177
+ y0: number
178
+ x1: number
179
+ y1: number
180
+ /** Set when the link points into this document; `uri` is then absent. */
181
+ dest?: OutlineDestination
182
+ /** Set when the link points at a URI; `dest` is then absent. */
183
+ uri?: string
184
+ /** The annotation's `/Contents` — its tooltip. Usually absent. */
185
+ alt?: string
186
+ }
187
+
188
+ /**
189
+ * The text of one page.
190
+ *
191
+ * Coordinates are the page as rendered at 72 DPI — pixels from the top-left with y
192
+ * increasing downwards, rotation and crop box applied — so scaling to any other
193
+ * render is one multiply.
194
+ */
195
+ export interface PageText {
196
+ lines: Array<TextLine>
197
+ /**
198
+ * Glyphs drawn that no encoding could map back to Unicode. Non-zero with no lines
199
+ * means the page has text that cannot be searched, which is a different answer
200
+ * than a page with no text at all.
201
+ */
202
+ undecodedGlyphs: number
203
+ }
204
+
37
205
  export interface RenderedPage {
38
206
  width: number
39
207
  height: number
@@ -56,3 +224,30 @@ export declare function reserveMemory(megabytes: number): number
56
224
 
57
225
  /** `"native"` or `"wasm"`. The wrapper uses this to pick a concurrency strategy. */
58
226
  export declare function runtime(): string
227
+
228
+ /**
229
+ * A run of glyphs sharing one baseline.
230
+ *
231
+ * Geometry runs along the baseline rather than being a rectangle per character: a
232
+ * page is thousands of glyphs, and four numbers each is far more than a search needs.
233
+ * One origin, one direction and a list of distances reconstructs any substring's
234
+ * quadrilateral exactly, rotated text included.
235
+ */
236
+ export interface TextLine {
237
+ text: string
238
+ /**
239
+ * Distance along the baseline to the start of each character, plus the end of the
240
+ * last — one more entry than the string has characters.
241
+ */
242
+ offsets: Float32Array
243
+ /** Start of the baseline. */
244
+ x: number
245
+ y: number
246
+ /** Unit vector along the baseline. `(1, 0)` for ordinary horizontal text. */
247
+ dx: number
248
+ dy: number
249
+ /** Extent above the baseline, perpendicular to it. */
250
+ ascent: number
251
+ /** Extent below the baseline. */
252
+ descent: number
253
+ }
Binary file