PDF Blob - 弹出窗口不显示内容

IT技术 javascript angularjs pdf
2021-02-08 13:28:34

最近几天我一直在研究这个问题尝试在<embed src>标签上显示流没有运气,我只是尝试在新窗口上显示它。

新窗口 显示 PDF控件在此处输入图片说明

知道为什么 pdf 的内容没有显示吗?

代码:

$http.post('/fetchBlobURL',{myParams}).success(function (data) {
    var file = new Blob([data], {type: 'application/pdf'});
    var fileURL = URL.createObjectURL(file);
    window.open(fileURL);
});
6个回答

如果您想从响应数据创建一个responseTypearraybuffer需要将 设置为blob

$http.post('/fetchBlobURL',{myParams}, {responseType: 'arraybuffer'})
   .success(function (data) {
       var file = new Blob([data], {type: 'application/pdf'});
       var fileURL = URL.createObjectURL(file);
       window.open(fileURL);
});

更多信息:Sending_and_Receiving_Binary_Data

你能帮忙解决这个stackoverflow.com/questions/63187758/... 吗?
2021-03-17 13:28:34
对我不起作用。在浏览器窗口中输入 URL 时,它可以工作,但不能通过 $http.post 方法。还有什么需要注意的吗?安全设定?浏览器类型和版本?
2021-03-26 13:28:34
这几乎对我有用。我需要做同样的事情,但我必须设置一个用户友好的 URL 或文件名。浏览器设置的 UUID 对我不起作用。您知道有没有办法在新标签页中打开 PDF 并在 URL 中设置文件名?谢谢!
2021-03-31 13:28:34
它现在正在工作。似乎 arrayBuffer 是在 angularjs 中从 v.1.1 开始实现的。我有 v.1.08。升级 angularjs 时,一切正常。
2021-04-06 13:28:34
URL.createObjectURL()是由铬71弃用developers.google.com/web/updates/2018/10/chrome-71-deps-rems你不能再使用它。
2021-04-12 13:28:34

如果设置{ responseType: 'blob' },则无需自己创建Blob您可以简单地根据响应内容创建 url:

$http({
    url: "...",
    method: "POST",
    responseType: "blob"
}).then(function(response) {
    var fileURL = URL.createObjectURL(response.data);
    window.open(fileURL);
});
你能帮忙解决这个stackoverflow.com/questions/63187758/... 吗?
2021-03-22 13:28:34
捕获类型错误:无法在“URL”上执行“createObjectURL”:找不到与提供的签名匹配的函数。在 Object.success (enquiry.js:68) at j (jquery.js:2) at Object.fireWith [as resolveWith] (jquery.js:2) at x (jquery.js:4) at XMLHttpRequest.<anonymous> (jquery.js:4)
2021-03-28 13:28:34
优秀的!在花了很多时间尝试显示 pdf 内容后,这对我有用。
2021-03-30 13:28:34
@ThakhaniTharage 你使用哪个浏览器?检查兼容性表
2021-04-11 13:28:34

我使用 AngularJS v1.3.4

HTML:

<button ng-click="downloadPdf()" class="btn btn-primary">download PDF</button>

JS控制器:

'use strict';
angular.module('xxxxxxxxApp')
    .controller('MathController', function ($scope, MathServicePDF) {
        $scope.downloadPdf = function () {
            var fileName = "test.pdf";
            var a = document.createElement("a");
            document.body.appendChild(a);
            MathServicePDF.downloadPdf().then(function (result) {
                var file = new Blob([result.data], {type: 'application/pdf'});
                var fileURL = window.URL.createObjectURL(file);
                a.href = fileURL;
                a.download = fileName;
                a.click();
            });
        };
});

JS服务:

angular.module('xxxxxxxxApp')
    .factory('MathServicePDF', function ($http) {
        return {
            downloadPdf: function () {
            return $http.get('api/downloadPDF', { responseType: 'arraybuffer' }).then(function (response) {
                return response;
            });
        }
    };
});

Java REST Web 服务 - Spring MVC:

@RequestMapping(value = "/downloadPDF", method = RequestMethod.GET, produces = "application/pdf")
    public ResponseEntity<byte[]> getPDF() {
        FileInputStream fileStream;
        try {
            fileStream = new FileInputStream(new File("C:\\xxxxx\\xxxxxx\\test.pdf"));
            byte[] contents = IOUtils.toByteArray(fileStream);
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.parseMediaType("application/pdf"));
            String filename = "test.pdf";
            headers.setContentDispositionFormData(filename, filename);
            ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(contents, headers, HttpStatus.OK);
            return response;
        } catch (FileNotFoundException e) {
           System.err.println(e);
        } catch (IOException e) {
            System.err.println(e);
        }
        return null;
    }
// I used this code with the fpdf library.
// Este código lo usé con la libreria fpdf.

var datas = json1;
var xhr = new XMLHttpRequest();
xhr.open("POST", "carpeta/archivo.php");
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.responseType = "blob";
xhr.onload = function () {
    if (this.status === 200) {
        var blob = new Blob([xhr.response], {type: 'application/pdf'});
        const url = window.URL.createObjectURL(blob);
        window.open(url,"_blank");
        setTimeout(function () {
            // For Firefox it is necessary to delay revoking the ObjectURL
            window.URL.revokeObjectURL(datas)
                , 100
        })
    }
};
xhr.send("men="+datas);

如果您的数据是字节数组,则不需要设置响应类型,请确保在将其传递给 blob 之前将其转换为 Uint8Array。

例子:

let byteArray = new Uint8Array(data)
let file = new Blob(
  [byteArray],
  {type: 'application/pdf'}
)

这个对我有用。

如果您的数据不是 byteArray,请确保将其转换为 byteArray 并按照上述步骤使其工作。

//For example if your data is base-64 encoded string.
let byteChars = atob(data); //To decrypt data
let dataArray = = new Array(byteChars.length);
for(let i=0; i< byteChars.length; i++){
   dataArray[i] = byteChars.charCodeAt(i);
}
let byteArray = new Uint8Array(dataArray)
let file = new Blob(
  [byteArray],
  {type: 'application/pdf'}
)