import os import gradio as gr import shutil import tempfile import uuid from pathlib import Path import json from PIL import Image import fitz # PyMuPDF for PDF handling # Constants TEMP_DIR = "temp" UPLOAD_DIR = os.path.join(TEMP_DIR, "uploads") OUTPUT_DIR = os.path.join(TEMP_DIR, "output") THUMBS_DIR = os.path.join(OUTPUT_DIR, "thumbs") # Ensure directories exist for dir_path in [TEMP_DIR, UPLOAD_DIR, OUTPUT_DIR, THUMBS_DIR]: os.makedirs(dir_path, exist_ok=True) def create_thumbnail(image_path, output_path, size=(300, 300)): """Create a thumbnail from an image.""" try: with Image.open(image_path) as img: img.thumbnail(size, Image.LANCZOS) img.save(output_path) return output_path except Exception as e: print(f"Error creating thumbnail: {e}") return None def process_pdf(pdf_path, session_id): """Extract pages from a PDF and save as images with thumbnails.""" pages_info = [] output_folder = os.path.join(OUTPUT_DIR, session_id) thumbs_folder = os.path.join(THUMBS_DIR, session_id) os.makedirs(output_folder, exist_ok=True) os.makedirs(thumbs_folder, exist_ok=True) try: # Open the PDF pdf_document = fitz.open(pdf_path) # Process each page for page_num, page in enumerate(pdf_document): # Render page to an image with a higher resolution pix = page.get_pixmap(matrix=fitz.Matrix(2, 2)) image_path = os.path.join(output_folder, f"page_{page_num + 1}.png") pix.save(image_path) # Create thumbnail thumb_path = os.path.join(thumbs_folder, f"thumb_{page_num + 1}.png") create_thumbnail(image_path, thumb_path) # Add page info pages_info.append({ "src": os.path.join("output", session_id, f"page_{page_num + 1}.png"), "thumb": os.path.join("thumbs", session_id, f"thumb_{page_num + 1}.png"), "title": f"Page {page_num + 1}" }) return pages_info except Exception as e: print(f"Error processing PDF: {e}") return [] def process_images(image_paths, session_id): """Process uploaded images and create thumbnails.""" pages_info = [] output_folder = os.path.join(OUTPUT_DIR, session_id) thumbs_folder = os.path.join(THUMBS_DIR, session_id) os.makedirs(output_folder, exist_ok=True) os.makedirs(thumbs_folder, exist_ok=True) for i, img_path in enumerate(image_paths): try: # Copy original image to output folder dest_path = os.path.join(output_folder, f"image_{i + 1}.png") shutil.copy(img_path, dest_path) # Create thumbnail thumb_path = os.path.join(thumbs_folder, f"thumb_{i + 1}.png") create_thumbnail(img_path, thumb_path) # Add page info pages_info.append({ "src": os.path.join("output", session_id, f"image_{i + 1}.png"), "thumb": os.path.join("thumbs", session_id, f"thumb_{i + 1}.png"), "title": f"Page {i + 1}" }) except Exception as e: print(f"Error processing image {img_path}: {e}") return pages_info def create_flipbook(upload_type, pdf_file=None, images=None, view_mode="webgl", skin="light"): """Create a flipbook from uploaded PDF or images.""" try: session_id = str(uuid.uuid4()) pages_info = [] # Process based on upload type if upload_type == "pdf" and pdf_file is not None: # Save PDF to temp directory pdf_path = os.path.join(UPLOAD_DIR, f"{session_id}.pdf") with open(pdf_path, "wb") as f: f.write(pdf_file) # Process PDF pages_info = process_pdf(pdf_path, session_id) elif upload_type == "images" and images is not None: # Process images pages_info = process_images(images, session_id) else: return """