使用 CDN 在國內加載本地 PDF 文件并處理批注:PDF.js 5.x 實戰指南

PDF.js 是一個強大的開源 JavaScript 庫,用于在 Web 瀏覽器中渲染 PDF 文件。它由 Mozilla 開發,能夠將 PDF 文檔繪制到 HTML5 Canvas 或 SVG 上,無需任何本機代碼或瀏覽器插件。對于許多需要在網頁中展示 PDF 內容的應用場景來說,PDF.js 是一個非常理想的選擇。

本文將重點探討以下幾個方面:

  1. 如何通過 CDN 在網頁中引入 PDF.js 庫。
  2. 在中國大陸地區選擇哪些 CDN 服務以獲得更好的訪問速度和穩定性。
  3. 如何使用 PDF.js 加載用戶選擇的本地 PDF 文件。
  4. PDF.js 如何處理 PDF 文件中的批注,以及在使用批注功能時需要注意的事項。

我們將以 PDF.js 5.x 版本為例進行講解,但核心原理同樣適用于其他版本。

1. 通過 CDN 引入 PDF.js

使用 CDN (內容分發網絡) 引入 PDF.js 是最常見和便捷的方式,它可以減輕服務器壓力,并利用 CDN 節點的地理優勢加速文件的傳輸。引入 PDF.js 主要需要兩個文件:

  • pdf.min.js: PDF.js 的核心庫,包含了主要的 API 和渲染邏輯。
  • pdf.worker.min.js: PDF.js 的 Worker 腳本,用于在后臺線程中處理 PDF 的解析和渲染任務,避免阻塞主線程。

你需要在 HTML 文件的 <head><body> 標簽中引入它們:

<script src="[CDN_URL_FOR_PDF.MIN.JS]"></script>
<script>// 必須設置 workerSrc 指向 worker 腳本的 URLpdfjsLib.GlobalWorkerOptions.workerSrc = '[CDN_URL_FOR_PDF.WORKER.MIN.JS]';
</script>

請將 [CDN_URL_FOR_PDF.MIN.JS][CDN_URL_FOR_PDF.WORKER.MIN.JS] 替換為實際的 CDN 鏈接。注意,workerSrc 必須設置,并且核心庫和 worker 腳本的版本號必須嚴格匹配。

2. 中國大陸地區 CDN 選擇建議

對于在中國大陸地區訪問的用戶,受限于網絡環境,直接使用一些國際 CDN(如 Cloudflare CDN)可能會遇到訪問速度慢或不穩定的問題。為了獲得更好的用戶體驗,建議選擇在中國有部署節點或與中國本地服務商有合作的 CDN。

以下是兩個在中國大陸地區表現通常較好的開源庫 CDN:

a. jsDelivr

jsDelivr 是一個免費的、高速的開源 CDN,它與中國的網宿、七牛云等服務商有深度合作,擁有廣泛的中國大陸節點。對于開源庫來說,jsDelivr 是一個非常可靠的選擇。

你可以在 jsDelivr 上通過 npm/package-name@version/file-path 的格式找到 PDF.js 的文件。PDF.js 的 npm 包名是 pdfjs-dist

例如,如果你需要引入接近 5.x 的某個穩定版本,你需要查找具體的版本號(請注意,pdf.js 版本號通常是構建號,例如 4.0.269 是一個近期版本,請替換為你實際需要的 5.x 對應的版本號):

  • 核心庫 (pdf.min.js):
    https://cdn.jsdelivr.net/npm/pdfjs-dist@版本號/build/pdf.min.js
    例:https://cdn.jsdelivr.net/npm/pdfjs-dist@4.0.269/build/pdf.min.js
  • Worker 腳本 (pdf.worker.min.js):
    https://cdn.jsdelivr.net/npm/pdfjs-dist@版本號/build/pdf.worker.min.js
    例:https://cdn.jsdelivr.net/npm/pdfjs-dist@4.0.269/build/pdf.worker.min.js

請訪問 jsDelivr 官網或利用其搜索功能,查找 pdfjs-dist 包下您需要的具體 5.x 版本號和文件路徑。

b. BootCDN

BootCDN 是一個由國內團隊維護的、專注于服務國內開發者的開源庫 CDN 平臺。它同步了許多國外常用開源庫的資源,并使用國內的 CDN 服務商提供加速。

你可以在 BootCDN 上搜索 “pdf.js” 或 “pdfjs-dist” 來找到對應的資源。BootCDN 的 URL 格式通常是 cdn.bootcdn.net/ajax/libs/library-name/version/file-path

