Spaces:
Sleeping
Sleeping
import streamlit as st | |
from PyPDF2 import PdfReader, PdfWriter | |
def split_pdf(input_file, output_files_with_ranges): | |
""" | |
Splits a PDF into multiple PDFs based on specified page ranges. | |
Parameters: | |
input_file (str): Path to the input PDF file. | |
output_files_with_ranges (list of tuples): Each tuple contains the output filename and the page range (start, end). | |
Example: [("output1.pdf", (1, 3)), ("output2.pdf", (4, 6))] | |
Returns: | |
None | |
""" | |
try: | |
reader = PdfReader(input_file) | |
for output_file, page_range in output_files_with_ranges: | |
writer = PdfWriter() | |
start, end = page_range | |
# Add specified page range to writer | |
for page_num in range(start - 1, end): | |
if 0 <= page_num < len(reader.pages): | |
writer.add_page(reader.pages[page_num]) | |
else: | |
raise ValueError(f"Page number {page_num + 1} out of range for input file.") | |
# Write the output file | |
with open(output_file, "wb") as f: | |
writer.write(f) | |
st.success("PDF split successfully!") | |
except Exception as e: | |
st.error(f"An error occurred: {e}") | |
# Streamlit app | |
st.title("PDF Splitter App") | |
uploaded_file = st.file_uploader("Upload a PDF file", type="pdf") | |
if uploaded_file: | |
input_pdf_path = f"uploaded_{uploaded_file.name}" | |
with open(input_pdf_path, "wb") as f: | |
f.write(uploaded_file.read()) | |
reader = PdfReader(input_pdf_path) | |
total_pages = len(reader.pages) | |
st.write(f"The uploaded PDF has {total_pages} pages.") | |
num_splits = st.number_input("How many splits do you want?", min_value=1, max_value=total_pages, step=1, value=1) | |
output_files_with_ranges = [] | |
download_links = [] | |
for i in range(num_splits): | |
st.write(f"### Split {i + 1}") | |
start = st.number_input(f"Start page for split {i + 1}", min_value=1, max_value=total_pages, step=1, value=1, key=f"start_{i}") | |
end = st.number_input(f"End page for split {i + 1}", min_value=1, max_value=total_pages, step=1, value=1, key=f"end_{i}") | |
output_filename = st.text_input(f"Output filename for split {i + 1}", value=f"PDF_Part{i + 1}.pdf", key=f"filename_{i}") | |
if start <= end: | |
output_files_with_ranges.append((output_filename, (start, end))) | |
else: | |
st.warning(f"End page must be greater than or equal to start page for split {i + 1}.") | |
if st.button("Split PDF"): | |
split_pdf(input_pdf_path, output_files_with_ranges) | |
for output_file, _ in output_files_with_ranges: | |
with open(output_file, "rb") as f: | |
download_links.append((output_file, f.read())) | |
for filename, data in download_links: | |
st.download_button(label=f"Download {filename}", data=data, file_name=filename, mime="application/pdf") | |