#!/usr/bin/env python3 """ Test script to verify OCR functionality. Run with: python ocr_test.py """ import os import sys import subprocess import platform from PIL import Image, ImageDraw, ImageFont # ANSI color codes RED = '\033[91m' GREEN = '\033[92m' YELLOW = '\033[93m' BLUE = '\033[94m' MAGENTA = '\033[95m' CYAN = '\033[96m' RESET = '\033[0m' # Logging levels DEBUG = 0 INFO = 1 WARNING = 2 ERROR = 3 LOG_LEVEL = INFO # Set default log level def log(message, level=INFO): """Print a formatted log message with color and level.""" if level < LOG_LEVEL: return if level == DEBUG: color = CYAN level_str = "DEBUG" elif level == INFO: color = GREEN level_str = "INFO" elif level == WARNING: color = YELLOW level_str = "WARNING" elif level == ERROR: color = RED level_str = "ERROR" else: color = RESET level_str = "UNKNOWN" print(f"{color}[{level_str}]{RESET} {message}") def print_header(message): """Print a formatted header message""" print("=" * 60) print(message) print("=" * 60) def test_tesseract(): """Test if Tesseract OCR is working properly""" log("Testing Tesseract OCR installation...", INFO) try: # First, check if pytesseract is installed try: import pytesseract log(f"{GREEN}✓{RESET} pytesseract module is installed", INFO) except ImportError: log(f"{RED}✗{RESET} pytesseract module is not installed. Install it with: pip install pytesseract", ERROR) return False # Check Tesseract version try: version = pytesseract.get_tesseract_version() log(f"{GREEN}✓{RESET} Tesseract version: {version}", INFO) except Exception as e: log(f"{RED}✗{RESET} Failed to get Tesseract version: {e}", ERROR) log("\nThis usually means Tesseract is not installed or not in your PATH.", WARNING) system = platform.system().lower() if system == "darwin": log(" - macOS: Install with 'brew install tesseract'", WARNING) elif system == "linux": log(" - Linux: Install with 'sudo apt-get install tesseract-ocr'", WARNING) elif system == "windows": log(" - Windows: Install from https://github.com/UB-Mannheim/tesseract/wiki", WARNING) log(" Make sure to check 'Add to PATH' during installation", WARNING) return False # Try to get list of available languages try: result = subprocess.run(['tesseract', '--list-langs'], capture_output=True, text=True) if result.returncode == 0: log(f"{GREEN}✓{RESET} Available languages:", INFO) for lang in result.stdout.strip().split('\n')[1:]: log(f" - {lang}", INFO) else: log(f"{YELLOW}✗{RESET} Error getting languages: {result.stderr}", WARNING) except Exception as e: log(f"{YELLOW}✗{RESET} Error checking languages: {e}", WARNING) # Create a simple test image with text try: # Create a white image img = Image.new('RGB', (400, 100), color='white') d = ImageDraw.Draw(img) # Try to use a standard font font = None try: # Try to find a font that exists on most systems system_fonts = [] if platform.system().lower() == "darwin": # macOS system_fonts = [ "/System/Library/Fonts/Helvetica.ttc", "/System/Library/Fonts/Arial.ttf", "/System/Library/Fonts/Times.ttc" ] elif platform.system().lower() == "windows": system_fonts = [ "C:\\Windows\\Fonts\\arial.ttf", "C:\\Windows\\Fonts\\times.ttf" ] else: # Linux system_fonts = [ "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", "/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf" ] for font_path in system_fonts: if os.path.exists(font_path): font = ImageFont.truetype(font_path, 36) break except Exception: pass # Add text (with or without font) if font: d.text((20, 30), "Tesseract OCR Test", fill="black", font=font) else: d.text((20, 30), "Tesseract OCR Test", fill="black") # Save the image img.save("test_ocr.png") log(f"{GREEN}✓{RESET} Created test image: test_ocr.png", INFO) # Try OCR on the image text = pytesseract.image_to_string(Image.open("test_ocr.png")) log(f"OCR result: '{text.strip()}'", DEBUG) # Attempt with explicit config for better results if "Tesseract OCR Test" not in text: log("Trying with explicit configuration...", INFO) text = pytesseract.image_to_string( Image.open("test_ocr.png"), config="--psm 6 --oem 3" ) log(f"Second OCR result: '{text.strip()}'", DEBUG) if "Tesseract OCR Test" in text: log(f"{GREEN}✅{RESET} OCR TEST PASSED: Text was correctly recognized", INFO) else: log(f"{RED}❌{RESET} OCR TEST FAILED: Text was not correctly recognized", ERROR) log("\nTroubleshooting tips:", WARNING) log("1. Make sure you have a newer version of Tesseract (4.0+)", WARNING) log("2. Install additional languages if needed", WARNING) log("3. Try running 'tesseract test_ocr.png stdout' directly in terminal", WARNING) # Keep the image for investigation log("Test image saved as 'test_ocr.png' for your reference", INFO) return "Tesseract OCR Test" in text except Exception as e: log(f"{RED}✗{RESET} Error during image creation test: {e}", ERROR) return False except Exception as e: log(f"{RED}❌{RESET} Tesseract OCR test failed: {e}", ERROR) log("\nPossible solutions:", WARNING) log("1. Make sure Tesseract is installed:", WARNING) log(" - macOS: brew install tesseract", WARNING) log(" - Ubuntu/Debian: sudo apt-get install tesseract-ocr", WARNING) log(" - Windows: Install from https://github.com/UB-Mannheim/tesseract/wiki", WARNING) log("2. Verify it's in your PATH by running 'tesseract --version' in terminal", WARNING) log("3. Check that pytesseract is correctly installed: pip install pytesseract", WARNING) return False def test_pdf_to_image(): """Test PDF to image conversion with pdf2image""" log("\nTesting PDF to image conversion...", INFO) try: try: # Check if pdf2image is installed try: import pdf2image log(f"{GREEN}✓{RESET} pdf2image module is installed", INFO) except ImportError: log(f"{RED}✗{RESET} pdf2image module is not installed. Install it with: pip install pdf2image", ERROR) log(" Then run the script again to complete the test.", WARNING) return False # Check Poppler try: from pdf2image.exceptions import PDFInfoNotInstalledError # Create a tiny test PDF test_pdf_path = "test_pdf.pdf" img = Image.new('RGB', (100, 100), color='white') img.save(test_pdf_path) # Try to get info using pdf2image try: pdf2image.pdfinfo_from_path(test_pdf_path) log(f"{GREEN}✓{RESET} Poppler is installed and working", INFO) # Try to convert a page try: images = pdf2image.convert_from_path(test_pdf_path, dpi=72) if images and len(images) > 0: log(f"{GREEN}✓{RESET} Successfully converted PDF to {len(images)} image(s)", INFO) # Save the first image for reference images[0].save("test_pdf_conversion.png") log(f"{GREEN}✓{RESET} Saved converted image as 'test_pdf_conversion.png'", INFO) else: log(f"{RED}✗{RESET} PDF conversion failed - no images returned", ERROR) return False except Exception as e: log(f"{RED}✗{RESET} PDF conversion failed: {e}", ERROR) return False except PDFInfoNotInstalledError: log(f"{RED}✗{RESET} Poppler is not installed or not in PATH", ERROR) system = platform.system().lower() if system == "darwin": log(" - macOS: Install with 'brew install poppler'", WARNING) elif system == "linux": log(" - Linux: Install with 'sudo apt-get install poppler-utils'", WARNING) elif system == "windows": log(" - Windows: Download from https://github.com/oschwartz10612/poppler-windows/releases", WARNING) log(" and add the bin directory to your PATH", WARNING) return False except Exception as e: log(f"{RED}✗{RESET} Error testing Poppler: {e}", ERROR) return False # Clean up try: os.remove(test_pdf_path) os.remove("test_pdf_conversion.png") except OSError as e: log(f"{YELLOW}✗{RESET} Could not clean up temporary files: {e}", WARNING) return True except ImportError: log(f"{RED}✗{RESET} Could not properly test Poppler installation", ERROR) return False except Exception as e: log(f"{RED}✗{RESET} Error importing pdf2image: {e}", ERROR) log(" Make sure you have installed all dependencies: pip install pdf2image", WARNING) return False except Exception as e: log(f"{RED}✗{RESET} PDF to image test failed: {e}", ERROR) return False def test_dependencies(): """Test both OCR dependencies and recommend fixes""" print_header("OCR PDF to DOCX Test Utility") tesseract_result = test_tesseract() pdf_result = test_pdf_to_image() print("\nTest Summary:") # The conditional has to be inside the braces. Written the other way round # this printed the literal words "Passed if False else Failed", showing both # outcomes on every run and telling the reader nothing. def verdict(passed): return f"{GREEN}✅ Passed{RESET}" if passed else f"{RED}❌ Failed{RESET}" print(f"Tesseract OCR: {verdict(tesseract_result)}") print(f"PDF to Image: {verdict(pdf_result)}") # Give combined advice if not (tesseract_result and pdf_result): print("\nRecommended fixes:") if not pdf_result: print("\n1. Fix PDF conversion:") print(" - Install pdf2image: pip install pdf2image") print(" - Install Poppler:") print(" • macOS: brew install poppler") print(" • Linux: sudo apt-get install poppler-utils") print(" • Windows: Download from https://github.com/oschwartz10612/poppler-windows/releases") print(" and add the bin directory to your PATH") if not tesseract_result: print("\n2. Fix Tesseract OCR:") print(" - Install pytesseract: pip install pytesseract") print(" - Install Tesseract:") print(" • macOS: brew install tesseract") print(" • Linux: sudo apt-get install tesseract-ocr") print(" • Windows: Download from https://github.com/UB-Mannheim/tesseract/wiki") print("\nFor automatic installation of all dependencies:") print("python install_dependencies.py") return False print("\n✅ All tests passed! Your system is ready to run the OCR PDF to DOCX converter.") return True if __name__ == "__main__": success = test_dependencies() sys.exit(0 if success else 1)