File size: 1,847 Bytes
598559d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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]