javascript - Blob 未正确生成 pdf

标签 javascript angular

我创建了一个 pdf 生成器服务,它调用后端来检索制作 pdf blob 所需的数据。由于某种原因,当 blob 打开时,Google Chrome(或任何与此相关的浏览器)会显示:“无法加载 PDF 文档。”我在控制台中没有收到任何错误,并且我的预览标题显示数据正在存储在我的前端值中。我的 http.post 也收到了 200 美元。下面是我的代码。

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 类型,仔细检查我的后端代码(检查并将正确的数据发送到前端),并逐步执行每段代码以确保所有内容都捕获了它需要的数据。

另一双眼睛会有很大帮助。如果您需要任何其他信息,请告诉我。在过去的几天里,这个错误一直让我发疯。

最佳答案

解决了。

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

需要是:

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

因此只有数组缓冲区被传递到 blob,没有其他内容。

关于javascript - Blob 未正确生成 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60416262/

相关文章:

javascript - 使用 JQuery 编辑特定 DOM 元素上的数据属性

node.js - 将图像上传到 Azure blob 存储

angular - 使用 ng-content 嵌入创建动态转发器

javascript - Angular/CSS/Javascript 创建一个可以突破包含 div 限制的弹出窗口

javascript - 绑定(bind)和指令之间的区别

angular-cli 和 bootstrap 4

javascript - 获取文本区域中光标下的单词

javascript - String.format 不是函数

javascript - 当我合并时,我看不到删除按钮

javascript - 如何检查选项是否包含空字符?