工作笔记三——使用pdf.js实现pdf文件的在线预览

博客更新地址啦~,欢迎访问:https://jerryyuanj.github.io/

 

最近做移动项目(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: https://github.com/JerryYuanJ/demos/tree/master/01-pdf-online-viewer

csdn:http://download.csdn.net/download/qq_25324335/10192172 

github上版本的对结构做了一点修改。欢迎star。

 

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 《FPGA自学笔记——设计与验证》是一本关于FPGA设计和验证的入门教材。本书以VHDL和Verilog两种HDL语言为主要工具,通过实例讲解FPGA的基本概念、设计流程和验证方法。同时,本书还通过实例演示了如何使用Xilinx ISE和ModelSim这两个主流软件工具进行FPGA设计和验证。 本书的内容分为五个部分,分别是FPGA基础知识、FPGA设计流程、FPGA验证方法、FPGA性能优化以及FPGA应用实例。其中,FPGA基础知识部分介绍了FPGA的基本构成、组成部件以及通用数字电路设计知识;FPGA设计流程部分从设计输入、RTL设计、布局布线、实现生成等方面详细介绍了FPGA设计流程;FPGA验证方法部分主要介绍了功能验证和时序验证这两个方面的知识;FPGA性能优化部分介绍了FPGA的几种性能指标以及如何通过一定的优化方法提高FPGA性能;FPGA应用实例部分通过几个实例演示了如何应用FPGA进行数字电路设计。 本书的难度适中,适合初学者学习和参考,同时也可以作为FPGA初学者的参考书籍。本书涉及的知识点较为全面,可以为初学者提供一个全面的FPGA设计和验证入门指南。其内容易于理解,实例讲解深入浅出,对于想要学习FPGA设计和验证的人群来说是一本很好的参考书。 ### 回答2: 《FPGA自学笔记——设计与验证》PDF是一本很好的自学FPGA的书籍。这本书包含了FPGA基本概念、设计流程、Verilog HDL语言、开发工具、测试方法等多个主题,非常详尽地介绍了FPGA的基本知识和开发技巧。读这本书可以帮助我们更好地理解FPGA的原理和功能,从而更加熟练地掌握FPGA的设计和验证。 此外,这本书还提供了很多实例来帮助我们更好地理解FPGA的设计和验证。这些实例包含多种应用场景,例如数字逻辑、时序控制、通信等,能够帮助我们从不同角度学习FPGA的相关知识。而且,这本书还提供了实验指导,通过做实验来让我们更深入地理解FPGA的各种知识和技能。 总之,这本书《FPGA自学笔记——设计与验证》PDF是一本非常好的FPGA自学指南,通过阅读这本书,我们可以掌握FPGA基本知识和开发技能,更好地应用FPGA进行各种应用开发。我相信,读完这本书,你一定能够对FPGA有更深刻的认识,并且能够灵活运用FPGA进行各种应用开发。 ### 回答3: 《FPGA自学笔记——设计与验证》是一本以FPGA为研究对象的书籍。它详细介绍了FPGA的诸多特性和应用。该书主要分为两部分,第一部分介绍了FPGA的基本概念,并讲解了Verilog的语法和使用方法。第二部分是实践性较强的部分,通过编写案例代码进行实际操作。 该书着重强调了FPGA设计流程,通过案例演示了FPGA设计的全过程。该书还提供了大量的练习题和案例代码,读者可以通过反复练习和实际操作,逐渐掌握FPGA的设计和验证技能。 总体来说,《FPGA自学笔记——设计与验证》是一本非常实用的FPGA入门教材。它从基础知识入手,循序渐进地讲解了FPGA的各个方面。并且,该书重点讲解了如何运用Verilog语言进行FPGA设计,这对FPGA初学者来说是一个非常实用的指南。 如果你对FPGA领域感兴趣,且希望通过自学来掌握FPGA的基本操作和设计方法,那么《FPGA自学笔记——设计与验证》是一本非常值得推荐的书籍。  

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值