在react中使用react-pdf-js 和 pdfjs-dist的区别和如何使用。以及分页和不分页是怎么处理的

1、首先讲下怎么使用react-pdf-js,以及需要注意的地方

// 引入
import ReactPdf from 'react-pdf-js'
下面如果你想要分页显示的话 https://www.jianshu.com/p/3edb2c1b5ae6 // 看这个就可以了,但是你如果想一页展示的话就需要做下面的操作了
<ReactPdf
  file={pdffile} // 这个地方是你的pdf文件或者是一个地址(推荐使用文件)
  onDocumentComplete={this.onDocumentComplete} // 这个是当pdf文件解析完成之后的回调函数,会返回给你一个pdf的总页数
  page={this.state.page} // 在state中保存的page,这个值可以手动写:1就代表第一页 2就代表第二页...,
/>

// 当pdf文件解析完成之后可以在state中设置page和pages,代表第几页和总页数
onDocumentComplete = (pages) => {
    this.setState({ page: 1, pages })
}
那么我们可以看到 他是支持一页一页展示的,但是如果你想一整页显示出来怎么办。那么我们就需要在render里遍历pages循环生成
1、首先在外层初始化加载一个,用来获取总页数,默认展示第一页。
<ReactPdf
    file={pdfUrl}
    onDocumentComplete={this.onDocumentComplete}
    page={1}
  />
2、获取到pages之后循环生成。另外注意的是index是从0开始,page需要从1开始,所以需要加1,因为上面已经加载过一次page=1的了所以我们就不需要再展示了。
另外要注意如果file传的不是下载好的文件,而是url 的话,会循环请求。解决办法就是先下载下来。不然会非常影响性能。如果请
求时长较短的可以
{
    this.state.pages ? new Array(this.state.pages).fill('').map((item, index) => {
        return index + 1 !== 1 ? (
            <ReactPdf
              file={pdfUrl}
             page={index + 1}
        />
    ) : ''
    }) : ''
}

ps:样式什么的就需要自己调了。

2、如何在react中使用pdfjs-dist

// 下载和引入
npm install pdfjs-dist --save
import 'pdfjs-dist'

// 使用方法
getPdfData = () => {
 let pdfUrl = 'xxx.pdf' || url //同样是pdf文件或者是一个地址
 let PDFJS = window.PDFJS // 引入后window中会有这个方法 可以在控制台打印下window看到
// 下面就是解析文件或者url
PDFJS.getDocument(pdfUrl).then((pdfDoc_)
=> {
  let pdfDoc
= pdfDoc_
  // 因为不想要分页所以循环生成canvas
for (let i = 1; i <= pdfDoc.numPages; i++) {
    // 因为不知道把pdf解析了多少页,所以我们需要循环创建canvas并且一定要不同的id
    let canvas
= document.createElement('canvas')
    canvas.id
= `pdf${i}`
    let ctx
= canvas.getContext('2d')
    // 通过getPage的方法获取到每一页的内容渲染,结束后把当前创建的canvas添加到页面中
    pdfDoc.getPage(i).then((page)
=> {
      let viewport
= page.getViewport(1)
      let desiredWidth
= '1238'
      let scale
= desiredWidth / viewport.width
      let scaledViewport
= page.getViewport(scale)
      canvas.height
= scaledViewport.height
      canvas.width
= scaledViewport.width
      
// 进行文件读取加载
      let renderContext = { canvasContext: ctx, viewport: scaledViewport, }
      page.render(renderContext) })
      // 获取到页面定义好的父元素,把生成的canvas添加进去
      document.getElementById(
'pdfList').appendChild(canvas)
   }
}).
catch(() => { message.error('pdf加载失败') }) }

如果哪里不对,或者有什么改进的地方 欢迎大家指出来

posted @ 2020-09-03 10:40  C丶c  阅读(5387)  评论(0编辑  收藏  举报