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