File size: 2,280 Bytes
1bafbd4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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()