feat: add new examples from pocketflow-academy
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
import fitz # PyMuPDF
|
||||
from PIL import Image
|
||||
import io
|
||||
import base64
|
||||
from typing import List, Tuple
|
||||
|
||||
def pdf_to_images(pdf_path: str, max_size: int = 2000) -> List[Tuple[Image.Image, int]]:
|
||||
"""Convert PDF pages to PIL Images with size limit
|
||||
|
||||
Args:
|
||||
pdf_path (str): Path to PDF file
|
||||
max_size (int): Maximum dimension (width/height) for images
|
||||
|
||||
Returns:
|
||||
list: List of tuples (PIL Image, page number)
|
||||
"""
|
||||
doc = fitz.open(pdf_path)
|
||||
images = []
|
||||
|
||||
try:
|
||||
for page_num in range(len(doc)):
|
||||
page = doc[page_num]
|
||||
pix = page.get_pixmap()
|
||||
|
||||
# Convert to PIL Image
|
||||
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
|
||||
|
||||
# Resize if needed while maintaining aspect ratio
|
||||
if max(img.size) > max_size:
|
||||
ratio = max_size / max(img.size)
|
||||
new_size = tuple(int(dim * ratio) for dim in img.size)
|
||||
img = img.resize(new_size, Image.Resampling.LANCZOS)
|
||||
|
||||
images.append((img, page_num + 1))
|
||||
|
||||
finally:
|
||||
doc.close()
|
||||
|
||||
return images
|
||||
|
||||
def image_to_base64(image: Image.Image) -> str:
|
||||
"""Convert PIL Image to base64 string
|
||||
|
||||
Args:
|
||||
image (PIL.Image): Image to convert
|
||||
|
||||
Returns:
|
||||
str: Base64 encoded image string
|
||||
"""
|
||||
buffer = io.BytesIO()
|
||||
image.save(buffer, format="PNG")
|
||||
return base64.b64encode(buffer.getvalue()).decode('utf-8')
|
||||
@@ -0,0 +1,40 @@
|
||||
from PIL import Image
|
||||
from utils.call_llm import client
|
||||
from tools.pdf import image_to_base64
|
||||
|
||||
def extract_text_from_image(image: Image.Image, prompt: str = None) -> str:
|
||||
"""Extract text from image using OpenAI Vision API
|
||||
|
||||
Args:
|
||||
image (PIL.Image): Image to process
|
||||
prompt (str, optional): Custom prompt for extraction. Defaults to general OCR.
|
||||
|
||||
Returns:
|
||||
str: Extracted text from image
|
||||
"""
|
||||
# Convert image to base64
|
||||
img_base64 = image_to_base64(image)
|
||||
|
||||
# Default prompt for general OCR
|
||||
if prompt is None:
|
||||
prompt = "Please extract all text from this image."
|
||||
|
||||
# Call Vision API
|
||||
response = client.chat.completions.create(
|
||||
model="gpt-4o",
|
||||
messages=[{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{"type": "text", "text": prompt},
|
||||
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{img_base64}"}}
|
||||
]
|
||||
}]
|
||||
)
|
||||
|
||||
return response.choices[0].message.content
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Test vision processing
|
||||
test_image = Image.open("example.png")
|
||||
result = extract_text_from_image(test_image)
|
||||
print("Extracted text:", result)
|
||||
Reference in New Issue
Block a user