如何在PDF.js中改造viewer.html以實現PDF的動態加載

在PDF.js中改造viewer.html實現PDF動態加載,需結合參數傳遞、文件流處理及跨域配置等技術。以下是綜合多個技術方案的核心實現步驟:


?一、基礎參數傳遞法?

1. ?URL參數動態加載?

通過修改viewer.html的URL參數傳遞PDF路徑,適用于靜態文件或服務端直鏈:

  • ?實現方式?:在viewer.html的URL后添加?file=參數,例如:

    html
    運行
    復制
    <iframe src="viewer.html?file=http://example.com/doc.pdf"></iframe>
    
  • ?關鍵代碼調整?:在viewer.js中注釋或修改跨域檢查代碼,并在webViewerInitialized事件中解析URL參數:

    javascript
    復制
    const urlParams = new URLSearchParams(window.location.search);
    const pdfUrl = urlParams.get('file');
    PDFViewerApplication.open(pdfUrl);
    

?二、文件流動態加載?

2. ?通過Ajax獲取二進制流?

適用于后端返回PDF字節流而非靜態鏈接的場景:

  1. ?前端改造?:在viewer.html中添加Ajax請求邏輯(需在引入viewer.js前執行):

    javascript
    復制
    fetch('/api/get-pdf-stream').then(response => response.arrayBuffer()).then(data => {const uint8Array = new Uint8Array(data);PDFViewerApplication.open(uint8Array);});
    
  2. ?后端要求?:響應頭需設置Content-Type: application/pdf,并處理CORS。

3. ?Base64數據加載?

若需處理Base64編碼的PDF數據:

javascript
復制
const base64ToUint8Array = (base64) => {const binaryString = atob(base64.split(',')[1]);const len = binaryString.length;const bytes = new Uint8Array(len);for (let i = 0; i < len; i++) {bytes[i] = binaryString.charCodeAt(i);}return bytes;
};
PDFViewerApplication.open(base64ToUint8Array(base64Data));

?三、跨框架通信方案?

4. ?使用postMessage傳遞數據?

viewer.html嵌入iframe時,通過父子頁面通信傳遞PDF數據:

  • ?父頁面發送數據?:

    javascript
    復制
    const iframe = document.getElementById('pdfFrame');
    iframe.contentWindow.postMessage({action: 'loadPdf',data: pdfBytes // 可以是URL、Uint8Array或Base64
    }, '*');
    
  • ?子頁面(viewer.html)監聽?:

    javascript
    復制
    window.addEventListener('message', (event) => {if (event.data.action === 'loadPdf') {PDFViewerApplication.open(event.data.data);}
    });
    

    此方法可繞過sessionStorage的5MB限制。


?四、深度定制viewer.js?

5. ?核心代碼修改?
  • ?禁用默認文件加載?:刪除或注釋viewer.jsDEFAULT_URL的定義。

  • ?事件觸發時機?:在webViewerLoaded事件中動態注入加載邏輯,確保PDF.js初始化完成后再操作:

    javascript
    復制
    PDFViewerApplication.initializedPromise.then(() => {// 動態加載代碼
    });
    

?五、跨域與安全處理?

6. ?跨域配置?
  • ?服務端?:設置響應頭Access-Control-Allow-Origin: *

  • ?PDF.js改造?:在viewer.js中注釋以下代碼段以禁用跨域檢查:

    javascript
    復制
    if (origin !== viewerOrigin && protocol !== 'blob:') {throw new Error('跨域禁止');
    }
    
7. ?電子簽章兼容性?

pdf.worker.js中注釋簽名驗證代碼段:

javascript
復制
// 注釋以下三行(約第2000行)
if (this.fieldType === 'Sig') {this._setFlags(AnnotationFlag.HIDDEN);
}

?六、性能優化建議?

  1. ?按需渲染?:參考PDF.js的分頁渲染機制,僅預加載可視區域頁面。

  2. ?內存管理?:調用PDFViewerApplication.close()釋放已卸載文檔內存。

  3. ?錯誤處理?:監聽documentloaderror事件實現容錯:

    javascript
    復制
    PDFViewerApplication.eventBus.on('documentloaderror', (err) => {console.error('加載失敗:', err);
    });
    

?擴展場景示例?

