File size: 2,359 Bytes
4c85f97
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import PyPDF2
import requests
import io
import os
import tempfile

def compress_pdf(input_file, url, quality):
    if input_file is None and url is None:
        return None, "Please provide either a file or a URL."
    
    if input_file is not None and url is not None:
        return None, "Please provide either a file or a URL, not both."
    
    if url:
        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 page in reader.pages:
            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)

        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):
    output_file, message = compress_pdf(input_file, url, quality)
    if output_file:
        return gr.File.update(value=output_file, visible=True), message
    else:
        return gr.File.update(visible=False), 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", visible=False)
    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()