例如,如果你需要引入接近 5.x 的某個版本(同樣,請替換為你實際需要的 5.x 對應的版本號):

  • 核心庫 (pdf.min.js):
    https://cdn.bootcdn.net/ajax/libs/pdf.js/版本號/pdf.min.js
    例:https://cdn.bootcdn.net/ajax/libs/pdf.js/4.0.269/pdf.min.js
  • Worker 腳本 (pdf.worker.min.js):
    https://cdn.bootcdn.net/ajax/libs/pdf.js/版本號/pdf.worker.min.js
    例:https://cdn.bootcdn.net/ajax/libs/pdf.js/4.0.269/pdf.worker.min.js

請訪問 BootCDN 官網查找您需要的 pdf.js 版本對應的具體文件路徑。

重要: 在選擇 CDN 后,請務必替換 HTML 中的 [CDN_URL_FOR_PDF.MIN.JS][CDN_URL_FOR_PDF.WORKER.MIN.JS] 為您選擇的 CDN 提供的實際鏈接,并確保兩個文件的版本號一致。

3. 加載本地 PDF 文件

PDF.js 可以通過多種方式加載 PDF 源,包括 URL、 TypedArray (如 ArrayBuffer)、以及 Blob。要加載本地文件,最常用的方式是結合 <input type="file">FileReader API,將文件讀取為 ArrayBuffer,然后傳遞給 PDF.js。

首先,在 HTML 中添加一個用于用戶選擇本地文件的輸入框,以及一個用于渲染 PDF 的 canvas 元素:

<input type="file" id="pdfFile" accept=".pdf">
<canvas id="the-canvas"></canvas>

然后,使用 JavaScript 監聽文件輸入框的 change 事件,讀取文件內容并使用 PDF.js 加載和渲染:

document.getElementById('pdfFile').addEventListener('change', function(event) {var file = event.target.files[0]; // 獲取用戶選擇的第一個文件// 檢查文件類型if (file.type !== "application/pdf") {alert(file.name + " 不是一個有效的 PDF 文件。");return;}var fileReader = new FileReader();// 當文件讀取完成后fileReader.onload = function() {// 文件內容作為 ArrayBuffervar typedarray = new Uint8Array(this.result);// 使用 PDF.js 加載 PDF 文檔const loadingTask = pdfjsLib.getDocument(typedarray);loadingTask.promise.then(function(pdf) {console.log('PDF 加載成功');// 以第一頁為例進行渲染pdf.getPage(1).then(function(page) {console.log('頁面加載成功');var scale = 1.5; // 縮放比例var viewport = page.getViewport({ scale: scale });// 獲取 canvas 元素及其上下文var canvas = document.getElementById('the-canvas');var context = canvas.getContext('2d');// 設置 canvas 的尺寸與頁面 viewport 匹配canvas.height = viewport.height;canvas.width = viewport.width;// 渲染頁面到 canvasvar renderContext = {canvasContext: context,viewport: viewport};var renderTask = page.render(renderContext);renderTask.promise.then(function() {console.log('頁面渲染完成');});});}, function(reason) {// PDF 加載失敗的處理console.error('PDF 加載失敗: ' + reason);});};// 讀取文件內容為 ArrayBufferfileReader.readAsArrayBuffer(file);
});

這段代碼演示了如何加載用戶選擇的本地 PDF 文件,并將其第一頁渲染到頁面上指定的 canvas 元素中。你可以根據需要擴展代碼,實現多頁加載、滾動、縮放等功能。

4. 關于批注功能

當涉及到 PDF 批注時,需要明確一點:PDF.js 的核心功能是渲染和顯示 PDF 文檔內容,這包括顯示 PDF 文件本身已經包含的標準批注類型(如文本標記、高亮、形狀等)。

但是,PDF.js (包括 5.x 版本) 本身并不提供創建**、編輯保存新批注的內置交互式工具或 API。**

這意味著:

  • 如果你加載的本地 PDF 文件本身已經包含了批注,PDF.js 在渲染時會嘗試將其顯示出來。通常情況下,如果批注是標準的 PDF 批注類型,它們會隨著頁面內容一起被繪制到 Canvas 上,或者作為獨立的圖層數據提供(需要進一步處理)。
  • 如果你希望實現用戶在網頁上添加修改刪除批注的功能,僅僅依靠 PDF.js 的核心庫是不夠的。你需要自己實現一套完整的批注交互邏輯和數據管理系統。這通常非常復雜,需要:
    • 監聽鼠標事件,識別用戶在 Canvas 上的操作。
    • 在 Canvas 上方疊加一個交互層(例如另一個 Canvas 或 SVG)來繪制批注的圖形表示。
    • 根據用戶操作,創建或修改批注的數據結構。
    • 將這些批注數據保存下來,如果需要保存回 PDF 文件本身,則需要更高級的庫(如 PDF-LIB,它可以在瀏覽器端修改 PDF 文件,但功能有限)或依賴后端服務來處理 PDF 文件的修改。

