1. 程式人生 > >pdfjs ----本地以及遠端訪問pdf檔案

pdfjs ----本地以及遠端訪問pdf檔案

如何下載pdfjs,可檢視我的另外一篇部落格文章 

一、本地訪問

1.把pdfjs放到專案,可把pdf.js和pdf.worker.js放到另外專門的js資料夾(放置位置自己調,pdf.min.js以及pdf.worker.min.js是去網上找自動壓縮工具壓縮的,你自己要不要壓縮隨你的便)

2.開啟viewer.js檔案,ctrl+f 搜尋‘DEFAULT_URL’檢視預設檔案位置,也就是說,你直接在網上開啟檔案的時候就可以預設開啟這個檔案了,下載的pdf檔案裡面會預設帶有這個檔案

如果想要修改檔案的話,改掉檔名,以及把檔案放在pdfweb下面下,與剛才的pdf檔案同級,具體自己修改檔案路徑

3.如果想要瀏覽其它pdf檔案的話,我們的訪問方式也可以這樣表示:

http://localhost:9528/static/pdfweb/viewer.html?file=a.pdf

注意file檔案的路徑,放在pdfweb下,否則可能讀不到,如果不放到pdfweb下也行,但訪問的路徑要寫對

本地訪問比較簡單,接下來是遠端訪問了,接下來我會把我所遇到的問題都儘可能寫出來。

二、遠端訪問

一般專案是MVVM的話,前後端分離,一般都是遠端訪問,即訪問遠端伺服器

1、遠端訪問的話,遠端檔名也可以放在file後面: http://localhost:9528/static/pdfweb/viewer.html?file=******.pdf

但遠端訪問的話,file後面肯定會跟http地址,瀏覽器會因識別不了兩條http而報出奇奇怪怪的原因,因此file後面的檔案需要編碼,用js自帶函式encodeURIComponent編碼,把編碼後的遠端pdf檔案的地址放在file後面,這樣file後面的檔案就是編碼後的地址了

2、這樣遠端訪問肯定會有問題的,pdf.js是不支援跨域檔案載入的,直接載入是不會成功的。會報  “file origin does not match viewer”錯誤。這裡涉及到前後端的設定

首先先來說前端的設定,開啟viewer.js檔案

註釋掉這個

後端的設定,後端會拒絕訪問這個,因此需要遠端伺服器處理這個pdf的servlet上面設定可任何伺服器訪問,也可以在過濾器上設定,也可以在伺服器上設定,比如ngnix的反向代理機制來解決前端跨域訪問的問題,這個在網上也有很多資料,下面講下在servlet上處理以及在ngnix上處理兩種方法:

1)servlet上處理,為了分片處理

2)ngnix反向代理這個如何處理,在nginx配置中加入了這樣一句:add_header 'Access-Control-Allow-Origin' '*';

   如圖所示:

以上的方法對於訪問遠端伺服器上的pdf檔案或者pdf檔案流都可以訪問

3.還有一個很重要的問題,關於J2EE跨域資源共享還需要在你的xml上面配置這樣一段資訊以及加上兩個jar包,這個很重要,jar包的獲取很容易的,直接去這裡下載就行:https://mvnrepository.com/repos/central

1)cors-filter-1.7.1.jar
2)java-property-utils-1.9.1.jar

web專案中的web.xml檔案
新增過濾器:
 

 <filter>
   <filter-name>CorsFilter</filter-name>
   <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
</filter>
<filter-mapping>
      <filter-name>CorsFilter</filter-name>
      <url-pattern>/*</url-pattern>
</filter-mapping>

4.另外說一聲,就是是返回位元組流,其載入方式也可以這樣操作的,然後把servlet連結放到file後面即可,注意要用js自帶函式encodeURIComponent編碼

urlhttp://localhost:9528/static/pdfweb/viewer.html?file=******

5.如果想要隱藏下載功能的話,可以在viewer.html設定這一小段程式碼,如果原始碼看不懂,註釋掉可能會引發奇奇怪怪的問題,所以還是加段程式碼把:style="visibility:hidden"

三、優化pdfjs載入速度(cdn、壓縮成min.js、min.css、分片載入)

1、採用cdn載入,不懂的可以網上查詢cdn載入的意思以及用處

在pdfjs官方存放程式碼裡,裡面有關於cdn載入的路徑,以及提供pdfjs提供的地址

如果你沒有在外掛改過程式碼的話,你可以直接引用官方提供的cdn地址,比如

注意版本號寫對1.9.426,別踩坑,不然顯示不出資料,版本號怎麼知道是哪個呢,如果你的pdf預覽報錯,就會顯示版本號,因為我在程式碼沒有看到版本號,所以我就通過頁面報錯找到版本號

如果程式碼改過就不要引用cdn了,直接壓縮,比如我上圖的viewer.min.js ,線上壓縮工具進行壓縮就行了,這樣發生產版本的遠端載入就會快,注意路徑要寫對

分片載入

但是如果pdf 檔案比較大, 往往會載入比較慢。影響使用者體驗。假設一個pdf 檔案大小為:100M,如何快速的在瀏覽器開啟

前置條件 
第一:web伺服器必須要能支援,分片下載。nginx 1.09 版本已上預設的就支援了 
第二:瀏覽器支援,經過簡單測試,谷歌和火狐都支援,谷歌支援的最好.

如何設定分片大小

 PDFJS.getDocument({url:url,rangeChunkSize:65536*16}).then(function(pdfDoc_) {
        pdfDoc = pdfDoc_;
        document.getElementById('page_count').textContent = pdfDoc.numPages;

        // Initial/first page rendering
        renderPage(pageNum);

   }) 
  • rangeChunkSize : 就是分塊大小,預設:65536(64k)。預設太小了,這個文件100m,需要有1000多個請求,才能下載完畢。所以我調成成了512k,減少請求數。如果你的pdf檔案就是一兩頁,那麼你設定分頁沒有多大效果,可以說不用設定。另外不同版本,可能設定分頁的位置不一樣,我現在的版本的話,就設定這個就行了

===============================================================

以上總結的就是遇到的坑,有些步驟我給了,但我沒有解釋為什麼要這樣子做,有些你們要自己查原因為什麼要這樣子處理,如果我全部寫了篇幅會很長,如果有疑問可以發表感言,很少寫部落格,描述文字不嚴謹,見諒、、告退、、、、