---
name: pdf_doc
lang: py
domain: infra
version: "1.0.0"
algebraic: product
definition: |
  @dataclass
  class PDFDoc:
      fpdf: Any = None
      pages: list = field(default_factory=list)
      title: str = ""
      author: str = ""
      subject: str = ""
      default_font: str = "Helvetica"
      margin_left: float = 20.0
      margin_right: float = 20.0
      margin_top: float = 20.0
      margin_bottom: float = 20.0
      header_text: str = ""
      footer_text: str = ""
      page_numbers: bool = False
description: "Wrapper de documento PDF generado con fpdf2. Contiene el objeto FPDF interno con el estado mutable del documento y la configuracion de metadatos, margenes, header y footer."
tags: [pdf, document, builder, fpdf2, infra]
uses_types: []
file_path: "python/types/infra/pdf_doc.py"
---

## Campos

- `fpdf` — objeto `fpdf2.FPDF` con el estado interno del documento. Se inicializa en `pdf_create`. No serializable directamente — usar `pdf_save` para obtener bytes o archivo.
- `pages` — lista de dicts con metadata de cada pagina añadida: `{orientation, width, height}`.
- `title` — titulo del documento (metadata PDF, visible en propiedades del PDF reader).
- `author` — autor del documento (metadata PDF).
- `subject` — asunto del documento (metadata PDF).
- `default_font` — fuente por defecto para texto: `Helvetica`, `Times`, `Courier`. Por defecto `Helvetica`.
- `margin_left`, `margin_right`, `margin_top`, `margin_bottom` — margenes del documento en milimetros. Por defecto `20.0` mm cada uno.
- `header_text` — texto a mostrar en el header de cada pagina. Vacio = sin header.
- `footer_text` — texto del footer. Acepta `{n}` y `{total}` como placeholders. Vacio = sin footer.
- `page_numbers` — si `True`, incluye numero de pagina en el footer.

## Ejemplo

```python
from pdf_doc import PDFDoc

# El doc se crea via pdf_create, no directamente
# doc = pdf_create(title="Mi Reporte", author="Agente")
# doc.title  =>  "Mi Reporte"
# doc.fpdf   =>  <fpdf2.FPDF object>
```

## Notas

Este tipo es el carrier del estado del builder. Todas las funciones `pdf_add_*` reciben un `PDFDoc` y retornan uno modificado (API fluent). El campo `fpdf` contiene el estado mutable — no es thread-safe. Creado exclusivamente via `pdf_create_py_infra`.
