Я создал службу генератора PDF, которая выполняет вызов бэкэнда для получения данных, необходимых для создания BLOB-объекта PDF. По какой-то причине, когда большой двоичный объект открывается, Google Chrome (или любой другой браузер в этом отношении) заявляет: «Не удалось загрузить PDF-документ». Я не получаю ошибок в консоли, и мои заголовки предварительного просмотра показывают, что данные сохраняются в моих значениях внешнего интерфейса. Я получаю 200 на моем http.post, а также. Ниже мой код.
Код BLOB-объекта
angular.module( 'utilitiesServices' ).factory( 'pdfGenerator', ['$q', '$timeout', '$window', function ($q, $timeout, $window) {
var service = {};
/**
* @memberof pdfGenerator
* @description
* Generates a pdf from given data
**/
function _print(data) {
if (data !== null || data !== undefined) {
var bytes = data
var file = new Blob([bytes], { type: 'application/pdf' });
$timeout(function () {
//IE compatabilty
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(file, 'report.pdf');
}
else {
var objectUrl = window.URL.createObjectURL(file);
$window.open(objectUrl);
}
});
}
};
/**
* Print the pdf
* @param data
* @returns {*}
*/
service.generatePDF = function (data) {
var deferred = $q.defer();
deferred.resolve(
_print(data)
);
return deferred.promise;
};
return service;
}]);
Позвоните в бэкэнд для получения данных PDF
service.prototype.getPDF = function (id) {
var deferred = $q.defer();
this.loading.GetPDF = true;
$http.post('service/api/GetPdf', JSON.stringify(id), { responseType: 'arraybuffer' })
.then(function successCallback(response) {
return deferred.resolve(response);
},
function errorCallback(error) {
return deferred.reject(error);
});
return deferred.promise;
};
Внешний ответ и вызов функции http.post
$scope.getPDF = function (id) {
$scope.data.loading = true; // Show the loading graphic
tracking.getPdf(id).then(function (data) {
// Tell the user that the pdf data was succesfully retrieved
ngToast.create({
className: 'success',
content: 'Success!'
});
pdfGenerator.generatePDF(data); // Create the pdf using the retrieved data
}, function (error) {
// Tell the user that there was an error getting data for the pdf
ngToast.create({
className: 'warning',
content: 'Error',
animation: 'slide'
});
}).finally(function () {
$scope.data.loading = false; // Turn off the loading graphic
});
};
Я попытался изменить тип BLOB-объекта, дважды проверив мой внутренний код (который проверяет и отправляет правильные данные на внешний интерфейс) и прошел через каждый фрагмент кода, чтобы убедиться, что все собирает необходимые данные.
Еще одна пара глаз очень поможет. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Эта ошибка сводила меня с ума последние пару дней.