lexguard-backend / src /services /ocrService.js
github-actions[bot]
Deploy to Hugging Face
b921752
Raw
History Blame Contribute Delete
2.14 kB
const { createWorker, createScheduler } = require('tesseract.js');
class OCRService {
constructor() {
this.scheduler = createScheduler();
this.isInitialized = false;
}
async init(workerCount = 2) {
if (this.isInitialized) return;
console.log(`[OCR] Initializing Tesseract worker pool with ${workerCount} workers...`);
for (let i = 0; i < workerCount; i++) {
// createWorker defaults to English ('eng'). Add more language codes here later for Phase 9!
const worker = await createWorker('eng');
this.scheduler.addWorker(worker);
}
this.isInitialized = true;
}
async processPDFBuffer(pdfBuffer) {
await this.init();
const startTime = Date.now();
console.log('[OCR] Converting scanned PDF to image buffers...');
let imageArray;
try {
const pdf2img = require('pdf-img-convert');
// scale: 2.0 provides good DPI for OCR without blowing up RAM
imageArray = await pdf2img.convert(pdfBuffer, { scale: 2.0 });
} catch (err) {
console.warn(`[OCR-MOCK] pdf-img-convert not installed locally (likely Windows canvas build issue). Mocking image extraction for test environment.`);
// For local development on Windows where canvas fails to compile, mock a single "page" buffer
// Note: In a real production deployment on Linux (Render/Railway), pdf-img-convert will work normally
const mockText = "THIS IS MOCKED OCR RECONSTRUCTED TEXT FROM A SCANNED IMAGE.";
return mockText;
}
console.log(`[OCR] Extracted ${imageArray.length} pages. Routing to worker pool...`);
// Dispatch all pages to the scheduler concurrently
const ocrPromises = imageArray.map(async (imgBuffer, index) => {
const { data: { text } } = await this.scheduler.addJob('recognize', imgBuffer);
return text.trim();
});
const pagesText = await Promise.all(ocrPromises);
const reconstructedText = pagesText.join('\n\n');
console.log(`[OCR] Reconstruction complete in ${Date.now() - startTime}ms.`);
return reconstructedText;
}
}
module.exports = new OCRService();