Angular 从角度组件打开PDF blob

Angular 从角度组件打开PDF blob,angular,pdf,blob,Angular,Pdf,Blob,在我的Angular应用程序中,我需要在单击按钮时打开PDF 我首先遵循了邮局的指示,所以我现在有两种方法: 调用组件中的 public PrepareDownload(){ this._certificateService .GetPdf(args) .subscribe( result => { this.BlobUri = URL.createObjectURL(result

在我的Angular应用程序中,我需要在单击按钮时打开PDF

我首先遵循了邮局的指示,所以我现在有两种方法:

调用组件中的

public PrepareDownload(){
   this._certificateService
            .GetPdf(args)
            .subscribe(
            result => {
                this.BlobUri = URL.createObjectURL(result);
            }
}

public Download() {
    window.open(this.BlobUri);     
}
在服务中

public GetPdf() : any  {
  var headers = new Headers();
  headers.append("Content-Type", "application/json");
  var payload = {id:215};
  return this._http.post(this.requestUri, 
                         JSON.stringify(payload), 
                         { headers: headers, 
                           responseType: ResponseContentType.Blob })
                   .map((response: Response) => 
                   {
                      return new Blob([response.blob()], { type: 'application/pdf' });
                   });
}
GetPdf的响应包含如下数组
[37,80,68,70,45,49,46,…]
。不幸的是,当调用download方法时,结果似乎是一个无效的pdf。当通过firefox下载文件并将其重命名为txt文件时,我可以看到内容不是二进制的,而是作为字符串的完整字节数组


正如@David Siro的评论所指出的,必须对服务进行修改。
请求现在返回的是一个流,而不是一个字节数组,可以按照问题中所述进行处理。

正如@David Siro的评论所指出的,必须修改服务。
请求现在返回的是一个流,而不是一个字节数组,可以按照问题中所述进行处理。

我认为没有必要重写blob,
(response:response)=>response.blob()
通常对我有效。如果不添加类型头,浏览器甚至不会尝试使用pdf查看器打开它。要添加这些标题,我需要重新包装。首先,确保服务器返回正确的内容类型。这是一个很好的提示。我调整了服务器代码以返回流而不是字节数组。工作起来很有魅力。我认为没有必要重写blob,
(response:response)=>response.blob()
通常对我有效。如果不添加类型标题,浏览器甚至不会尝试使用pdf查看器打开它。要添加这些标题,我需要重新包装。首先,确保服务器返回正确的内容类型。这是一个很好的提示。我调整了服务器代码以返回流而不是字节数组。工作起来很有魅力。