2015-12-23 5 views
4

У меня есть веб-сервис, который возвращает его содержимое в формате PDF. Я хочу загрузить этот файл в формате pdf, когда пользователь нажимает на ссылку. Javascript код, который я написал в UI выглядит следующим образом:PDF пуст при загрузке с помощью javascript

$http.get('http://MyPdfFileAPIstreamURl').then(function(response){ 
var blob=new File([response],'myBill.pdf',{type: "text/pdf"}); 
var link=document.createElement('a'); 
link.href=window.URL.createObjectURL(blob); 
link.download="myBill.pdf"; 
link.click(); 
}); 

«ответ» содержит PDF байтовый массив из сервлета OutputStream из «MyPdfFileAPIstreamURl». А также поток не зашифрован.

Поэтому, когда я нажимаю на ссылку, файл PDF загружается с размером около 200 КБ. Но когда я открываю этот файл, он открывается пустыми страницами. Начальное содержимое загруженного pdf-файла находится на изображении.

Я не могу понять, что здесь не так. Помогите !

Это загруженный файл PDF, начиная содержание:

This is the downloaded pdf file starting contents

+1

Вы используете тип носителя * "текст/PDF" *; это задает проблемы, ** pdf не является текстовым форматом, он является двоичным ** и рассматривает его как текст, который может его уничтожить. Попробуйте ** application/pdf ** вместо этого. – mkl

+0

@mkl Изменил его в приложении/pdf, но вопрос все тот же. – programmer129

+0

Неправильно использовать текст/pdf здесь. Кроме того, ваш скриншот выглядит как где-то вдоль строки, какой-то код обрабатывает файл как текст, читает его с помощью одной байтовой кодировки (Latin1) и записывает его с помощью UTF-8. – mkl

ответ

12

решить ее с помощью XMLHttpRequest и xhr.responseType = 'arraybuffer'; код:

var xhr = new XMLHttpRequest(); 
    xhr.open('GET', './api/exportdoc/report_'+id, true); 
    xhr.responseType = 'arraybuffer'; 
    xhr.onload = function(e) { 
     if (this.status == 200) { 
      var blob=new Blob([this.response], {type:"application/pdf"}); 
      var link=document.createElement('a'); 
      link.href=window.URL.createObjectURL(blob); 
      link.download="Report_"+new Date()+".pdf"; 
      link.click(); 
     } 
    }; 
xhr.send(); 
+1

Спасибо @Alexey, у меня была та же проблема, с помощью angularjs мне пришлось поставить responseType = 'arraybuffer' в – jrey

+1

Спасибо. Это действительно помогло мне и сработало – Farhad

5

я получает данные от сервера в виде строки (который является base64 закодированный в строку), а затем на стороне клиента i декодировал его на base64, а затем на буфер массива.

Пример кода

function solution1(base64Data) { 

    var arrBuffer = base64ToArrayBuffer(base64Data); 

    // It is necessary to create a new blob object with mime-type explicitly set 
    // otherwise only Chrome works like it should 
    var newBlob = new Blob([arrBuffer], { type: "application/pdf" }); 

    // IE doesn't allow using a blob object directly as link href 
    // instead it is necessary to use msSaveOrOpenBlob 
    if (window.navigator && window.navigator.msSaveOrOpenBlob) { 
     window.navigator.msSaveOrOpenBlob(newBlob); 
     return; 
    } 

    // For other browsers: 
    // Create a link pointing to the ObjectURL containing the blob. 
    var data = window.URL.createObjectURL(newBlob); 

    var link = document.createElement('a'); 
    document.body.appendChild(link); //required in FF, optional for Chrome 
    link.href = data; 
    link.download = "file.pdf"; 
    link.click(); 
    window.URL.revokeObjectURL(data); 
    link.remove(); 
} 

function base64ToArrayBuffer(data) { 
    var binaryString = window.atob(data); 
    var binaryLen = binaryString.length; 
    var bytes = new Uint8Array(binaryLen); 
    for (var i = 0; i < binaryLen; i++) { 
     var ascii = binaryString.charCodeAt(i); 
     bytes[i] = ascii; 
    } 
    return bytes; 
}; 
+0

Этот ответ помог мне спариться! Благодарю. – SubSul

+0

wow, спасибо за ваши комментарии –

+0

Работает нормально на настольных и Android-браузерах. Протестировал его на iPhone (сафари и хром) и не работал. – Redder

Смежные вопросы