22

I am using pdfkit to generate pdf file and i want to send this pdf file to browser.

But i am getting message "TypeError: listener must be a function", Also, file is getting generate in my parent directory which i don't want.

Can anyone explain me how to generate pdf file and send it to browser without storing it at parent directory?
I am using expressjs here.

My code

var PDFDocument = require('pdfkit');                      
var fs=require('fs');
doc = new PDFDocument();
doc.moveTo(300, 75)
   .lineTo(373, 301)
   .lineTo(181, 161)
   .lineTo(419, 161)
   .lineTo(227, 301)
   .fill('red', 'even-odd');  

var loremIpsum = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in...';  

doc.y = 320;
doc.fillColor('black')
doc.text(loremIpsum, {
   paragraphGap: 10,
   indent: 20,
   align: 'justify',
   columns: 2
});  

doc.write('out.pdf');
res.download('out.pdf');
1

2 Answers 2

25

doc.write is the line causing the trouble, which is also a deprecated method so don't use it. Instead, use pipe to tell your doc where to stream the information, and remember to close it using doc.end(), i.e., like so:

doc = new PDFDocument();
doc.pipe( fs.createWriteStream('out.pdf') );

// rest of the code goes here...

doc.end();

Note that it's not important that doc.pipe() be at the top, it just makes sense to me (you can put it before or after doc.end(). It doesn't matter, it'll work just fine). Finally, note that you can use pipe to stream directly to a response, there's no need to create the file first and then download it, i.e.:

doc.pipe( res )
Sign up to request clarification or add additional context in comments.

9 Comments

still file is getting generate in local directory i want to send this file as download to browser.
@SachinKumbharkar Yes sorry, I forgot to include the fs function in that last example. You still need it, just point it to the HTTP response instead of a local file
Now i got error message uncaughtException: path must be a string.
@SachinKumbharkar I'm not sure then. I have had no problem doing it here,are you running the latest version of pdfkit? Anyway, if nothing else, output it to a file using the first method I've shown and then send it to the response. Is that working for you?
not doc.pipe( fs.createWriteStream(res) ) but doc.pipe(res)
|
5

So Instead try Using

doc.pipe(res);

3 Comments

i made this as a service on node, and pass data as parameter and pipe my data on response. did doc.pipe(res) and on my react side made an axios call - and abosorbed response in arraybuffer and wrote it to a blob.
Dont forget to end the stream using doc.end()
Hi , I am stuck in a similar situation with the difference that my code will execute in AWS api gateway. I have written the description in this link , Would be of great help if anyone could take a look and help. stackoverflow.com/questions/57256887/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.