我们使用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的控制台相同的结果。为什么呢?
答案 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是完全独立的。