pdf.js插件使用記錄,在線打開pdf

pdf.js插件使用記錄,在線打開pdf
原文:pdf.js插件使用記錄,在線打開pdf

天記錄一個js庫:pdf.js。主要是實現在線打開pdf功能。因為項目需求需要能在線查看pdf文檔,所以就研究了一下這個控件。

有些人很好奇,在線打開pdf文檔瀏覽器不是支持嗎。是的你說的都是現代瀏覽器,例如谷歌,360,edg等。

但是很不幸的是我們這個項目是要使用我們最喜歡(很煩)的瀏覽器IE。所有要想使IE能夠在線讀取pdf,我就知道兩種辦法第一種下載Acrobat Reader插件,第二就是使用js庫了。

介紹pdf.js

pdf.js是一個開源的js庫。

官網:http://mozilla.github.io/pdf.js/?

源碼地址:https://github.com/mozilla/pdf.js

下載并解壓

我們在http://mozilla.github.io/pdf.js/getting_started/#download選中版本后下載后解壓會生成兩個文件夾:

這兩個文件夾核心文件就是build文件下的js文件,web文件是官方給寫好的封裝示例,你你可選擇使用或者不使用。

├── LICENSE
├── build/
│   ├── pdf.js                             - 顯示層
│   └── pdf.worker.js                      - 核心層
└── web/├── cmaps/                             - 字符映射(由核心要求)├── compressed.tracemonkey-pldi-09.pdf - 測試 pdf├── debugger.js                        - 有幫助的PDF調試功能├── images/                            - 觀看者和注釋圖標的圖像├── l10n.js                            - 漢化├── locale/                            - 翻譯文件├── viewer.css                         - viewer 頁面樣式├── viewer.html                        - viewer 頁面└── viewer.js                          - viewer js

?使用:

使用pdf.js有兩種方式:

  • 第一種使用官方給寫好的示例,簡單來說就是上面提到的下載下來的web文件夾。
  • 第二種就是自己調用API自己寫方法實現,相對于第一種如果自己要的效果不是很多還是自己寫。也不是很復雜很容易實現。官方給的代碼太多修改維護太麻煩。

使用官方示例:

使用官方示例其實就是使用pdfjs已經寫好的viewer.html頁面,例子:http://mozilla.github.io/pdf.js/web/viewer.html 做的功能比較全面。

簡單的來說一下吧,很多人可能下載之后直接打開會報錯,其實那是因為出現了兩個問題:第一個是沒有文件,第二個是知道寫文件但是存在跨域。就會產生如下錯誤:

出現這個問題其實也沒事,只要我們引用到項目后就不會出現了。然后是我們在使用的地方打開這個頁面并且加上文件即可:

  window.location.href = "../../Content/js/PDFShow/padjs/web/viewer.html?file=pdfTest.pdf";

效果展示:

?自己實現分頁版:

我們自己實現的話就不需要web文件夾下的東西。你就可以刪除了。

自己定義實現說起來也是很簡單的,官方上已經給了很多代碼示例了。廢話我就不說了。我就上一下我的代碼吧。

首先引入pdf.js文件到頁面:

    <script src="~/Content/js/PDFShow/padjs/build/pdf.js"></script>

