Ошибка Не удалось загрузить документ PDF.(Angular5) - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь получить PDF-документ из Web API и хочу показать в Angular App. Получение "Не удалось загрузить документ PDF ошибка".

Пожалуйста, следуйте моему коду:

Мой сервис.ц

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())
    }

Мой компонент.ts

  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

  <button>
   <i class="fa fa-save" aria-hidden="true"(click)="downloadFile2(item.id)"></i>
  </button>

Результат: загрузить файл test.pdf -> Ошибка Не удалось загрузить документ PDF.

1 Ответ

0 голосов
/ 05 апреля 2019

Выполните следующие шаги для решения проблемы.

Шаг 1. Преобразуйте ваш байтовый массив в строку base64 в вашем API, как показано ниже

[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 в ArrayBuffer в файле .ts

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 в пользовательской функции для события нажатия кнопки

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)
    });
...