मैं क्लाइंट को नोड.जेएस में पीडीएफकिट का उपयोग करके उत्पन्न एक पीडीएफ फाइल भेजने की कोशिश कर रहा हूं।

अगर मेरे पीडीएफ में कोई छवि है, तो मेरा कोड निम्न त्रुटि देगा। अन्यथा (बिना किसी छवि के), यह कोड त्रुटियों के बिना काम करेगा

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

यह मेरा कोड है

var doc = new PDFDocument({
              bufferPages: true,
            }),
    svg = mySvg;

SVGtoPDF(doc, svg, 0, 0);
let buffers = [];

doc.on("data", buffers.push.bind(buffers));
doc.on("end", () => {
    let pdfData = Buffer.concat(buffers);
    ctx.res
    .writeHead(200, {
        "Content-Length": Buffer.byteLength(pdfData),
        "Content-Type": "application/pdf",
        "Content-disposition": "attachment;filename=file.pdf",
    })
    .end(pdfData);
});
doc.end();

मैं अपने बैकएंड ढांचे के रूप में स्ट्रैपी का उपयोग कर रहा हूं। जब मैंने सर्वर पर फ़ाइल लिखने की कोशिश की, तो यह ठीक काम करेगा। लेकिन मुझे सर्वर में स्टोर किए बिना फाइल भेजने की जरूरत है।

0
Ajil Paul 2 सितंबर 2021, 10:02

1 उत्तर

सबसे बढ़िया उत्तर

मुझे लगता है कि doc.pipe(ctx.res) में समस्या है। .end(pdfData) . के बाद जोड़ने का प्रयास करें

res.writeHead(200, {
  'Content-Type': 'application/pdf',
  'Access-Control-Allow-Origin': '*',
  'Content-Disposition': `attachment; filename=${fileName}`,
});

doc.pipe(ctx.res);
doc.end();

मेरे लिए यह ठीक काम करता है, लेकिन 3-4 डाउनलोड के बाद प्रतिक्रिया का समय समाप्त हो गया है। प्रारंभ दस्तावेज़ पर doc.on("data", buffers.push.bind(buffers)); ले जाया गया

let buffers = [];
doc.on('data', buffers.push.bind(buffers));

/* doc body here */
doc.text('pdf');
doc.text('pdf2');
doc.text('pdf3');

doc.on('end', () => {
    const pdfData = Buffer.concat(buffers);
    res.writeHead(200, {
      'Content-Length': Buffer.byteLength(pdfData),
      'Content-Type': 'application/pdf',
      'Content-disposition': `attachment; filename=${filename}.pdf`,
      'Access-Control-Allow-Origin': '*',
    }).end(pdfData);
  });

doc.end();
1
Denys 22 सितंबर 2021, 12:51