---
name: pdf_from_markdown
kind: function
lang: py
domain: infra
version: "1.0.0"
purity: impure
signature: "def pdf_from_markdown(markdown_string, output_path, css, page_size) -> str"
description: "Convierte un string Markdown a PDF via HTML + weasyprint. Incluye CSS por defecto para tipografia legible. Soporta tablas, codigo y headers. Requiere weasyprint y markdown instalados."
tags: [pdf, markdown, conversion, weasyprint, infra]
uses_functions: [pdf_from_html_py_infra]
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [weasyprint, markdown]
params:
  - name: markdown_string
    desc: "contenido Markdown como string; soporta tablas GFM, codigo cercado y listas"
  - name: output_path
    desc: "ruta del archivo PDF a generar"
  - name: css
    desc: "CSS adicional a añadir sobre los estilos por defecto (tipografia, tablas, codigo)"
  - name: page_size
    desc: "tamaño de pagina: A4, letter. Por defecto A4"
output: "output_path con el PDF generado en disco"
tested: false
tests: []
test_file_path: ""
file_path: "python/functions/infra/pdf_from_markdown.py"
---

## Ejemplo

```python
md_content = """
# Especificacion de la API

## Endpoints

| Metodo | Path | Descripcion |
|--------|------|-------------|
| GET    | /fn  | Lista funciones |
| POST   | /fn  | Crea funcion |

## Notas

Usar `Authorization: Bearer <token>` en todos los requests.
"""

output = pdf_from_markdown(md_content, "api_spec.pdf")
```

## Instalacion

```bash
pip install weasyprint markdown

# Linux
sudo apt install libpango-1.0-0 libcairo2 libgdk-pixbuf-2.0-0
```

## Notas

Usa las extensiones `tables`, `fenced_code` y `nl2br` de la libreria `markdown`. El CSS por defecto incluye estilos para: tipografia base (Helvetica 11pt), headers jerarquicos, bloques de codigo con fondo gris, tablas con bordes y blockquotes. Stub activo: lanza `RuntimeError` con instrucciones si alguna dependencia falta.
