Skip to main content

HTML-to-PDF generator with pagination and validation

Project description

pdfgen-juanipis

Libreria para generar PDFs a partir de data estructurada (HTML + WeasyPrint), con paginacion, validacion y soporte JSON/YAML.

Quickstart

Desde este repo (usa tu .venv si ya la tienes):

pip install -e .

pdfgen-juanipis render examples/demo.yaml examples/demo.pdf --root .

Resultados:

  • examples/demo.pdf generado con assets demo incluidos

Instalacion

Desde el repo:

pip install -e .

Desde PyPI:

pip install pdfgen-juanipis

Que archivos de configuracion usa

No hay un archivo unico de configuracion. PDFGenConfig.from_root(root_dir) arma la configuracion por convencion:

  • Si existe template/ en tu proyecto, usa template/boletin_template.html.jinja y template/boletin.css
  • Si no existe template/, usa los templates incluidos en el paquete
  • fonts.conf en root_dir es opcional; si no existe se ignora
  • assets/ en root_dir es opcional; si no existe se usan assets del paquete cuando corresponda

En resumen: la configuracion se define por la estructura de carpetas, no por un archivo config.*.

Estructura recomendada del proyecto

mi-proyecto/
  assets/
    banner.png
    logo.png
  template/
    boletin_template.html.jinja
    boletin.css
  fonts.conf   (opcional)
  data.yaml

Assets demo incluidos

Para jugar sin preparar assets, puedes referenciar nombres simples como banner.png y logo.png. Resolucion de rutas:

  • Primero busca en root_dir/assets/
  • Si no existen, usa los assets incluidos en el paquete (src/pdfgen_juanipis/assets/)

Assets de demo incluidos:

  • banner.png
  • banner-clean.png
  • logo.png
  • figure.png
  • map.png
  • chart.png

Uso basico (Python)

from pdfgen_juanipis.api import PDFGenConfig, PDFGen

config = PDFGenConfig.from_root("/ruta/a/tu/proyecto")
pdf = PDFGen(config)

pdf.render(data, output_path="salida.pdf", paginate=True, validate=True)

Atajo:

from pdfgen_juanipis.api import render_with_defaults

render_with_defaults(data, output_path="salida.pdf", root_dir="/ruta/a/tu/proyecto")

Salida en bytes:

from pdfgen_juanipis.api import render_with_defaults_bytes

pdf_bytes = render_with_defaults_bytes(data, root_dir="/ruta/a/tu/proyecto")

Estructura minima del data

data = {
  "theme": {
    "header_banner_path": "banner.png",
    "header_banner_path_cont": "banner-clean.png",
    "header_logo_path": "logo.png",
    "title_line1": "Titulo",
    "title_line2": "Subtitulo",
    "footer_site": "example.org",
    "footer_phone": "Contacto: +1 555 0100"
  },
  "sections": [
    {
      "title": "I. Introduccion",
      "content": [
        {"type": "text", "text": "Texto con <strong>negrita</strong>."}
      ]
    }
  ]
}

Notas:

  • header_banner_path_cont es opcional (banner limpio para paginas continuas)
  • Puedes trabajar sin assets propios usando los demo (ver seccion Assets)

Bloques con assets demo (para jugar)

data = {
  "theme": {
    "header_banner_path": "banner.png",
    "header_logo_path": "logo.png",
    "title_line1": "Demo",
    "title_line2": "Assets incluidos"
  },
  "sections": [
    {
      "title": "Figuras y mapas",
      "content": [
        {"type": "figure", "path": "figure.png", "caption": "Figura demo"},
        {"type": "figure", "path": "chart.png", "caption": "Grafica demo", "wide": True},
        {"type": "map_grid", "items": [{"path": "map.png", "label": "Mapa demo"}]}
      ]
    }
  ]
}

Estilos inline

Los bloques de texto aceptan HTML:

  • <strong> negrita
  • <em> italica
  • <u> subrayado
  • <s> tachado

CLI

Render (JSON o YAML):

pdfgen-juanipis render data.json salida.pdf --root /ruta/proyecto
pdfgen-juanipis render data.yaml salida.pdf

Validar (sin generar PDF):

