|
import streamlit as st |
|
import fitz |
|
import io |
|
|
|
|
|
st.title("PDF Merger with Slider Ordering π¨") |
|
|
|
st.write("Upload multiple PDF files and the app will merge them into one PDF.") |
|
|
|
st.markdown(""" |
|
1. Upload multiple PDF files |
|
2. Use sliders to specify the order of each file |
|
3. Click [π Merge PDFs] to merge and then [β¬οΈ Download Merged PDF] to download |
|
""") |
|
|
|
st.video("https://youtu.be/vsREt0Jh7eo?si=5XAaL9h1wxTNJfpN") |
|
|
|
|
|
uploaded_files = st.file_uploader( |
|
"Select PDF files (multiple allowed)", |
|
type="pdf", |
|
accept_multiple_files=True |
|
) |
|
|
|
if uploaded_files: |
|
|
|
max_order = len(uploaded_files) |
|
|
|
|
|
order_dict = {} |
|
|
|
st.subheader("π’ Specify Merge Order") |
|
|
|
|
|
cols = st.columns(1) |
|
for idx, uploaded_file in enumerate(uploaded_files): |
|
with cols[idx % 1]: |
|
default_order = idx + 1 |
|
if max_order > 1: |
|
order = st.slider( |
|
f"Order for {uploaded_file.name}", |
|
min_value=1, |
|
max_value=max_order, |
|
value=default_order, |
|
key=f"slider_{idx}" |
|
) |
|
order_dict[idx] = order |
|
|
|
|
|
unique_orders = set(order_dict.values()) |
|
if len(unique_orders) != max_order: |
|
st.error("β οΈ Upload two or more PDFs. Duplicate order detected! Please assign unique numbers using the sliders.") |
|
st.stop() |
|
|
|
|
|
if st.button("π Merge PDFs", type="primary"): |
|
try: |
|
|
|
sorted_files = sorted( |
|
zip(uploaded_files, order_dict.values()), |
|
key=lambda x: x[1] |
|
) |
|
|
|
|
|
merged_doc = fitz.open() |
|
|
|
|
|
for uploaded_file, _ in sorted_files: |
|
file_data = uploaded_file.read() |
|
doc = fitz.open("pdf", file_data) |
|
merged_doc.insert_pdf(doc) |
|
|
|
merged_doc.subset_fonts() |
|
|
|
output_pdf = io.BytesIO() |
|
merged_doc.save( |
|
output_pdf, |
|
deflate=True, |
|
garbage=4, |
|
deflate_fonts=True, |
|
use_objstms=1 |
|
) |
|
output_pdf.seek(0) |
|
|
|
|
|
st.success("β
PDF merging completed!") |
|
st.download_button( |
|
label="β¬οΈ Download Merged PDF", |
|
data=output_pdf, |
|
file_name="merged.pdf", |
|
mime="application/pdf", |
|
help="Click to download the merged PDF" |
|
) |
|
|
|
except Exception as e: |
|
st.error(f"An error occurred: {str(e)}") |
|
else: |
|
st.info("π Please upload PDF files from the top section") |