2015-07-20 47 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