import streamlit as st
from PIL import Image
from fpdf import FPDF
import os
# Function to process a single image with user-provided sequence number
def process_image(image_file, sequence_number):
try:
image = Image.open(image_file)
return image, sequence_number
except Exception as e:
st.error(f"Failed to open image: {e}")
return None, None
# Function to generate the PDF using fpdf
def generate_pdf(images_with_sequence):
pdf_name = "output.pdf"
images_with_sequence.sort(key=lambda x: x[1]) # Sort by sequence number
pdf = FPDF()
for i, (image, _) in enumerate(images_with_sequence):
if image.mode != 'RGB':
image = image.convert('RGB')
image.save(f"temp_image_{i}.jpg", "JPEG")
pdf.add_page()
pdf.image(f"temp_image_{i}.jpg", x=10, y=10, w=190)
try:
pdf.output(pdf_name)
except Exception as e:
st.error(f"Failed to generate PDF: {e}")
return None
return pdf_name
st.markdown("
Image to PDF Converter
", unsafe_allow_html=True)
st.markdown("Supports multiple image upload at once and rearrangement of pages
", unsafe_allow_html=True)
uploaded_images = st.file_uploader("Upload Images", type=["jpg", "jpeg", "png"], accept_multiple_files=True)
if uploaded_images:
num_images = len(uploaded_images)
if num_images > 0: # Check if any image is uploaded
st.write("**Uploaded Images:**")
images_with_sequence = []
for i, image_file in enumerate(uploaded_images):
col1, col2 = st.columns([3, 1])
with col1:
st.image(image_file, width=250)
with col2:
sequence_options = [str(j) for j in range(1, num_images + 1)]
default_index = i # Set default selection of sequence as the order of upload
sequence_number = st.selectbox(f"Sequence {i+1}", sequence_options, index=default_index)
processed_image, processed_sequence = process_image(image_file, int(sequence_number))
if processed_image:
images_with_sequence.append((processed_image, processed_sequence))
if st.button("Generate PDF"):
pdf_name = generate_pdf(images_with_sequence)
if pdf_name: # Check if PDF is generated successfully
st.success(f"PDF generated! Download: {pdf_name}")
with open(pdf_name, "rb") as pdf_file:
st.download_button("Download PDF", pdf_file, file_name=pdf_name)
for i in range(len(images_with_sequence)):
if os.path.exists(f"temp_image_{i}.jpg"):
os.remove(f"temp_image_{i}.jpg")
os.remove(pdf_name) # Remove the file after download
else:
st.write("Please upload images to continue")