12

I have a problem saving a pdf file from binary data. I get the binary from a web service and my express server (as middleware) should send the file to the client. The problem is that client and adobe acrobat reader show a blank pdf, so I'm thinking that I done some error saving/encoding the binary data.

exports.downloadReceipt = function(req, res) {
  var idPrenotazione = req.params.idPrenotazione;
  var options = {
    'method': 'GET',
    'uri': api_url + '/ricevute/'+idPrenotazione,
    'headers': {
      'Authorization': req.get('Authorization')
    }
  }

  request(options, function(error, response, body) {
    var date = new Date().getTime();
    var filename = 'ricevuta_'+idPrenotazione+'_'+date+'.pdf';
    var file = folderPath + filename;

  fs.writeFile(file, body, function(err) {
    if(err)
      console.log(err);
    else
      console.log("The file was saved!");
  });      

  // for the moment I only save the file on server file system
  res.end();


  });
}

I also tried to use createWriteStream instead of writeFile, with and without encoding option

  var options = { encoding: 'binary' };
  var wstream = fs.createWriteStream(file_);
  wstream.write(body);
  wstream.end();

The string that I get from web service is something like this:

%PDF-1.5
%����
2 0 obj
<</Length1 17948/Length 9587/Filter/FlateDecode>>stream
x��{y`՝���!ɖ-Y�iɖF�e˖,۲lَ��v�$���s8v��B�$�(4nHiI�RP��@�n�����׶���-P�-Wbi����H��������y��|���^��}3�p9� -[3�~�+���< ��l�E���E7�7��Њ�+�l\�1��?P��rt�
�G��!}ؿj���ɿ~�@�+H߰
o�t�&��u��5m�??ن�5�~���e�����й��޼�3����#��~���ԷX��%����������
k\��\z���d���O�x@�A9(-�A>�@`�B0�  �`+ؠ���Q��\ �<��R�A��*��*A5�@-��"P
�Fh�f�-� 

[.....]

0000042111 00000 n 
0000042252 00000 n 
0000042393 00000 n 
trailer
<</Root 7 0 R/ID [<10edca6daaad5a49919bad108ba77f0a><492e2d9a8ca810421f41667217724e69>]/Info 4 0 R/Size 183>>
%iText-5.5.8
startxref
173008
%%EOF

What I'm doing wrong? I just have a function that get an image (from the same web service) in base64 and I save it on server file system with writeFile and it works well.

Thanks for help

2 Answers 2

25

I found the problem! I needed to specify 'encoding': 'binary' in request options and in writeFile: fs.writeFile(file, body, 'binary', function(err) {.

Now I can open and send correctly image and pdf from binary string.

Sign up to request clarification or add additional context in comments.

4 Comments

@Ciotto I tried this code. It create a pdf file. but, i can't open the file. it show me the "Can't validate the signature"
Hi @HariharanAR unfortunately I didn't work on this project anymore and I never managed pdf with signature. Can you share your code to be sure that you do it correctly?
I am getting a blank PDF with the expected number of pages. @Ciotto
Yup, works! thx
10

for those who have a blank pdf and are using axios, you have to add these axios request params:

responseType: "arraybuffer",
responseEncoding: "binary"

Source : here

Comments

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.