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.
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")
// );
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 utilizandores.sendFile
. Debido a que el archivo aún se está escribiendo cuando se llama ares.sendFile
, la respuesta está vacía o incompleta.Para solucionar este problema, puedes eliminar la línea
res.sendFile
y en su lugar utilizarres.download
para descargar el archivo PDF una vez que se haya escrito completamente en el disco. Aquí tienes un fragmento de código actualizado:En el código actualizado, se llama a
res.download
después de un retraso de 2 segundos utilizandosetTimeout
. Esto asegura que el archivo se haya escrito completamente en el disco antes de enviarlo como respuesta.