defmodule ApiWeb.DownloadpdfController do use ApiWeb, :controller alias Api.Downloadpdf alias File require Logger def index(conn, %{"idstudyreport" => idstudyreport}) do # Obtenemos los datos JSON del informe Logger.info("hash antes de llamar a la funcion: #{idstudyreport}") json = Downloadpdf.get_report_query(idstudyreport) Logger.debug("resultado query: #{inspect(json)}") # Verifica si el JSON es nulo o vacĂ­o if json == nil or json == %{} do Logger.error("Error: JSON is None or empty") conn |> send_resp(500, "Error generating PDF") else # Codificamos el JSON en una cadena para poder escribirlo en un archivo. json = Jason.encode!(json) Envar.load(".env") Envar.require_env_file(".env") python_executable = Envar.get("PYTHON_EXECUTABLE") Logger.info("executable -> #{python_executable}") python_script = Envar.get("PYTHON_SCRIPT") Logger.info("script -> #{python_script}") command = "#{python_executable} #{python_script}" Logger.info("comando -> #{command}") port = Port.open({:spawn, command}, [:binary, :use_stdio, :stderr_to_stdout, :exit_status]) Port.command(port, json <> "\n") res = do_flush(<<0>>) # IO.puts(res) case json do {:error, mensaje} -> Logger.error("No se encontraron resultados para el reporte -> #{inspect(mensaje)}") conn |> put_status(:not_found) |> html(mensaje) _ -> conn |> put_resp_content_type("application/pdf") |> send_resp(200, res) end end end defp do_flush(data) do receive do {_port, {:data, d}} -> do_flush(data <> d) _ -> data end end end