建議:

如果你的需求是實現功能完善的交互式批注工具,考慮到其復雜性,你可能需要:

  • 深入研究 PDF.js 的底層 API 如何獲取批注信息,并結合 Canvas 或 SVG 繪圖技術自行實現批注的繪制和交互邏輯。
  • 考慮使用第三方的 JavaScript PDF SDK 或庫,這些庫通常基于 PDF.js 或其他渲染引擎構建,并提供了開箱即用的批注創建、編輯和保存功能。一些庫聲稱與 PDF.js 兼容,或者提供了更高級的 API 來處理 PDF 文檔的結構和批注。

總結

本文詳細介紹了如何在中國大陸地區選擇合適的 CDN(如 jsDelivr 或 BootCDN),通過 CDN 引入 PDF.js 5.x 版本,并使用 JavaScript 加載用戶選擇的本地 PDF 文件并將其渲染到網頁的 Canvas 元素上。

同時,我們澄清了 PDF.js 在批注功能方面的能力:它能很好地顯示 PDF 中已有的批注,但不包含創建和編輯批注的內置工具。如果你需要完整的交互式批注功能,需要進行額外的開發或考慮使用更專業的第三方庫。

希望這篇博文對你在使用 PDF.js 構建 Web PDF 應用時有所幫助!

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

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

相關文章

網絡化:DevOps 工程的必要基礎(Networking: The Essential Foundation for DevOps Engineering)

李升偉 編譯 理解網絡化基礎知識 你是否曾想過是什么真正讓卓越的DevOps工程師與眾人區別開來&#xff1f;答案是網絡化。是的&#xff0c;對網絡的基本理解不僅僅是有幫助的——它是絕對必要的。在當今以微服務、容器和分布式系統為主宰的互聯互通世界中&#xff0c;對網絡原…

C++基本知識 —— 缺省參數·函數重載·引用

C基本知識 —— 缺省參數函數重載引用 1. 缺省參數2. 函數重載3. 引用3.1 引用的基礎知識3.2 引用的作用3.3 const 引用3.4 指針與引用的關系 1. 缺省參數 什么是缺省參數&#xff1f;缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數的時候&#xff0c;如…

Rust 官方文檔:人話版翻譯指南

鑒于大部分翻譯文檔都不太會說人話&#xff0c;本專欄主要內容為 rust 程序設計語言、rust 參考手冊、std 庫 等官方文檔的中譯中。

FlySecAgent:——MCP全自動AI Agent的實戰利器

最近&#xff0c;出于對人工智能在網絡安全領域應用潛力的濃厚興趣&#xff0c;我利用閑暇時間進行了深入研究&#xff0c;并成功開發了一款小型輕量化的AI Agent安全客戶端FlySecAgent。 什么是 FlySecAgent&#xff1f; 這是一個基于大語言模型和MCP&#xff08;Model-Contr…

實戰項目5(08)

目錄 任務場景一 【r1配置】 【r2配置】 【r3配置】 ???????任務場景二 【r1配置】 【r2配置】 ???????任務場景一 按照下圖完成網絡拓撲搭建和配置 任務要求&#xff1a; 通過在路由器R1、R2和R3上配置靜態路由&#xff0c;實現網絡中各終端PC能夠正常…

基于Kubernetes的Apache Pulsar云原生架構解析與集群部署指南(下)

文章目錄 k8s安裝部署Pulsar集群前期準備版本要求 安裝 Pulsar Helm chart管理pulsarClustersBrokersTopic k8s安裝部署Pulsar集群 前期準備 版本要求 Kubernetes 集群&#xff0c;版本 1.14 或更高版本Helm v3&#xff08;3.0.2 或更高版本&#xff09;數據持久化&#xff…

C35-數組和函數開發初見

一 數組作為函數的參數 用于傳遞數組中的某一個元素→意義不大 數組名當做函數實際參數 示例 代碼 #include <stdio.h>//封裝函數PrintArr void PrintArr(int arr[3]){int i;for(i0;i<3;i){printf("%d ",arr[i]);}putchar(\n);}//主函數 int main() { …

【小沐學GIS】基于C++繪制二維瓦片地圖2D Map(QT、OpenGL、GIS)

&#x1f37a;三維數字地球系列相關文章如下&#x1f37a;&#xff1a;1【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;OpenGL、glfw、glut、GIS&#xff09;第二期3【小沐學…

