首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误无法加载PDF文档。(Angular5)

错误无法加载PDF文档。(Angular5)
EN

Stack Overflow用户
提问于 2018-04-25 09:29:11
回答 2查看 6K关注 0票数 1

我正在尝试从Web中获取PDF文档,并希望在中显示。获取“未能加载PDF文档错误”。

请按照我的代码:

我的service.ts

代码语言:javascript
复制
public download_pdf(id: string): Observable<any> {
        let params = new URLSearchParams();
        let headers = new Headers();
        headers.append('x-access-token', this.auth.getCurrentUser().token);
        headers.append('id', id);
        return this.http.get(Api.getUrl(Api.URLS.download_pdf), {
          headers: headers,
          responseType: ResponseContentType.ArrayBuffer,

        }).map(
          response => (<Response>response).blob())
    }

我的component.ts

代码语言:javascript
复制
  downloadFile2(id) {
    this.ws.download_pdf(id).subscribe(
      (response) => {
        let mediaType = 'application/pdf';
        let blob = new Blob([response._body], {type: mediaType});
        let filename = 'test.pdf';
        FileSaver.saveAs(blob, filename);
      });
  }

Template.html

代码语言:javascript
复制
  <button>
   <i class="fa fa-save" aria-hidden="true"(click)="downloadFile2(item.id)"></i>
  </button>

结果是:下载一个test.pdf ->错误无法加载PDF文档。

EN

回答 2

Stack Overflow用户

发布于 2019-04-05 05:35:58

按照以下步骤解决问题。

步骤1.在API中将字节数组转换为base64字符串,如下所示

代码语言:javascript
复制
[HttpGet("Downloadpdf/{SessionKey}")]
        public IActionResult Downloadpdf(string SessionKey)
        {
            Byte[] pdf = null;
            try
            {
                pdf = PDFService.Downloadpdf(SessionKey);//Here you need to modify and get byte array like byte[]
                string pdfBase64 = Convert.ToBase64String(pdf);
                return Ok(pdfBase64);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

步骤2.在base64文件中添加一个从.ts字符串转换为ArrayBuffer的函数

代码语言:javascript
复制
base64ToArrayBuffer(base64:any):ArrayBuffer {
      var binary_string =  window.atob(base64);
      var len = binary_string.length;
      var bytes = new Uint8Array( len );
      for (var i = 0; i < len; i++)        {
          bytes[i] = binary_string.charCodeAt(i);
      }
      return bytes.buffer;
  }

步骤3.为按钮单击事件调用自定义函数中的step2函数

代码语言:javascript
复制
let sessionKey: any ="sessiontoken";
      this.pdfService.downloadpdf(sessionKey).subscribe((data: any) => {
        var byteArray = this.base64ToArrayBuffer(data);
        let blob: any = new Blob([byteArray], { type: 'application/octet-stream' });
        saveAs(blob, 'Report.pdf',true);
      },
      (error: HttpErrorResponse) => {
        console.log(error)
    });
票数 2
EN

Stack Overflow用户

发布于 2021-06-01 18:58:13

你也可以用这个角度10。

Service.ts

代码语言:javascript
复制
    getPdf():Observable<any> { 
        return this.http.get<any>(`${this.apiUrl}Controller/GetPdf`);
      }

Component.ts

代码语言:javascript
复制
    this.service.getPdf().subscribe((resp) => {
      
          let response = this.base64ToArrayBuffer(resp);
          let file = new Blob([response], { type: 'application/pdf' });            
          var fileURL = URL.createObjectURL(file);
          window.open(fileURL);
        
      });
     }

辅助法

代码语言:javascript
复制
    base64ToArrayBuffer(base64:any):ArrayBuffer {
      var binary_string =  window.atob(base64);
      var len = binary_string.length;
      var bytes = new Uint8Array( len );
      for (var i = 0; i < len; i++)        {
          bytes[i] = binary_string.charCodeAt(i);
      }
      return bytes.buffer;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50018660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档