pdfjs 基础使用教程(三)上

第三个基础教程主要讲分页  上半部分讲自定义分页

        随着我们pdfjs的学习 我们已经学会了pdfjs展示自己的pdf文件,那么如果一个pdf文件非常大的话怎么办,比如1百乃至几百m。因为pdfjs默认是全部pdf一次渲染。那么非常大的pdf会导致本地下载时间非常长,本地渲染时间非常长,用户长时间处于空白页面,造成非常差的用户体验。那么我们解决的方法就是分页。

        分页基础理论就是用户进入页面我们可以先返回1~2页数据,顺便渲染1~2页数据,那么用户就能看到页面,其他的页面呢,一种是可以后台慢慢渲染,还有一种就是用户请求到那一页我们给他渲染到那一页。 

        我们pdfjs的理论是什么,我们创建和pdf页面数相等的canvas数目,然后渲染pdf第一页,因为pdf文件有可能很大所以我们最好后端单页pdf流或者单页base64返回,然后呢当用户向下滚动的时候当滚动到一定距离的时候(或者其他方式 我自己写的一种方式)我这里面写了个大概像html 两个div之间的padding 后端返回单个页并没有涉及,只是前端描述了一下思想,代码如下

        

<!DOCTYPE html>
<html>
    <head>
        <title>自定义渲染pdf页demo</title>
    </head>
    <body>
        <div>
            <canvas width="612" height="792" class="canvas"></canvas>
        </div>
        <div>
            <canvas width="612" height="792" class="canvas"></canvas>
        </div>
        <div>
            <canvas width="612" height="792" class="canvas"></canvas>
        </div>

        <script src="https://mozilla.github.io/pdf.js/build/pdf.js"></script>
        <script>
            //html页面滚动方法
            var scrollFunc = function (e) { 
                e = e || window.event; 
                if (e.wheelDelta) { //第一步:先判断浏览器IE,谷歌滑轮事件    
                if (e.wheelDelta > 0) { //当滑轮向上滚动时 
                console.log("滑轮向上滚动"); 
                } 
                if (e.wheelDelta < 0) { //当滑轮向下滚动时 
                    // 592是一页792的多半,意思就是当前一页滚动多半的时候渲染下一页面,
                    if(window.scrollY >= 592){
                        rend(2, document.getElementsByClassName('canvas').item(1))
                    }
                    if(window.scrollY >= 592 * 2){
                        rend(3, document.getElementsByClassName('canvas').item(2))
                    }
                    console.info(window.scrollY);

                } 
                } else if (e.detail) { //Firefox滑轮事件 
                if (e.detail> 0) { //当滑轮向上滚动时 
                console.log("滑轮向上滚动"); 
                } 
                if (e.detail< 0) { //当滑轮向下滚动时 
                    console.info(window.scrollY);
                } 
                } 
            }
            window.onmousewheel = document.onmousewheel = scrollFunc;


            var pdfjsLib = window['pdfjs-dist/build/pdf'];

            var pdfurl = 'https://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf';
            var pdfData = atob(
                'JVBERi0xLjcKCjEgMCBvYmogICUgZW50cnkgcG9pbnQKPDwKICAvVHlwZSAvQ2F0YWxvZwog' +
                'IC9QYWdlcyAyIDAgUgo+PgplbmRvYmoKCjIgMCBvYmoKPDwKICAvVHlwZSAvUGFnZXMKICAv' +
                'TWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCiAgL0NvdW50IDEKICAvS2lkcyBbIDMgMCBSIF0K' +
                'Pj4KZW5kb2JqCgozIDAgb2JqCjw8CiAgL1R5cGUgL1BhZ2UKICAvUGFyZW50IDIgMCBSCiAg' +
                'L1Jlc291cmNlcyA8PAogICAgL0ZvbnQgPDwKICAgICAgL0YxIDQgMCBSIAogICAgPj4KICA+' +
                'PgogIC9Db250ZW50cyA1IDAgUgo+PgplbmRvYmoKCjQgMCBvYmoKPDwKICAvVHlwZSAvRm9u' +
                'dAogIC9TdWJ0eXBlIC9UeXBlMQogIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KPj4KZW5kb2Jq' +
                'Cgo1IDAgb2JqICAlIHBhZ2UgY29udGVudAo8PAogIC9MZW5ndGggNDQKPj4Kc3RyZWFtCkJU' +
                'CjcwIDUwIFRECi9GMSAxMiBUZgooSGVsbG8sIHdvcmxkISkgVGoKRVQKZW5kc3RyZWFtCmVu' +
                'ZG9iagoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDEwIDAwMDAwIG4g' +
                'CjAwMDAwMDAwNzkgMDAwMDAgbiAKMDAwMDAwMDE3MyAwMDAwMCBuIAowMDAwMDAwMzAxIDAw' +
                'MDAwIG4gCjAwMDAwMDAzODAgMDAwMDAgbiAKdHJhaWxlcgo8PAogIC9TaXplIDYKICAvUm9v' +
                'dCAxIDAgUgo+PgpzdGFydHhyZWYKNDkyCiUlRU9G');
            pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://mozilla.github.io/pdf.js/build/pdf.worker.js';
            
            //异步下载pdf 加载base64pdf
            // var loadingTask = pdfjsLib.getDocument({data: pdfData});

            // 异步下载pdf加载pdfurl
            var loadingTask = pdfjsLib.getDocument(pdfurl);

            function rend(pageNumber, canvas){
                //加载pdf
                loadingTask.promise.then(function(pdf) {
                                console.log('PDF loaded');
                
                                
                                //这里面来调用getPage方法获取对应的页面
                                pdf.getPage(pageNumber).then(function(page) {
                                    //这个是倍数
                                    var scale = 1;
                                    //这个是展示的倍数viewer.html的倍数就是改的这个东西
                                    var viewport = page.getViewport({scale: scale});
                                    
                                    //这里面获得一个画笔
                                    var context = canvas.getContext('2d');
                                    //这里面定义canvas的宽高
                                    canvas.height = viewport.height;
                                    canvas.width = viewport.width;

                                    
                                    var renderContext = {
                                    canvasContext: context,
                                    viewport: viewport
                                    };
                                    //真正的渲染
                                    var renderTask = page.render(renderContext);
                                    renderTask.promise.then(function () {
                                        console.log('渲染完毕');
                                    });
                                });
                            }, function(reason){
                                //pdf加载错误 原因有很多 比如文件错误这种的话属于不可解决问题  比如pdf有密码 这种就可以在这里处理
                                console.log('loading error')
                                //pdfjs 自己编辑的错误码        
                                console.error(reason);
                            })
            }
            //渲染第一页
            rend(1, document.getElementsByClassName('canvas').item(0))
        </script>
    </body>
