前端預(yù)覽pdf文件流詳細(xì)步驟
1. PDF組件選型
通過查找資料,可以找到如下幾種方案,其中最為成熟的方案是vue-pdf
1. iframe 既可以用來瀏覽本地static下的文檔,也可以預(yù)覽后端返回的文件流文檔
2. vue-pdf 較為完善的vue預(yù)覽pdf的方案
3. vueshowpdf 網(wǎng)絡(luò)上找到的一個(gè)他人封裝的pdf組件
優(yōu)點(diǎn) | 缺點(diǎn) | 原理 | |
iframe/object/embed | 簡(jiǎn)單易用,包含了翻頁(yè),打印,縮放等內(nèi)嵌功能 | 無(wú)法禁止打印 | 將pdf作為插件內(nèi)嵌再這三個(gè)HTML標(biāo)簽內(nèi) |
| vueshowpdf | 樣式簡(jiǎn)單清爽,包含翻頁(yè),縮放功能,可以禁止打印 | 在不修改源碼的情況下無(wú)法自定義相關(guān)樣式,無(wú)進(jìn)度加載提示,加載完成前會(huì)出現(xiàn)白屏 | 基于底層pdf.js實(shí)現(xiàn) |
vue-pdf | 樣式組件可自定義,包含加載進(jìn)度,翻頁(yè),頁(yè)內(nèi)元素可交互等 | 固定寬高的比例,需要將包裹pdf的父容器盡可能調(diào)大才能顯示完全 | 基于pdf.js實(shí)現(xiàn) |
總結(jié)下來,
- 如果只想 簡(jiǎn)單在頁(yè)面嵌套PDF,使用iframe/object/embed是最好的選擇,它不需要你自己去編寫翻頁(yè)組件,不需要去調(diào)整樣式,用戶體驗(yàn)佳。
- 如果對(duì) 樣式?jīng)]有定制化 的需求,使用 vueshowpdf 也是非常不錯(cuò),彈窗式的UI看起來會(huì)更加高大上。
- 如果對(duì) 權(quán)限控制,樣式定制需求高,使用 vue-pdf 是最好的選擇,接口和屬性較全,擴(kuò)展能力強(qiáng),自由度高。
2. Iframe使用步驟
2.1 使用與邏輯
邏輯:將后端返回的看不懂的文件流,設(shè)置成reponseType="arraybuffer",然后讀取到返回的blob,再使用createObjectURL讀取出url即可
2.2 代碼示例
<template>
<iframe :src="src" frameborder="0" :style="iframeStyle" />
</template>
<script>
import { mapState } from 'vuex'
import { getNodeObjectData } from '@/modules/viewer/apis/service'
export default {
name: 'pdfPanel',
props: {
node: {
type: Object,
default: () => {}
}
},
data() {
return {
src: ''
}
},
computed: {
...mapState({
innerHeight: (state) => state.viewerStore.setting['innerHeight']
}),
iframeStyle() {
return {
width: '100%',
height: `${this.innerHeight - 130}px`
}
}
},
mounted() {
return getNodeObjectData({
meta_id: this.node.id
})
.then((res) => {
const blob = new Blob([res], { type: 'application/pdf' })
const url = window.URL.createObjectURL(blob)
this.src = url
})
},
methods: {
handleFullScreen() {
window.open(`${this.src}#filename=${this.node.name}`, "_blank")
}
}
}
</script>>2.3 圖文詳解
1. 后端返回的是文件流,如下:

2. 接口請(qǐng)求設(shè)置responseType="arraybuffer"
export function getNodeObjectData(params) {
return axios({
url: `${apiPrefix}/pdf`,
method: 'GET',
params: params,
responseType: 'arraybuffer'
})
}總結(jié)
到此這篇關(guān)于前端預(yù)覽pdf文件流的文章就介紹到這了,更多相關(guān)前端預(yù)覽pdf文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用nodeJS+vue圖片上傳實(shí)現(xiàn)更新頭像的過程
Vue是一套構(gòu)建用戶界面的框架,最近工作中遇到了一個(gè)需求,需要做一個(gè)更新頭像的通能,下面這篇文章主要給大家介紹了關(guān)于利用nodeJS+vue圖片上傳的相關(guān)資料,需要的朋友可以參考下2022-04-04
vue內(nèi)點(diǎn)擊url下載文件的最佳解決方案分享
這篇文章主要給大家介紹了關(guān)于vue內(nèi)點(diǎn)擊url下載文件的最佳解決方案,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02
vue項(xiàng)目頁(yè)面嵌入代碼塊vue-prism-editor的實(shí)現(xiàn)
這篇文章主要介紹了vue項(xiàng)目頁(yè)面嵌入代碼塊vue-prism-editor的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
vuex 如何動(dòng)態(tài)引入 store modules
這篇文章主要介紹了vuex 如何動(dòng)態(tài)引入 store modules,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
vue做網(wǎng)頁(yè)開場(chǎng)視頻的實(shí)例代碼
這篇文章主要介紹了vue做網(wǎng)頁(yè)開場(chǎng)視頻的實(shí)例代碼,需要的朋友可以參考下2017-10-10
Vue+ElementUI實(shí)現(xiàn)動(dòng)態(tài)更換任意主題色(動(dòng)態(tài)換膚)的全過程
眾所周知Element-UI有換膚功能,下面這篇文章主要給大家介紹了關(guān)于Vue+ElementUI實(shí)現(xiàn)動(dòng)態(tài)更換任意主題色(動(dòng)態(tài)換膚)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
vue-cli3在main.js中console.log()會(huì)報(bào)錯(cuò)的解決
這篇文章主要介紹了vue-cli3在main.js中console.log()會(huì)報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04

