使用PDFJS遇到的坑及解決辦法記錄
一、PDF.js 介紹
PDF.js 是一個使用 HTML5 構建的便攜式文檔格式查看器。 pdf.js 是社區(qū)驅(qū)動的,并由 Mozilla 支持。我們的目標是為解析和呈現(xiàn) PDF 創(chuàng)建一個通用的、基于 Web 標準的平臺。
PDF.js 支持的功能:
在線檢索文檔中的內(nèi)容,并支持高亮顯示,匹配大小寫,統(tǒng)計匹配項等;
指定頁跳轉,上下一頁;
下載或連接打印機打印當前預覽文件;
按比例縮放當前預覽的文件,調(diào)整閱讀視野;
對當前預覽的文件,開啟在線演示模式;
支持閱讀本地pdf文件;
支持大文件分片上傳;
支持在 viewer.html 添加水印;
可在 viewer.html 中自定義樣式;
二、安裝
1.下載PDF.js
下載后得到一個 .zip 的壓縮包
備注:舊瀏覽器版本,不支持uos自帶瀏覽器、微信瀏覽器等更舊版本。
2.解壓到項目中
我用的是 vue3,把它解壓到了 public 文件夾內(nèi);(我這里用的是【3.11.174】版本,并且把文件名成了fileView,沒需求的可以不用改)
如果是早期版本的vue-cli腳手架放到 static 文件夾下。如果放在 src 文件下,可能不利于引入 viewer.html 進行預覽。
3.允許跨域
在 web/viewer.mjs 或者 web/viewer.js 中搜索 file origin does not match viewer's 并注釋掉。
不然可能會報跨域的錯誤
三、基本使用
方案一:通過彈窗預覽
1.創(chuàng)建組件 PDF.vue
<script setup lang="ts"> import { onMounted, ref } from 'vue'; interface Props { url: string; // pdf文件地址 } const props = defineProps<Props>(); const pdfUrl = ref(''); // pdf文件地址 const fileUrl = '/fileView/web/viewer.html?file='; // pdfjs文件地址 onMounted(() => { // encodeURIComponent() 函數(shù)可把字符串作為 URI 組件進行編碼。 // 核心就是將 iframe 的 src 屬性設置為 pdfjs 的地址,然后將 pdf 文件的地址作為參數(shù)傳遞給 pdfjs // 例如:http://localhost:8080/pdfjs-4.0.189-dist/web/viewer.html?file=http%3A%2F%2Flocalhost%3A8080%2Fpdf%2Ftest.pdf pdfUrl.value = fileUrl + encodeURIComponent(props.url); }); </script> <template> <div class="container"> <iframe :src="pdfUrl" width="100%" height="100%"></iframe> </div> </template> <style scoped lang="scss"> .container { width: 100%; height: 100%; } </style>
2.使用組件
列如我們需要預覽 public 下的一個 test.pdf 文件; 或者換成其他網(wǎng)絡路徑。
<div class="pdf-box"> <PDF url="/public/test.pdf" /> </div>
方案二:直接訪問,通過瀏覽器預覽
<script> const fileView = (url:string) => { const fileUrl = '/fileView/web/viewer.html?file='; // pdfjs文件地址 window.open(fileUrl + encodeURIComponent(url), '_blank'); } </script> <template> <div> <!-- 換成 a 標簽也是一樣的 --> <span @click="fileView(v.fileUrl)" class="mr-20 blue-300" v-for="v in form.fileInfos" :key="v.fileId" style="cursor: pointer;"><u>{{ v.fileName }}</u></span> </div> </template>
四、問題與解決方案
Q:如果出現(xiàn)以下問題:
viewer.mjs:1 Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.
pdf.mjs:1 Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "application/octet-stream". Strict MIME type checking is enforced for module scripts per HTML spec.
說明無法解析.mjs 文件格式
A:解決方法:
方案一:把mjs 的后綴改成js 或者在 .htaccess 添加
<IfModule mod_mime.c> AddType application//javascript js mjs </IfModule>
方案二:配置 MIME
1)Nginx
由于nginx無法識別mjs文件,從而在http header中錯誤的使用 Content-Type:application/octet-stream 來傳輸mjs文件,導致瀏覽器端認為它不是一個合法的js腳本。
操作如下:找到 Nginx 文件夾下的 mime.types ,我的mimetype文件路徑為 /usr/local/nginx/mime.types
sudo vim /usr/local/nginx/mime.types
將
application/javascript js;
改為
application/javascript js mjs;
然后
sudo nginx -s reload
就可以了。
如果有可視化工具,也可以鼠標右鍵通過記事本編輯
如果有用到 ftl 模版、 gzip 文件或者其他格式,可以按照上面的方法添加,列如:
application/x-freemarker ftl; application/x-gzip gz;
2)window
Windows部署到IIS需要設置MIME類型(沒用到IIS可以忽略)
.mjs application/javascript
.ftl application/x-freemarker
方案三:切換版本
不用mjs的版本就好了,切換到 3.11.174 及以下的版本都可以。
Q:怎么禁用打印下載等功能
A:禁用下載、打印等功能:
不能直接注釋會報錯,一般建議采用css方式隱藏。例如注釋下載功能:打開web/viewer.html文件,搜索關鍵字“download”,在相關代碼段加上style="visibility: hidden;"即可
總結
到此這篇關于使用PDFJS遇到的坑及解決辦法的文章就介紹到這了,更多相關PDFJS遇到的坑內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
微信小程序內(nèi)拖動圖片實現(xiàn)移動、放大、旋轉的方法
這篇文章主要介紹了微信小程序內(nèi)拖動圖片實現(xiàn)移動、放大、旋轉的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09關于layui toolbar和template的結合使用方法
今天小編就為大家分享一篇關于layui toolbar和template的結合使用方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09JS設置網(wǎng)頁圖片vspace和hspace屬性的方法
這篇文章主要介紹了JS設置網(wǎng)頁圖片vspace和hspace屬性的方法,具體分析了vspace和hspace屬性的功能及javascript修改技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04