Blob не генерирует PDF правильно - PullRequest
1 голос
/ 26 февраля 2020

Я создал службу генератора 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-объекта, дважды проверив мой внутренний код (который проверяет и отправляет правильные данные на внешний интерфейс) и прошел через каждый фрагмент кода, чтобы убедиться, что все собирает необходимые данные.

Еще одна пара глаз очень поможет. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Эта ошибка сводила меня с ума последние пару дней.

1 Ответ

0 голосов
/ 26 февраля 2020

Разрешено.

            pdfGenerator.generatePDF(data);                       // Create the pdf using the retrieved data

должно быть:

            pdfGenerator.generatePDF(data.data);                       // Create the pdf using the retrieved data

, поэтому в буфер передается только буфер массива, ничего больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...