2015-07-20 237 views
4

我们使用dompdf将HTML转换为后端(PHP)中的PDF。从DOMPDF所生成的输出被Base64编码与在浏览器中解码Base64编码的PDF内容

$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 A A实施例:

JVBERi0xLjMKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZwovT3V0bGluZXMgMiAwIFIKL1BhZ2VzIDMgMCBSID4 + CmVuZG9iagoyIDAgb2JqCjw8IC9UeXBlIC9PdXRsaW5lcyAvQ291bnQgMCA + PgplbmRvYmoKMyAwIG9iago8PCAvVHlwZSAvUGFnZXMKL0tpZHMgWzYgMCBSCl0KL0NvdW50IDEKL1Jlc291cmNlcyA8PAovUHJvY1NldCA0IDAgUgovRm9udCA8PCAKL0YxIDggMCBSCj4 + CJ4 + Ci9NZWRpYUJveCBbMC4wMDAgMC4wMDAgNjEyLjAwMCA3OTIuMDAwXQogPj4KZW5kb2JqCjQgMCBvYmoKWy9QREYgL1RleHQgXQplbmRvYmoKNSAwIG9iago8PAovQ3JlYXRvciAoRE9NUERGKQovQ3JlYXRpb25EYXRlIChEOjIwMTUwNzIwMTMzMzIzKzAyJzAwJykKL01vZERhdGUgKEQ6MjAxNTA3MjAxMzMzMjMrMDInMDAnKQo + PgplbmRvYmoKNiAwIG9iago8PCAvVHlwZSAvUGFnZQovUGFyZW50IDMgMCBSCi9Db250ZW50cyA3IDAgUgo + PgplbmRvYmoKNyAwIG9iago8PCAvRmlsdGVyIC9GbGF0ZURl Y29kZQovTGVuZ3RoIDY2ID4 + CnN0cmVhbQp4nOMy0DMwMFBAJovSuZxCFIxN9AwMzRTMDS31DCxNFUJSFPTdDBWMgKIKIWkKCtEaIanFJZqxCiFeCq4hAO4PD0MKZW5kc3RyZWFtCmVuZG9iago4IDAgb2JqCjw8IC9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovTmFtZSAvRjEKL0Jhc2VGb250IC9UaW1lcy1Cb2xkCi9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCj4 + CmVuZG9iagp4cmVmCjAgOQowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMDggMDAwMDAgbiAKMDAwMDAwMDA3MyAwMDAwMCBuIAowMDAwMDAwMTE5IDAwMDAwIG4gCjAwMDAwMDAyNzMgMDAwMDAgbiAKMDAwMDAwMDMwMiAwMDAwMCBuIAowMDAwMDAwNDE2IDAwMDAwIG4gCjAwMDAwMDA0NzkgMDAwMDAgbiAKMDAwMDAwMDYxNiAwMDAwMCBuIAp0cmFpbGVyCjw8Ci9TaXplIDkKL1Jvb3QgMSAwIFIKL0luZm8gNSAwIFIKPj4Kc3RhcnR4cmVmCjcyNQolJUVPRgo =

如果ATOB()这个,你没有得到相同的结果作为使用Base64 -D在控制台上。为什么?

+0

您是否找到解决方法?我遇到了同样的问题。即使有外部库... – tvelop

+0

我们仍然使用浏览器btoa()编码为base64。我们将它以这种格式存储在服务器上,服务器本身对内容进行解码并将其直接传输到浏览器。我们无法通过RESTful API将其作为JSON发回,并让浏览器对其进行解码。只有文本格式(MIME类型文本/平原例如)工作,PDF和其他不可读格式不起作用。如果您获得解决方案,请让我知道,因为我们对我们的解决方案不满意。 – marcelhaerle

回答

1

您可以使用btoa()atob()在某些浏览器中工作: For Exa。

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

对于JSON和base64是完全独立的。 (以及direct GitHub link)。

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

+0

base64编码是在服务器上完成的,因为通过将HTML转换为PDF需要执行一些处理。我知道btoa()和atob()在javascript中是对应的。正如上面所解释的,如果字符串被编码和解码,所有东西都可以完美运行但是如果是像内容那样的“二进制”,在我们的例子中就是一个pdf文件的内容,它是行不通的。 – marcelhaerle

+0

我认为这可能对你有所帮助:https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding – hugsbrugs