vue+better-scroll+pdfjs-dist实现pdf文件预览放大缩小翻页功能

前些天,公司的一个移动端项目中,有个这样的需求,点击按钮,请求后台获取PDF地址,实现PDF预览,需要放大缩小翻页功能。因为之前没做过,在百度谷歌乱搜一通,有用标签iframe、embed、object的,也有用PDFObject的,还有用PDF.js的。前者用标签的方法我一一试过,没成功,特别是结合vue开发。后者经过尝试,我优先用了在PDF.js的基础上做了一点点改动封装。当然,网上也有些类似的封装,类似于vueshowpdf、vue-pdf。

DEMO源码上传至github:https://github.com/xiao0502/vue-to-pdf

准备工作:

    1.    npm install pdfjs-dist -S // => 安装pdfjs-dist依赖
    2.    npm install better-scroll -S // => 安装better-scroll依赖
    3.    初始化PDF
          => 3.1 利用require引入,别用Import
            let pdfJS = require('pdfjs-dist').PDFJS; 
          => 3.2 把pdfJS的的workerSrc指向pdf.worker.js
            pdfJS.workerSrc = require('pdfjs-dist/build/pdf.worker.min');
          => 3.3 获取DOM中为预览PDF准备好的canvasDOM对象
            var canvas = document.getElementById('the-canvas');
          => 3.4  初始化pdf文件渲染
            let vm = this;
            pdfJS.getDocument(this.url).then(function getPdfHelloWorld(pdf) {
                pdf.getPage(num).then(function getPageHelloWorld(page) {
                    if (vm.initFlag) {
                        vm.scale = document.body.getBoundingClientRect().width / page.view[2];
                        vm.minScale = vm.scale;
                    }
                    vm.initFlag = false;
                    var viewport = page.getViewport(vm.scale);
                    var context = canvas.getContext('2d');
                    canvas.height = viewport.height;
                    canvas.width = viewport.width;
                    var renderContext = {
                        canvasContext: context,
                        viewport: viewport
                    };
                    page.render(renderContext);
                    document.querySelector('.scroll-content-info').style.width = document.querySelector('#the-canvas').getBoundingClientRect().width + 'px';
                    vm.$refs.scroll.refresh();
                    vm.isLoading = false;
                });
            });
           => 3.5 设置PDF总页数
            pdfJS.getDocument(this.url).then(function (pdfDoc_) { //初始化pdf
                vm.pdfDoc = pdfDoc_;
                vm.pageTotal = vm.pdfDoc.numPages;
            }).catch(function (err) {
                if (err) {
                    console.log(err)
                    vm.throwerr(vm.pdfurl)
                }
            })
            => 3.6 上述变量解释
              this.url // => 从后台获取的pdf urldi地址
              num // => 渲染PDF的当前页
              initFlag // => 判断PDF渲染是否是第一次,因为第一次的时候要计算PDF的缩放,刚好满足手机屏幕的最大宽度,即一屏显示完整
              minScale // => PDF的最小缩放值(正常为1,这里最小为计算出来的一屏显示)
              scale // => 缩放值
              document.querySelector('.scroll-content-info').style.width = document.querySelector('#the-canvas').getBoundingClientRect().width + 'px';
              vm.$refs.scroll.refresh();
              上述两行是设置better-scroll 横向滚动的宽度和重新计算滚动宽高度
              对better-scroll不太了解的同学可以顺便学习下,个人接触到的做移动端滚动
              结合vue项目做开发最好的插件,地址:https://ustbhuangyi.github.io/better-scroll/doc/zh-hans/#better-scroll 是什么

    4.      放大缩小翻页功能,只需要改变上述变量的scale值和num值,然后重新初始
            化就行,这里有个坑,因为是对同一个canvas操作,当canvas还没有渲染完成的候,
            快速点击放大缩小或者翻页再次对同一canvas操作的话,就会报错。我这里的处理办法
            是实现放大缩小翻页功能的时候,删除原来的canvas,重新渲染到新的canvas上面
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • 感赏今天中午儿子冒着大太阳去市场帮我买来香菜,让我免去奔波的幸苦我知道外面很热,你在外面也打了一上午的球,本来就晒...
    爱娃林丽华aw阅读 204评论 0 2
  • 今天晚上你再一次打电话给我,但是这一次,我在洗澡,是妈妈拿的电话。我只能冷淡的回应,再像一个对待一个骚扰电话一样,...
    bevil阅读 199评论 0 1