title: Decode Base64 encoded PDF content in browser
body: <p>We transform HTML to PDF in the backend (PHP) using <a href="https://github.com/dompdf/dompdf" rel="noreferrer">dompdf</a>. The generated output from dompdf is Base64 encoded with</p>
  
  <pre><code>$output = $dompdf-&gt;output();
  base64_encode($output);
  </code></pre>
  
  <p>This Base64 encoded content is saved as a file on the server. When we decode this file content like this:</p>
  
  <pre><code>cat /tmp/55acbaa9600f4 | base64 -D &gt; test.pdf
  </code></pre>
  
  <p>we get a proper PDF file.</p>
  
  <p>But when we transfer the Base64 content to the client as a string value inside a JSON object (the server provides a RESTful API...):</p>
  
  <pre><code>{
    "file_data": "...the base64 string..."
  }
  </code></pre>
  
  <p>And decode it with atob() and then create a Blob object to download the file later on, the PDF is always "empty"/broken.</p>
  
  <pre><code>$scope.downloadFileData = function(doc) {
    DocumentService.getFileData(doc).then(function(data) {
      var decodedFileData = atob(data.file_data);
      var file = new Blob([decodedFileData], { type: doc.file_type });
      saveAs(file, doc.title + '.' + doc.extension);
    });
  };
  </code></pre>
  
  <p>When we log the decoded content, it seems that the content is "broken", because several symbols are not the same as when we decode the content on the server using base64 -D.</p>
  
  <p>When we encode/decode the content of simple text/plain documents, it's working as expected. But all binary (or not ASCII formats) are not working.</p>
  
  <p>We have searched the web for many hours, but didn't find a solution for this that works for us. Does anyone have the same problem and can provide us with a working solution? Thanks in advance!</p>
  
  <p>This is a example for a on the server Base64 encoded content of a PDF document:</p>
  
  <p>JVBERi0xLjMKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZwovT3V0bGluZXMgMiAwIFIKL1BhZ2VzIDMgMCBSID4+CmVuZG9iagoyIDAgb2JqCjw8IC9UeXBlIC9PdXRsaW5lcyAvQ291bnQgMCA+PgplbmRvYmoKMyAwIG9iago8PCAvVHlwZSAvUGFnZXMKL0tpZHMgWzYgMCBSCl0KL0NvdW50IDEKL1Jlc291cmNlcyA8PAovUHJvY1NldCA0IDAgUgovRm9udCA8PCAKL0YxIDggMCBSCj4+Cj4+Ci9NZWRpYUJveCBbMC4wMDAgMC4wMDAgNjEyLjAwMCA3OTIuMDAwXQogPj4KZW5kb2JqCjQgMCBvYmoKWy9QREYgL1RleHQgXQplbmRvYmoKNSAwIG9iago8PAovQ3JlYXRvciAoRE9NUERGKQovQ3JlYXRpb25EYXRlIChEOjIwMTUwNzIwMTMzMzIzKzAyJzAwJykKL01vZERhdGUgKEQ6MjAxNTA3MjAxMzMzMjMrMDInMDAnKQo+PgplbmRvYmoKNiAwIG9iago8PCAvVHlwZSAvUGFnZQovUGFyZW50IDMgMCBSCi9Db250ZW50cyA3IDAgUgo+PgplbmRvYmoKNyAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZQovTGVuZ3RoIDY2ID4+CnN0cmVhbQp4nOMy0DMwMFBAJovSuZxCFIxN9AwMzRTMDS31DCxNFUJSFPTdDBWMgKIKIWkKCtEaIanFJZqxCiFeCq4hAO4PD0MKZW5kc3RyZWFtCmVuZG9iago4IDAgb2JqCjw8IC9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovTmFtZSAvRjEKL0Jhc2VGb250IC9UaW1lcy1Cb2xkCi9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCj4+CmVuZG9iagp4cmVmCjAgOQowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMDggMDAwMDAgbiAKMDAwMDAwMDA3MyAwMDAwMCBuIAowMDAwMDAwMTE5IDAwMDAwIG4gCjAwMDAwMDAyNzMgMDAwMDAgbiAKMDAwMDAwMDMwMiAwMDAwMCBuIAowMDAwMDAwNDE2IDAwMDAwIG4gCjAwMDAwMDA0NzkgMDAwMDAgbiAKMDAwMDAwMDYxNiAwMDAwMCBuIAp0cmFpbGVyCjw8Ci9TaXplIDkKL1Jvb3QgMSAwIFIKL0luZm8gNSAwIFIKPj4Kc3RhcnR4cmVmCjcyNQolJUVPRgo=</p>
  
  <p>If you atob() this, you don't get the same result as on the console with base64 -D. Why?</p>