Spaces:
Paused
Paused
File size: 2,729 Bytes
4c85f97 f13099a 4c85f97 72673b1 4c85f97 72673b1 4c85f97 72673b1 4c85f97 f13099a 4c85f97 f13099a 4c85f97 e0b9bcc 4c85f97 e0b9bcc 4c85f97 e0b9bcc 4c85f97 e0b9bcc |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
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) |