1. 程式人生 > >工作筆記三——使用pdf.js實現pdf檔案的線上預覽

工作筆記三——使用pdf.js實現pdf檔案的線上預覽

最近做移動專案(H5)時遇到一個需求,就是線上預覽pdf檔案。其實本來使用window.open()就可以實現了,但是這個API在IOS上是正常的開啟Safari瀏覽器進行預覽,在安卓上開啟是則是下載預覽,客戶不滿意;而且在將該應用嵌入到釘釘微應用時,這個API在安卓裝置上根本不起效果。於是在網上找到了這個外掛,去官網摘了個例子,並且結合移動端的上下左右滑動滑動翻頁做了個例子,完美解決。以下是詳細程式碼。註釋都在程式碼中。

<html>
<head>
    <meta charset="UTF-8">
    <title>pdf線上預覽</title>
    <script src="js/pdf.js" type="text/javascript"></script>
    <style>
        button {
            display: flex;
            justify-content: center;
            align-items: center;
            background-color: lightseagreen;
            border: 1px solid transparent;
            border-radius: 5px;
            height: 30px;
            width: 70px;
        }

        .header-bar {
            background-color: cornflowerblue;
            height: 5%;
            display: flex;
            justify-content: center;
            align-items: center;
            color: white;
            font-size: 2em;
        }

        .pdf-container {
            background-color: gainsboro;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 95%
        }
        canvas{
            width: 100%;
            height: 100%;
        }
    </style>
</head>
<body>
<div class="header-bar">
    <span>當前第 <span id="page_num"></span> 頁    共<span id="page_count"></span>頁</span>
</div>
<div class="pdf-container">
    <canvas id="the-canvas"></canvas>
</div>

