У меня есть 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() не сработает для меня.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Сначала измените ожидаемый 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, когда закончите с ним, чтобы избежать утечек памяти.