Upload 8 files
Browse files- buscar_datos.py +30 -0
- chat.py +90 -0
- home.py +65 -0
- insumos.py +6 -0
- notificaciones.py +6 -0
- radiografias.py +49 -0
- recomendaciones.py +89 -0
- trabajos.py +6 -0
buscar_datos.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# pages/buscar_datos.py
|
| 2 |
+
import streamlit as st
|
| 3 |
+
from utils.data_manager import cargar_desde_txt, listar_archivos_txt
|
| 4 |
+
|
| 5 |
+
def show():
|
| 6 |
+
st.title("🔍 Buscar Datos Guardados")
|
| 7 |
+
|
| 8 |
+
archivos = listar_archivos_txt()
|
| 9 |
+
|
| 10 |
+
if archivos:
|
| 11 |
+
archivo_seleccionado = st.selectbox("Selecciona un archivo para ver:", archivos)
|
| 12 |
+
|
| 13 |
+
if archivo_seleccionado:
|
| 14 |
+
datos = cargar_desde_txt(archivo_seleccionado)
|
| 15 |
+
if datos:
|
| 16 |
+
st.write(f"### Datos del archivo {archivo_seleccionado}")
|
| 17 |
+
st.text_area("Datos", datos, height=300)
|
| 18 |
+
|
| 19 |
+
# Link to download the file
|
| 20 |
+
with open(archivo_seleccionado, 'rb') as file:
|
| 21 |
+
st.download_button(
|
| 22 |
+
label="📥 Descargar Archivo TXT",
|
| 23 |
+
data=file,
|
| 24 |
+
file_name=archivo_seleccionado,
|
| 25 |
+
mime="text/plain"
|
| 26 |
+
)
|
| 27 |
+
else:
|
| 28 |
+
st.warning(f"No se encontraron datos en el archivo {archivo_seleccionado}")
|
| 29 |
+
else:
|
| 30 |
+
st.info("No se encontraron archivos de datos guardados.")
|
chat.py
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import os
|
| 3 |
+
from utils.data_manager import (
|
| 4 |
+
extraer_texto_pdf,
|
| 5 |
+
preprocesar_texto,
|
| 6 |
+
obtener_respuesta,
|
| 7 |
+
handle_voice_input
|
| 8 |
+
)
|
| 9 |
+
# Configuración de la clave API
|
| 10 |
+
OPENAI_API_KEY= "sk-proj-3LjZDUxPCK7NOxAGsBrcT3BlbkFJPwq200vDWf5JG2YWgAsx" # Reemplaza esto con tu clave API real
|
| 11 |
+
|
| 12 |
+
def inicializar_estado():
|
| 13 |
+
"""Inicializa el estado de la sesión si no está ya inicializado."""
|
| 14 |
+
if 'modelo' not in st.session_state:
|
| 15 |
+
st.session_state['modelo'] = "gpt-3.5-turbo"
|
| 16 |
+
if 'temperatura' not in st.session_state:
|
| 17 |
+
st.session_state['temperatura'] = 0.5
|
| 18 |
+
if 'mensajes_chat' not in st.session_state:
|
| 19 |
+
st.session_state['mensajes_chat'] = []
|
| 20 |
+
|
| 21 |
+
def barra_lateral():
|
| 22 |
+
"""Configura la barra lateral de la aplicación."""
|
| 23 |
+
st.sidebar.image(os.path.join("assets"), use_column_width=True)
|
| 24 |
+
st.sidebar.title("🤖 Galatea OMARDENT")
|
| 25 |
+
st.sidebar.markdown("---")
|
| 26 |
+
st.sidebar.subheader("🧠 Configuración del Modelo")
|
| 27 |
+
st.session_state['modelo'] = st.sidebar.selectbox(
|
| 28 |
+
"Selecciona el modelo:",
|
| 29 |
+
["gpt-3.5-turbo", "gpt-4", "gpt-4-32k"],
|
| 30 |
+
index=0,
|
| 31 |
+
help="Elige el modelo de lenguaje de OpenAI que prefieras."
|
| 32 |
+
)
|
| 33 |
+
st.sidebar.markdown("---")
|
| 34 |
+
st.session_state['temperatura'] = st.sidebar.slider(
|
| 35 |
+
"🌡️ Temperatura",
|
| 36 |
+
min_value=0.0, max_value=1.0,
|
| 37 |
+
value=st.session_state['temperatura'], step=0.1
|
| 38 |
+
)
|
| 39 |
+
|
| 40 |
+
def mostrar_mensajes_chat():
|
| 41 |
+
"""Muestra los mensajes del chat."""
|
| 42 |
+
for mensaje in st.session_state['mensajes_chat']:
|
| 43 |
+
with st.chat_message(mensaje["role"]):
|
| 44 |
+
st.markdown(mensaje["content"])
|
| 45 |
+
|
| 46 |
+
def manejar_pregunta_usuario(pregunta_usuario, archivo_pdf):
|
| 47 |
+
"""Procesa la pregunta del usuario."""
|
| 48 |
+
st.session_state['mensajes_chat'].append({"role": "user", "content": pregunta_usuario})
|
| 49 |
+
with st.chat_message("user"):
|
| 50 |
+
st.markdown(pregunta_usuario)
|
| 51 |
+
|
| 52 |
+
texto_preprocesado = ""
|
| 53 |
+
if archivo_pdf:
|
| 54 |
+
texto_pdf = extraer_texto_pdf(archivo_pdf)
|
| 55 |
+
texto_preprocesado = preprocesar_texto(texto_pdf)
|
| 56 |
+
|
| 57 |
+
respuesta = obtener_respuesta(pregunta_usuario, texto_preprocesado, st.session_state['modelo'], st.session_state['temperatura'])
|
| 58 |
+
st.session_state['mensajes_chat'].append({"role": "assistant", "content": respuesta})
|
| 59 |
+
with st.chat_message("assistant"):
|
| 60 |
+
st.markdown(respuesta)
|
| 61 |
+
|
| 62 |
+
def manejar_captura_de_voz(audio_capturado):
|
| 63 |
+
"""Procesa el archivo de audio subido."""
|
| 64 |
+
texto_extraido = handle_voice_input(audio_capturado)
|
| 65 |
+
st.markdown("### Texto extraído del audio:")
|
| 66 |
+
st.write(texto_extraido)
|
| 67 |
+
|
| 68 |
+
def main():
|
| 69 |
+
st.header("💬 Hablar con Galatea OMARDENT - Página de Chat")
|
| 70 |
+
inicializar_estado()
|
| 71 |
+
barra_lateral()
|
| 72 |
+
|
| 73 |
+
# --- Área principal de la aplicación ---
|
| 74 |
+
archivo_pdf = st.file_uploader("📂 Cargar PDF", type='pdf', key='chat_pdf')
|
| 75 |
+
|
| 76 |
+
mostrar_mensajes_chat()
|
| 77 |
+
|
| 78 |
+
pregunta_usuario = st.chat_input("Pregunta:")
|
| 79 |
+
if pregunta_usuario:
|
| 80 |
+
manejar_pregunta_usuario(pregunta_usuario, archivo_pdf)
|
| 81 |
+
|
| 82 |
+
st.markdown("### Captura de voz")
|
| 83 |
+
audio_capturado = st.file_uploader("Subir archivo de audio", type=["wav", "mp3"], key='audio_chat')
|
| 84 |
+
if audio_capturado:
|
| 85 |
+
manejar_captura_de_voz(audio_capturado)
|
| 86 |
+
|
| 87 |
+
st.markdown("---")
|
| 88 |
+
|
| 89 |
+
if __name__ == "__main__":
|
| 90 |
+
main()
|
home.py
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# pages/home.py
|
| 2 |
+
import os
|
| 3 |
+
import streamlit as st
|
| 4 |
+
from utils.data_manager import (
|
| 5 |
+
extraer_texto_pdf,
|
| 6 |
+
preprocesar_texto,
|
| 7 |
+
obtener_respuesta
|
| 8 |
+
)
|
| 9 |
+
|
| 10 |
+
def show():
|
| 11 |
+
st.header("💬 Hablar con Galatea OMARDENT")
|
| 12 |
+
|
| 13 |
+
# Inicializa los valores predeterminados si no existen
|
| 14 |
+
if 'modelo' not in st.session_state:
|
| 15 |
+
st.session_state.modelo = "gpt-3.5-turbo"
|
| 16 |
+
if 'temperatura' not in st.session_state:
|
| 17 |
+
st.session_state.temperatura = 0.5
|
| 18 |
+
|
| 19 |
+
# --- Barra lateral ---
|
| 20 |
+
with st.sidebar:
|
| 21 |
+
st.image(os.path.join("assets", "Logo Omardent.png"), use_column_width=True)
|
| 22 |
+
st.title("🤖 Galatea OMARDENT")
|
| 23 |
+
st.markdown("---")
|
| 24 |
+
|
| 25 |
+
# Selección de modelo de lenguaje
|
| 26 |
+
st.subheader("🧠 Configuración del Modelo")
|
| 27 |
+
st.session_state.modelo = st.selectbox(
|
| 28 |
+
"Selecciona el modelo:",
|
| 29 |
+
["gpt-3.5-turbo", "gpt-4", "gpt-4-32k"],
|
| 30 |
+
index=0,
|
| 31 |
+
help="Elige el modelo de lenguaje de OpenAI que prefieras."
|
| 32 |
+
)
|
| 33 |
+
|
| 34 |
+
# Opciones adicionales
|
| 35 |
+
st.markdown("---")
|
| 36 |
+
st.session_state.temperatura = st.slider("🌡️ Temperatura", min_value=0.0, max_value=1.0, value=st.session_state.temperatura, step=0.1)
|
| 37 |
+
|
| 38 |
+
# --- Área principal de la aplicación ---
|
| 39 |
+
# Carga de archivo PDF
|
| 40 |
+
archivo_pdf = st.file_uploader("📂 Cargar PDF", type='pdf')
|
| 41 |
+
|
| 42 |
+
# --- Chatbot ---
|
| 43 |
+
if 'mensajes' not in st.session_state:
|
| 44 |
+
st.session_state.mensajes = []
|
| 45 |
+
|
| 46 |
+
for mensaje in st.session_state.mensajes:
|
| 47 |
+
with st.chat_message(mensaje["role"]):
|
| 48 |
+
st.markdown(mensaje["content"])
|
| 49 |
+
|
| 50 |
+
pregunta_usuario = st.chat_input("Pregunta:")
|
| 51 |
+
if pregunta_usuario:
|
| 52 |
+
st.session_state.mensajes.append({"role": "user", "content": pregunta_usuario})
|
| 53 |
+
with st.chat_message("user"):
|
| 54 |
+
st.markdown(pregunta_usuario)
|
| 55 |
+
|
| 56 |
+
if archivo_pdf:
|
| 57 |
+
texto_pdf = extraer_texto_pdf(archivo_pdf)
|
| 58 |
+
texto_preprocesado = preprocesar_texto(texto_pdf)
|
| 59 |
+
else:
|
| 60 |
+
texto_preprocesado = ""
|
| 61 |
+
|
| 62 |
+
respuesta = obtener_respuesta(pregunta_usuario, texto_preprocesado, st.session_state.modelo, st.session_state.temperatura)
|
| 63 |
+
st.session_state.mensajes.append({"role": "assistant", "content": respuesta})
|
| 64 |
+
with st.chat_message("assistant"):
|
| 65 |
+
st.markdown(respuesta)
|
insumos.py
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
from utils.data_manager import flujo_insumos
|
| 3 |
+
|
| 4 |
+
def show():
|
| 5 |
+
flujo_insumos()
|
| 6 |
+
|
notificaciones.py
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# pages/notificaciones.py
|
| 2 |
+
import streamlit as st
|
| 3 |
+
from utils.data_manager import generar_notificaciones_pendientes
|
| 4 |
+
|
| 5 |
+
def show():
|
| 6 |
+
generar_notificaciones_pendientes()
|
radiografias.py
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# pages/radiografias.py
|
| 2 |
+
import streamlit as st
|
| 3 |
+
from utils.data_manager import guardar_en_txt, cargar_desde_txt, mostrar_datos_como_texto
|
| 4 |
+
|
| 5 |
+
def show():
|
| 6 |
+
st.title("📋 Registro de Radiografías")
|
| 7 |
+
|
| 8 |
+
if 'radiografias' not in st.session_state:
|
| 9 |
+
st.session_state.radiografias = []
|
| 10 |
+
|
| 11 |
+
with st.form("radiografias_form"):
|
| 12 |
+
nombre_paciente = st.text_input("Nombre del Paciente:")
|
| 13 |
+
fecha_envio = st.date_input("Fecha en que se envía la Radiografía:")
|
| 14 |
+
motivo_consulta = st.text_input("Motivo de Consulta:")
|
| 15 |
+
tipo_diagnostico = st.text_input("Tipo de Diagnóstico:")
|
| 16 |
+
tutor_envia = st.text_input("Tutor que envía la Radiografía:")
|
| 17 |
+
recomendaciones = st.selectbox("Recomendaciones:", [
|
| 18 |
+
"Recomendaciones después de una exodoncia dental",
|
| 19 |
+
"Recomendaciones después de un blanqueamiento dental",
|
| 20 |
+
"Recomendaciones para el uso de una prótesis dental"
|
| 21 |
+
])
|
| 22 |
+
submitted = st.form_submit_button("Registrar Radiografía")
|
| 23 |
+
|
| 24 |
+
if submitted:
|
| 25 |
+
radiografia = {
|
| 26 |
+
"nombre_paciente": nombre_paciente,
|
| 27 |
+
"fecha_envio": str(fecha_envio),
|
| 28 |
+
"motivo_consulta": motivo_consulta,
|
| 29 |
+
"tipo_diagnostico": tipo_diagnostico,
|
| 30 |
+
"tutor_envia": tutor_envia,
|
| 31 |
+
"recomendaciones": recomendaciones
|
| 32 |
+
}
|
| 33 |
+
st.session_state.radiografias.append(radiografia)
|
| 34 |
+
datos_guardados = mostrar_datos_como_texto(st.session_state.radiografias)
|
| 35 |
+
guardar_en_txt('radiografias.txt', datos_guardados)
|
| 36 |
+
st.success("Radiografía registrada con éxito.")
|
| 37 |
+
|
| 38 |
+
if st.session_state.radiografias:
|
| 39 |
+
st.write("### Radiografías Registradas")
|
| 40 |
+
st.text_area("Radiografías", mostrar_datos_como_texto(st.session_state.radiografias), height=300)
|
| 41 |
+
|
| 42 |
+
# Link to download the file
|
| 43 |
+
with open('datos_guardados/radiografias.txt', 'rb') as file:
|
| 44 |
+
st.download_button(
|
| 45 |
+
label="📥 Descargar Registro de Radiografías",
|
| 46 |
+
data=file,
|
| 47 |
+
file_name="radiografias.txt",
|
| 48 |
+
mime="text/plain"
|
| 49 |
+
)
|
recomendaciones.py
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import io
|
| 3 |
+
from docx import Document
|
| 4 |
+
from PyPDF2 import PdfReader, PdfWriter
|
| 5 |
+
from utils.data_manager import extraer_texto_pdf
|
| 6 |
+
import openai
|
| 7 |
+
|
| 8 |
+
def show():
|
| 9 |
+
st.title("✍️ IA para Modificación de Documentos")
|
| 10 |
+
|
| 11 |
+
uploaded_file = st.file_uploader("Sube un documento (PDF o DOCX)", type=['pdf', 'docx'])
|
| 12 |
+
|
| 13 |
+
if uploaded_file:
|
| 14 |
+
if uploaded_file.type == "application/pdf":
|
| 15 |
+
texto_original = extraer_texto_pdf(uploaded_file)
|
| 16 |
+
st.text_area("Contenido del Documento Original", texto_original, height=300)
|
| 17 |
+
elif uploaded_file.type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
|
| 18 |
+
documento = Document(uploaded_file)
|
| 19 |
+
texto_original = "\n".join([para.text for para in documento.paragraphs])
|
| 20 |
+
st.text_area("Contenido del Documento Original", texto_original, height=300)
|
| 21 |
+
|
| 22 |
+
st.markdown("### Modificar Documento")
|
| 23 |
+
|
| 24 |
+
receptor = st.text_input("Modificar Para (Nombre del Receptor):")
|
| 25 |
+
notas_adicionales = st.text_area("Notas Adicionales:", height=100)
|
| 26 |
+
|
| 27 |
+
if st.button("Generar Documento Modificado"):
|
| 28 |
+
contenido_modificado = modificar_documento(texto_original, receptor, notas_adicionales)
|
| 29 |
+
st.text_area("Contenido del Documento Modificado", contenido_modificado, height=300)
|
| 30 |
+
|
| 31 |
+
# Descargar documento modificado
|
| 32 |
+
if uploaded_file.type == "application/pdf":
|
| 33 |
+
pdf_modificado = modificar_pdf(uploaded_file, contenido_modificado)
|
| 34 |
+
st.download_button(
|
| 35 |
+
label="📥 Descargar PDF Modificado",
|
| 36 |
+
data=pdf_modificado,
|
| 37 |
+
file_name="documento_modificado.pdf",
|
| 38 |
+
mime="application/pdf"
|
| 39 |
+
)
|
| 40 |
+
elif uploaded_file.type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
|
| 41 |
+
docx_modificado = modificar_docx(contenido_modificado)
|
| 42 |
+
st.download_button(
|
| 43 |
+
label="📥 Descargar DOCX Modificado",
|
| 44 |
+
data=docx_modificado,
|
| 45 |
+
file_name="documento_modificado.docx",
|
| 46 |
+
mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
| 47 |
+
)
|
| 48 |
+
|
| 49 |
+
def modificar_documento(texto, receptor, notas):
|
| 50 |
+
"""Modifica el contenido del documento basado en el receptor y notas adicionales."""
|
| 51 |
+
prompt = f"Modifica el siguiente texto para que esté dirigido a {receptor} y añade las siguientes notas: {notas}.\n\nTexto:\n{texto}"
|
| 52 |
+
response = openai.ChatCompletion.create(
|
| 53 |
+
model="gpt-3.5-turbo", # o "gpt-4" si estás usando ese modelo
|
| 54 |
+
messages=[
|
| 55 |
+
{"role": "system", "content": "Eres un asistente útil."},
|
| 56 |
+
{"role": "user", "content": prompt}
|
| 57 |
+
]
|
| 58 |
+
)
|
| 59 |
+
return response.choices[0].message['content']
|
| 60 |
+
|
| 61 |
+
def modificar_pdf(pdf_file, nuevo_contenido):
|
| 62 |
+
"""Modifica el contenido de un PDF."""
|
| 63 |
+
reader = PdfReader(pdf_file)
|
| 64 |
+
writer = PdfWriter()
|
| 65 |
+
|
| 66 |
+
# Añadir el contenido modificado a una nueva página del PDF
|
| 67 |
+
for page in reader.pages:
|
| 68 |
+
writer.add_page(page)
|
| 69 |
+
|
| 70 |
+
nueva_pagina = writer.add_blank_page(width=reader.pages[0].mediabox.width, height=reader.pages[0].mediabox.height)
|
| 71 |
+
nueva_pagina.insert_text(nuevo_contenido)
|
| 72 |
+
|
| 73 |
+
pdf_output = io.BytesIO()
|
| 74 |
+
writer.write(pdf_output)
|
| 75 |
+
pdf_output.seek(0)
|
| 76 |
+
|
| 77 |
+
return pdf_output
|
| 78 |
+
|
| 79 |
+
def modificar_docx(nuevo_contenido):
|
| 80 |
+
"""Modifica el contenido de un DOCX."""
|
| 81 |
+
doc = Document()
|
| 82 |
+
for line in nuevo_contenido.split("\n"):
|
| 83 |
+
doc.add_paragraph(line)
|
| 84 |
+
|
| 85 |
+
docx_output = io.BytesIO()
|
| 86 |
+
doc.save(docx_output)
|
| 87 |
+
docx_output.seek(0)
|
| 88 |
+
|
| 89 |
+
return docx_output
|
trabajos.py
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
from utils.data_manager import flujo_laboratorio
|
| 3 |
+
|
| 4 |
+
def show():
|
| 5 |
+
st.title("🦷 Gestión de Trabajos de Laboratorio")
|
| 6 |
+
flujo_laboratorio()
|