Spaces:
Sleeping
Sleeping
| # app.py | |
| import streamlit as st | |
| from PyPDF2 import PdfReader, PdfWriter | |
| from pdf2image import convert_from_path | |
| from ocrmypdf import ocr | |
| from PIL import Image | |
| from reportlab.pdfgen import canvas | |
| from io import BytesIO | |
| import os | |
| from docx import Document | |
| from pptx import Presentation | |
| from openpyxl import load_workbook | |
| st.title("Comprehensive PDF Tools App") | |
| st.sidebar.header("Choose an Operation") | |
| # List of all operations | |
| operations = [ | |
| "Merge PDF", "Split PDF", "Remove Pages", "Extract Pages", "Organize PDF", | |
| "Scan to PDF", "Optimize PDF", "Compress PDF", "Repair PDF", "JPG to PDF", | |
| "WORD to PDF", "POWERPOINT to PDF", "EXCEL to PDF", "HTML to PDF", | |
| "PDF to JPG", "PDF to WORD", "PDF to POWERPOINT", "PDF to EXCEL", | |
| "PDF to PDF/A", "Rotate PDF", "Add Page Numbers", "Add Watermark" | |
| ] | |
| operation = st.sidebar.selectbox("Select Operation", operations) | |
| uploaded_files = st.file_uploader("Upload File(s)", accept_multiple_files=True, type=["pdf", "jpg", "png", "docx", "pptx", "xlsx", "html"]) | |
| output = BytesIO() | |
| # Functionality Definitions | |
| def merge_pdfs(files): | |
| writer = PdfWriter() | |
| for file in files: | |
| reader = PdfReader(file) | |
| for page in reader.pages: | |
| writer.add_page(page) | |
| output = BytesIO() | |
| writer.write(output) | |
| output.seek(0) | |
| return output | |
| def split_pdf(file): | |
| reader = PdfReader(file) | |
| for i, page in enumerate(reader.pages): | |
| writer = PdfWriter() | |
| writer.add_page(page) | |
| split_output = BytesIO() | |
| writer.write(split_output) | |
| split_output.seek(0) | |
| st.download_button(f"Download Page {i+1}", split_output, file_name=f"page_{i+1}.pdf") | |
| def remove_pages(file, pages_to_remove): | |
| reader = PdfReader(file) | |
| writer = PdfWriter() | |
| for i, page in enumerate(reader.pages): | |
| if i not in pages_to_remove: | |
| writer.add_page(page) | |
| writer.write(output) | |
| output.seek(0) | |
| return output | |
| def extract_pages(file, pages_to_extract): | |
| reader = PdfReader(file) | |
| writer = PdfWriter() | |
| for i in pages_to_extract: | |
| writer.add_page(reader.pages[i]) | |
| writer.write(output) | |
| output.seek(0) | |
| return output | |
| def jpg_to_pdf(files): | |
| images = [Image.open(file).convert("RGB") for file in files] | |
| pdf_output = BytesIO() | |
| images[0].save(pdf_output, save_all=True, append_images=images[1:], format="PDF") | |
| pdf_output.seek(0) | |
| return pdf_output | |
| def convert_docx_to_pdf(file): | |
| doc = Document(file) | |
| pdf_output = BytesIO() | |
| c = canvas.Canvas(pdf_output) | |
| for paragraph in doc.paragraphs: | |
| c.drawString(100, 750, paragraph.text) | |
| c.save() | |
| pdf_output.seek(0) | |
| return pdf_output | |
| def rotate_pdf(file, rotation): | |
| reader = PdfReader(file) | |
| writer = PdfWriter() | |
| for page in reader.pages: | |
| page.rotate(rotation) | |
| writer.add_page(page) | |
| writer.write(output) | |
| output.seek(0) | |
| return output | |
| def add_watermark(file, watermark_text): | |
| reader = PdfReader(file) | |
| writer = PdfWriter() | |
| watermark_file = BytesIO() | |
| c = canvas.Canvas(watermark_file) | |
| c.drawString(100, 750, watermark_text) | |
| c.save() | |
| watermark_file.seek(0) | |
| watermark_pdf = PdfReader(watermark_file) | |
| watermark_page = watermark_pdf.pages[0] | |
| for page in reader.pages: | |
| page.merge_page(watermark_page) | |
| writer.add_page(page) | |
| writer.write(output) | |
| output.seek(0) | |
| return output | |
| # Mapping Operations to Functions | |
| if operation == "Merge PDF" and uploaded_files: | |
| merged_pdf = merge_pdfs(uploaded_files) | |
| st.download_button("Download Merged PDF", merged_pdf, file_name="merged.pdf") | |
| elif operation == "Split PDF" and uploaded_files: | |
| split_pdf(uploaded_files[0]) | |
| elif operation == "Remove Pages" and uploaded_files: | |
| pages_to_remove = st.text_input("Enter page numbers to remove (comma-separated):") | |
| if st.button("Remove Pages"): | |
| pages = [int(x.strip()) - 1 for x in pages_to_remove.split(",")] | |
| updated_pdf = remove_pages(uploaded_files[0], pages) | |
| st.download_button("Download Updated PDF", updated_pdf, file_name="updated.pdf") | |
| elif operation == "Rotate PDF" and uploaded_files: | |
| rotation = st.slider("Select Rotation (degrees):", -180, 180, 90) | |
| rotated_pdf = rotate_pdf(uploaded_files[0], rotation) | |
| st.download_button("Download Rotated PDF", rotated_pdf, file_name="rotated.pdf") | |
| elif operation == "Add Watermark" and uploaded_files: | |
| watermark_text = st.text_input("Enter Watermark Text:") | |
| if st.button("Add Watermark"): | |
| watermarked_pdf = add_watermark(uploaded_files[0], watermark_text) | |
| st.download_button("Download Watermarked PDF", watermarked_pdf, file_name="watermarked.pdf") | |
| # Add other operations similarly | |
| else: | |
| st.write("Please select an operation and upload the required file(s).") | |