引入pdf.js之后:

 //引入pdf.js之后var url = '../pdfTest.pdf';PDFJS.workerSrc = '../../Content/js/PDFShow/padjs/build/pdf.worker.js';//定義變量var pdfDoc = null,pageNum = 1,pageRendering = false,pageNumPending = null,scale = 1,canvas = document.getElementById('the-canvas'),ctx = canvas.getContext('2d');function renderPage(num) {pageRendering = true;pdfDoc.getPage(num).then(function (page) {//設置頁面大小var viewport = page.getViewport(1);console.log(viewport.width);var desiredWidth = "1000";var scale = desiredWidth / viewport.width;var scaledViewport = page.getViewport(scale);//var viewport = page.getViewport(scale);canvas.height = scaledViewport.height;canvas.width = scaledViewport.width;//設置背景顏色(無效)canvas.style.backgroundColor = "red";//進行文件讀取加載var renderContext = {canvasContext: ctx,viewport: scaledViewport};var renderTask = page.render(renderContext);renderTask.promise.then(function () {pageRendering = false;if (pageNumPending !== null) {// New page rendering is pending
                        renderPage(pageNumPending);pageNumPending = null;}});});//顯示總頁數document.getElementById('page_num').textContent = pageNum;}//翻頁方法function queueRenderPage(num) {if (pageRendering) {pageNumPending = num;} else {renderPage(num);}}function onPrevPage() {if (pageNum <= 1) {return;}pageNum--;queueRenderPage(pageNum);}//上一頁監聽document.getElementById('prev').addEventListener('click', onPrevPage);function onNextPage() {if (pageNum >= pdfDoc.numPages) {return;}pageNum++;queueRenderPage(pageNum);}//下一頁監聽document.getElementById('next').addEventListener('click', onNextPage);PDFJS.getDocument(url).then(function (pdfDoc_) {pdfDoc = pdfDoc_;document.getElementById('page_count').textContent = pdfDoc.numPages;renderPage(pageNum);});
View Code

相應html代碼:

<body style="background:#404040"><div><button id="prev">上一頁</button><button id="next">下一頁</button><span>Page: <span id="page_num"></span> / <span id="page_count"></span></span></div><div style="width:100%;height:100%;background:#404040"><div style=" width:1000px;margin: 0 auto;"><canvas id="the-canvas"></canvas></div></div>
</body>

效果展示:

?自己實現不分頁版:

雖然分頁很好用,但是確不一定使用所有的場景,比如我就是想一次性打開所有頁面然后滾動查看跟讀word似的,怎么辦,有辦法,當然是實現不分頁嘍,哈哈。

分頁好理解啊:根據頁數讀取然后把讀取的內容放到畫布上就好了,既然我們明白分頁的原理,那么我們稍稍改造一下就是不分頁了嗎。

不分頁:我們全部讀出來放到頁面不就好了嗎,簡單來說是這個樣,但是具體思路是=》我們先獲取到所有頁數,然后遍歷的把每一頁像分頁一下放到畫布上展示,然后在遍歷相同數量畫布來對應每頁的內容,最后展現出來。

好了大致的思路已經明白了下面就是擼代碼:

還是不要忘記引用js文件:

 <script src="~/Content/js/PDFShow/padjs/build/pdf.js"></script>

頁面布局就可以這樣子了:

   <div style="width:100%;height:100%;background:#404040"><div id="pdf-container" style=" width:1000px;margin: 0 auto;"></div></div>

