es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede enviar un PDF desde Express al navegador o a Postman.

const PDF = require("pdfkit");
const fs = require("fs");
const express = require("express");
const app = express();

app.get("/", (req, res) => {
  try {
    const doc = new PDF({ size: "A4" });

    doc.image("/home/rahul/Desktop/projects/test/test/vlogo.png", 10, 0, {
      width: 100,
      height: 100,
      align: "left",
    });

    doc.pipe(
      fs.createWriteStream("/home/rahul/Desktop/projects/test/test/doc.pdf")
    );
    doc.end();
    res.sendFile("/home/rahul/Desktop/projects/test/test/doc.pdf");
  } catch (error) {
    console.log(error);
    res.status(500).sendFile("Rahul");
  }
});

El código anterior no envía ninguna respuesta al navegador.

Cuando cargo la API en el navegador, obtengo esto.
rahul

Pero, cuando elimino el código doc.pipe, entonces funciona bien. Envía un PDF.

Puedes probar comentando lo siguiente:

// doc.pipe(
//   fs.createWriteStream("/home/rahul/Desktop/projects/test/test/doc.pdf")
// );
Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que el código está redirigiendo el PDF a un archivo utilizando fs.createWriteStream, pero también está intentando enviar el mismo archivo como respuesta utilizando res.sendFile. Debido a que el archivo aún se está escribiendo cuando se llama a res.sendFile, la respuesta está vacía o incompleta.

    Para solucionar este problema, puedes eliminar la línea res.sendFile y en su lugar utilizar res.download para descargar el archivo PDF una vez que se haya escrito completamente en el disco. Aquí tienes un fragmento de código actualizado:

    const PDF = require("pdfkit");
    const fs = require("fs");
    const express = require("express");
    const app = express();
    
    app.get("/", (req, res) => {
      try {
        const doc = new PDF({ size: "A4" });
    
        doc.image("/home/rahul/Desktop/projects/test/test/vlogo.png", 10, 0, {
          width: 100,
          height: 100,
          align: "left",
        });
    
        doc.pipe(
          fs.createWriteStream("/home/rahul/Desktop/projects/test/test/doc.pdf")
        );
        doc.end();
    
        // Espera a que el PDF se haya escrito completamente en el disco
        // antes de enviarlo como respuesta
        setTimeout(() => {
          res.download("/home/rahul/Desktop/projects/test/test/doc.pdf");
        }, 2000);
      } catch (error) {
        console.log(error);
        res.status(500).send("Rahul");
      }
    });
    

    En el código actualizado, se llama a res.download después de un retraso de 2 segundos utilizando setTimeout. Esto asegura que el archivo se haya escrito completamente en el disco antes de enviarlo como respuesta.

Comments are closed.