@markitdownjs/image-ocr 0.1.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.
@@ -0,0 +1,2 @@
1
+ export { ImageOcrConverter } from "./ocr-converter.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { ImageOcrConverter } from "./ocr-converter.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { Converter, ConversionInput, ConversionResult } from "@markitdownjs/shared";
2
+ /**
3
+ * Converts images to text using OCR (Optical Character Recognition).
4
+ *
5
+ * Features:
6
+ * - Chunked base64 encoding to prevent stack overflow on large images
7
+ * - Language selection (defaults to English, configurable)
8
+ * - Image dimension extraction from PNG, JPEG, GIF, and BMP headers
9
+ * - OCR confidence score from tesseract.js (when available)
10
+ * - Magic byte detection for additional image formats
11
+ * - Comprehensive error messages when tesseract.js is not installed
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const converter = new ImageOcrConverter();
16
+ * const result = await converter.convert({
17
+ * data: pngBuffer,
18
+ * options: { customProperties: { ocrLanguage: "fra" } }
19
+ * });
20
+ * console.log(result.ast); // DocumentNode with image + extracted text
21
+ * console.log(result.markdown);
22
+ * ```
23
+ */
24
+ export declare class ImageOcrConverter implements Converter {
25
+ readonly id = "image-ocr";
26
+ readonly supportedMimeTypes: string[];
27
+ readonly supportedExtensions: string[];
28
+ /**
29
+ * Checks whether this converter can handle the given input.
30
+ * Validates MIME type, file extension, and magic byte signatures.
31
+ *
32
+ * @param input - The conversion input to check
33
+ * @returns True if this converter can process the input
34
+ */
35
+ canConvert(input: ConversionInput): Promise<boolean>;
36
+ /**
37
+ * Converts an image file into text via OCR, producing an AST with the image
38
+ * node and the extracted text as a paragraph.
39
+ *
40
+ * @param input - The image data as Uint8Array, ArrayBuffer, Blob, or string
41
+ * @returns A ConversionResult with the AST, Markdown, and image metadata
42
+ */
43
+ convert(input: ConversionInput): Promise<ConversionResult>;
44
+ }
45
+ //# sourceMappingURL=ocr-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ocr-converter.d.ts","sourceRoot":"","sources":["../src/ocr-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAGjB,MAAM,sBAAsB,CAAC;AAwL9B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,iBAAkB,YAAW,SAAS;IACjD,QAAQ,CAAC,EAAE,eAAe;IAC1B,QAAQ,CAAC,kBAAkB,WAOzB;IACF,QAAQ,CAAC,mBAAmB,WAS1B;IAEF;;;;;;OAMG;IACG,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IA2B1D;;;;;;OAMG;IACG,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAsIjE"}
@@ -0,0 +1,359 @@
1
+ import { createNode, readInputData, detectMimeTypeFromData, generateId, } from "@markitdownjs/shared";
2
+ /** Magic byte signatures for additional image format detection. */
3
+ const IMAGE_SIGNATURES = [
4
+ { bytes: [0x89, 0x50, 0x4e, 0x47], mime: "image/png" }, // PNG
5
+ { bytes: [0xff, 0xd8, 0xff], mime: "image/jpeg" }, // JPEG
6
+ { bytes: [0x52, 0x49, 0x46, 0x46], mime: "image/webp" }, // RIFF (WebP)
7
+ { bytes: [0x47, 0x49, 0x46, 0x38], mime: "image/gif" }, // GIF8
8
+ { bytes: [0x42, 0x4d], mime: "image/bmp" }, // BMP
9
+ { bytes: [0x49, 0x49, 0x2a, 0x00], mime: "image/tiff" }, // TIFF (little-endian)
10
+ { bytes: [0x4d, 0x4d, 0x00, 0x2a], mime: "image/tiff" }, // TIFF (big-endian)
11
+ { bytes: [0x00, 0x00, 0x01, 0x00], mime: "image/x-icon" }, // ICO
12
+ { bytes: [0x38, 0x50, 0x53, 0x00], mime: "image/vnd.adobe.photoshop" }, // PSD
13
+ ];
14
+ /**
15
+ * Converts a Uint8Array to a base64 string safely, without stack overflow.
16
+ *
17
+ * The naive approach `btoa(String.fromCharCode(...data))` fails for arrays
18
+ * larger than ~64K elements due to JavaScript's maximum call stack size.
19
+ * This function processes data in 8KB chunks to avoid the issue.
20
+ *
21
+ * @param data - The byte array to encode
22
+ * @returns A base64-encoded string
23
+ */
24
+ function uint8ArrayToBase64(data) {
25
+ let binary = "";
26
+ const chunkSize = 8192;
27
+ for (let i = 0; i < data.length; i += chunkSize) {
28
+ const chunk = data.subarray(i, i + chunkSize);
29
+ binary += String.fromCharCode(...chunk);
30
+ }
31
+ return btoa(binary);
32
+ }
33
+ /**
34
+ * Detects the MIME type of an image from its binary data using magic byte signatures.
35
+ * Falls back to the shared `detectMimeTypeFromData` utility.
36
+ *
37
+ * @param data - The raw image bytes
38
+ * @returns The detected MIME type, or undefined if unrecognized
39
+ */
40
+ function detectImageMimeType(data) {
41
+ if (data.length < 2)
42
+ return undefined;
43
+ for (const sig of IMAGE_SIGNATURES) {
44
+ if (data.length >= sig.bytes.length) {
45
+ const match = sig.bytes.every((byte, idx) => data[idx] === byte);
46
+ if (match)
47
+ return sig.mime;
48
+ }
49
+ }
50
+ return detectMimeTypeFromData(data);
51
+ }
52
+ /**
53
+ * Attempts to extract image dimensions from the raw bytes.
54
+ * Supports PNG (IHDR chunk) and JPEG (SOF marker) formats.
55
+ *
56
+ * @param data - The raw image bytes
57
+ * @param mimeType - The detected MIME type
58
+ * @returns An object with width and height, or undefined if unable to parse
59
+ */
60
+ function extractImageDimensions(data, mimeType) {
61
+ try {
62
+ if (mimeType === "image/png" && data.length >= 24) {
63
+ // PNG: width at offset 16 (4 bytes BE), height at offset 20 (4 bytes BE)
64
+ const width = (data[16] << 24) | (data[17] << 16) | (data[18] << 8) | data[19];
65
+ const height = (data[20] << 24) | (data[21] << 16) | (data[22] << 8) | data[23];
66
+ if (width > 0 && height > 0)
67
+ return { width, height };
68
+ }
69
+ if (mimeType === "image/jpeg" && data.length >= 4) {
70
+ // JPEG: scan for SOF0 (0xC0) or SOF2 (0xC2) marker
71
+ let offset = 2;
72
+ while (offset < data.length - 9) {
73
+ if (data[offset] !== 0xff)
74
+ break;
75
+ const marker = data[offset + 1];
76
+ if (marker === 0xc0 || marker === 0xc2) {
77
+ const height = (data[offset + 5] << 8) | data[offset + 6];
78
+ const width = (data[offset + 7] << 8) | data[offset + 8];
79
+ if (width > 0 && height > 0)
80
+ return { width, height };
81
+ }
82
+ // Skip to next marker
83
+ const segmentLength = (data[offset + 2] << 8) | data[offset + 3];
84
+ offset += 2 + segmentLength;
85
+ }
86
+ }
87
+ if (mimeType === "image/gif" && data.length >= 10) {
88
+ // GIF: width at offset 6 (2 bytes LE), height at offset 8 (2 bytes LE)
89
+ const width = data[6] | (data[7] << 8);
90
+ const height = data[8] | (data[9] << 8);
91
+ if (width > 0 && height > 0)
92
+ return { width, height };
93
+ }
94
+ if (mimeType === "image/bmp" && data.length >= 26) {
95
+ // BMP: width at offset 18 (4 bytes LE), height at offset 22 (4 bytes LE)
96
+ const width = data[18] | (data[19] << 8) | (data[20] << 16) | (data[21] << 24);
97
+ const height = data[22] | (data[23] << 8) | (data[24] << 16) | (data[25] << 24);
98
+ if (width > 0 && height > 0)
99
+ return { width, height: Math.abs(height) };
100
+ }
101
+ }
102
+ catch {
103
+ // Dimension extraction is best-effort; don't fail conversion
104
+ }
105
+ return undefined;
106
+ }
107
+ /**
108
+ * Renders an array of AST nodes into a Markdown string.
109
+ * This is the local renderMarkdown helper for the image-ocr converter.
110
+ *
111
+ * @param nodes - The AST nodes to render
112
+ * @returns The rendered Markdown string
113
+ */
114
+ function renderMarkdown(nodes) {
115
+ const parts = [];
116
+ for (const node of nodes) {
117
+ parts.push(renderNode(node));
118
+ }
119
+ return parts.join("\n\n").replace(/\n{3,}/g, "\n\n").trim();
120
+ }
121
+ /**
122
+ * Renders a single AST node into its Markdown representation.
123
+ *
124
+ * @param node - The AST node to render
125
+ * @returns The Markdown string for this node
126
+ */
127
+ function renderNode(node) {
128
+ switch (node.type) {
129
+ case "heading": {
130
+ const n = node;
131
+ return `${"#".repeat(n.level)} ${renderNodes(n.children)}`;
132
+ }
133
+ case "paragraph": {
134
+ return renderNodes(node.children);
135
+ }
136
+ case "image": {
137
+ const n = node;
138
+ return `![${n.alt ?? ""}](${n.src}${n.title ? ` "${n.title}"` : ""})`;
139
+ }
140
+ case "code": {
141
+ const n = node;
142
+ return "```" + (n.language ?? "") + "\n" + n.value + "\n```";
143
+ }
144
+ case "text": {
145
+ return node.value;
146
+ }
147
+ default:
148
+ if ("children" in node && Array.isArray(node.children)) {
149
+ return renderNodes(node.children);
150
+ }
151
+ return "";
152
+ }
153
+ }
154
+ /**
155
+ * Recursively renders an array of AST nodes into a single string.
156
+ *
157
+ * @param nodes - The AST nodes to render
158
+ * @returns The concatenated rendered output
159
+ */
160
+ function renderNodes(nodes) {
161
+ return nodes.map((n) => renderNode(n)).join("");
162
+ }
163
+ /**
164
+ * Converts images to text using OCR (Optical Character Recognition).
165
+ *
166
+ * Features:
167
+ * - Chunked base64 encoding to prevent stack overflow on large images
168
+ * - Language selection (defaults to English, configurable)
169
+ * - Image dimension extraction from PNG, JPEG, GIF, and BMP headers
170
+ * - OCR confidence score from tesseract.js (when available)
171
+ * - Magic byte detection for additional image formats
172
+ * - Comprehensive error messages when tesseract.js is not installed
173
+ *
174
+ * @example
175
+ * ```ts
176
+ * const converter = new ImageOcrConverter();
177
+ * const result = await converter.convert({
178
+ * data: pngBuffer,
179
+ * options: { customProperties: { ocrLanguage: "fra" } }
180
+ * });
181
+ * console.log(result.ast); // DocumentNode with image + extracted text
182
+ * console.log(result.markdown);
183
+ * ```
184
+ */
185
+ export class ImageOcrConverter {
186
+ id = "image-ocr";
187
+ supportedMimeTypes = [
188
+ "image/png",
189
+ "image/jpeg",
190
+ "image/webp",
191
+ "image/tiff",
192
+ "image/bmp",
193
+ "image/gif",
194
+ ];
195
+ supportedExtensions = [
196
+ ".png",
197
+ ".jpg",
198
+ ".jpeg",
199
+ ".webp",
200
+ ".tiff",
201
+ ".tif",
202
+ ".bmp",
203
+ ".gif",
204
+ ];
205
+ /**
206
+ * Checks whether this converter can handle the given input.
207
+ * Validates MIME type, file extension, and magic byte signatures.
208
+ *
209
+ * @param input - The conversion input to check
210
+ * @returns True if this converter can process the input
211
+ */
212
+ async canConvert(input) {
213
+ if (input.mimeType && this.supportedMimeTypes.includes(input.mimeType)) {
214
+ return true;
215
+ }
216
+ if (input.fileName) {
217
+ const ext = input.fileName
218
+ .slice(input.fileName.lastIndexOf("."))
219
+ .toLowerCase();
220
+ if (this.supportedExtensions.includes(ext)) {
221
+ return true;
222
+ }
223
+ }
224
+ try {
225
+ const data = await readInputData(input.data);
226
+ const detected = detectImageMimeType(data);
227
+ if (detected && this.supportedMimeTypes.includes(detected)) {
228
+ return true;
229
+ }
230
+ }
231
+ catch {
232
+ return false;
233
+ }
234
+ return false;
235
+ }
236
+ /**
237
+ * Converts an image file into text via OCR, producing an AST with the image
238
+ * node and the extracted text as a paragraph.
239
+ *
240
+ * @param input - The image data as Uint8Array, ArrayBuffer, Blob, or string
241
+ * @returns A ConversionResult with the AST, Markdown, and image metadata
242
+ */
243
+ async convert(input) {
244
+ const startTime = performance.now();
245
+ const data = await readInputData(input.data);
246
+ const mimeType = input.mimeType ?? detectImageMimeType(data) ?? "image/png";
247
+ const imageId = generateId();
248
+ // Extract image dimensions (best-effort, from raw bytes)
249
+ const dimensions = extractImageDimensions(data, mimeType);
250
+ // Determine OCR language from options (default: English)
251
+ const ocrLanguage = input.options?.customProperties?.ocrLanguage ?? "eng";
252
+ // Perform OCR
253
+ let ocrText = "";
254
+ let ocrConfidence;
255
+ let ocrSuccess = false;
256
+ try {
257
+ const Tesseract = await import("tesseract.js");
258
+ const blob = new Blob([new Uint8Array(data)], { type: mimeType });
259
+ const result = await Tesseract.recognize(blob, ocrLanguage, {
260
+ logger: undefined, // suppress verbose logging
261
+ });
262
+ ocrText = result.data.text.trim();
263
+ ocrConfidence = result.data.confidence;
264
+ ocrSuccess = ocrText.length > 0;
265
+ }
266
+ catch (err) {
267
+ const errorMessage = err instanceof Error ? err.message : String(err);
268
+ if (errorMessage.includes("Cannot find module") ||
269
+ errorMessage.includes("MODULE_NOT_FOUND") ||
270
+ errorMessage.includes("tesseract")) {
271
+ ocrText =
272
+ "[OCR unavailable: tesseract.js is not installed. " +
273
+ "Install it with: npm install tesseract.js]";
274
+ }
275
+ else {
276
+ ocrText = `[OCR failed: ${errorMessage}]`;
277
+ }
278
+ }
279
+ // Build the base64 data URL (using safe chunked encoding)
280
+ const base64 = uint8ArrayToBase64(new Uint8Array(data));
281
+ const dataUrl = `data:${mimeType};base64,${base64}`;
282
+ // Build the AST nodes
283
+ const children = [];
284
+ // Image node with dimension metadata
285
+ const imageNode = createNode({
286
+ type: "image",
287
+ src: dataUrl,
288
+ alt: "OCR source image",
289
+ data: new Uint8Array(data),
290
+ mimeType,
291
+ width: dimensions?.width,
292
+ height: dimensions?.height,
293
+ });
294
+ children.push(imageNode);
295
+ // OCR result paragraph with confidence metadata
296
+ if (ocrText) {
297
+ const textNode = createNode({
298
+ type: "text",
299
+ value: ocrText,
300
+ });
301
+ const paragraphNode = createNode({
302
+ type: "paragraph",
303
+ children: [textNode],
304
+ // Attach confidence as custom property
305
+ confidence: ocrConfidence,
306
+ ocrSuccess,
307
+ ocrLanguage,
308
+ });
309
+ children.push(paragraphNode);
310
+ }
311
+ const documentNode = createNode({
312
+ type: "document",
313
+ children,
314
+ });
315
+ const markdown = renderMarkdown(children);
316
+ const endTime = performance.now();
317
+ const stats = {
318
+ startTime,
319
+ endTime,
320
+ duration: endTime - startTime,
321
+ inputSize: data.length,
322
+ outputSize: new TextEncoder().encode(markdown).byteLength,
323
+ };
324
+ const metadata = {
325
+ wordCount: ocrText.split(/\s+/).filter(Boolean).length,
326
+ format: mimeType,
327
+ customProperties: {
328
+ imageId,
329
+ width: dimensions?.width,
330
+ height: dimensions?.height,
331
+ ocrLanguage,
332
+ ocrConfidence,
333
+ ocrSuccess,
334
+ },
335
+ };
336
+ return {
337
+ markdown,
338
+ metadata,
339
+ assets: [],
340
+ tables: [],
341
+ images: [
342
+ {
343
+ id: imageId,
344
+ data: new Uint8Array(data),
345
+ mimeType,
346
+ alt: "OCR source image",
347
+ width: dimensions?.width,
348
+ height: dimensions?.height,
349
+ },
350
+ ],
351
+ headings: [],
352
+ ast: documentNode,
353
+ format: "markdown",
354
+ converterId: this.id,
355
+ stats,
356
+ };
357
+ }
358
+ }
359
+ //# sourceMappingURL=ocr-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ocr-converter.js","sourceRoot":"","sources":["../src/ocr-converter.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@markitdownjs/image-ocr",
3
+ "version": "0.1.0",
4
+ "description": "Image OCR converter for MarkItDownJS",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "dependencies": {
20
+ "@markitdownjs/shared": "0.1.0"
21
+ },
22
+ "peerDependencies": {
23
+ "tesseract.js": ">=5.0.0"
24
+ },
25
+ "peerDependenciesMeta": {
26
+ "tesseract.js": {
27
+ "optional": true
28
+ }
29
+ },
30
+ "devDependencies": {
31
+ "tesseract.js": "^5.0.0",
32
+ "typescript": "^5.5.0"
33
+ },
34
+ "scripts": {
35
+ "build": "tsc --project tsconfig.json",
36
+ "dev": "tsc --watch --project tsconfig.json",
37
+ "typecheck": "tsc --noEmit",
38
+ "clean": "rm -rf dist tsconfig.tsbuildinfo"
39
+ }
40
+ }