pdfjs優化,實現按需載入,節省流量和記憶體

来源:https://www.cnblogs.com/dehai/archive/2020/07/02/13224254.html
-Advertisement-
Play Games

1 問題 當使用pdfjs來實現預覽功能的時候,遇到了2個問題: 一是帶寬占用過大,會下載整個pdf文件,這對部署在公網的應用來說,成本壓力很大,因為雲服務帶寬是很貴的。 二是記憶體占用過大,一個80M的pdf,在預覽時占用記憶體高達600M,在一些記憶體較小的手機上容易發生崩潰。 pdfjs預設配置下, ...


1 問題

  當使用pdfjs來實現預覽功能的時候,遇到了2個問題:

  一是帶寬占用過大,會下載整個pdf文件,這對部署在公網的應用來說,成本壓力很大,因為雲服務帶寬是很貴的。

  二是記憶體占用過大,一個80M的pdf,在預覽時占用記憶體高達600M,在一些記憶體較小的手機上容易發生崩潰。

  pdfjs預設配置下,會載入所有的分片(內容),即使只預覽一個頁面也會載入整個文件。能不能實現按需載入呢?只載入所預覽的頁面?答案是可以,下麵我就詳細地介紹如何做。

2 測試環境

pdfjs 1.10.100 prebuild

chrome 76

springboot 2.1

3 步驟

3.1 原理

  要實現按需下載,需要用到HTTP協議的範圍(Range)請求。MSN站點中有關Range的介紹如下:

The Range HTTP request header indicates the part of a document that the server should return. Several parts can be requested with one Range header at once, and the server may send back these ranges in a multipart document. If the server sends back ranges, it uses the 206 Partial Content for the response. If the ranges are invalid, the server returns the 416 Range Not Satisfiable error. The server can also ignore the Range header and return the whole document with a 200 status code.

  這段文字的大概意思是,客戶端使用Range請求頭,可以要求服務端返迴文檔的某個部分。如果服務端不支持,則響應200狀態碼並直接返回整個文檔的內容。如果服務端支持,則在響應中使用206狀態碼並返回部分內容。

Range示例:
Range: bytes=200-1000
Range: bytes=0-499, -500

  在HTTP伺服器上,當它支持Range請求頭時,也就實現了所謂的“分片下載”、“斷點續傳”功能。為行文的方便,下麵都使用’分片下載’這個術語。

3.2 HTTP伺服器啟用分片下載功能

  伺服器要啟用功能,springboot web預設開啟了這個功能,不需要再額外配置。

  如果使用其它的技術棧,一定要確保開啟這個功能!這是必要條件。

  那如何測試HTTP伺服器是否開啟了分片?可以使用chrome開發者模式來確認,如果看到有很多狀態碼為206的報文,就說明開啟了,如下圖所示:

clip_image002

3.3 pdfjs關閉自動獲取

  在pdfjs發行包的web/viewer.js文件中,找到配置項disableAutoFetch,可以看到它的預設值是false,意味著會自動獲取所有分片。

clip_image004

  將它改為true,意味著關閉自動獲取,它僅僅會下載所需要的分片,實現了按需載入。

3.4 效果確認

  可以看到,除了載入開頭的幾個分片之外(這幾個分片中包含pdf元數據,目錄等),不會再載入其它。只有等到要訪問某個頁面的時候,才會接著發起請求,做到了按需載入。如下圖所示。

clip_image006

4 參考資料

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range

