| from __future__ import annotations |
| from pathlib import Path |
| import io |
| import fitz |
| from PIL import Image |
| import pytesseract |
| from src.services.tesseract_service import TesseractService |
|
|
| class OfflineOCRAgent: |
| name = "ocr_agent" |
|
|
| def __init__(self): |
| self.tesseract = TesseractService() |
|
|
| def run(self, input_pdf: Path, output_pdf: Path, language: str = "eng") -> Path: |
| self.tesseract.ensure_available() |
| src = fitz.open(input_pdf) |
| out = fitz.open() |
| for page in src: |
| pix = page.get_pixmap(dpi=300, alpha=False) |
| img = Image.open(io.BytesIO(pix.tobytes("png"))) |
| pdf_bytes = pytesseract.image_to_pdf_or_hocr(img, extension="pdf", lang=language) |
| ocr_doc = fitz.open("pdf", pdf_bytes) |
| out.insert_pdf(ocr_doc) |
| output_pdf.parent.mkdir(parents=True, exist_ok=True) |
| out.save(output_pdf, garbage=4, deflate=True, clean=True) |
| return output_pdf |
|
|