当前位置:首页 > React

react如何实现下载页面成pdf

2026-01-26 08:42:06React

使用html2canvas和jsPDF库

安装依赖库html2canvas和jsPDF:

npm install html2canvas jspdf

创建一个React组件并实现下载功能:

import React from 'react';
import html2canvas from 'html2canvas';
import { jsPDF } from 'jspdf';

const DownloadPDF = () => {
  const downloadPDF = () => {
    const input = document.getElementById('content-to-export');

    html2canvas(input).then((canvas) => {
      const imgData = canvas.toDataURL('image/png');
      const pdf = new jsPDF('p', 'mm', 'a4');
      const imgProps = pdf.getImageProperties(imgData);
      const pdfWidth = pdf.internal.pageSize.getWidth();
      const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width;

      pdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight);
      pdf.save('download.pdf');
    });
  };

  return (
    <div>
      <div id="content-to-export">
        {/* 这里放需要导出为PDF的内容 */}
        <h1>PDF导出示例</h1>
        <p>这是将被导出为PDF的内容</p>
      </div>
      <button onClick={downloadPDF}>下载PDF</button>
    </div>
  );
};

export default DownloadPDF;

使用react-pdf库

安装react-pdf库:

npm install @react-pdf/renderer

创建PDF文档组件:

import React from 'react';
import { Document, Page, Text, View, StyleSheet } from '@react-pdf/renderer';

const MyDocument = () => (
  <Document>
    <Page size="A4" style={styles.page}>
      <View style={styles.section}>
        <Text>PDF文档标题</Text>
        <Text>这是使用react-pdf生成的PDF内容</Text>
      </View>
    </Page>
  </Document>
);

const styles = StyleSheet.create({
  page: {
    padding: 30
  },
  section: {
    margin: 10
  }
});

export default MyDocument;

实现下载功能:

import React from 'react';
import { PDFDownloadLink } from '@react-pdf/renderer';
import MyDocument from './MyDocument';

const DownloadButton = () => (
  <PDFDownloadLink document={<MyDocument />} fileName="document.pdf">
    {({ loading }) => (loading ? '加载中...' : '下载PDF')}
  </PDFDownloadLink>
);

export default DownloadButton;

使用浏览器打印功能

通过CSS媒体查询优化打印样式:

@media print {
  body * {
    visibility: hidden;
  }
  #printable-area, #printable-area * {
    visibility: visible;
  }
  #printable-area {
    position: absolute;
    left: 0;
    top: 0;
  }
}

在React组件中触发打印:

const PrintComponent = () => {
  const handlePrint = () => {
    window.print();
  };

  return (
    <div>
      <div id="printable-area">
        {/* 可打印内容 */}
        <h1>可打印内容</h1>
      </div>
      <button onClick={handlePrint}>打印/保存为PDF</button>
    </div>
  );
};

注意事项

确保要导出的内容完全加载后再触发PDF生成,特别是包含异步数据或图片时

对于复杂布局,可能需要调整html2canvas的配置参数以获得更好的渲染效果

考虑添加加载状态指示器,因为PDF生成可能需要一些时间

react如何实现下载页面成pdf

测试不同浏览器的兼容性,某些功能可能在特定浏览器中表现不同

分享给朋友:

相关文章

vue如何实现递归

vue如何实现递归

递归组件的实现方法 在Vue中实现递归组件通常用于渲染树形结构或嵌套数据。核心思路是组件在其模板中调用自身,但需注意终止条件以避免无限循环。 定义递归组件 组件需设置name选项,才能在模板中调用自…

java如何实现多继承

java如何实现多继承

在Java中,由于语言设计本身不支持多继承(即一个类不能直接继承多个父类),但可以通过以下方式间接实现类似多继承的效果: 使用接口实现多继承 接口允许一个类实现多个接口,从而继承多个抽象行为。接口中…

vue如何实现分业

vue如何实现分业

Vue 实现分页的方法 在 Vue 中实现分页功能通常需要结合后端接口或前端数据处理。以下是几种常见的实现方式: 使用第三方分页组件 许多 UI 库提供了现成的分页组件,例如 Element UI…

vue如何实现webssh

vue如何实现webssh

使用Vue实现WebSSH WebSSH的实现需要结合前端Vue和后端服务,通常通过WebSocket协议与服务器进行实时通信。以下是具体实现方法: 安装必要依赖 在Vue项目中安装xterm.js…

vue如何实现全屏

vue如何实现全屏

实现全屏的基本方法 在Vue中实现全屏功能可以通过浏览器提供的Fullscreen API完成。以下是一个基础实现示例: // 进入全屏 function enterFullscreen(eleme…

vue 如何实现多选

vue 如何实现多选

Vue 实现多选的几种方法 使用 v-model 绑定数组 在 Vue 中,可以通过 v-model 绑定一个数组来实现多选功能。当用户勾选多个选项时,选中的值会自动添加到数组中。 <temp…