当前位置:首页 > 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

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

分享给朋友:

相关文章

react如何实现分页

react如何实现分页

实现分页的基本思路 在React中实现分页通常需要以下几个核心步骤:管理当前页码状态、计算分页数据、渲染分页控件。以下是一个典型的分页实现方法。 管理分页状态 使用React的useState钩子来…

vue router如何实现

vue router如何实现

Vue Router 的实现方法 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是实现 Vue Router 的具体方法: 安装 Vue Router…

react如何实现菜单

react如何实现菜单

使用 React 实现菜单的方法 使用状态管理控制菜单显示/隐藏 通过 useState 管理菜单的展开和收起状态,结合点击事件切换状态。 import { useState } from 'rea…

vue如何实现分业

vue如何实现分业

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

vue如何实现控制

vue如何实现控制

Vue 实现控制的方法 Vue 提供了多种方式来实现对应用的控制,包括数据绑定、条件渲染、循环渲染、事件处理等。以下是几种常见的控制方法: 数据绑定 通过 v-model 指令实现双向数据绑定,可以…

vue 如何实现返回

vue 如何实现返回

Vue 实现返回功能的方法 使用 router.go(-1) 在 Vue 中可以通过 Vue Router 的 go 方法实现返回上一页的功能。在需要触发返回的按钮或方法中调用 this.$route…