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)