React 将页面导出为pdf

安装依赖包

npm i --save html2canvas
npm i --save jspdf

使用 

一个ref也可以,我这里是多个元素导出多个页面 

  const ref1 = useRef<HTMLDivElement>(null);
  const ref2 = useRef<HTMLDivElement>(null);
  const refs = [ref1, ref2];
  const handleExportPdf = async () => {
    // 根据dpi放大,防止图片模糊
    const scale = window.devicePixelRatio > 1 ? window.devicePixelRatio : 2;
    // 下载尺寸 a4 纸 比例
    const pdf = new jsPDF('p', 'pt', 'a4')
    for(let i in refs){
      const toPdfRef = refs[i];
      let width = toPdfRef.current.offsetWidth;
      let height = toPdfRef.current.offsetHeight;
  
      const canvas = document.createElement('canvas');
      canvas.width = width * scale;
      canvas.height = height * scale;
      const pdfCanvas = await html2canvas(toPdfRef.current, {
        useCORS: true,
        canvas,
        scale,
        width,
        height,
        x: 0,
        y: 0,
      });
      const imgDataUrl = pdfCanvas.toDataURL();

      if(height > 14400){ // 超出jspdf高度限制时
        const ratio = 14400 / height;
        height = 14400;
        width = width * ratio;
      }

      // 缩放为 a4 大小  pdfpdf.internal.pageSize 获取当前pdf设定的宽高
      height = height * pdf.internal.pageSize.getWidth() / width;
      width = pdf.internal.pageSize.getWidth();
  
      // pdf.addImage(pageData, 'JPEG', 左,上,宽度,高度)设置
      pdf.addImage(imgDataUrl, 'png', 0, 0, width, height)

      // 若当前是最后一张截图,则不再另起一页,直接退出循环
      if(+i >= refs.length - 1){
        break;
      }

      // 另起一页
      pdf.addPage();
    }

    // 导出下载 
    await pdf.save("pdf名", { returnPromise: true });
  }

React生成PDF可以使用一些第三方库来实现。一个常用的库是`react-pdf`,它提供了一个简单的API来创建和渲染PDF文档。 首先,你需要安装 `react-pdf` 库。你可以使用npm或者yarn命令来安装: ``` npm install @react-pdf/renderer ``` 或者 ``` yarn add @react-pdf/renderer ``` 安装完成后,你可以在React组件中使用`react-pdf`来生成PDF。下面是一个简单的示例: ```jsx import React from 'react'; import { PDFViewer, Document, Page, Text } from '@react-pdf/renderer'; const MyDocument = () => ( <Document> <Page> <Text>Hello World</Text> </Page> </Document> ); const App = () => ( <PDFViewer> <MyDocument /> </PDFViewer> ); export default App; ``` 在上面的示例中,我们定义了一个名为`MyDocument`的组件,它包含一个页面和一段文本。然后,我们将`MyDocument`组件包裹在`PDFViewer`组件中,这样就可以在浏览器中显示PDF。 当你需要导出PDF文件时,你可以使用`react-pdf`提供的`PDFDownloadLink`组件。下面是一个示例: ```jsx import { PDFDownloadLink } from '@react-pdf/renderer'; const App = () => ( <div> <PDFDownloadLink document={<MyDocument />} fileName="document.pdf"> {({ blob, url, loading, error }) => loading ? '正在生成PDF...' : '下载PDF' } </PDFDownloadLink> </div> ); export default App; ``` 在上面的示例中,我们使用`PDFDownloadLink`组件来提供一个下载链接。你可以通过`document`属性传递一个PDF文档组件,通过`fileName`属性设置下载文件的名称。 这只是一个简单的示例,你可以根据自己的需求来定制生成PDF内容和样式。你可以在`react-pdf`的文档中找到更多的API和使用示例。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值