当前位置:首页 > 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文档组件:

react如何实现下载页面成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组件中触发打印:

react如何实现下载页面成pdf

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

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

注意事项

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

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

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

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

分享给朋友:

相关文章

vue如何实现mvvm

vue如何实现mvvm

Vue 实现 MVVM 的核心机制 Vue 的 MVVM(Model-View-ViewModel)实现依赖于数据绑定和响应式系统,通过以下核心机制完成: 数据劫持(响应式系统) Vue 使用 Ob…

vue如何实现注册

vue如何实现注册

Vue 注册功能实现步骤 注册功能通常涉及前端表单、数据验证、与后端API交互等环节。以下是基于Vue 3和Element Plus的典型实现方式: 表单设计与数据绑定 使用Vue的v-model实…

vue如何实现放大缩小

vue如何实现放大缩小

Vue 实现放大缩小功能 在 Vue 中实现放大缩小功能可以通过多种方式实现,以下介绍几种常见的方法: 使用 CSS transform 缩放 通过绑定 CSS 的 transform: scal…

vue如何实现曲线图

vue如何实现曲线图

使用 ECharts 实现曲线图 在 Vue 项目中安装 ECharts 依赖: npm install echarts --save 引入 ECharts 并创建基础图表组件: <te…

h5如何实现vr效果

h5如何实现vr效果

使用WebXR API实现VR效果 WebXR是浏览器中实现VR/AR的核心API,支持设备姿态追踪、渲染交互等功能。需在支持WebXR的设备(如Oculus、HTC Vive)或浏览器模拟环境中运行…

vue如何实现

vue如何实现

Vue 实现方法 Vue 提供了多种方式来实现功能,具体取决于需求。以下是一些常见场景的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。在组件中可以通过 pro…