如何在AngularJS中处理来自Web API的PDF文件?

时间:2015-03-23 13:48:49

标签: angularjs asp.net-web-api

我使用Web API post方法生成PDF:

[HttpPost]
[Route("api/pdf")]
public HttpResponseMessage Post(CustomType type)
{
    StreamContent pdfContent = PdfGenerator.GeneratePdf();

    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
    response.Content = pdfContent;
    response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
    response.Content.Headers.ContentDisposition.FileName = "PDFName.pdf"

    return response;
}

在AngularJS中,我想得到这样的PDF文件:

$http.post("api/pdf", object).then(function (results) {
    var data = results.data;

    //TODO: got PDF, how to handle?

}, function (results) {
    console.log(results);
});

但是我应该如何处理AngularJS中的PDF数据?在iPad上,我希望PDF能够打开,但如果文件被下载或只是在桌面上打开并不重要。

EDIT1:

使用SaveAS JS library我能够在桌面上制作出有效的解决方案:

$http.post("api/pdf", object).then(function (results) {
    var data = results.data;

    var file = new Blob([data], { type: 'application/pdf' });
    saveAs(file, "test.pdf");

}, function (results) {
    console.log(results);
});

该文件正在直接下载到我的桌​​面,但由于某些原因,此解决方案无法在iOS中运行。什么都没发生。请参阅此JSFiddle

有没有其他方法可以在我的iPad上显示PDF而无需将文件嵌入我的网站?

3 个答案:

答案 0 :(得分:3)

您可能很清楚,ios设备不允许您将文件下载并存储到内存/磁盘,就像在桌面/笔记本电脑上一样。

下载的商品必须由应用

打开

由于您已经在网站上工作,浏览器似乎是一个很自然的候选人。


正如我猜测您不希望将pdf文件嵌入您的网站,另一种方法是在新的浏览器标签中打开pdf

如果您可以接受此类解决方案,请查看此SO帖子:

window.open() in an iPad

提供的解决方案确实有效,但只有在配置Safari时才能阻止弹出窗口。


我担心这可能是唯一可行的选择。 Having the iPad store the pdf into apps like iBooks will not work,根据这篇文章。它不能用javaScript自动化。


据我所知,在这种情况下没有完美的解决方案,只是一个最可接受的解决方案:如果检测到ios,则在浏览器的新标签页中打开pdf。

如果您对这种妥协感兴趣,并遇到使用window.open()实施此问题的问题,我们将很乐意为您提供帮助。

答案 1 :(得分:1)

PDF可能很大,在处理如此大的字节时,你应该stream这些字节,而不是聚集到某个变量。

您的服务器端代码已经在执行该作业。但内容类型可能会丢失。

在客户端,我建议您在单独的窗口/标签中打开,如下所示: -

window.open('http://yourapidomain/api/pdf','resizable,scrollbars');

答案 2 :(得分:0)

服务器似乎没有为application / pdf设置响应的mime类型。尝试在http响应中添加“Content-Type”标题,ipad应在相关应用中打开pdf。