前端在線預覽PDF文件三種實現(xiàn)方式(兼容移動端)
背景
項目中需要在線預覽公司內部的PDF文件,且PC端和移動端均可支持查看
實現(xiàn)方式
一、微軟提供的在線預覽地址結合iframe:
reviewUrl 為需要預覽的 pdf 文件鏈接
這個方式不僅可以預覽 pdf,同時也可以預覽 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)絡問題導致無法預覽,需要多次刷新重新打開的問題,體驗較差
- 在安卓真機設備上會出現(xiàn)打開時直接下載 pdf 文件不能在線預覽的問題,不符合需求
二、直接 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%以上的文件都能預覽
1、首先在官網(wǎng)下載好所需要的文件,主要內容如下:
將 build 和 web 兩個文件夾,整個放到項目中的 public 文件夾下(我的是 Nuxt3 項目,但如果是 Vite 創(chuàng)建的 vue3 項目同樣也是放在 public 文件夾下)
2、新建 Preview.vue 組件,用來預覽 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用于預覽的url,固定格式,會去項目中的 public 文件夾下找到 web 文件夾中的 viewer.html const pdfjsFileUrl = '/web/viewer.html?file='; const previewUrl = ref(""); const handleClose = () => { emit("emitClosePreview"); }; watch( () => props.reviewUrl, newReviewUrl => { // 如果你預覽的是本地的 pdf,那么建議你把 pdf 文件也放到 public 中,這樣不會被編譯 previewUrl.value = `${pdfjsFileUrl}${encodeURIComponent(newReviewUrl)}`; }, { immediate: true, } ); </script> // 彈框的樣式我就不貼了
3、在 public/web 下找到 viewer.js 文件,搜索 file origin does not match viewer's
,把這一行注釋掉,不然會存在跨域問題
4、在移動端設備上,會發(fā)現(xiàn)預覽時 pdf 整體內容縮放過小,影響閱讀,雖然可以通過手動進行放大,但是這里是可以進行初始設置的。在 viewer.js 文件中,搜索 const DEFAULT_SCALE_VALUE
,然后把默認的值修改為 'page-width'
,這樣在移動端預覽的時候,就會是最合適設備大小寬度的樣式
這個方法中,有一個 switch 代碼塊,可以設置的值如下:
你可以自己設定初始值,以實現(xiàn)你想要的初始化效果。
注意:pdfjs的版本號要對應,不然會有如下報錯:
Warning: UnknownErrorException: The API version "3.11.174" does not match the Worker version "3.6.172".
查看版本號,可以通過console.log("pdf-js版本", pdfjs.version)來打印
總結
到此這篇關于前端在線預覽PDF文件三種實現(xiàn)方式的文章就介紹到這了,更多相關前端在線預覽PDF文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
uniapp改變底部安全區(qū)頂部手機信號時間電池欄顏色樣式
這篇文章主要為大家介紹了uniapp改變底部安全區(qū)頂部手機信號時間電池欄顏色樣式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03js window.addEventListener實際案例
window.addEventListener 是 JavaScript 中的一個方法,用于向指定對象添加事件監(jiān)聽器,下面通過本文給大家介紹js window.addEventListener的實際案例,感興趣的朋友跟隨小編一起看看吧2024-12-12Laydate時間組件在火狐瀏覽器下有多時間輸入框時只能給第一個輸入框賦值的解決方法
這篇文章主要介紹了Laydate時間組件在火狐瀏覽器下有多時間輸入框時只能給第一個輸入框賦值的解決方法,需要的朋友可以參考下2016-08-08基于Arcgis for javascript實現(xiàn)百度地圖ABCD marker的效果
本篇文章由腳本之家小編給大家分享的基于Arcgis for javascript實現(xiàn)百度地圖ABCD marker的效果,需要的朋友一起學習吧2015-09-09JS實現(xiàn)自動輪播圖效果(自適應屏幕寬度+手機觸屏滑動)
這篇文章主要介紹了JS實現(xiàn)自動輪播圖效果(自適應屏幕寬度+手機觸屏滑動),需要的朋友可以參考下2017-06-06基于postman獲取動態(tài)數(shù)據(jù)過程詳解
這篇文章主要介紹了基于postman獲取動態(tài)數(shù)據(jù)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09微信小程序視圖容器(swiper)組件創(chuàng)建輪播圖
這篇文章主要為大家詳細介紹了微信小程序視圖容器(swiper)組件創(chuàng)建輪播圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08