在浏览器

时间:2015-07-20 10:24:12

标签: javascript json pdf encoding base64

我们使用dompdf在后端(PHP)将HTML转换为PDF。 dompdf生成的输出是Base64编码的

$output = $dompdf->output();
base64_encode($output);

此Base64编码内容将另存为服务器上的文件。当我们像这样解码这个文件内容时:

cat /tmp/55acbaa9600f4 | base64 -D > test.pdf

我们得到一个合适的PDF文件。

但是当我们将Base64内容作为JSON对象内的字符串值传输到客户端时(服务器提供RESTful API ......):

{
  "file_data": "...the base64 string..."
}

使用atob()对其进行解码,然后创建一个Blob对象以便稍后下载该文件,PDF始终为“空”/已损坏。

$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);
  });
};

当我们记录解码的内容时,似乎内容被“破坏”,因为几个符号与我们使用base64 -D解码服务器上的内容时不一样。

当我们对简单文本/普通文档的内容进行编码/解码时,它正如预期的那样工作。但是所有二进制(或非ASCII格式)都不起作用。

我们已经在网上搜索了好几个小时,但没有找到适用于我们的解决方案。有没有人有同样的问题,可以为我们提供有效的解决方案?提前谢谢!

这是关于PDF文档的服务器Base64编码内容的示例:

JVBERi0xLjMKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZwovT3V0bGluZXMgMiAwIFIKL1BhZ2VzIDMgMCBSID4 + CmVuZG9iagoyIDAgb2JqCjw8IC9UeXBlIC9PdXRsaW5lcyAvQ291bnQgMCA + PgplbmRvYmoKMyAwIG9iago8PCAvVHlwZSAvUGFnZXMKL0tpZHMgWzYgMCBSCl0KL0NvdW50IDEKL1Jlc291cmNlcyA8PAovUHJvY1NldCA0IDAgUgovRm9udCA8PCAKL0YxIDggMCBSCj4 + CJ4 + Ci9NZWRpYUJveCBbMC4wMDAgMC4wMDAgNjEyLjAwMCA3OTIuMDAwXQogPj4KZW5kb2JqCjQgMCBvYmoKWy9QREYgL1RleHQgXQplbmRvYmoKNSAwIG9iago8PAovQ3JlYXRvciAoRE9NUERGKQovQ3JlYXRpb25EYXRlIChEOjIwMTUwNzIwMTMzMzIzKzAyJzAwJykKL01vZERhdGUgKEQ6MjAxNTA3MjAxMzMzMjMrMDInMDAnKQo + PgplbmRvYmoKNiAwIG9iago8PCAvVHlwZSAvUGFnZQovUGFyZW50IDMgMCBSCi9Db250ZW50cyA3IDAgUgo + PgplbmRvYmoKNyAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURlY29kZQovTGVuZ3RoIDY2ID4 + CnN0cmVhbQp4nOMy0DMwMFBAJovSuZxCFIxN9AwMzRTMDS31DCxNFUJSFPTdDBWMgKIKIWkKCtEaIanFJZqxCiFeCq4hAO4PD0MKZW5kc3RyZWFtCmVuZG9iago4IDAgb2JqCjw8IC9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovTmFtZSAvRjEKL0Jhc2VGb250IC9UaW1lcy1Cb2xkCi9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCj4 + CmVuZG9iagp4cmVmCjAgOQowMDAwMDAwMDAwIDY1N TM1IGYgCjAwMDAwMDAwMDggMDAwMDAgbiAKMDAwMDAwMDA3MyAwMDAwMCBuIAowMDAwMDAwMTE5IDAwMDAwIG4gCjAwMDAwMDAyNzMgMDAwMDAgbiAKMDAwMDAwMDMwMiAwMDAwMCBuIAowMDAwMDAwNDE2IDAwMDAwIG4gCjAwMDAwMDA0NzkgMDAwMDAgbiAKMDAwMDAwMDYxNiAwMDAwMCBuIAp0cmFpbGVyCjw8Ci9TaXplIDkKL1Jvb3QgMSAwIFIKL0luZm8gNSAwIFIKPj4Kc3RhcnR4cmVmCjcyNQolJUVPRgo =

如果您使用atob(),则不会获得与使用base64 -D的控制台相同的结果。为什么呢?

2 个答案:

答案 0 :(得分:3)

您的问题看起来与我最近需要解决的问题相同。

这对我有用:

Response<PostR>

似乎仅执行base64解码是不够的...您需要将结果放入Uint8Array。否则,pdf页面将显示为空白。

我在这里找到了这个解决方案: https://github.com/sayanee/angularjs-pdf/issues/110#issuecomment-579988190

答案 1 :(得分:1)

您可以在某些浏览器中使用btoa()atob(): 对于Exa。

var enc = btoa("this is some text");
alert(enc);
alert(atob(enc));

To JSON和base64是完全独立的。

Here's a JSON stringifier/parser(和direct GitHub link)。

Here's a base64 Q&AHere's another one