| 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") |