動態加載加密PDF
javascript
復制
PDFViewerApplication.open({url: 'encrypted.pdf',password: 'user123'
}).catch(reason => {// 彈出密碼輸入框PDFViewerApplication.pdfViewer.passwordPrompt();
});

通過上述方案,可實現從URL、二進制流、Base64、跨框架通信等多渠道動態加載PDF,同時解決電子簽章、跨域限制等疑難問題。具體實現需根據項目架構選擇合適的技術組合。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79943.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79943.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79943.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

組件之間的數據通信方式

Vue 的傳值方式&#xff08;即組件之間的數據通信方式&#xff09;根據組件關系不同&#xff08;父子、兄弟、跨層級&#xff09;有所區別。下面是常見的傳值方式&#xff0c;按使用場景來分類&#xff1a; 一、父子組件傳值 1. props&#xff08;父 -> 子&#xff09; 父…

組件是怎樣寫的(1):虛擬列表-VirtualList

本篇文章是《組件是怎樣寫的》系列文章的第一篇&#xff0c;該系列文章主要說一下各組件實現的具體邏輯&#xff0c;組件種類取自 element-plus 和 antd 組件庫。 每個組件都會有 vue 和 react 兩種實現方式&#xff0c;可以點擊 https://hhk-png.github.io/components-show/ …

個性化的配置AndroidStudio

Android Studio 提供諸多向導和模板&#xff0c;可用于驗證 Java 開發套件 (JDK) 和可用 RAM 等系統要求&#xff0c;以及配置默認設置&#xff0c;例如經過優化的默認 Android 虛擬設備 (AVD) 模擬和更新的系統映像。本文檔介紹了可用于自定義 Android Studio 使用方式的其他配…

人類行為的原動力是自我保存-來自ChatGPT

自我保存&#xff08;Self-Preservation&#xff09;確實可以說是人類行為最原始、最底層的驅動力。 簡單來說&#xff1a; 無論我們做什么&#xff0c;表面看動機五花八門&#xff0c;實際上歸根到底都繞不開活下去、保護自己。 &#x1f4a1; 從不同層面理解這個觀點&#…

SystemVerilog語法之內建數據類型

簡介&#xff1a;SystemVerilog引進了一些新的數據類型&#xff0c;具有以下的優點&#xff1a;&#xff08;1&#xff09;雙狀態數據類型&#xff0c;更好的性能&#xff0c;更低的內存消耗&#xff1b;&#xff08;2&#xff09;隊列、動態和關聯數組&#xff0c;減少內存消耗…

藍光三維掃描技術:高效精密測量相機鏡頭底座注塑件

如今越來越多的攝影愛好者、vlog拍攝者使用數碼相機以及無人機&#xff0c;隨時隨地記錄生活中的每一刻美好瞬間&#xff0c;對相機設備的要求也不斷提高。 — 案例背景 — 相機鏡頭底座涉及鏡頭裝置可靠、螺絲位置度連接以及殼體組裝&#xff0c;鏡頭底座注塑件生產廠商&…

【前端】【面試】【業務場景】前端如何獲取并生成設備唯一標識

? 總結 問題&#xff1a;前端如何獲取并生成設備唯一標識&#xff1f; 核心要點&#xff1a;瀏覽器原生信息有限&#xff0c;但通過組合多個維度可生成設備指紋&#xff08;Device Fingerprint&#xff09;&#xff0c;用于唯一標識設備。 常見方式&#xff1a; 瀏覽器信息&…

極刻AI搜v1.0 問一次問題 AI工具一起答

軟件名&#xff1a;極刻AI搜 版本&#xff1a;v1.0 功能&#xff1a;囊括了互聯網上比較好用的一些支持”搜索“的網站或者工具 開發平臺&#xff1a;nodepythonweb 分類有&#xff1a; AI搜索&#xff08;支持智能問答的AI搜索引擎&#xff09; 常規搜索&#xff1a;&#xff…

《2025最新Java面試題全解析:從基礎到高并發架構設計》

25年Java開發者面試中最常考察的100道面試題&#xff0c;涵蓋Java基礎、JVM、多線程、Spring框架、分布式系統等核心知識點&#xff0c;并結合大廠真實面試案例進行深度解析&#xff0c;助你順利通過技術面試。 一、Java基礎篇&#xff08;高頻15問&#xff09; 1. HashMap底層…

[c語言日寄]免費文檔生成器——Doxygen在c語言程序中的使用

