feat: issue/0020 — generacion de PDFs en Python y Go

Añade 3 tipos Python (PDFDoc, PDFPage, PDFStyle) y 10 funciones Python
para construir PDFs con fpdf2 (builder fluent), fusionar PDFs con pypdf
y convertir HTML/Markdown a PDF via weasyprint (stub si no disponible).
Añade pdf_simple_report en Go como stub hasta que go-pdf/fpdf se integre.

- python/types/infra/: pdf_doc, pdf_page, pdf_style
- python/functions/infra/: pdf_create, pdf_add_page, pdf_add_text,
  pdf_add_table, pdf_add_image, pdf_add_header_footer, pdf_from_html,
  pdf_from_markdown, pdf_merge, pdf_save
- functions/infra/pdf_simple_report.go: stub Go con ReportSection/ReportTable
- 17 tests Python pasando (pytest)
- fpdf2 y pypdf añadidos via uv al venv Python

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-13 02:02:51 +02:00
parent eca52b1329
commit 0819c35bbb
34 changed files with 1818 additions and 0 deletions
+57
View File
@@ -0,0 +1,57 @@
---
name: pdf_add_table
kind: function
lang: py
domain: infra
version: "1.0.0"
purity: impure
signature: "def pdf_add_table(doc, headers, rows, col_widths, header_style, row_style, border, row_height, alternate_bg) -> PDFDoc"
description: "Añade una tabla con fila de headers y filas de datos al documento PDF. Soporta anchos de columna personalizados, estilos diferenciados para headers/datos, bordes y colores alternados en filas."
tags: [pdf, table, data, builder, infra]
uses_functions: []
uses_types: [pdf_doc_py_infra, pdf_style_py_infra]
returns: [pdf_doc_py_infra]
returns_optional: false
error_type: "error_go_core"
imports: []
params:
- name: doc
desc: "PDFDoc con pagina activa"
- name: headers
desc: "lista de strings con nombres de columna de la tabla"
- name: rows
desc: "lista de listas de strings con los datos de cada fila"
- name: col_widths
desc: "lista de anchos de columna en mm; None distribuye uniformemente el ancho disponible"
- name: header_style
desc: "PDFStyle para la fila de headers; None usa Helvetica-Bold 10pt"
- name: row_style
desc: "PDFStyle para filas de datos; None usa Helvetica 10pt"
- name: border
desc: "tipo de borde: 0=sin borde, 1=borde completo"
- name: row_height
desc: "altura de cada celda en mm, por defecto 8"
- name: alternate_bg
desc: "si True alterna fondo gris claro en filas pares para mejorar legibilidad"
output: "PDFDoc con la tabla renderizada en la pagina activa"
tested: true
tests: ["tabla con headers y datos", "tabla con col_widths personalizados", "tabla sin borde"]
test_file_path: "python/functions/infra/pdf_add_table_test.py"
file_path: "python/functions/infra/pdf_add_table.py"
---
## Ejemplo
```python
headers = ["Dominio", "Funciones", "Purity"]
rows = [
["core", "45", "pure"],
["infra", "38", "impure"],
["finance", "22", "mixed"],
]
doc = pdf_add_table(doc, headers, rows, col_widths=[70, 40, 60])
```
## Notas
Las columnas se distribuyen uniformemente si `col_widths` es None. Si la lista tiene menos elementos que columnas, se completa con distribucion uniforme. El fondo alternado usa gris muy claro (245, 245, 245) en filas impares para mejorar la lectura de tablas largas. No gestiona overflow de celdas — textos muy largos se truncan en fpdf2 con `cell()`.