Spaces:
Sleeping
Sleeping
File size: 3,212 Bytes
7a9b80b |
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 |
import streamlit as st
from PIL import Image
import io
from dotenv import load_dotenv
import os
import openai
from openai import OpenAI
# Google Cloud Vision
from google.cloud import vision
# Load environment variables
load_dotenv()
# Set Google Cloud credentials in environment
service_account_path = os.getenv("GOOGLE_APPLICATION_CREDENTIALS")
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = r'gcv-new-project-dd6ed833cc91.json'
# Initialize Google Vision client
vision_client = vision.ImageAnnotatorClient()
def extract_text_with_google_vision_api(image):
"""Extract structured text from image using Google Cloud Vision API, with additional formatting based on bounding box analysis."""
import io
from google.cloud import vision
vision_client = vision.ImageAnnotatorClient()
img_byte_arr = io.BytesIO()
image.save(img_byte_arr, format=image.format)
image_bytes = img_byte_arr.getvalue()
image = vision.Image(content=image_bytes)
response = vision_client.document_text_detection(image=image)
structured_texts = []
for page in response.full_text_annotation.pages:
for block in page.blocks:
block_texts = []
last_paragraph_bottom = None # Store the bottom position of the last paragraph to compare spacing
for paragraph in block.paragraphs:
paragraph_text = ' '.join([''.join([symbol.text for symbol in word.symbols]) for word in paragraph.words])
paragraph_text = paragraph_text.strip()
# Example for analyzing bounding box position and size (simplified)
paragraph_bounds = paragraph.bounding_box
top_left = paragraph_bounds.vertices[0] # Example vertex
if last_paragraph_bottom is not None and (top_left.y - last_paragraph_bottom) > 10:
# Add additional break if the spacing exceeds some threshold
block_texts.append("") # This adds an extra line break to indicate a significant separation
# Update last_paragraph_bottom to the current paragraph's bottom position
last_paragraph_bottom = paragraph_bounds.vertices[2].y # Assuming 0 is top-left and going clockwise
if len(paragraph_text.split()) > 2:
block_texts.append(paragraph_text)
if block_texts:
structured_texts.append('\n'.join(block_texts))
if structured_texts:
return '\n\n'.join(structured_texts)
else:
return "No structured text found."
def main():
st.title("Article Extraction")
uploaded_file = st.file_uploader("Upload an image", type=["jpg", "jpeg", "png"])
if uploaded_file is not None:
image = Image.open(uploaded_file)
st.image(image, caption="Uploaded Image", use_column_width=True)
extracted_text = extract_text_with_google_vision_api(image)
st.success("Analysis completed successfully!")
st.header("Extracted Text:")
st.write(extracted_text if extracted_text else "No text detected.")
if __name__ == "__main__":
main() |