idea左側項目資源管理器不見了處理

使用idea誤觸導致&#xff0c;側邊欄和功能欄沒了&#xff0c;如何打開&#xff1f; 1.打開文件&#xff08;File&#xff09; 2. 打開設置&#xff08;Settings&#xff09; 3.選擇Appearance&Behavior--->Appearance劃到最下面&#xff0c;開啟顯示工具欄和左側并排布…

[Java實戰]Spring Boot 靜態資源配置(十三)

[Java實戰]Spring Boot 靜態資源配置&#xff08;十三&#xff09; 引言 靜態資源&#xff08;如 HTML、CSS、JavaScript、圖片等&#xff09;是 Web 應用的基石。Spring Boot 通過自動化配置簡化了靜態資源管理&#xff0c;但面對復雜場景&#xff08;如多模塊項目、CDN 集成…

多模態大語言模型arxiv論文略讀(六十九)

Prompt-Aware Adapter: Towards Learning Adaptive Visual Tokens for Multimodal Large Language Models ?? 論文標題&#xff1a;Prompt-Aware Adapter: Towards Learning Adaptive Visual Tokens for Multimodal Large Language Models ?? 論文作者&#xff1a;Yue Zha…

Python 基礎語法與數據類型(七) - 函數的定義與調用 (def, return)

文章目錄 為什么要使用函數&#xff1f;函數的定義 (def)函數的調用函數參數 (Parameters vs Arguments)返回值 (return)變量作用域 (簡要了解)總結練習題練習題答案 **創作不易&#xff0c;請大家點贊加收藏&#xff0c;關注我&#xff0c;持續更新教程&#xff01;** 到目前為…

華為配置篇-RSTP/MSTP實驗

MSTP 一、簡介二、常用命令總結三、實驗 一、簡介 RSTP&#xff08;快速生成樹協議&#xff09;? RSTP&#xff08;Rapid Spanning Tree Protocol&#xff09;是 STP 的改進版本&#xff0c;基于 ??IEEE 802.1w 標準??&#xff0c;核心目標是解決傳統 STP 收斂速度慢的問…

Docker Compose 完全指南:從入門到生產實踐

Docker Compose 完全指南&#xff1a;從入門到生產實踐 1. Docker Compose 簡介與核心價值 Docker Compose 是一個用于定義和運行多容器 Docker 應用程序的工具。通過一個 YAML 文件來配置應用的服務&#xff0c;只需簡單命令就能創建和啟動所有服務。 核心優勢&#xff1a;…

Linux 離線安裝 Docker 和 Docker Compose 最新版 的完整指南

一、準備工作 1. 下載安裝包?&#xff08;需在有網絡的機器操作&#xff09;&#xff1a; Docker 引擎&#xff1a;從官方倉庫下載最新二進制包 wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz?Docker Compose&#xff1a;下載最新二進制…

CSS: 選擇器與三大特性

標簽選擇器 標簽選擇器就是選擇一些HTML的不同標簽&#xff0c;由于它們的標簽需求不同&#xff0c;所以CSS需要設置標簽去選擇它們&#xff0c;為滿足它們的需求給予對應的屬性 基礎選擇器 標簽選擇器 <!DOCTYPE html> <head><title>HOME</title>…

鴻蒙跨平臺開發教程之Uniapp布局基礎

前兩天的文章內容對uniapp開發鴻蒙應用做了一些詳細的介紹&#xff0c;包括配置開發環境和項目結構目錄解讀&#xff0c;今天我們正式開始寫代碼。 入門新的開發語言往往從Hello World開始&#xff0c;Uniapp的初始化項目中已經寫好了一個簡單的demo&#xff0c;這里就不再贅述…

JavaSE核心知識點02面向對象編程02-08(異常處理)

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 JavaSE核心知識點02面向對象編程02-08&#…

【JVM-GC調優】

一、預備知識 掌握GC相關的VM參數&#xff0c;會基本的空間調整掌握相關工具明白一點&#xff1a;調優跟應用、環境有關&#xff0c;沒有放之四海而皆準的法則 二、調優領域 內存鎖競爭cpu占用io 三、確定目標 【低延遲】&#xff1a;CMS、G1&#xff08;低延遲、高吞吐&a…

基于單片機的電子法頻率計

一、電子計數法測頻率原理 通過門控控制閘門開關&#xff0c;閘門時間T自己設定&#xff0c;計數器計數脈沖個數N&#xff08;也就是待測信號&#xff09;&#xff0c;N個脈沖的時間間隔為δt,倒數即為信號的頻率f,由此 δtT/N fN/T——信號頻率 根據公式&#xff0c;如果考慮…