Spaces:
Sleeping
Sleeping
| from __future__ import annotations | |
| import logging | |
| import os | |
| from pathlib import Path | |
| from typing import Optional | |
| import pdfkit | |
| # Carpeta de este m贸dulo (app/) | |
| BASE_DIR = Path(__file__).parent | |
| # Cache de configuraci贸n de pdfkit | |
| # False => a煤n no inicializado | |
| # None => se intent贸 inicializar pero no se encontr贸 wkhtmltopdf | |
| # config => configuraci贸n v谩lida | |
| _PDFKIT_CONFIG: Optional[pdfkit.configuration] | bool = False | |
| def _detect_wkhtmltopdf() -> Optional[str]: | |
| """ | |
| Para entorno Docker (Linux): | |
| 1) Si hay WKHTMLTOPDF_PATH y apunta a un archivo, usarlo. | |
| 2) Si no, devolver None y dejar que pdfkit use lo que haya en PATH. | |
| No nos preocupamos por .exe ni por Windows aqu铆. | |
| """ | |
| env_path = os.getenv("WKHTMLTOPDF_PATH") | |
| if env_path and Path(env_path).is_file(): | |
| return env_path | |
| # None = que pdfkit use wkhtmltopdf del PATH (/usr/bin/wkhtmltopdf) | |
| return None | |
| def get_pdfkit_config() -> Optional[pdfkit.configuration]: | |
| """ | |
| Devuelve una instancia de pdfkit.configuration o None si | |
| no se pudo inicializar wkhtmltopdf. | |
| """ | |
| global _PDFKIT_CONFIG | |
| if _PDFKIT_CONFIG is not False: | |
| return _PDFKIT_CONFIG # type: ignore[return-value] | |
| wkhtml_path = _detect_wkhtmltopdf() | |
| try: | |
| if wkhtml_path: | |
| _PDFKIT_CONFIG = pdfkit.configuration(wkhtmltopdf=wkhtml_path) | |
| logging.info("wkhtmltopdf detectado en WKHTMLTOPDF_PATH: %s", wkhtml_path) | |
| else: | |
| # Usar binario en PATH (caso normal en Docker: /usr/bin/wkhtmltopdf) | |
| _PDFKIT_CONFIG = pdfkit.configuration() | |
| logging.info("wkhtmltopdf detectado en PATH.") | |
| except OSError as exc: | |
| logging.error("No se pudo inicializar pdfkit: %s", exc) | |
| _PDFKIT_CONFIG = None | |
| return _PDFKIT_CONFIG # type: ignore[return-value] | |