File size: 3,910 Bytes
91fa6b5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import os
import io
from flask import Flask, render_template, request, send_file, Response
from PIL import Image
from PyPDF2 import PdfMerger

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

# Funci贸n para manejar la subida y la combinaci贸n de archivos
@app.route('/combine', methods=['POST'])
def combine_files():
    if 'files' not in request.files:
        return Response('No se seleccionaron archivos', status=400)

    uploaded_files = request.files.getlist('files')
    if not uploaded_files:
        return Response('No se seleccionaron archivos', status=400)

    # NUEVO: Obtener el nivel de compresi贸n (0 a 100) del formulario
    compression_level_str = request.form.get('compression_level', '85')
    try:
        # Convertir a entero. Usamos 85 como calidad est谩ndar si falla.
        compression_level = int(compression_level_str)
        if not 0 <= compression_level <= 100:
            compression_level = 85
    except ValueError:
        compression_level = 85

    pdf_merger = PdfMerger()
    image_pdfs = [] 
    
    # 1. Ajuste de calidad para la compresi贸n JPEG
    # Para archivos PDF generados a partir de im谩genes, la calidad afecta la compresi贸n JPEG interna.
    # 95 es alta calidad, 50 es compresi贸n media.
    quality = compression_level 

    try:
        for file in uploaded_files:
            file_name = file.filename.lower()
            file_stream = io.BytesIO(file.read())

            if file_name.endswith(('.pdf')):
                # Si es PDF, se agrega directamente SIN COMPRESI脫N.
                pdf_merger.append(file_stream)
            
            elif file_name.endswith(('.jpg', '.jpeg', '.png')):
                # Si es una imagen, la convertimos a PDF con compresi贸n.
                try:
                    img = Image.open(file_stream)
                    
                    if img.mode != 'RGB':
                        img = img.convert('RGB')
                        
                    pdf_stream = io.BytesIO()
                    
                    # APLICACI脫N DE COMPRESI脫N AL CONVERTIR LA IMAGEN A PDF
                    # El argumento 'quality' controla el nivel de compresi贸n JPEG interna del PDF.
                    img.save(
                        pdf_stream, 
                        format='PDF', 
                        quality=quality,
                        resolution=100.0 # Resoluci贸n est谩ndar para pantalla
                    )
                    pdf_stream.seek(0)
                    
                    pdf_merger.append(pdf_stream)
                    image_pdfs.append(pdf_stream)
                except Exception as e:
                    return Response(f"Error al procesar la imagen {file_name}: {e}", status=500)
            
            # Ignorar otros tipos de archivo
            else:
                print(f"Archivo ignorado: {file_name}")

        final_pdf_stream = io.BytesIO()
        pdf_merger.write(final_pdf_stream)
        pdf_merger.close()
        final_pdf_stream.seek(0)

        return send_file(
            final_pdf_stream,
            as_attachment=True,
            download_name=request.form.get('filename', 'documento_combinado.pdf'),
            mimetype='application/pdf'
        )

    except Exception as e:
        print(f"Error general: {e}")
        return Response(f'Ocurri贸 un error inesperado en el servidor: {e}', status=500)
    finally:
        for pdf_stream in image_pdfs:
            pdf_stream.close()


if __name__ == '__main__':
    # Obtener el puerto de las variables de entorno, usando 7860 como fallback
    port = int(os.environ.get('PORT', 7860)) 
    
    # Ejecutar la aplicaci贸n en el host 0.0.0.0 para que sea accesible externamente
    app.run(host='0.0.0.0', port=port, debug=False)