jspdf閱讀器源碼,jspdf 中文

本文目錄一覽:

vue-pdf.js 在線預覽問題

最近修改公司vue項目中使用pdf.js來實現在線預覽上傳的各類文件.由於使用pdf.js在預覽時是直接在標籤內將src屬性賦值為要請求的地址.這就導致一個問題,會直接請求伺服器的文件路徑地址,而這個伺服器文件路徑就會暴露出來。處於安全性考慮在預覽請求時不再返回地址,改為通過調用普通介面,而是統一返迴流(word,pdf)或者base64(jpg,png…)。.前端再進行解析並實現在線預覽.

此時遇到第一個問題:

        這個請求是在插件中進行的無法攜帶項目中封裝的各類請求頭信息(token..等)。 翻看pdf.js源碼及網上總結.發現一個底層方法 

         該方法可傳一個對象作為參數,對象內可以添加url(所請求的介面),headers(請求頭信息)等…. . 有了這個方法就好處理了.

         最後在將該方法當做變數賦值給pdf的src.大功告成.

         最後再補充一些 : @loaded=”docLoaded” @page-loaded =”pageLoaded” 這兩個方法為載入預覽文件時的loading事件,

最後引一波示例,

如何創建pdf的buffer,讓pdf.js實現預覽pdf文件

PDF.js 是基於開放的 HTML5 及 JavaScript 技術實現的開源產品。簡單說就是一個 PDF 解析器。運用HTML5JavaScript(即pdf.js僅使用安全的web語言,不包含任何攻擊者可以用的本地代碼塊)的PDF閱讀器pdf.js,直接在標準的HTML頁面上載入和渲染PDF文件, 還可以提高安全性(不需要安裝第三方插件,安全性由瀏覽器保證),瀏覽器所做的安全措施已經為pdf.js提供了安全的運行環境。其對IE和 FireFox瀏覽器的要求是IE9+, FireFox19+。

在線示例: ,

源碼:

官網:

pdf.js VS 傳統瀏覽器讀取pdf

一般來說,PDF檔案格式都是在瀏覽器中由外掛程式來描繪,通常是Adobe自己的PDF reader或來自其他供應商的描繪工具,但這些外掛通常無法充分運用PDF的特點,而且由於含有大量的受信任代碼,使得Google Chrome瀏覽器必須運用SandBox沙箱原理,來檢查PDF描繪工具是否遭到未知病毒感染。

使用adobe,必須在本地安裝軟體才能使用,而pdf.js不依賴環境、渲染速度快(測試過,確實很快)、安全性高。

pdf.js渲染PDF文件

pdf.js渲染PDF文件的流程:Fetch pdf (url / buffer) —— canvas —— 渲染

如果要深入pdf的渲染,需要去研究pdf.js源代碼。pdf.js可通過pdf文件的地址或pdf數據流獲取pdf,具體實現是調用介面函數 PDFJs.getDoc(url/buffer)將pdf載入html,通過canvas處理, 然後渲染pdf文件。網上給出的都是通過url來獲取pdf的例子,而我在做項目的時候,後台(python)要求是發pdf的數據流給前台,前台接收pdf的buffer,然後通過pdf.js來渲染。當然最初嘗試buffer出現了很多問題,具體問題總結如下:

1)如何通過$.ajax接收後台發給前台的buffer數據;

2)如何將buffer傳給pdf.js來處理(這裡我使用了viewer.js, 所以需要考慮的是如何將buffer傳給viewer.js來處理);

3)如何將pdf.js轉換成pdf.js可以接收的buffer格式;

(對應問題解決見代碼注釋)

註:viewer.js是pdf.js的擴展,其將列印、翻頁、縮放等功能進行了實現,且界面非常好看。也就是說如果你引入了viewer.js,pdf的渲染和渲染之後的功能界面都已經幫你實現了,你不用自己去寫界面。

先從官網: 下載代碼,然後使用文件viewer.html , 我的html就是在viewer.html 的基礎上修改的,下面我給出buffer的例子:

!DOCTYPE html

html dir=”ltr” mozdisallowselectionprint moznomarginboxes

head

meta charset=”utf-8″

meta name=”viewport” content=”width=device-width, initial-scale=1, maximum-scale=1″

meta name=”google” content=”notranslate”

title在線預覽/title

{% load static %}{% get_static_prefix as STATIC_URL %}

link href=”{{STATIC_URL}}css/preview.css” rel=”stylesheet” type=”text/css” /

link rel=”stylesheet” href=”{{STATIC_URL}}pdfjs/web/viewer.css”/

script type=”text/javascript” src=”{{STATIC_URL}}pdfjs/web/compatibility.js”/script

link rel=”resource” type=”application/l10n” href=”{{STATIC_URL}}pdfjs/web/locale/locale.properties”/

script type=”text/javascript” src=”{{STATIC_URL}}pdfjs/web/l10n.js”/script

script type=”text/javascript” src=”{{STATIC_URL}}pdfjs/build/pdf.js”/script

script type=”text/javascript” src=”{{STATIC_URL}}pdfjs/web/debugger.js”/script

script src=”{{STATIC_URL}}js/jquery-1.8.3.js” type=”text/javascript”/script

script type=”text/javascript”

//convertDataURIToBinary()

