Spaces:
Sleeping
Sleeping
File size: 3,959 Bytes
316e596 665ac31 316e596 665ac31 316e596 665ac31 a354097 665ac31 316e596 665ac31 316e596 665ac31 316e596 665ac31 316e596 665ac31 316e596 665ac31 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import HTMLResponse
from io import BytesIO
import pytesseract
from PIL import Image
import cv2
import numpy as np
# Initialize FastAPI app
app = FastAPI()
import subprocess
def install_tesseract():
try:
subprocess.run(['apt-get', 'update'], check=True)
subprocess.run(['apt-get', 'install', '-y', 'tesseract-ocr'], check=True)
except subprocess.CalledProcessError as e:
print(f"Error installing Tesseract: {e}")
install_tesseract()
# Serve static files (images, etc.)
# app.mount("/static", StaticFiles(directory="static"), name="static") # Not needed if you're not saving the images
# Home route
@app.get("/", response_class=HTMLResponse)
async def home():
html_content = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Image to Text Converter</title>
<style>
body { font-family: Arial, sans-serif; background-color: #000000; color: #333; margin: 0; padding: 0; display: flex; justify-content: center; align-items: center; height: 100vh; }
.container { text-align: center; background: #fff; padding: 30px; border-radius: 10px; box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); width: 90%; max-width: 600px; }
h1 { font-size: 24px; color: #4CAF50; }
p { color: #666; }
.upload-box { margin: 20px auto; padding: 30px; border: 2px dashed #ccc; border-radius: 10px; background-color: #f9f9f9; cursor: pointer; position: relative; }
.upload-box:hover { background-color: #f4f4f4; }
.upload-box span { color: #888; font-size: 14px; display: block; }
.upload-box input[type="file"] { position: absolute; width: 100%; height: 100%; top: 0; left: 0; opacity: 0; cursor: pointer; }
.process-button { background-color: #4CAF50; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; }
.process-button:hover { background-color: #45a049; }
.result-box { margin-top: 20px; text-align: left; }
.result-box img { max-width: 100%; border-radius: 5px; margin-top: 10px; }
.actions { margin-top: 20px; }
.actions button { margin: 5px; background-color: #4CAF50; color: white; padding: 8px 16px; border: none; border-radius: 5px; cursor: pointer; font-size: 14px; }
.actions button:hover { background-color: #45a049; }
pre { background-color: #f4f4f4; padding: 10px; border-radius: 5px; white-space: pre-wrap; word-wrap: break-word; }
.error { color: red; font-weight: bold; margin-bottom: 20px; }
</style>
</head>
<body>
<div class="container">
<h1>Image to Text Converter</h1>
<p>Quickly extract text from your uploaded images!</p>
<form action="/upload_image/" method="POST" enctype="multipart/form-data">
<div class="upload-box">
<span>Drag & Drop the Images<br>Or Click to Browse</span>
<input type="file" name="image" accept="image/*" id="image-file">
</div>
<button class="process-button" type="submit">Upload Image</button>
</form>
</div>
</body>
</html>
"""
return HTMLResponse(content=html_content)
# Upload image route (image is processed directly in memory)
@app.post("/upload_image/")
async def upload_image(image: UploadFile = File(...)):
# Read the image file directly into memory
image_bytes = await image.read()
image_stream = BytesIO(image_bytes)
# Open the image with PIL (Pillow)
img = Image.open(image_stream)
# Process the image and extract text
extracted_text = pytesseract.image_to_string(img)
return {"extracted_text": extracted_text}
|