ammadkhan5544's picture
Update app.py
7526462 verified
Raw
History Blame Contribute Delete
4.82 kB
# 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).")