#node.js #pdfkit
Вопрос:
const PDF = require("pdfkit"); const fs = require("fs"); const express = require("express"); const app = express(); app.get("/", (req, res) =gt; { 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"); } });
Приведенный выше код не отправляет никакого ответа браузеру.
Когда я загружаю API в браузер, я получаю это.
Но когда я удаляю doc.pipe
код, он работает нормально. Он отправляет PDF-файл.
Вы можете попробовать, прокомментировав
// doc.pipe( // fs.createWriteStream("/home/rahul/Desktop/projects/test/test/doc.pdf") // );
Ответ №1:
При вызове doc.end()
pdf потребуется некоторое время для записи на диск. Таким образом, вы в основном отправляете «наполовину написанный» pdf-файл, который приводит к недействительному файлу. Поэтому дождитесь, пока созданное WriteStream
завершится первым:
const PDF = require("pdfkit"); const fs = require("fs"); const express = require("express"); const app = express(); app.get("/", (req, res) =gt; { 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", }); const stream = fs.createWriteStream("/home/rahul/Desktop/projects/test/test/doc.pdf") stream.on('finish', () =gt; { // now, the file is fully written to disk. Let's send it back!. res.sendFile("/home/rahul/Desktop/projects/test/test/doc.pdf"); }) stream.on('error', err =gt; { console.error(err) res.status(500).send("Failed to send pdf.") }) doc.pipe(stream); // start writing to file!. doc.end(); } catch (error) { console.log(error); res.status(500).send("Server error occured."); } });