簡體   English   中英

jsPDF-將pdf發送到服務器最終損壞

[英]jsPDF - send pdf to server ends up corrupted

我使用javascript jsPDF庫生成包含文本和圖像的pdf文件。 然后,我想將文件發送到服務器以便隨它發送電子郵件。 問題是到達服務器的文件已損壞,無法打開,或者我看不到pdf上的圖像。

我的代碼:

var pdf = btoa(doc.output()); -這將產生錯誤: Uncaught InvalidCharacterError: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.

var pdf = btoa(encodeURIComponent(doc.output()));
var data = new FormData();
data.append("data" , pdf);
var xhr = new XMLHttpRequest();
xhr.open( 'post', '/url', true );
xhr.send(data);

我還嘗試了其他方法,例如:

var pdf = btoa(encodeURIComponent(doc.output('blob'))); -文件無法打開

var pdf = btoa(doc.output('blob')); -文件無法打開

var pdf = btoa(unescape(encodeURIComponent(doc.output()))); -文件將打開,但是圖像有些灰線

PS:我正在使用Laravel5。服務器代​​碼:

$data = base64_decode($_POST['data']);
$fname = "test.pdf"; 
$file = fopen("pdf/" .$fname, 'w'); 
fwrite($file, $data); 
fclose($file);

解:

js代碼:

var blob = doc.output('blob');
var fd = new FormData();
fd.append('data', blob);
$.ajax({
   type: 'POST',
   url: '/url',
   data: fd,
   processData: false,
   contentType: false
}).done(function(data) {
   console.log(data);
});

服務器代碼:

if(!empty($_FILES['data'])){
    move_uploaded_file(
        $_FILES['data']['tmp_name'],
        public_path() . '/test.pdf'
    );
    return "Pdf was successfully saved.";
} else {
    return "No Data Sent";
}

btoa弄亂了ascii字節范圍... javascript無法容納所有字符。 這就是為什么您不應該使用FileReader的readAsBinaryString的原因……以正確的方式處理二進制文件,而不是字符串或〜3x較大的base64字符串,而是以blob,ArrayBuffer或類型化數組的形式處理,結果會很好

var blob = doc.output('blob')
xhr.send(blob)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM