前端在線預(yù)覽PDF文件三種實現(xiàn)方式(兼容移動端)
背景
項目中需要在線預(yù)覽公司內(nèi)部的PDF文件,且PC端和移動端均可支持查看
實現(xiàn)方式
一、微軟提供的在線預(yù)覽地址結(jié)合iframe:
reviewUrl 為需要預(yù)覽的 pdf 文件鏈接
這個方式不僅可以預(yù)覽 pdf,同時也可以預(yù)覽 word、ppt、excel 等文件
<iframe :src="'https://view.officeapps.live.com/op/view.aspx?src=' + encodeURIComponent(reviewUrl)" frameborder="0" title="review" width="100%" height="100%"></iframe>
缺點:
- 有一定的概率會出現(xiàn)網(wǎng)絡(luò)問題導(dǎo)致無法預(yù)覽,需要多次刷新重新打開的問題,體驗較差
- 在安卓真機設(shè)備上會出現(xiàn)打開時直接下載 pdf 文件不能在線預(yù)覽的問題,不符合需求
二、直接 window.open 打開文檔鏈接
在 iOS 上表現(xiàn)為可以直接在網(wǎng)頁中打開,但在安卓端也會變成直接下載文檔
三、通過 PDF.js 實現(xiàn)
注意:建議下載低版本,我的是 v2.7.570。版本太高會發(fā)現(xiàn) pdf.js 會報一個版本不匹配的錯誤,不知道是不是我們的pdf文件版本太低的兼容性問題。
我從v4一直試到v3,最后在這個版本才是最穩(wěn)定的,測試了一下98%以上的文件都能預(yù)覽
1、首先在官網(wǎng)下載好所需要的文件,主要內(nèi)容如下:
將 build 和 web 兩個文件夾,整個放到項目中的 public 文件夾下(我的是 Nuxt3 項目,但如果是 Vite 創(chuàng)建的 vue3 項目同樣也是放在 public 文件夾下)
2、新建 Preview.vue 組件,用來預(yù)覽 pdf 文件
因為我的需求是打開彈框進行查看,如果你的項目中不是,那么你打開新頁面就行,記得把鏈接帶上。代碼如下:
<template> <el-dialog title="" class="preview-dialog" v-model="dialogVisible" :destroy-on-close="true" :append-to-body="true" :show-close="false" @closed="handleClose" > <div class="close-button" @click.stop="handleClose"></div> <iframe frameborder="0" :src="previewUrl" width="100%" height="100%"></iframe> </el-dialog> </template> <script lang="ts" setup> import { ref, watch } from "vue"; interface IProps { reviewUrl?: string; } const props = withDefaults(defineProps<IProps>(), { reviewUrl: "", }); const emit = defineEmits(["update:modelValue", "emitClosePreview"]); const dialogVisible = ref(true); // pdfjs用于預(yù)覽的url,固定格式,會去項目中的 public 文件夾下找到 web 文件夾中的 viewer.html const pdfjsFileUrl = '/web/viewer.html?file='; const previewUrl = ref(""); const handleClose = () => { emit("emitClosePreview"); }; watch( () => props.reviewUrl, newReviewUrl => { // 如果你預(yù)覽的是本地的 pdf,那么建議你把 pdf 文件也放到 public 中,這樣不會被編譯 previewUrl.value = `${pdfjsFileUrl}${encodeURIComponent(newReviewUrl)}`; }, { immediate: true, } ); </script> // 彈框的樣式我就不貼了
3、在 public/web 下找到 viewer.js 文件,搜索 file origin does not match viewer's
,把這一行注釋掉,不然會存在跨域問題
4、在移動端設(shè)備上,會發(fā)現(xiàn)預(yù)覽時 pdf 整體內(nèi)容縮放過小,影響閱讀,雖然可以通過手動進行放大,但是這里是可以進行初始設(shè)置的。在 viewer.js 文件中,搜索 const DEFAULT_SCALE_VALUE
,然后把默認的值修改為 'page-width'
,這樣在移動端預(yù)覽的時候,就會是最合適設(shè)備大小寬度的樣式
這個方法中,有一個 switch 代碼塊,可以設(shè)置的值如下:
你可以自己設(shè)定初始值,以實現(xiàn)你想要的初始化效果。
注意:pdfjs的版本號要對應(yīng),不然會有如下報錯:
Warning: UnknownErrorException: The API version "3.11.174" does not match the Worker version "3.6.172".
查看版本號,可以通過console.log("pdf-js版本", pdfjs.version)來打印
總結(jié)
到此這篇關(guān)于前端在線預(yù)覽PDF文件三種實現(xiàn)方式的文章就介紹到這了,更多相關(guān)前端在線預(yù)覽PDF文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS導(dǎo)出PDF插件的方法(支持中文、圖片使用路徑)
下面小編就為大家?guī)硪黄狫S導(dǎo)出PDF插件的方法(支持中文、圖片使用路徑)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-07-07JavaScript解析JSON格式數(shù)據(jù)的方法示例
這篇文章主要介紹了JavaScript解析JSON格式數(shù)據(jù)的方法,結(jié)合實例形式分析了JavaScript解析json格式數(shù)據(jù)的常用函數(shù)與使用技巧,需要的朋友可以參考下2017-01-01JavaScript實現(xiàn)無刷新上傳預(yù)覽圖片功能
這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)無刷新上傳預(yù)覽圖片功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08