Загрузите pdf с сервера и вставьте в приложение Vue

У меня есть API, который возвращает файл PDF. Я пытаюсь отобразить это в vue.js и нашел компонент vue-pdf, который выглядит так, как будто он должен выполнять эту работу. Вот проект на гитхабе

Я могу вызвать API и получить двоичный ответ, но мне не удалось преобразовать двоичные данные во что-то, что может отобразить библиотека vue-pdf.

Документация для реквизита :src находится здесь

Мой код vue ниже с несколькими неудачными попытками, закомментированными.

<template>
  <pdf :src = "pdfsrc"></pdf>
</template>

<script>
import pdf from "vue-pdf";
import axios from "axios";

export default {
  components: {
    pdf
  },
  data() {
    return {
      pdfsrc: null
    };
  },
  created() {
    return axios
      .get(`${process.env.VUE_APP_API_INTRANET}/pdf`, {
        responseType: "application/pdf"
      })
      .then(response => {
        console.info("Success", response);
       
       // 1
       // this.pdfsrc = new Blob([response.data]);
       
       // 2
       //this.pdfsrc = response.data;
       
       //3
       //   for (var i = 0; i < response.data.length; ++i) {
        //   this.pdfsrc.push(response.data.charCodeAt(i) & 0xff);
        //   }

        //4
        this.pdfsrc = new Uint8Array(response.data);
      })
      .catch(console.error); //
  }
};
</script>

Я понимаю, что для моего примера я мог бы просто установить src на URL-адрес API, но в конечном итоге потребуется добавить заголовки авторизации и связать их с вызовами OAuth, поэтому это должен быть вызов API.

Я также хочу отобразить PDF-файл рядом с некоторыми данными из другого вызова API, поэтому использование трюка динамического создания тега привязки, загруженного данными, и .click() не сработает для меня.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
8
0
12 592
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала измените ожидаемый responseType на «blob»:

return axios.get(`${process.env.VUE_APP_API_INTRANET}/pdf`, {
  responseType: "blob"
})

Также преобразуйте двоичный ответ в Blob , а затем сгенерируйте URL-адрес объекта:

.then(response => {
  console.info("Success", response);
  const blob = new Blob([response.data]);
  const objectUrl = URL.createObjectURL(blob);
  this.pdfsrc = objectUrl;
})

Не забудьте использовать revokeObjectURL, когда закончите с ним, чтобы избежать утечек памяти.

Другие вопросы по теме