我使用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而无需将文件嵌入我的网站?
答案 0 :(得分:3)
您可能很清楚,ios设备不允许您将文件下载并存储到内存/磁盘,就像在桌面/笔记本电脑上一样。
下载的商品必须由应用
打开由于您已经在网站上工作,浏览器似乎是一个很自然的候选人。
正如我猜测您不希望将pdf文件嵌入您的网站,另一种方法是在新的浏览器标签中打开pdf 。
如果您可以接受此类解决方案,请查看此SO帖子:
提供的解决方案确实有效,但只有在配置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。