Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node express save pdf from binary string

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

like image 219
Alessandro Mercurio Avatar asked Sep 14 '16 08:09

Alessandro Mercurio


2 Answers

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.

like image 196
Alessandro Mercurio Avatar answered Nov 12 '22 01:11

Alessandro Mercurio


for those who have a blank pdf, you have to add these request params :

responseType: "arraybuffer",
responseEncoding: "binary"

Source : here

like image 3
hamzawi Avatar answered Nov 12 '22 00:11

hamzawi