import gradio as gr from PIL import Image import os import numpy as np import cv2 import time # Directory to store the PDF files output_directory = "base" os.makedirs(output_directory, exist_ok=True) # Initialize an empty list to store the uploaded images as NumPy arrays images_list = [] # Function to add an uploaded image (NumPy array) to the list def add_image(image): print(image) # Display the image array global images_list images_list.append(image) return f"Image added! Current number of images: {len(images_list)}" # Function to convert NumPy array to PIL Image def numpy_to_pil(np_img): if np_img.ndim == 2: # Grayscale return Image.fromarray(np_img) elif np_img.shape[2] == 3: # RGB return Image.fromarray(cv2.cvtColor(np_img, cv2.COLOR_BGR2RGB)) elif np_img.shape[2] == 4: # RGBA return Image.fromarray(cv2.cvtColor(np_img, cv2.COLOR_BGRA2RGBA)) else: raise ValueError("Unsupported image format") # Function to merge images into a PDF and save it def merge_images_to_pdf(): if not images_list: return "No images to merge!" # Convert NumPy arrays to PIL Images image_objs = [numpy_to_pil(img) for img in images_list] # Save the images as a PDF pdf_output_path = os.path.join(output_directory, str(time.ctime())+'.pdf') image_objs[0].save(pdf_output_path, save_all=True, append_images=image_objs[1:]) # Clear the images list after saving the PDF images_list.clear() return f"PDF saved successfully at {pdf_output_path}!" # Create the Gradio interface with gr.Blocks() as demo: gr.Markdown("### Image to PDF Converter") # Image upload component (uses webcam or upload) image_input = gr.Image(source="webcam", streaming=True, type="numpy") # Button to add the image to the list add_button = gr.Button("Add Image") # Button to merge the images into a PDF merge_button = gr.Button("Merge Images to PDF") # Output text to display status output_text = gr.Textbox(label="Status") # Event handling add_button.click(add_image, inputs=image_input, outputs=output_text) merge_button.click(merge_images_to_pdf, outputs=output_text) # Launch the Gradio app demo.launch()