如何使用javascript和PDF数据动态创建PDF?

时间:2017-05-09 15:01:25

标签: javascript php jquery

我有一个AJAX调用,调用一个安全的PHP API调用,生成PDF文件数据(动态,没有实际文件)并返回它。如何在javascript / jquery中使用此PDF文件数据来创建PDF文件并将其下载给用户?

我最初尝试将ajax调用的头部设置为PDF格式,但显然你无法通过ajax下载文件。

2 个答案:

答案 0 :(得分:0)

要从ajax调用自动下载文件,您可以执行以下操作。在我的示例中,我返回了一个包含文件名,mime类型和Base64数据的对象,但这可能会让您了解如何执行您要查找的内容。

PostDTO('/ReportService.asmx/DownloadReport', dto, function (result) {
                var a = document.createElement('a');
                if (window.URL && window.Blob && ('download' in a) && window.atob) {
                    // Do it the HTML5 compliant way
                    var blob = base64ToBlob(result.FileDataBase64, result.MimeType);
                    var url = window.URL.createObjectURL(blob);
                    a.href = url;
                    a.download = result.Filename;
                    a.click();
                    window.URL.revokeObjectURL(url);
                }
            });

function base64ToBlob(base64, mimetype, slicesize) {
        if (!window.atob || !window.Uint8Array) {
            // The current browser doesn't have the atob function. Cannot continue
            return null;
        }
        mimetype = mimetype || '';
        slicesize = slicesize || 512;
        var bytechars = atob(base64);
        var bytearrays = [];
        for (var offset = 0; offset < bytechars.length; offset += slicesize) {
            var slice = bytechars.slice(offset, offset + slicesize);
            var bytenums = new Array(slice.length);
            for (var i = 0; i < slice.length; i++) {
                bytenums[i] = slice.charCodeAt(i);
            }
            var bytearray = new Uint8Array(bytenums);
            bytearrays[bytearrays.length] = bytearray;
        }
        return new Blob(bytearrays, { type: mimetype });
    };

答案 1 :(得分:0)

您可以从ajax下载文件。 我是通过角度应用程序完成的。 想法:

  1. 获取文件数据并询问响应类型&#34; arrayBuffer&#34;
  2. 确保您的框架不会转换数据响应(因为它是有棱角的)
  3. 创建blob:var blob = new Blob([data],{type:&#39; application / pdf&#39;); // check type
  4. 创建网址:var url = URL.createObjectURL(blob);
  5. 打开网址:window.open(网址);
  6. 您可以验证通过控制台生成的blob,显示blob网址。该网址必须打开您的PDF格式。