//不知道什麼原因如果後台直接將pdf的數據流發給前台,得到的是亂碼,將數據轉換成 Uint8Array始終不成功

//所以就讓後台將發送之前的數據流做 了base64編碼發給前台,前台再解碼得到的數據就不是亂碼了。

var BASE64_MARKER = ‘;base64,’;

var preFileId = {{mark}};

//viewer.js全局變數,傳入buffer,回答問題2

var DEFAULT_URL

$(document).ready(function(){

$.ajax({

type:”post”,

async: false,

//ajax接收pdf數據流,注意dataType值的設置是否有錯,如果不指定,jQuery將自動根據HTTP包MIME信息返回

//responseXML或responseText . 回答問題1

contentType:”application/pdf;charset=utf-8″,

url:”{% url netPan.File.views.browserFuf%}”,

data:{

id: preFileId

},

success:function(data){

var pdfAsDataUri = data;

//如果引入了viewer.js , 處理方法

var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);

DEFAULT_URL = pdfAsArray;

// 只引入了pdf.js, 未引入viewer.js, 處理方法

// var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);

// PDFJS.getDocument(pdfAsArray).then(); 自己寫pdf的處理函數

}

});

});

function convertDataURIToBinary(dataURI) { //編碼轉換,回答問題3

var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;

var base64 = dataURI.substring(base64Index);

var raw = window.atob(base64);

var rawLength = raw.length;

//轉換成pdf.js能直接解析的Uint8Array類型,見pdf.js-4068

var array = new Uint8Array(new ArrayBuffer(rawLength));

for(i = 0; i rawLength; i++) {

array[i] = raw.charCodeAt(i);

}

return array;

}

/script

!–先設置全局變數DEFAULT_URL 的值,所以要後調入viewer.js —

script type=”text/javascript” src=”{{STATIC_URL}}pdfjs/web/viewer.js”/script

/head

body

省略內容

/body

/html

使用js下載保存pdf文件

pdf.js

是基於開放的

html5

javascript

技術實現的開源產品。簡單說就是一個

pdf

解析器。運用html5javascript(即pdf.js僅使用安全的web語言,不包含任何攻擊者可以用的本地代碼塊)的pdf閱讀器pdf.js,直接在標準的html頁面上載入和渲染pdf…

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/158358.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-19 00:41
下一篇 2024-11-19 00:41

相關推薦

  • 雲智直聘 源碼分析

    本文將會對雲智直聘的源碼進行分析,包括前端頁面和後端代碼,幫助讀者了解其架構、技術實現以及對一些常見的問題進行解決。通過本文的閱讀,讀者將會了解到雲智直聘的特點、優勢以及不足之處,…

    編程 2025-04-29
  • Python讀取中文

    Python是一種高級編程語言,被廣泛地應用於各種領域中。而處理中文數據也是其中重要的一部分。本文將介紹在Python中如何讀取中文,為大家提供指導和幫助。 一、讀取中文文件 在P…

    編程 2025-04-29
  • jQuery Datatable分頁中文

    jQuery Datatable是一個非常流行的數據表插件,它可以幫助您快速地在頁面上創建搜索、過濾、排序和分頁的數據表格。不過,它的默認設置是英文的,今天我們就來探討如何將jQu…

    編程 2025-04-29
  • Python計算中文字元個數

    本文將從多個方面對Python計算中文字元個數進行詳細的闡述,包括字元串長度計算、正則表達式統計和模塊使用方法等內容。 一、字元串長度計算 在Python中,計算字元串長度是非常容…

    編程 2025-04-29
  • Python3亂碼轉中文

    本文將詳細介紹如何轉換Python3中的亂碼為中文字元,幫助Python3開發工程師更好的處理中文字元的問題。 一、Python3中文亂碼的原因 在Python3中,中文字元使用的…

    編程 2025-04-29
  • 金融閱讀器提示配置文件無法識別

    在使用金融閱讀器過程中,有時會遇到提示配置文件無法識別的情況。這種情況通常是由於配置文件中存在錯誤或不完整所導致的。本文將從多個方面對此問題進行詳細的闡述,並提供相應解決方法。 一…

    編程 2025-04-28
  • 從16進位轉義到中文字元

    16進位轉義是為了在不同的字符集、不同的編碼下,能夠保證特殊字元被正確的識別和渲染。本文將從多個方面對16進位轉義做詳細的闡述,讓讀者對其有更深入的了解。 一、轉義實現 在Web開…

    編程 2025-04-28
  • opendistroforelasticsearch-kibana的中文應用

    本文將介紹opendistroforelasticsearch-kibana在中文應用中的使用方法和注意事項。 一、安裝及配置 1、安裝opendistroforelasticse…

    編程 2025-04-28
  • Python網站源碼解析

    本文將從多個方面對Python網站源碼進行詳細解析,包括搭建網站、數據處理、安全性等內容。 一、搭建網站 Python是一種高級編程語言,適用於多種領域。它也可以用於搭建網站。最常…

    編程 2025-04-28
  • 源碼是什麼

    源碼是一段計算機程序的原始代碼,它是程序員所編寫的可讀性高、理解性強的文本。在計算機中,源碼是指編寫的程序代碼,這些代碼按照一定規則排列,被計算機識別並執行。 一、源碼的組成 源碼…

    編程 2025-04-27

發表回復

登錄後才能評論