然后初始化控件吧:

  <script>//引入pdf.js之后//
        var url = '../pdfTest.pdf';PDFJS.workerSrc = '../../Content/js/PDFShow/padjs/build/pdf.worker.js';window.onload = function () {//創建canvas方法
            function createPdfContainer(id, className) {var pdfContainer = document.getElementById('pdf-container');var canvasNew = document.createElement('canvas');canvasNew.id = id;canvasNew.className = className;pdfContainer.appendChild(canvasNew);};//渲染pdf
            function renderPDF(pdf, i, id) {pdf.getPage(i).then(function (page) {//默認設置文檔的顯示大小var scale = 1.5;var viewport = page.getViewport(scale);////  準備用于渲染的 canvas 元素//
var canvas = document.getElementById(id);var context = canvas.getContext('2d');canvas.height = viewport.height;canvas.width = viewport.width;//// 將 PDF 頁面渲染到 canvas 上下文中//
                    var renderContext = {canvasContext: context,viewport: viewport};page.render(renderContext);});};//創建和pdf頁數等同的canvas數
            function createSeriesCanvas(num, template) {var id = '';for (var j = 1; j <= num; j++) {id = template + j;createPdfContainer(id, 'pdfClass');}}//讀取pdf文件,并加載到頁面中
            function loadPDF(fileURL) {PDFJS.getDocument(fileURL).then(function (pdf) {//用 promise 獲取頁面var id = '';var idTemplate = 'cw-pdf-';var pageNum = pdf.numPages;//根據頁碼創建畫布
                    createSeriesCanvas(pageNum, idTemplate);//將pdf渲染到畫布上去for (var i = 1; i <= pageNum; i++) {id = idTemplate + i;renderPDF(pdf, i, id);}});}//啟動loadPDF('../pdfTest.pdf');};</script>
View Code

最后上一下效果展示截圖:

?

posted on 2018-09-20 08:27 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/9678722.html

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

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

相關文章

程序員 sql面試_非程序員SQL使用指南

程序員 sql面試Today, the word of the moment is DATA, this little combination of 4 letters is transforming how all companies and their employees work, but most people don’t really know how data behaves or how to access it and they also think that this is j…

Apache+Tomcat集群負載均衡的兩種session處理方式

session共享有兩種方式&#xff1a; 1、session共享&#xff0c;多個服務器session拷貝保存&#xff0c;一臺宕機不會影響用戶的登錄狀態&#xff1b; 2、請求精確集中定位&#xff0c;即當前用戶的請求都集中定位到一臺服務器中&#xff0c;這樣單臺服務器保存了用戶的sessi…

SmartSVN:File has inconsistent newlines

用SmartSVN提交文件的時候&#xff0c;提示svn: File has inconsistent newlines 這是由于要提交的文件編碼時混合了windows和unix符號導致的。 解決方案 SmartSVN設置做如下修改可以解決問題&#xff1a; Project–>Setting選擇Working copy下的EOL-style將Default EOL-sty…

我要認真學Git了 - Config

有一天&#xff0c;當我像往常一樣打開SourceTree提交代碼&#xff0c;然后推送的時候&#xff0c;我突然意識到我只是根據肌肉記憶完成這個過程&#xff0c;我壓根不知道這其中到底發生了什么。這是個很嚴重的問題&#xff0c;作為一個技術人員&#xff0c;居然只滿足于使用工…

計算機科學與技術科研論文,計算機科學與技術學院2007年度科研論文一覽表

1Qiang Sun,Xianwen Zeng, Raihan Ur Rasool, Zongwu Ke, Niansheng Chen. The Capacity of Wireless Ad Hoc Networks with Power Control. IWCLD 2007. (EI收錄: 083511480101)2Hong jia ping. The Application of the AES in the Bootloader of AVR Microcontroller. In: DC…

r a/b 測試_R中的A / B測試

r a/b 測試什么是A / B測試&#xff1f; (What is A/B Testing?) A/B testing is a method used to test whether the response rate is different for two variants of the same feature. For instance, you may want to test whether a specific change to your website lik…

一臺機器同時運行兩個Tomcat

如果不加任何修改&#xff0c;在一臺服務器上同時運行兩個Tomcat服務顯然會發生端口沖突。假設現在已經按照正常的方式安裝配置好了第一個Tomcat,第二個如何設置呢&#xff1f;以下是使用Tomcat5.5解壓版本所做的實驗。 解決辦法&#xff1a; 1.解壓Tomcat到一個新的目錄&#…

PHP獲取IP地址的方法,防止偽造IP地址注入攻擊

PHP獲取IP地址的方法,防止偽造IP地址注入攻擊 原文:PHP獲取IP地址的方法,防止偽造IP地址注入攻擊PHP獲取IP地址的方法 /*** 獲取客戶端IP地址* <br />來源&#xff1a;ThinkPHP* <br />"X-FORWARDED-FOR" 是代理服務器通過 HTTP Headers 提供的客戶端IP。…

工作10年厭倦寫代碼_厭倦了數據質量討論?

工作10年厭倦寫代碼I have been in tons of meetings where data and results of any sort of analysis have been presented. And most meetings have one thing in common, data quality is being challenged and most of the meeting time is used for discussing potential…

Java基礎回顧

內容&#xff1a; 1、Java中的數據類型 2、引用類型的使用 3、IO流及讀寫文件 4、對象的內存圖 5、this的作用及本質 6、匿名對象 1、Java中的數據類型 Java中的數據類型有如下兩種&#xff1a; 基本數據類型: 4類8種 byte(1) boolean(1) short(2) char(2) int(4) float(4) l…

oracle數據庫 日志滿了

1、 數據庫不能啟動SQL> startupORACLE 例程已經啟動。Total System Global Area 289406976 bytesFixed Size 1248576 bytesVariable Size 83886784 bytesDatabase Buffers 197132288 bytesRedo Buffers 7139328 byt…

計算機應用基礎學生自查報告,計算機應用基礎(專科).docx

1.在資源管理器中&#xff0c;如果要選擇連續多個文件或文件夾&#xff0c;需要單擊第一個文件或文件夾&#xff0c;按下鍵盤()&#xff0c;再用鼠標單擊最后一個文件或文件夾即可。(A)Shift(B)Tab(C)Alt(D)Ctrl分值&#xff1a;2完全正確?得分&#xff1a;2?2.下列數據能被E…

Random隨機數

Random 隨機數 1 產生隨機數 1.1 Random的使用步驟 我們想產生1-100(包含1和100)的隨機數該怎么辦&#xff1f;我們不需要自己寫算法&#xff0c;因為額Java已經為我們提供好了產生隨機數的類---Random 作用&#xff1a;用于產生一個隨機數 使用步驟(和Scanner類似)&#xff1a…

模擬一個簡單計算器_閱讀模擬器的簡單介紹

模擬一個簡單計算器Read simulators are widely being used within the research community to create synthetic and mock datasets for analysis. In this article, I will introduce some recently proposed, commonly used read simulators.閱讀模擬器在研究社區中被廣泛使…

計算機部分應用顯示模糊,win10系統打開部分軟件字體總顯示模糊的解決方法-電腦自學網...

win10系統打開部分軟件字體總顯示模糊的解決方法。方法一&#xff1a;win10軟件字體模糊1、首先&#xff0c;在Win10的桌面點擊鼠標右鍵&#xff0c;選擇“顯示設置”。2、在“顯示設置”的界面下方&#xff0c;點擊“高級顯示設置”。3、在“高級顯示設置”的界面中&#xff0…

Tomcat調節

Tomcat默認可以使用的內存為128MB&#xff0c;在較大型的應用項目中&#xff0c;這點內存是不夠的&#xff0c;需要調大,并且Tomcat本身不能直接在計算機上運行&#xff0c;需要依賴于硬件基礎之上的操作系統和一個java虛擬機。 AD&#xff1a; 這里向大家描述一下如何使用Tom…

假如不工作了,你還有源源不斷的收入嗎?

擁有金山跟銀礦&#xff0c;其實不值得羨慕。俗話說&#xff1a;授人以魚不如授人以漁。與其選擇萬貫家財&#xff0c;倒不如選擇一個會持續冒出錢的杯子。很多人害怕上班的收入不確定&#xff0c;上班族急于尋找雙薪&#xff0c;下班之后還要辛勤工作&#xff0c;以為這樣就可…

turtle 20秒畫完小豬佩奇“社會人”

轉載&#xff1a;https://blog.csdn.net/csdnsevenn/article/details/80650456 圖片源自網絡 作者 丁彥軍 如需轉載&#xff0c;請聯系原作者授權。 今年社交平臺上最火的帶貨女王是誰&#xff1f;范冰冰&#xff1f;楊冪&#xff1f;Angelababy&#xff1f;不&#xff0c;是豬…

最佳子集aic選擇_AutoML的起源:最佳子集選擇

最佳子集aic選擇As there is a lot of buzz about AutoML, I decided to write about the original AutoML; step-wise regression and best subset selection. Then I decided to ignore step-wise regression because it is bad and should probably stop being taught. That…

Java虛擬機內存溢出

最近在看周志明的《深入理解Java虛擬機》&#xff0c;雖然剛剛開始看&#xff0c;但是覺得還是一本不錯的書。對于和我一樣對于JVM了解不深&#xff0c;有志進一步了解的人算是一本不錯的書。注明&#xff1a;不是書托&#xff0c;同樣是華章出的書&#xff0c;質量要比《深入剖…