首页 > 其他分享 >react项目中预览pdf文件

react项目中预览pdf文件

时间:2023-10-19 11:33:44浏览次数:29  
标签:canvas const 预览 height react pdf pdfjs viewport

最近需求,要在b端展示上传的pdf文件。实现方式有很多,记录一下我们最常用的pdf.js

//安装
"pdfjs-dist": "2.0.402"


//引入
import * as pdfjs from 'pdfjs-dist'
import * as pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry'



// 定义初始值
let pdfDoc = null;

  const [pdfParams, setPdfParams] = useState({     pageNumber: 1, // 当前页     total: 0,// 总页数   });
// 预览pdf文档的地址
let pdfUrl = 'https://c.alisports.com/xxxxx/test.pdf'

// 加载
useEffect(() => {
    loadPdfFile(pdfUrl);
  }, [pdfUrl]);

// 初始化
const loadPdfFile = (pdfUrl) => {
    pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker ;
    let url = pdfUrl ;
    pdfjs.getDocument(url).promise.then(async (doc) => {
      pdfDoc = doc
      getPdfPage(1)
      setPdfParams(s => ({
        ...s,
        total: doc.numPages
      }))
    })
  }

//加载页数
const getPdfPage = (number) => {
    pdfDoc.getPage(number).then(page => {
      const viewport = page.getViewport()
      const canvas = document.getElementById('pdf-render')
      const context = canvas.getContext('2d')
      canvas.width = viewport.viewBox[2]
      canvas.height = viewport.viewBox[3]
      viewport.width = viewport.viewBox[2]
      viewport.height = viewport.viewBox[3]
      canvas.style.width =  viewport.width // viewport.width为pdf文件的实际宽度
      canvas.style.height = viewport.height   // viewport.height为pdf文件的实际高度
  
      let renderContext = {
        canvasContext: context,
        viewport: viewport,
        // 这里transform的六个参数,使用的是transform中的Matrix(矩阵)
        transform: [1, 0, 0, -1, 0, viewport.height] // 默认填这个就好了
      }
      // 进行渲染
      page.render(renderContext)
    })
  }


// dom结构
<canvas id="pdf-render" ></canvas>

 

标签:canvas,const,预览,height,react,pdf,pdfjs,viewport
From: https://www.cnblogs.com/yujiawen/p/17774349.html

相关文章

  • Ant Design中表单验证输入框默认值initialValue不更改值会验证不通过(react)
    AntDesign中表单验证输入框默认值initialValue不更改值会验证不通过(react)更改前<Form.Itemlabel="用户标识"name="id"rules={[{required:true,message:'用户标识不能为空!',},]}......
  • React学习笔记08- 组件的样式
    1.使用行内样式想给虚拟dom添加行内样式,需要使用表达式传入样式对象的方式来实现://注意这里的两个括号,第一个表示我们在要JSX里插入JS了,第二个是对象的括号<pstyle={{color:'red',fontSize:'14px'}}>Helloworld</p>行内样式需要写入一个样式对象,而这个样式对象的位置可......
  • vue2和vue3导出页面为PDF格式:jspdf和html2canvas
    一、vue2导出PDF使用步骤1、安装html2canvas,将页面html转换成图片npminstall--savehtml2canvas卸载:npmuninstallhtml2canvas指定版本安装:[email protected]、安装jspdf,将图片生成pdfnpminstalljspdf--save3、定义全局函数在指......
  • React学习笔记06-函数式组件
    函数式组件即在React中通过函数的方式来声明一个组件importReactfrom"react"functionApp(){return(<div>函数式组件<div>hhh</div></div>)}/*16.8之前//无状态16.8之后reacthooks*/exportdef......
  • React学习笔记07-组件嵌套
    一个项目肯定是由多个组件构成的,组件之前必然会存在相互嵌套的关系在react中如果想要将一个组件嵌入到另外一个组件中只需要在父组件的render函数的返回值中放入子组件即可请看下面代码importReact,{Component}from"react"classNavbarextendsComponent{rende......
  • React学习笔记05-类组件
    ES6的加入让JavaScript直接支持使用class来定义一个类,react创建组件的方式就是使用的类的继承,ES6class是目前官方推荐的使用方式,它使用了ES6标准语法来构建,看以下代码importReactfrom'react'importReactDOMfrom'react-dom'classAppextendsReact.Component{rend......
  • 【Vue3响应式入门#01】Reactivity
    专栏分享:vue2源码专栏,vue3源码专栏,vuerouter源码专栏,玩具项目专栏,硬核......
  • 一篇文章解密如何轻松实现移动应用的电子和手绘PDF签名功能!
    对PDF文件签名是移动设备上越来越普遍的使用需求,本文将描述自动生成/“手绘”签名与如何使用DevExpressOfficeFileAPI组件来实现在.NETMAUI应用程序中快速合并签名/签名支持之间的区别。DevExpressOfficeFileAPI是一个专为C#,VB.NET和ASP.NET等开发人员提供的非可视化......
  • 《机器学习与优化》PDF高质量正版电子书
    下载:https://pan.quark.cn/s/5fb461be1a45......
  • 《Java 8实战》PDF高清高质量电子书
    下载:https://pan.quark.cn/s/c6c7603af158......