pdf-compressor / app.py
bluenevus's picture
Update app.py
f13099a verified
raw
history blame
2.73 kB
import gradio as gr
import PyPDF2
import requests
import io
import os
import tempfile
import sys
def compress_pdf(input_file, url, quality):
if input_file is None and (url is None or url.strip() == ""):
return None, "Please provide either a file or a URL."
if input_file is not None and url and url.strip() != "":
return None, "Please provide either a file or a URL, not both."
if url and url.strip() != "":
try:
response = requests.get(url)
response.raise_for_status()
pdf_content = io.BytesIO(response.content)
except requests.RequestException as e:
return None, f"Error downloading PDF: {str(e)}"
else:
pdf_content = input_file
try:
reader = PyPDF2.PdfReader(pdf_content)
writer = PyPDF2.PdfWriter()
for i, page in enumerate(reader.pages):
try:
if quality == "High":
page.compress_content_streams() # This is the lowest compression
elif quality == "Medium":
page.compress_content_streams(level=2)
else: # Low quality
page.compress_content_streams(level=3)
writer.add_page(page)
except RecursionError:
return None, f"Error: PDF structure too complex. Compression stopped at page {i+1}."
except Exception as e:
return None, f"Error compressing page {i+1}: {str(e)}"
with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as temp_file:
writer.write(temp_file)
temp_file_path = temp_file.name
return temp_file_path, "PDF compressed successfully!"
except Exception as e:
return None, f"Error compressing PDF: {str(e)}"
def process_and_compress(input_file, url, quality):
# Increase recursion limit
sys.setrecursionlimit(10000)
output_file, message = compress_pdf(input_file, url, quality)
if output_file:
return output_file, message
else:
return None, message
with gr.Blocks() as demo:
gr.Markdown("# PDF Compressor")
with gr.Row():
input_file = gr.File(label="Upload PDF")
url_input = gr.Textbox(label="Or enter PDF URL")
quality = gr.Radio(["High", "Medium", "Low"], label="Compression Quality", value="Medium")
compress_btn = gr.Button("Compress")
output_file = gr.File(label="Download Compressed PDF")
message = gr.Textbox(label="Message")
compress_btn.click(
process_and_compress,
inputs=[input_file, url_input, quality],
outputs=[output_file, message]
)
if __name__ == "__main__":
demo.launch(share=True)