好吧,我已经阅读了关于从Web服务下载PDF的每个堆栈溢出问题。迄今为止,他们都没有帮助过我。我将此作为最后一次努力尝试并获得一些答案。基本上,我正在向API发出GET请求,并且需要返回动态生成的PDF。我们试图通过收到byte[]
来做到这一点,现在我们正在返回包含内容的信息流。下面就是我们在Web服务控制器:从AngularJS的.NET控制器下载PDF
var result = await resp.Content.ReadAsAsync<byte[]>();
var response = request.CreateResponse(HttpStatusCode.OK);
var dataStream = new MemoryStream(result);
response.Content = new StreamContent(dataStream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = "idcard.pdf";
var fileStream = new FileStream(@"c:\temp\temp.pdf", FileMode.Create);
fileStream.Write(result, 0, result.Length);
fileStream.Close();
return response;
通过FileStream的部分是我们在做,看看是否将数据保存到临时文件工作的测试和PDF格式保存即可。这部分工作。去c:\ temp并打开idcard.pdf文件完美。其中一个问题就是它默默无闻,用户不知道它在那里。我们可以告诉他们,但我们确实希望PDF在浏览器中默认打开并/或通过浏览器保存,以便他们知道发生了什么事情。
我的角度代码如下所示:
.factory('memberIdCard', ['$http', function($http) {
var get = function() {
return $http({
method: 'GET',
url: '/Member/IdCard',
headers: {
accept: 'application/octet-stream'
},
responseType: 'arraybuffer',
transformResponse: function(data) {
var pdf;
console.log('data: ', data);
if (data) {
pdf = new Blob([data], {
type: 'application/pdf'
});
console.log('pdf: ', pdf);
}
return pdf;
}
})
}
return {
get: get
}
}]);
我已经试过这部分与$http
和$resource
既不作品。现在,在我的控制器:
$scope.printIdCard = function() {
memberIdCard.get().then(function(data) {
var pdf = data.data;
FileSaver.saveAs(pdf, 'idcard.pdf');
var pdfUrl = window.URL.createObjectURL(pdf);
$scope.pdfView = $sce.trustAsResourceUrl(pdfUrl);
window.open($scope.pdfView);
});
作为一个说明,FileSaver
是angular-file-saver。
毕竟,打开新窗口,但出现如下错误:无法加载PDF文档,并且如果尝试在Adobe Acrobat中打开它,则会出现如下错误:Adobe Acrobat Reader DC无法打开'idcard.pdf',因为它不是受支持的文件类型,或者是因为文件已损坏(例如,它是作为电子邮件附件发送的,未正确解码)。
任何帮助将不胜感激。我觉得我已经完成了许多其他SO问题中提出的一切,但也许我错过了一些我无法看到的东西。
谢谢!
感谢您的答复,并与我们联系。我实施了所有这一切,但它仍然没有帮助我。我认为它基本上是以角度文件保护程序的方式做的,只是以不同的方式。在我们的结局中必须有其他的东西出现问题,并使其不能正常工作。 – pjlamb12