一尘不染

如何从我的angularjs应用发送的iOS上显示PDF(Blob)

angularjs

我的Angular 1.5应用程序通过REST连接到Java / Tomcat / Spring后端服务器。

一种REST服务会生成PDF并将其发送给客户端。它在DEsktop浏览器(至少是FF,Chrome)上运行良好,但是
无论我使用的浏览器是什么(Chrome,Safari ), 我都无法在iOS(例如ipad)上看到PDF内容。

这是角度代码:

$http.get("/displayPdf", {responseType: 'arraybuffer', params: {id: 1}}).
 success(function(data) {
   var blob = new Blob([data], {type 'application/pdf'});
   var objectUrl =  window.URL.createObjectURL(blob);
   window.open(objectUrl);
 }
);

Spring / Jax-RS代码是:

@GET
@Path("displayPdf")
@Produces("application/pdf")
Response displayPdf(@QueryParam("id") Long id) {
  byte[] bytes = service.generatePdf(); 
  return javax.ws.rs.core.Response.ok().
    entity(bytes).
    header("Content-Type", "pdf").
    header("Content-Disposition", "attachment; filename='test.pdf'").
    build();
}

例如,我在这里做了研究(AngularJS:在angular应用程序中显示blob(.pdf)),但找不到合适的解决方案。

所以,请问您知道如何将生成的PDF显示给iPad / iPhone最终用户吗?

非常感谢


阅读 261

收藏
2020-07-04

共1个答案

一尘不染

上面提出的解决方案都没有对我有用。

主要问题来自URLiOS中没有正确检索到的问题。以下代码可以正常工作:

window.URL = window.URL || window.webkitURL;

即使这样,它也无法在Chrome iOS,Opera iOS上运行…因此,在深入研究互联网并受到以下问题启发之后:

  • Blob createObjectURL下载在Firefox中不起作用(但在调试时有效)
  • 如何在Chrome iOS上打开Blob URL
  • 在角度应用程序中显示Blob(.pdf)

…我最终得到以下代码(可在除iOS上的FF以外的所有iOS浏览器上使用):

if (window.navigator.msSaveOrOpenBlob) { //IE 11+
  window.navigator.msSaveOrOpenBlob(blob, "my.pdf");
} else if (userAgent.match('FxiOS')) { //FF iOS
  alert("Cannot display on FF iOS");
}
} else if (userAgent.match('CriOS')) { //Chrome iOS
  var reader = new FileReader();
  reader.onloadend = function () { $window.open(reader.result);};
  reader.readAsDataURL(blob);
} else if (userAgent.match(/iPad/i) || userAgent.match(/iPhone/i)) { //Safari & Opera iOS
  var url = $window.URL.createObjectURL(blob);
  window.location.href = url;
}
2020-07-04