Framework de generación de reportes LaTeX científicos vía Cloud
Project description
CloudMatchPDF v2.0
CloudMatchPDF es un framework Python para automatizar la generación de documentos LaTeX técnicos y académicos. Integra cálculo simbólico con SymPy, visualización con Matplotlib y compilación distribuida en la nube, eliminando la necesidad de instalaciones locales de TeX Live.
Novedades v2.0
- Modelo de documento orientado a objetos: Nueva arquitectura con
Document,Section,Paragraph,Equation, etc. que permite manipular documentos como objetos en lugar de strings LaTeX - Arquitectura de compiladores extensible: Sistema de backends con
CompilerBackendcomo clase base. IncluyeCloudCompilerBackend(nube) yLocalCompiler(pdflatex local) - Seguridad mejorada: Eliminación completa de
eval(), ahora usasympify()de SymPy para parsear funciones matemáticas de forma segura - Soporte para tablas: Nuevo método
add_table()para generar tablas LaTeX - Soporte para imágenes: Nuevo método
add_image()para incluir imágenes externas - Manejo de errores específico: Excepciones específicas (
ValueError,requests.Timeout, etc.) en lugar deExceptiongenérico
Características Principales
- LatexBuilder: Constructor de documentos con API fluida. Permite inyectar ecuaciones de SymPy, bloques de código y gráficas vectoriales sin tocar LaTeX
- Integración Gráfica: Renderizado de funciones matemáticas y figuras de Matplotlib mediante primitivas vectoriales de LaTeX
- LatexValidator: Sistema de sanitización que escapa caracteres reservados y valida sintaxis LaTeX
- CloudCompiler: Motor de compilación asíncrona que utiliza mirrors distribuidos en la nube
Dependencias
- Python 3.8+
- SymPy >= 1.12
- Matplotlib >= 3.8.0
- NumPy >= 1.26.4
- requests >= 2.31.0
Instalación
pip install -e .
Estructura del Proyecto
CloudMatchPDF/
├── src/cloudmatchpdf/
│ ├── __init__.py # Exporta clases públicas
│ ├── latex_builder.py # API fluida tradicional
│ ├── latex_validator.py # Validación y sanitización
│ ├── cloud_compiler.py # Wrapper backwards compatibility
│ ├── compiler_backend.py # Clase base abstracta
│ ├── document_model.py # Modelo de documento v2.0
│ ├── latex_renderer.py # Renderer LaTeX v2.0
│ └── backends/
│ ├── __init__.py
│ ├── cloud_backend.py # Compilación en la nube
│ └── local_backend.py # Compilación local
├── tests/
│ ├── test_builder.py
│ ├── test_compiler.py
│ ├── test_validator.py
│ ├── test_document_model.py # Tests v2.0
│ └── test_backends.py # Tests v2.0
├── examples/
│ └── pruebas.py # Ejemplo con fallback Local -> Nube
├── setup.py
├── requirements.txt
└── README.md
Ejemplos de Uso
Opción 1: Modelo de documento v2.0 (Recomendado)
from cloudmatchpdf import Document, LatexRenderer
from cloudmatchpdf.backends import CloudCompilerBackend, LocalCompiler
from cloudmatchpdf.latex_validator import LatexValidator
import sympy as sp
# Crear documento
doc = Document(title="Análisis de Osciladores", author="Jose V. Jimenez")
# Construir con API fluida
(doc.add_section("Cinemática del Sistema")
.add_text("Se analiza la ecuación de movimiento para un sistema masa-resorte:")
.add_equation(sp.Function('x')(sp.Symbol('t')), subtitle="Posición temporal")
.add_plot(obj="sin(x) * exp(-0.1*x)", caption="Decaimiento", x_range="0:10")
.add_table(
data=[["1.0", "2.5"], ["2.0", "4.8"], ["3.0", "7.1"]],
headers=["Tiempo (s)", "Posición (m)"],
caption="Datos experimentales"
)
)
# Renderizar a LaTeX
renderer = LatexRenderer(doc)
latex = renderer.render()
# Validar
safe_latex = LatexValidator.process(latex)
# Fallback: Local -> Nube
# Primero intenta compilación local (rápida, sin internet)
local_compiler = LocalCompiler()
if local_compiler.compile(safe_latex, output="report.pdf"):
print("✅ Compilación local exitosa")
else:
print("❌ Local falló, intentando nube...")
# Si local falla, usa compilación en la nube
cloud_compiler = CloudCompilerBackend()
if cloud_compiler.compile(safe_latex, output="report.pdf"):
print("✅ Compilación en nube exitosa")
else:
print("❌ Todos los métodos fallaron")
Opción 2: API tradicional (LatexBuilder)
from cloudmatchpdf.latex_builder import LatexBuilder
from cloudmatchpdf.cloud_compiler import CloudCompiler
import sympy as sp
doc = LatexBuilder(title="Reporte", author="Autor")
doc.add_section("Introducción").add_text("Texto")
doc.add_equation(sp.sin(sp.Symbol('x')))
compiler = CloudCompiler()
compiler.compile(doc.build(), output="report.pdf")
Referencia de la API
Document (v2.0)
add_section(title, numbered=True): Añade secciónadd_subsection(title, numbered=True): Añade subsecciónadd_text(text): Añade párrafoadd_equation(expr, subtitle): Añade ecuación SymPyadd_math_block(latex_str, numbered): Añade bloque matemático LaTeXadd_plot(obj, caption, x_range): Añade gráficaadd_table(data, caption, headers): Añade tablaadd_image(path, caption, width): Añade imagenadd_package(name, options): Añade paquete LaTeX
LatexRenderer
render(): Convierte Document a código LaTeX
Backends
CloudCompilerBackend: Compila en la nube (3 endpoints por defecto)
- LaTeXOnline (GET):
https://latexonline.cc/compile - LaTeXOnline (POST):
https://latexonline.cc/compile - TeXLive-Net:
https://texlive.net/cgi-bin/latexml.cgi - Ventaja: No requiere instalación local de TeX Live
- Requiere: Conexión a internet
add_endpoint(name, method, url, param="text"): Agrega endpoint personalizado
LocalCompiler: Compila con pdflatex local
- Ventaja: Compilación rápida sin dependencias externas
- Requiere: pdflatex instalado
Crear backend personalizado
from cloudmatchpdf.compiler_backend import CompilerBackend
class CustomBackend(CompilerBackend):
def compile(self, latex: str, output: str) -> bool:
# Tu lógica personalizada
pass
Tests
pytest tests/
Troubleshooting
Problema: pdflatex no encontrado
- Solución: Instala TeX Live o MikTeX, o usa
CloudCompilerBackenden su lugar
Problema: Sin conexión a internet
- Solución: Usa
LocalCompilercon pdflatex instalado localmente
Problema: Timeout en compilación cloud
- Solución: Aumenta el timeout:
CloudCompilerBackend(timeout=60)
Problema: Underscore sin escapar
- Solución: Usa
LatexValidator.process()antes de compilar
Contributing
Las contribuciones son bienvenidas. Para contribuir:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/nueva-funcionalidad) - Commit tus cambios (
git commit -am 'Agrega nueva funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Abre un Pull Request
Licencia
Desarrollado por Jose V. Jimenez para uso académico y personal.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cloudmatchpdf-2.0.0.tar.gz.
File metadata
- Download URL: cloudmatchpdf-2.0.0.tar.gz
- Upload date:
- Size: 15.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
776b70029e1254e17da635e6e66094f873d0883606243e3a3c9470b1b4e10e5f
|
|
| MD5 |
0e15d7dbbfaea7b8ecd7be79c24e0f35
|
|
| BLAKE2b-256 |
219e5054feb3b0c97e0ee323f7c4f0514b40bce63cf544886164ce3e35de90a4
|
File details
Details for the file cloudmatchpdf-2.0.0-py3-none-any.whl.
File metadata
- Download URL: cloudmatchpdf-2.0.0-py3-none-any.whl
- Upload date:
- Size: 17.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2573ff630a1df6b56a13690dcc766625161db0c5abdc5ddb8b0b0cd29f94097
|
|
| MD5 |
faf8bfa0c5b2b70a0fc854b2c1727552
|
|
| BLAKE2b-256 |
7a8f6b62fa5ca9da08c8932ead19e0927f75ac6aa16b57e0133f763d7ddd2a60
|