https://mozilla.github.io/pdf.js/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 有時候編譯android鏡像會用到一些不需要的app和系統服務,咱們測驗將其裁剪出去。 ####1、源碼目錄 build/target/product/* 在此下麵有不少*.mk文件,這一找到相應的app進行規避修改:android diff–gita/target/product/core.mkb ...
  • 修改android studio的logcat列印顏色 Settings → Editor → Color Scheme → Android Logcat 編程中我們會遇到多少挫折?表放棄,沙漠盡頭必是綠洲。 ...
  • 面試形式:電話面試 作為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個我的iOS交流群:761407670 進群密碼‘博客’,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿裡面試題、面試經驗,討論技術, 大家一起交流學習成長! 1. 你平時怎麼解決網路請求的依賴關係:當一個介面的請求需 ...
  • 前言 最近做一個簡單的應用,使用到了一些WebView的相關知識,這裡做一些總結。 為WebView中的輸入框賦值 讀取WebView控制項中的值 執行WebView中網頁的方法 註入一段js代碼,為一個控制項賦值一個點擊方法 讀取WebView網頁中的表格. 一、為輸入框賦值和取值 首先,載入網頁的方 ...
  • 前端開發當中最有意思的就是實現動畫特效,Flutter提供的各種動畫組件可以方便實現各種動畫效果。Flutter中的動畫組件主要分為兩類: 隱式動畫控制項:只需設置組件開始值,結束值,執行時間,比如AnimatedOpacity,AnimatedSize等組件。 顯式動畫控制項:需要設置Animatio ...
  • break語句描述:break語句,用於無條件結束各種迴圈(退出迴圈)和switch。說明:一般情況下,需要在break語句之前加一個條件判斷。換句話說:就是條件成立了,就退出迴圈。continue語句描述:結束本次迴圈,而開始下一次迴圈。continue之後的代碼不再執行了。說明:一般情況下,需要 ...
  • if條件判斷語句:條件成立,執行什麼代碼;條件不成立,執行什麼代碼結構一:只判斷真(true),條件為假,什麼也不做if(條件判斷:判斷結果是一個布爾值){條件為真(true),執行的代碼} 結構二:既判斷真,也判斷假 if(條件判斷){條件為真,執行的代碼}else{條件為假,執行的代碼} 結構三 ...
  • Koch曲線的構造過程是:取一條長度為L0的直線段,將其三等分,保留兩端的線段,將中間的一段改換成夾角為60度的兩個等長直線;再將長度為L0/3的4個直線段分別進行三等分,並將它們中間的一段均改換成夾角為60度的兩段長為L0/9的直線段;重覆以上操作直至無窮,可得以一條具有自相似結構的折線,如圖1所 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 插件化的需求主要源於對軟體架構靈活性的追求,特別是在開發大型、複雜或需要不斷更新的軟體系統時,插件化可以提高軟體系統的可擴展性、可定製性、隔離性、安全性、可維護性、模塊化、易於升級和更新以及支持第三方開發等方面的能力,從而滿足不斷變化的業務需求和技術挑戰。 一、插件化探索 在WPF中我們想要開 ...
  • 歡迎ReaLTaiizor是一個用戶友好的、以設計為中心的.NET WinForms項目控制項庫,包含廣泛的組件。您可以使用不同的主題選項對項目進行個性化設置,並自定義用戶控制項,以使您的應用程式更加專業。 項目地址:https://github.com/Taiizor/ReaLTaiizor 步驟1: ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • Channel 是乾什麼的 The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consume ...
  • efcore如何優雅的實現按年分庫按月分表 介紹 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵適配 距離上次發文.net相關的已經有很久了,期間一直在從事java相關的 ...
  • 前言 Spacesniffer 是一個免費的文件掃描工具,通過使用樹狀圖可視化佈局,可以立即瞭解大文件夾的位置,幫助用戶處理找到這些文件夾 當前系統C盤空間 清理後系統C盤空間 下載 Spacesniffer 下載地址:https://spacesniffer.en.softonic.com/dow ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • 一、ReZero簡介 ReZero是一款.NET中間件 : 全網唯一開源界面操作就能生成API , 可以集成到任何.NET6+ API項目,無破壞性,也可讓非.NET用戶使用exe文件 免費開源:MIT最寬鬆協議 , 一直從事開源事業十年,一直堅持開源 1.1 純ReZero開發 適合.Net Co ...
  • 一:背景 1. 講故事 停了一個月沒有更新文章了,主要是忙於寫 C#內功修煉系列的PPT,現在基本上接近尾聲,可以回頭繼續更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統出現了大量的http超時,程式不響應處理了,讓我幫忙看下怎麼回事,dump也抓到了。 二:WinDbg分析 ...
  • 開始做項目管理了(本人3年java,來到這邊之後真沒想到...),天天開會溝通整理需求,他們講話的時候忙裡偷閑整理一下常用的方法,其實語言還是有共通性的,基本上看到方法名就大概能猜出來用法。出去打水的時候看到外面太陽好好,真想在外面坐著曬太陽,回來的時候好兄弟三年前送給我的鍵盤D鍵不靈了,在打"等待 ...