pdfgen-juanipis validate data.yaml

Desde stdin (YAML por defecto):

cat data.yaml | pdfgen-juanipis render - salida.pdf

Opciones utiles:

  • --template-dir usar tu template
  • --css usar tu CSS
  • --fonts-conf usar un fonts.conf propio
  • --fonts-dir usar un directorio con .ttf
  • --css-extra inyectar CSS adicional
  • --no-validate desactivar validacion
  • --no-paginate desactivar paginacion
  • --stdout escribir bytes a stdout

Personalizacion

Fuentes propias (Python):

config = PDFGenConfig.from_root("/ruta/a/tu/proyecto")
config.fonts_conf = "/ruta/a/mi/fonts.conf"
PDFGen(config).render(data, "salida.pdf")

Fuentes propias (CLI):

pdfgen-juanipis render data.json salida.pdf --fonts-dir /ruta/a/mis/fuentes

Colores/estilos rapidos:

css_extra = ":root { --blue-title: #0b7285; --orange-footer: #f08c00; }"
render_with_defaults(data, "salida.pdf", root_dir="/ruta", css_extra=css_extra)

Template y CSS propios:

pdfgen-juanipis render data.json salida.pdf --template-dir /ruta/template --css /ruta/template/boletin.css

Ejemplos

  • examples/minimal.yaml
  • examples/minimal.json
  • examples/demo.yaml
  • examples/demo.pdf
  • notebooks/demo.ipynb
  • notebooks/usage.ipynb
  • notebooks/bytes.ipynb
  • notebooks/advanced.ipynb

Generar el demo con un script

./scripts/make_demo.sh

Validacion

Se valida automaticamente con schema.json. Los warnings se imprimen en consola.

Si quieres desactivar:

pdf.render(data, output_path="salida.pdf", validate=False)

Solucion de problemas

  • Assets no encontrados: asegurate de ponerlos en root_dir/assets/ o usa los nombres demo incluidos.
  • Warnings de schema: instala jsonschema o desactiva la validacion con --no-validate.
  • Warnings de Fontconfig: puedes proveer un fonts.conf propio o ignorarlos si el PDF se genera bien.
  • Imagenes no aparecen: verifica que los paths sean relativos (se resuelven contra assets/) o absolutos.

Licencia

MIT

Releases

Al hacer push a main, el workflow Auto Release crea tag y Release si la version en pyproject.toml es nueva, y publica automaticamente en PyPI.

Hecho por Juanipis

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

pdfgen_juanipis-0.1.11.tar.gz (501.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pdfgen_juanipis-0.1.11-py3-none-any.whl (525.0 kB view details)

Uploaded Python 3

File details

Details for the file pdfgen_juanipis-0.1.11.tar.gz.

File metadata

  • Download URL: pdfgen_juanipis-0.1.11.tar.gz
  • Upload date:
  • Size: 501.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pdfgen_juanipis-0.1.11.tar.gz
Algorithm Hash digest
SHA256 6789b116ae493accb5ebcc700829e2e87fca6029258d73e3d22147d5de58b5b0
MD5 526a0ed3b5a2afc2c5b157b0f01c0d86
BLAKE2b-256 5c1c635b77b362718153242c5b6de156ee8810faef2abf3db73229afb562e5e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for pdfgen_juanipis-0.1.11.tar.gz:

Publisher: auto-release.yml on Juanipis/pdfgen-juanipis

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pdfgen_juanipis-0.1.11-py3-none-any.whl.

File metadata

File hashes

Hashes for pdfgen_juanipis-0.1.11-py3-none-any.whl
Algorithm Hash digest
SHA256 8d9066e635132fd42b114ca28c0728122bd5da392bc863ea01f9d0ee1dbe95eb
MD5 100c7fbecf43c9c4f92aaf398652cb9e
BLAKE2b-256 8491d7b6166f984a7dd42f54f2dc35b40b0b835fb5e39d31934fb6f59a4c52eb

See more details on using hashes here.

Provenance

The following attestation bundles were made for pdfgen_juanipis-0.1.11-py3-none-any.whl:

Publisher: auto-release.yml on Juanipis/pdfgen-juanipis

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page