</body>
<script type="text/javascript">
    var url = 'test-js.pdf';

    //  workerSrc的路徑
    PDFJS.workerSrc = 'js/pdf.worker.js';

    var pdfDoc = null,
        pageNum = 1,
        pageRendering = false,
        pageNumPending = null,
        scale = 1,////設定pdf文字顯示區域的縮放級別
        canvas = document.getElementById('the-canvas'),
        ctx = canvas.getContext('2d');

    /**
     * 渲染對應的文件頁碼,並且調整canvas大小,渲染介面
     * @param num 頁碼.
     */
    function renderPage(num) {
        pageRendering = true;
        // 通過promise來獲取
        pdfDoc.getPage(num).then(function (page) {

            var viewport = page.getViewport(scale);
            canvas.height = viewport.height;
            canvas.width = viewport.width;

            //將PDF檔案渲染進canvas中
            var renderContext = {
                canvasContext: ctx,
                viewport: viewport
            };
            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 = num;
    }

    /**
     * 如果有另一個頁面pdf頁正在渲染,那麼先等這個pdf頁渲染完再渲染。否則立即渲染傳進來的頁碼。
     */
    function queueRenderPage(num) {
        if (pageRendering) {
            pageNumPending = num;
        } else {
            renderPage(num);
        }
    }

    /**
     * 上一頁
     */
    function onPrevPage() {
        if (pageNum <= 1) {
            return;
        }
        pageNum--;
        queueRenderPage(pageNum);
    }

    /**
     * 下一頁
     */
    function onNextPage() {
        if (pageNum >= pdfDoc.numPages) {
            return;
        }
        pageNum++;
        queueRenderPage(pageNum);
    }

    /**
     * 非同步的下載pdf檔案
     */
    PDFJS.getDocument(url).then(function (pdfDoc_) {
        pdfDoc = pdfDoc_;
        document.getElementById('page_count').textContent = pdfDoc.numPages;

        // 下載完以後初始化渲染第一頁
        renderPage(pageNum);
    });

    function _touch() {
        var startx;//讓startx在touch事件函式裡是全域性性變數。
        var endx;
        var el = document.getElementsByTagName("body")[0];

        function cons() {   //獨立封裝這個事件可以保證執行順序,從而能夠訪問得到應該訪問的資料。
            var l = Math.abs(startx - endx);
            var h = Math.abs(starty - endy);

            if (l > h) {
                // x事件
                if (startx > endx) {
                    onNextPage();
                } else if (startx < endx) {
                    onPrevPage();
                }

            } else {
                // y事件
                if (starty > endy) {
                    onNextPage();
                } else if (starty < endy) {
                    onPrevPage();
                }
            }

        }

        el.addEventListener('touchstart', function (e) {
            var touch = e.changedTouches;
            startx = touch[0].clientX;
            starty = touch[0].clientY;
        });
        el.addEventListener('touchend', function (e) {
            var touch = e.changedTouches;
            endx = touch[0].clientX;
            endy = touch[0].clientY;
            cons();  //startx endx 的資料收集應該放在touchend事件後執行,而不是放在touchstart事件裡執行,這樣才能訪問到touchstart和touchend這2個事件產生的startx和endx資料。另外startx和endx在_touch事件函式裡是全域性性的,所以在此函式中都可以訪問得到,所以只需要注意事件執行的先後順序即可。
        });
    }

    _touch();
</script>
</html>


demo演示效果:

demo地址:

github上版本的對結構做了一點修改。歡迎star。

相關推薦

vue外掛開發 使用pdf.js實現手機端線上pdf文件

        目前大多數PC瀏覽器支援線上預覽pdf檔案,但大多數手機瀏覽器還未支援,嘗試用手機瀏覽器開啟一個pdf檔案會彈出是否下載的提示框。網上查了一些資料,在實現的過程中,還是走了比較多的彎路,最後採用了倍受推薦的pdf.js外掛來實現(文末附Demo)。     

Wabacus結合PDF.js實現線上文件

首先,我們需要了解一下什麼是線上預覽,能夠實現文件線上預覽的工具有很多,簡單舉一兩個例子: OpenOffice  該工具是實現了真正意義上的文件線上預覽列印,因為它支援Office全部型別,包括圖片在內。在預覽的過程中,需要SWFTools將檔案轉換Adobe Flash檔案

java實現office檔案線上

需要下載的軟體: 基本思路: 通過jodconverte在java程式碼中呼叫OpenOffice把Office檔案轉換為html檔案來實現線上預覽。 demo程式碼: package com.pds.framework.utils; import com.arto

工作筆記——使用pdf.js實現pdf檔案線上

最近做移動專案(H5)時遇到一個需求,就是線上預覽pdf檔案。其實本來使用window.open()就可以實現了,但是這個API在IOS上是正常的開啟Safari瀏覽器進行預覽,在安卓上開啟是則是下載預覽,客戶不滿意;而且在將該應用嵌入到釘釘微應用時,這個API在安卓裝置上根

PDF檔案線上pdf.js

概述 pdf.js在是一個很成熟的技術了,網上也有很多相關的資料。但是都相對比較零散,所以當時我在做的時候還是花了較多的一個時間。本文在這裡主要是對自己當時在處理時候碰到的一些相關問題做一個整理記

通過pdf.js、openoffice實現客戶端線上

宣告:部分程式碼引用自網路部落格,因未收藏部落格,無法找到引用,請作者諒解。 1.環境:windows、linux,openoffice服務 2.思路:進行預覽時,將資料庫檔案存入臨時資料夾,通過openoffice將doc\xls\ppt轉為pdf,返回路徑。將伺服器絕對

txt、doc、xls、ppt、pdf檔案線上

txt、doc、xls、ppt、pdf檔案預覽   實現思路: android通過第三方API對映附件網路地址對附件進行線上預覽。 ios通過iframe對附件設定src進行線上預覽。 document.addEventListener( "plusready", fu

利用OpenOffice、flexpaper、swftools將DOC、JPG檔案PDF再轉成SWF線上

公司需要將文件進行線上預覽,鑑於網上沒一個完整的踩坑流程而且大牛不願寫的情況,鄙人願手操一份方便日後相見(段友可能懂)!完全貼程式碼這種浪費讀者時間的事情,恕小人難做到!windows上的應用網上多多少少也能拼接,我就只記錄一下linux的。所需檔案和原始碼全部打包到了這裡。

js實現視頻本地,一級獲取播放時長

bubuko bject obj gef chan onchange eat 播放 ide <video style="display:none;" controls="controls" id="aa" oncanplaythrough="myFunction(

js實現移動端圖片:手勢縮放, 手勢拖動,雙擊放大...

在屏幕上 turn cit format 基礎上 set 邊距 點擊 點擊事件 前言本文將介紹如何通過js實現移動端圖片預覽,包括圖片的 預覽模式,手勢縮放,手勢拖動,雙擊放大等基本功能;

JS 實現區域性列印和

我們呼叫瀏覽器的列印功能需要window.print();方法,但是會將全部頁面打印出來,如果我們只需要列印部分頁面,這樣最簡單的辦法就是擷取html,保留我們想列印的部分。 <!DOCTYPE html> <html> <head>

JS實現上傳圖片功能

js實現上傳圖片預覽功能思路是獲取上傳圖片本地路徑,再載入到頁面中實現上傳預覽 HTML程式碼 <div class="upload"> <input type="button" class="btn" onclick=

前端js實現圖片上傳

前端js實現圖片上傳 前端js實現圖片上傳的原理是通過input標籤的type=file屬性將input標籤定義為上傳檔案,對input進行onchange事件的監聽,當input的value值改變時代表使用者已經上傳了圖片,而input的value值就是使用者上傳的圖片的相對路徑,new

java SpringMvc 實現檔案線上(openoffice+swftools+flexpaper)

專案需求:伺服器接受的檔案當下只能下載之後才能瀏覽內容,現需要後臺能線上瀏覽到檔案內容,避免繁瑣無用檔案下載操作. 通過幾天網上資料搜尋,目前免費的線上預覽開發技術使用最多還是(openoffice+swftools+flexpape

JS上傳檔案(單張和多張)

Section1單張上傳和預覽:思路:用<input type="file"/> 觸發onchange事件,取出e.target.files || e.target.dataTransfer.files, 將其轉為window.createObjectURL(fi

js實現上傳圖片,購物車加減

js效果(一):上傳的圖片預覽 $("#path").change(function(){ var objUrl = getObjectURL(this.files[0]) ; console.log("objUrl = "+objUrl) ; if (ob

Vim無外掛實現Markdown檔案實時

之前的文章Vim外掛之vim-instant-markdown曾提到Vim實時預覽Markdown檔案的方法,不過這個方法有個小缺點,就是依賴不是很好處理–Node.js和npm在很多發行版(系統)並沒

訪問路徑對映到本地實現圖片的線上

 1.簡介 對於檔案的下載展示一般有兩種方法: 1.直接以流的形式返回給前端,在我之前文章中已經介紹過了下載和線上預覽。 2.把檔案地址對映到本地,把本地地址給前端   2.對映到本地實現 2.1 首先在ssm專案中的common.properties 中

使用openoffice實現文件線上

下載地址:http://www.openoffice.org/zh-cn/download/ 安裝 wget https://jaist.dl.sourceforge.net/project/openofficeorg.mirror/4.1.6/binaries/zh-CN/Apache_OpenOffi

php excel檔案線上(走過的坑)

首先感謝以往分享相關問題的小夥伴,從中收貨很多部分內容也是引用了前人的內容,希望對後來的人有幫助。 1.已經布好的服務如微軟的Office365等平臺服務 例項:http://technet.microsoft.com/zh-cn/library/jj21