【作者主頁】siy2333 【專欄介紹】?c語言日寄?&#xff1a;這是一個專注于C語言刷題的專欄&#xff0c;精選題目&#xff0c;搭配詳細題解、拓展算法。從基礎語法到復雜算法&#xff0c;題目涉及的知識點全面覆蓋&#xff0c;助力你系統提升。無論你是初學者&#xff0c;還是…

51c嵌入式~單片機~合集5~DMA

我自己的原文哦~ https://blog.51cto.com/whaosoft/12940885 一、DMA DMA&#xff0c;全稱Direct Memory Access&#xff0c;即直接存儲器訪問。 DMA傳輸將數據從一個地址空間復制到另一個地址空間&#xff0c;提供在外設和存儲器之間或者存儲器和存儲器之間的高速數據傳輸…

Linux隨記(十七)

一、綜合報錯&#xff1a;fork: Cannot allocatte memory 和 modues is unknwon 和 pam_limits(crond:session) : unknwon limit item ‘noproc’ 1.1 fork: Cannot allocatte memory 處理 - 隨記 排查時間2025年4月。 環境描述&#xff1a; 2014年左右的服務器&#xff0c;…

支持mingw g++14.2 的c++23 功能print的vscode tasks.json生成調試

在mingw14.2版本中, print庫的功能默認沒有開啟, 生成可執行文件的tasks.json里要顯式加-lstdcexp, 注意放置順序. tasks.json (支持mingw g14.2 c23的print ) {"version": "2.0.0","tasks": [{"type": "cppbuild","…

賦能能源 | 智慧數據,構建更高效智能的儲能管理系統

行業背景 隨著新能源產業的快速發展&#xff0c;大規模儲能系統在電力調峰、調頻及可再生能源消納等領域的重要性日益凸顯。 儲能電站作為核心基礎設施&#xff0c;其能量管理系統&#xff08;EMS&#xff09;需要處理海量實時數據&#xff0c;包括電池狀態、功率變化、環境監…

使用 Flutter 遇坑小計

前言 首先, 谷哥很貼心地為國內用戶準備了一份使用手冊 不過很遺憾 就算你照著它的手冊來了, 還是會在后續使用中遇到其它的坑 今天我踩了, 保不齊明天就是其他人(lol) running gradle task ‘assembledebug’ stuck 首先去確定下當下Android Studio(或者說你目前的Flutter項…

鏈表與文件

鏈表 單鏈表 1.鏈表的初始化 typedef struct node {char name[100];int number;struct node *next; }Node,*LinkList;}Node;2.鏈表的初始化函數(Initlist) LinkList InitList() {LinkList head;head(Node*)malloc(sizeof(Node));head->nextNULL;return head; }3.建立鏈…

uniapp打ios包

uniapp在windows電腦下申請證書并打包上架 前言 該開發筆記記錄了在window系統下&#xff0c;在蘋果開發者網站生成不同證書&#xff0c;進行uniapp打包調試和上線發布&#xff0c;對window用戶友好 注&#xff1a;蘋果打包涉及到兩種證書&#xff1a;開發證書 和 分發證書 …

OpenCV 圖形API(48)顏色空間轉換-----將 LUV 顏色空間的圖像數據轉換為 BGR 顏色空間函數LUV2BGR()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 將圖像從LUV顏色空間轉換為BGR顏色空間。 該函數將輸入圖像從LUV顏色空間轉換為BGR。B、G和R通道值的常規范圍是0到255。 輸出圖像必須是8位無符…

HOW MUCH POSITION INFORMATION DO CONVOLUTIONAL NEURAL NETWORKS ENCODE?

1. 動機: 卷積神經網絡中的卷積操作實際上是一個局部的操作,這樣的話就會使得它雖然知道自己看的是什么,但是卻不清楚他在圖像中的位置信息,但是位置信息實際上是很有用的,因此CNN可能潛在的學習到了如何去編碼這種位置信息。所以這篇論文就是為了研究這種位置信息是如何在…

56、如何快速讓?個盒??平垂直居中

在網頁開發中&#xff0c;有多種方式能讓一個盒子實現水平垂直居中。下面為你介紹幾種常見且快速的方法。 1. 使用 Flexbox 布局 Flexbox 是一種非常便捷的布局模型&#xff0c;能夠輕松實現元素的水平和垂直居中。 html <!DOCTYPE html> <html lang"en"&…