pdf在线阅读 html js,PDF.js实现在线展示pdf文件

背景

现在很多项目开发过程中都会碰到PDF在线预览的需求,对于PC端浏览器,一般直接提供PDF文件,iframe一下就可以直接预览。但在移动端要预览PDF则较为麻烦,有些浏览器检测到文件流,就会直接下载,无法实现预览功能。

PDFJS就是解决这一问题比较好用的一款插件。

PDF.js

PDF.js是一个使用HTML5构建的可移植文档格式库。

官网给出的使用方法是将PDF.js下载到项目静态资源目录中,在html文件中引入pdf.js去使用,但这样会导致最后项目编译打包后的资源包比较大。

pdfjs-dist这一node库这好可以解决我们的问题。pdfjs-dist是pdf.js源代码的预构建版本,我们直接在项目中引入该库即可使用,接下来我们介绍如何使用。

需要预览的PDF一般是后台接口返回的base64编码数据或者是本地上传获取到文件,接下来我们在vue工程上实现本地上传PDF文件,获取文件的base64编码,利用pdf.js实现预览效果。

基于Vue工程实现PDF在线预览

1、安装pdfjs-dist依赖

npm install pdfjs-dist

2、初始化PDF,核心代码

previewPDF() {

// 引入pdf.js的字体

let CMAP_URL = 'https://unpkg.com/pdfjs-dist@2.0.943/cmaps/'

//读取base64的pdf流文件

let loadingTask = pdfJS.getDocument({

data: this.pdfData, // PDF base64编码

cMapUrl: CMAP_URL,

cMapPacked: true

})

loadingTask.promise.then((pdf) => {

this.loadFinished = true

let numPages = pdf.numPages

let pageNumber = 1

this.getPage(pdf, pageNumber, numPages)

})

},

getPage(pdf, pageNumber, numPages) {

let _this = this

pdf.getPage(pageNumber)

.then((page) => {

// 获取DOM中为预览PDF准备好的canvasDOM对象

let canvas = this.$refs.myCanvas

let viewport = page.getViewport(_this.scale)

canvas.height = viewport.height

canvas.width = viewport.width

let ctx = canvas.getContext('2d')

let renderContext = {

canvasContext: ctx,

viewport: viewport

}

page.render(renderContext).then(() => {

pageNumber += 1

if (pageNumber <= numPages) {

_this.getPage(pdf, pageNumber, numPages)

}

})

})

}

3、效果

f6da4449c4e2

vue-pdfjs-demo.png

4、注意点

当PDF文件中有中文的情况下,在引用pdfjs过程中可能会出现中文不显示问题,在console中会报下面的错误,

Warning: The CMap "baseUrl" parameter must be specified, ensure that the "cMapUrl" and "cMapPacked" API parameters are provided.

主要原因是有pdf不支持的字体格式,可以通过引入pdf.js的字体来解决该问题。

// 引入pdf.js的字体

let CMAP_URL = 'https://unpkg.com/pdfjs-dist@2.0.943/cmaps/'

//读取base64的pdf流文件

let loadingTask = pdfJS.getDocument({

data: this.pdfData, // PDF base64编码

cMapUrl: CMAP_URL,

cMapPacked: true

})

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值