-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconvertidor.py
More file actions
162 lines (123 loc) · 5.84 KB
/
convertidor.py
File metadata and controls
162 lines (123 loc) · 5.84 KB
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
import os
import img2pdf
from docx2pdf import convert as convert_docx
from PIL import Image
from tkinter import filedialog
import tkinter as tk
from tqdm import tqdm
import win32com.client
def convertir_docx_a_pdf(ruta_entrada, directorio_salida):
nombre_base = os.path.splitext(os.path.basename(ruta_entrada))[0]
ruta_salida = os.path.join(directorio_salida, f"{nombre_base}.pdf")
try:
convert_docx(ruta_entrada, ruta_salida)
return ruta_salida
except Exception as e:
print(f"\nERROR DOCX ({os.path.basename(ruta_entrada)}): Falló la conversión de Word. Verifique que no esté abierto.")
print(f"Detalle: {e}")
return None
def convertir_imagen_a_pdf(ruta_entrada, directorio_salida):
nombre_base = os.path.splitext(os.path.basename(ruta_entrada))[0]
ruta_salida = os.path.join(directorio_salida, f"{nombre_base}.pdf")
try:
with Image.open(ruta_entrada) as img:
img.verify()
with open(ruta_salida, "wb") as f:
f.write(img2pdf.convert(ruta_entrada))
return ruta_salida
except Exception as e:
print(f"\nERROR IMAGEN ({os.path.basename(ruta_entrada)}): No se pudo convertir la imagen.")
print(f"Detalle: {e}")
return None
def convertir_excel_a_pdf(ruta_entrada, directorio_salida):
nombre_base = os.path.splitext(os.path.basename(ruta_entrada))[0]
ruta_salida = os.path.join(directorio_salida, f"{nombre_base}.pdf")
try:
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False
wb = excel.Workbooks.Open(os.path.abspath(ruta_entrada))
# 0 = Formato PDF, Exporta a PDF todo el libro
wb.ExportAsFixedFormat(0, os.path.abspath(ruta_salida))
wb.Close(False)
excel.Quit()
return ruta_salida
except Exception as e:
print(f"\nERROR EXCEL ({os.path.basename(ruta_entrada)}): Falló la automatización de Excel.")
print(f"Detalle: {e}")
return None
def convertir_pptx_a_pdf(ruta_entrada, directorio_salida):
nombre_base = os.path.splitext(os.path.basename(ruta_entrada))[0]
ruta_salida = os.path.join(directorio_salida, f"{nombre_base}.pdf")
try:
powerpoint = win32com.client.Dispatch("Powerpoint.Application")
powerpoint.Visible = False
presentation = powerpoint.Presentations.Open(os.path.abspath(ruta_entrada), WithWindow=False)
# 32 = Formato PDF
presentation.ExportAsFixedFormat(os.path.abspath(ruta_salida), 32)
presentation.Close()
powerpoint.Quit()
return ruta_salida
except Exception as e:
print(f"\nERROR PPTX ({os.path.basename(ruta_entrada)}): Falló la automatización de PowerPoint.")
print(f"Detalle: {e}")
return None
def convertidor_universal_pdf(ruta_entrada, directorio_salida):
extension = ruta_entrada.lower().split('.')[-1]
ruta_pdf = None
if extension in ['docx', 'doc']:
ruta_pdf = convertir_docx_a_pdf(ruta_entrada, directorio_salida)
elif extension in ['jpg', 'jpeg', 'png', 'tiff', 'webp']:
ruta_pdf = convertir_imagen_a_pdf(ruta_entrada, directorio_salida)
elif extension in ['xlsx', 'xls']:
ruta_pdf = convertir_excel_a_pdf(ruta_entrada, directorio_salida)
elif extension in ['pptx', 'ppt']:
ruta_pdf = convertir_pptx_a_pdf(ruta_entrada, directorio_salida)
elif extension == 'pdf':
return None
else:
print(f"\nADVERTENCIA: El formato '.{extension}' no está soportado. Saltando.")
return None
return ruta_pdf
def seleccionar_archivos_y_convertir():
root = tk.Tk()
root.withdraw()
tipos_archivos = [
('Archivos de Word', ('*.docx', '*.doc')),
('Archivos de Excel', ('*.xlsx', '*.xls')),
('Archivos de PowerPoint', ('*.pptx', '*.ppt')),
('Imágenes', ('*.jpg', '*.jpeg', '*.png', '*.tiff', '*.webp')),
('Todos los soportados', ('*.docx', '*.doc', '*.xlsx', '*.xls', '*.pptx', '*.ppt', '*.jpg', '*.jpeg', '*.png', '*.tiff', '*.webp')),
('Todos los archivos', '*.*')
]
rutas_archivos = filedialog.askopenfilenames(
title="1. Selecciona los documentos para convertir a PDF",
filetypes=tipos_archivos
)
if not rutas_archivos:
print("CANCELADO: No se seleccionó ningún archivo. Saliendo.")
return
directorio_salida = filedialog.askdirectory(
title="2. Selecciona la carpeta donde guardar los archivos PDF"
)
if not directorio_salida:
print("CANCELADO: No se seleccionó carpeta de destino. Saliendo.")
return
print(f"\nCarpeta de destino: {directorio_salida}")
print(f"Iniciando conversión de {len(rutas_archivos)} archivos...")
print("=" * 60)
archivos_fallidos = []
for ruta in tqdm(rutas_archivos, desc="Progreso Total", unit=" archivo", dynamic_ncols=True):
ruta_pdf = convertidor_universal_pdf(ruta, directorio_salida)
if ruta_pdf is None and os.path.basename(ruta).lower().split('.')[-1] not in ['pdf']:
archivos_fallidos.append(os.path.basename(ruta))
print("=" * 60)
print("PROCESO TERMINADO: Conversión por lotes finalizada.")
if archivos_fallidos:
print("\n--- RESUMEN DE FALLOS ---")
print(f"Archivos que NO pudieron convertirse ({len(archivos_fallidos)}):")
for nombre in archivos_fallidos:
print(f"- {nombre}")
print("Verifique los mensajes de error anteriores.")
if __name__ == "__main__":
seleccionar_archivos_y_convertir()