File size: 3,037 Bytes
7aa49b3
 
 
 
 
 
 
44af7ed
7aa49b3
 
44af7ed
 
7aa49b3
 
 
 
44af7ed
7aa49b3
 
 
 
44af7ed
 
 
 
 
 
 
 
 
7aa49b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44af7ed
7aa49b3
 
 
 
 
 
 
 
 
44af7ed
7aa49b3
 
 
 
44af7ed
7aa49b3
 
44af7ed
7aa49b3
 
 
 
 
 
 
 
 
 
 
 
 
 
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
80
81
82
83
84
85
86
87
88
89
90
import os
import io
import subprocess
from flask import Flask, render_template, request, send_file, Response

app = Flask(__name__)

# --- FUNCI脫N DE COMPRESI脫N (USANDO GHOSTSCRIPT) ---
def compress_pdf_with_ghostscript(input_stream: io.BytesIO, quality: str) -> io.BytesIO:
    """
    Comprime un PDF usando Ghostscript, forzando un perfil agresivo y baja resoluci贸n 
    (100 DPI) para las im谩genes internas.
    """
    output_stream = io.BytesIO()
    input_stream.seek(0)
    
    # Par谩metros para forzar la compresi贸n m谩xima
    gs_command = [
        "gs",
        "-sDEVICE=pdfwrite",
        "-dCompatibilityLevel=1.4",
        # Usamos el perfil 'ebook' como base agresiva
        "-dPDFSETTINGS=/ebook", 
        
        # Opciones para forzar el reescalado de im谩genes a 100 DPI
        "-dDownsampleColorImages=true",
        "-dColorImageResolution=100",  
        "-dDownsampleGrayImages=true",
        "-dGrayImageResolution=100",   
        
        "-dNOPAUSE", "-dBATCH", "-dQUIET",
        "-sOutputFile=-",  # Salida a stdout
        "-"  # Entrada desde stdin
    ]
    
    try:
        # Ejecutar el comando Ghostscript
        process = subprocess.run(
            gs_command,
            input=input_stream.read(),
            capture_output=True,
            check=True
        )
        output_stream.write(process.stdout)
        output_stream.seek(0)
        return output_stream
    except subprocess.CalledProcessError as e:
        raise Exception(f"Error de Ghostscript: {e.stderr.decode()}")
    except FileNotFoundError:
        raise Exception("Ghostscript no est谩 instalado en el servidor. (Verifica el Dockerfile)")
    except Exception as e:
        raise Exception(f"Error desconocido durante la compresi贸n: {e}")

# --- RUTAS ---
@app.route('/')
def index():
    """Muestra la interfaz del compresor."""
    # Aseg煤rate de que compressor_index.html est茅 en la carpeta templates/
    return render_template('compressor_index.html') 

@app.route('/compress', methods=['POST'])
def compress_pdf_file():
    """Ruta para recibir y comprimir el PDF subido."""
    if 'pdf_file' not in request.files:
        return Response('No se seleccion贸 ning煤n archivo PDF', status=400)

    pdf_file = request.files['pdf_file']
    quality_setting = request.form.get('quality', 'screen') # Recibe el perfil seleccionado
    
    try:
        input_stream = io.BytesIO(pdf_file.read())

        # Comprimir el PDF subido
        compressed_stream = compress_pdf_with_ghostscript(input_stream, quality_setting)
        
        # Devolver el archivo comprimido
        return send_file(
            compressed_stream,
            as_attachment=True,
            download_name=f"comprimido_{pdf_file.filename}",
            mimetype='application/pdf'
        )
        
    except Exception as e:
        return Response(f"Error en la compresi贸n: {str(e)}", status=500)


if __name__ == '__main__':
    port = int(os.environ.get('PORT', 7860)) 
    app.run(host='0.0.0.0', port=port, debug=False)