</html>

如果后面需要的话我做一个简版的前后端结合的

利用viewer.html做分页将在使用教程(三)下讲述

基础交流群 799827663 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PDF.js是一个用于在Web上呈现PDF文档的JavaScript库。你可以使用pdfjs-dist来引入并使用该库。下面是一些基本的使用步骤: 1. 首先,下载pdfjs-dist库。你可以从PDF.js的官方GitHub仓库中获取最新版本的库文件:https://github.com/mozilla/pdf.js/releases 2. 解压缩下载的文件,你将会看到一个名为`pdfjs-dist`的文件夹。 3. 将`pdfjs-dist`文件夹中的`build`文件夹复制到你的项目中。 4. 在你的HTML文件中引入`pdf.js`和`pdf.worker.js`这两个脚本文件。你可以使用以下代码片段: ```html <script src="path/to/pdf.js"></script> <script src="path/to/pdf.worker.js"></script> ``` 请确保将`path/to/`替换为实际的文件路径。 5. 创建一个用于呈现PDF文档的容器元素。例如,你可以在HTML中添加一个带有id属性的div元素: ```html <div id="pdfContainer"></div> ``` 6. 使用JavaScript代码加载并呈现PDF文档。你可以使用以下代码示例: ```javascript // 获取用于呈现PDF的容器元素 const container = document.getElementById('pdfContainer'); // 使用PDF.js加载PDF文档 PDFJS.getDocument('path/to/pdf/document.pdf').promise.then(pdf => { // 获取第一页 pdf.getPage(1).then(page => { // 创建一个canvas元素来显示页面内容 const canvas = document.createElement('canvas'); container.appendChild(canvas); // 设置canvas的尺寸 const viewport = page.getViewport({ scale: 1 }); canvas.width = viewport.width; canvas.height = viewport.height; // 将页面呈现到canvas上 const renderContext = { canvasContext: canvas.getContext('2d'), viewport: viewport }; page.render(renderContext); }); }); ``` 确保将`path/to/pdf/document.pdf`替换为实际的PDF文档路径。 这只是一个简单的示例,你可以根据自己的需求进行进一步的定制和扩展。你可以在PDF.js的官方文档中找到更多关于使用pdfjs-dist的信息:https://mozilla.github.io/pdf.js/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值