Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -68,14 +68,16 @@ def mejorar_texto_con_IA(var_name, var_value, vectordb_list, nombre_curso):
|
|
| 68 |
|
| 69 |
|
| 70 |
# Función para generar el documento
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 71 |
def crear_documento(nombre_curso, variables):
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
# Insertar la imagen con estilo centrado
|
| 75 |
-
imagen = doc.add_paragraph()
|
| 76 |
-
imagen.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
| 77 |
-
run_imagen = imagen.add_run()
|
| 78 |
-
run_imagen.add_picture("UdeA+simplificado-01.png", width=Inches(1.5))
|
| 79 |
|
| 80 |
# Título Principal
|
| 81 |
titulo = doc.add_paragraph()
|
|
@@ -83,12 +85,18 @@ def crear_documento(nombre_curso, variables):
|
|
| 83 |
titulo_run = titulo.add_run("PROGRAMA OFICIAL DE CURSO\n(Pregrado y Posgrado)\nUNIVERSIDAD DE ANTIOQUIA")
|
| 84 |
titulo_run.bold = True
|
| 85 |
titulo_run.font.size = Pt(16)
|
| 86 |
-
titulo_run.font.color.rgb = RGBColor(34, 85, 85) #
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
|
| 88 |
# Información General - Tabla
|
| 89 |
-
doc.add_paragraph("\nINFORMACIÓN GENERAL", style='Heading 1')
|
| 90 |
info_table = doc.add_table(rows=0, cols=2)
|
| 91 |
-
info_table.style = 'Table Grid'
|
| 92 |
|
| 93 |
info_general = [
|
| 94 |
("Nombre del curso", nombre_curso),
|
|
@@ -111,11 +119,19 @@ def crear_documento(nombre_curso, variables):
|
|
| 111 |
|
| 112 |
for key, value in info_general:
|
| 113 |
row = info_table.add_row().cells
|
|
|
|
| 114 |
row[0].text = key
|
| 115 |
-
row[0].paragraphs[0]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 116 |
row[1].text = value
|
| 117 |
|
| 118 |
-
# Secciones con Títulos
|
| 119 |
secciones = [
|
| 120 |
("RELACIONES CON EL PERFIL", str(variables.get('relaciones_perfil', ''))),
|
| 121 |
("INTENCIONALIDADES FORMATIVAS", str(variables.get('intencionalidades', ''))),
|
|
@@ -129,28 +145,28 @@ def crear_documento(nombre_curso, variables):
|
|
| 129 |
]
|
| 130 |
|
| 131 |
for titulo, contenido in secciones:
|
| 132 |
-
# Añadir título de sección
|
| 133 |
-
parrafo_titulo = doc.add_paragraph(
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
run_titulo.font.color.rgb = RGBColor(34, 85, 85) # Cambiar el color azul oscuro a un verde azulado más acorde
|
| 138 |
|
| 139 |
-
# Añadir contenido
|
| 140 |
if '\n' in contenido:
|
| 141 |
for linea in contenido.split('\n'):
|
| 142 |
-
parrafo = doc.add_paragraph(linea
|
|
|
|
| 143 |
parrafo.paragraph_format.left_indent = Inches(0.5)
|
| 144 |
else:
|
| 145 |
-
doc.add_paragraph(contenido)
|
|
|
|
| 146 |
|
| 147 |
# Aprobación del Consejo de Unidad Académica
|
| 148 |
-
aprobacion_titulo = doc.add_paragraph("
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
aprobacion_parrafo = doc.add_paragraph()
|
| 155 |
aprobacion_parrafo.add_run("Aprobado en Acta número ").bold = False
|
| 156 |
aprobacion_parrafo.add_run("_______________").underline = True
|
|
@@ -167,40 +183,9 @@ def crear_documento(nombre_curso, variables):
|
|
| 167 |
for label, line in secretario_info:
|
| 168 |
parrafo_label = doc.add_paragraph(label)
|
| 169 |
parrafo_label.runs[0].font.bold = True
|
| 170 |
-
parrafo_label.runs[0].font.color.rgb = RGBColor(34, 85, 85)
|
| 171 |
-
doc.add_paragraph(line)
|
| 172 |
-
|
| 173 |
-
# Encabezado y pie de página
|
| 174 |
-
section = doc.sections[0]
|
| 175 |
-
header = section.header
|
| 176 |
-
header_paragraph = header.paragraphs[0]
|
| 177 |
-
header_paragraph.text = "Universidad de Antioquia - Programa Oficial de Curso"
|
| 178 |
-
header_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
| 179 |
-
header_run = header_paragraph.runs[0]
|
| 180 |
-
header_run.font.size = Pt(10)
|
| 181 |
-
header_run.font.color.rgb = RGBColor(255, 255, 255) # Color de letra blanco
|
| 182 |
-
header_run.font.name = 'Arial' # Fuente Arial
|
| 183 |
-
|
| 184 |
-
# Fondo naranja del encabezado
|
| 185 |
-
p = header_paragraph._p
|
| 186 |
-
pPr = p.get_or_add_pPr()
|
| 187 |
-
shading_elm = parse_xml(r'<w:shd {} w:fill="FFA500"/>'.format(nsdecls('w')))
|
| 188 |
-
pPr.append(shading_elm)
|
| 189 |
-
|
| 190 |
-
footer = section.footer
|
| 191 |
-
footer_paragraph = footer.paragraphs[0]
|
| 192 |
-
footer_paragraph.text = "Página – Universidad de Antioquia"
|
| 193 |
-
footer_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
| 194 |
-
footer_run = footer_paragraph.runs[0]
|
| 195 |
-
footer_run.font.size = Pt(10)
|
| 196 |
-
footer_run.font.color.rgb = RGBColor(255, 255, 255) # Color de letra blanco
|
| 197 |
-
footer_run.font.name = 'Arial' # Fuente Arial
|
| 198 |
-
|
| 199 |
-
# Fondo naranja del pie de página
|
| 200 |
-
p = footer_paragraph._p
|
| 201 |
-
pPr = p.get_or_add_pPr()
|
| 202 |
-
shading_elm = parse_xml(r'<w:shd {} w:fill="FFA500"/>'.format(nsdecls('w')))
|
| 203 |
-
pPr.append(shading_elm)
|
| 204 |
|
| 205 |
# Guardar el documento en un objeto de bytes
|
| 206 |
doc_buffer = BytesIO()
|
|
@@ -210,6 +195,7 @@ def crear_documento(nombre_curso, variables):
|
|
| 210 |
return doc_buffer
|
| 211 |
|
| 212 |
|
|
|
|
| 213 |
with st.expander("INFORMACIÓN GENERAL"):
|
| 214 |
nombre_curso = st.text_input("Nombre del curso:", value=st.session_state.get('nombre_curso', ''), key='nombre_curso')
|
| 215 |
programa_academico = st.text_input("Programa académico al que pertenece:", value=st.session_state.get('programa_academico', ''), key='programa_academico')
|
|
|
|
| 68 |
|
| 69 |
|
| 70 |
# Función para generar el documento
|
| 71 |
+
from docx import Document
|
| 72 |
+
from docx.shared import Inches, Pt, RGBColor
|
| 73 |
+
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
|
| 74 |
+
from docx.oxml import parse_xml
|
| 75 |
+
from docx.oxml.ns import nsdecls
|
| 76 |
+
from io import BytesIO
|
| 77 |
+
|
| 78 |
def crear_documento(nombre_curso, variables):
|
| 79 |
+
# Cargar la plantilla existente
|
| 80 |
+
doc = Document('plantilla_micro.dotx')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
|
| 82 |
# Título Principal
|
| 83 |
titulo = doc.add_paragraph()
|
|
|
|
| 85 |
titulo_run = titulo.add_run("PROGRAMA OFICIAL DE CURSO\n(Pregrado y Posgrado)\nUNIVERSIDAD DE ANTIOQUIA")
|
| 86 |
titulo_run.bold = True
|
| 87 |
titulo_run.font.size = Pt(16)
|
| 88 |
+
titulo_run.font.color.rgb = RGBColor(34, 85, 85) # Ajustar el color del título
|
| 89 |
+
|
| 90 |
+
# Información General - Título de sección
|
| 91 |
+
titulo_info_general = doc.add_paragraph("INFORMACIÓN GENERAL")
|
| 92 |
+
titulo_info_general.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
|
| 93 |
+
titulo_info_general.style = 'Heading 1' # Asumiendo que este estilo existe en la plantilla
|
| 94 |
+
for run in titulo_info_general.runs:
|
| 95 |
+
run.font.color.rgb = RGBColor(34, 85, 85)
|
| 96 |
|
| 97 |
# Información General - Tabla
|
|
|
|
| 98 |
info_table = doc.add_table(rows=0, cols=2)
|
| 99 |
+
info_table.style = 'Table Grid' # Puedes ajustar el estilo según tus preferencias
|
| 100 |
|
| 101 |
info_general = [
|
| 102 |
("Nombre del curso", nombre_curso),
|
|
|
|
| 119 |
|
| 120 |
for key, value in info_general:
|
| 121 |
row = info_table.add_row().cells
|
| 122 |
+
# Primera celda (clave)
|
| 123 |
row[0].text = key
|
| 124 |
+
paragraph = row[0].paragraphs[0]
|
| 125 |
+
for run in paragraph.runs:
|
| 126 |
+
run.font.bold = True
|
| 127 |
+
run.font.color.rgb = RGBColor(34, 85, 85)
|
| 128 |
+
# Aplicar fondo a la primera celda
|
| 129 |
+
shading_elm_1 = parse_xml(r'<w:shd {} w:fill="D9D9D9"/>'.format(nsdecls('w')))
|
| 130 |
+
row[0]._tc.get_or_add_tcPr().append(shading_elm_1)
|
| 131 |
+
# Segunda celda (valor)
|
| 132 |
row[1].text = value
|
| 133 |
|
| 134 |
+
# Secciones con Títulos y Contenido
|
| 135 |
secciones = [
|
| 136 |
("RELACIONES CON EL PERFIL", str(variables.get('relaciones_perfil', ''))),
|
| 137 |
("INTENCIONALIDADES FORMATIVAS", str(variables.get('intencionalidades', ''))),
|
|
|
|
| 145 |
]
|
| 146 |
|
| 147 |
for titulo, contenido in secciones:
|
| 148 |
+
# Añadir título de sección
|
| 149 |
+
parrafo_titulo = doc.add_paragraph(titulo)
|
| 150 |
+
parrafo_titulo.style = 'Heading 1' # Asegúrate de que este estilo está en tu plantilla
|
| 151 |
+
for run in parrafo_titulo.runs:
|
| 152 |
+
run.font.color.rgb = RGBColor(34, 85, 85)
|
|
|
|
| 153 |
|
| 154 |
+
# Añadir contenido
|
| 155 |
if '\n' in contenido:
|
| 156 |
for linea in contenido.split('\n'):
|
| 157 |
+
parrafo = doc.add_paragraph(linea)
|
| 158 |
+
parrafo.style = 'List Bullet' # O el estilo que prefieras
|
| 159 |
parrafo.paragraph_format.left_indent = Inches(0.5)
|
| 160 |
else:
|
| 161 |
+
parrafo = doc.add_paragraph(contenido)
|
| 162 |
+
# Puedes aplicar un estilo específico si lo deseas
|
| 163 |
|
| 164 |
# Aprobación del Consejo de Unidad Académica
|
| 165 |
+
aprobacion_titulo = doc.add_paragraph("APROBACIÓN DEL CONSEJO DE UNIDAD ACADÉMICA")
|
| 166 |
+
aprobacion_titulo.style = 'Heading 1'
|
| 167 |
+
for run in aprobacion_titulo.runs:
|
| 168 |
+
run.font.color.rgb = RGBColor(34, 85, 85)
|
| 169 |
+
|
|
|
|
| 170 |
aprobacion_parrafo = doc.add_paragraph()
|
| 171 |
aprobacion_parrafo.add_run("Aprobado en Acta número ").bold = False
|
| 172 |
aprobacion_parrafo.add_run("_______________").underline = True
|
|
|
|
| 183 |
for label, line in secretario_info:
|
| 184 |
parrafo_label = doc.add_paragraph(label)
|
| 185 |
parrafo_label.runs[0].font.bold = True
|
| 186 |
+
parrafo_label.runs[0].font.color.rgb = RGBColor(34, 85, 85)
|
| 187 |
+
parrafo_linea = doc.add_paragraph(line)
|
| 188 |
+
parrafo_linea.runs[0].font.underline = True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
|
| 190 |
# Guardar el documento en un objeto de bytes
|
| 191 |
doc_buffer = BytesIO()
|
|
|
|
| 195 |
return doc_buffer
|
| 196 |
|
| 197 |
|
| 198 |
+
|
| 199 |
with st.expander("INFORMACIÓN GENERAL"):
|
| 200 |
nombre_curso = st.text_input("Nombre del curso:", value=st.session_state.get('nombre_curso', ''), key='nombre_curso')
|
| 201 |
programa_academico = st.text_input("Programa académico al que pertenece:", value=st.session_state.get('programa_academico', ''), key='programa_academico')
|