当前位置:首页 > React

react如何实现直接打印pdf

2026-01-25 07:46:33React

使用 react-to-print 库实现 PDF 打印

安装 react-to-print 库:

npm install react-to-print

创建一个可打印的组件:

import React from 'react';
import { useReactToPrint } from 'react-to-print';

class PrintableComponent extends React.Component {
  render() {
    return (
      <div>
        <h1>可打印内容</h1>
        <p>这里是要打印的内容</p>
      </div>
    );
  }
}

const PrintComponent = () => {
  const componentRef = React.useRef();
  const handlePrint = useReactToPrint({
    content: () => componentRef.current,
  });

  return (
    <div>
      <PrintableComponent ref={componentRef} />
      <button onClick={handlePrint}>打印</button>
    </div>
  );
};

export default PrintComponent;

使用 window.print() 方法

创建一个打印按钮并绑定 window.print():

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

  return <button onClick={handlePrint}>打印页面</button>;
};

添加打印样式到 CSS 文件:

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

使用 html2canvas 和 jsPDF 生成 PDF

安装所需库:

npm install html2canvas jspdf

实现代码:

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

const PDFGenerator = () => {
  const printRef = React.useRef();

  const handleDownloadPdf = async () => {
    const element = printRef.current;
    const canvas = await html2canvas(element);
    const data = canvas.toDataURL('image/png');

    const pdf = new jsPDF();
    const imgProperties = pdf.getImageProperties(data);
    const pdfWidth = pdf.internal.pageSize.getWidth();
    const pdfHeight = (imgProperties.height * pdfWidth) / imgProperties.width;

    pdf.addImage(data, 'PNG', 0, 0, pdfWidth, pdfHeight);
    pdf.save('print.pdf');
  };

  return (
    <div>
      <div ref={printRef}>
        <h1>要转换为PDF的内容</h1>
        <p>这里是详细内容</p>
      </div>
      <button onClick={handleDownloadPdf}>下载PDF</button>
    </div>
  );
};

export default PDFGenerator;

使用 @react-pdf/renderer 生成 PDF 文档

安装库:

npm install @react-pdf/renderer

创建 PDF 文档组件:

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

const styles = StyleSheet.create({
  page: {
    flexDirection: 'row',
    backgroundColor: '#E4E4E4'
  },
  section: {
    margin: 10,
    padding: 10,
    flexGrow: 1
  }
});

const MyDocument = () => (
  <Document>
    <Page size="A4" style={styles.page}>
      <View style={styles.section}>
        <Text>Section #1</Text>
      </View>
      <View style={styles.section}>
        <Text>Section #2</Text>
      </View>
    </Page>
  </Document>
);

const PDFExport = () => (
  <div>
    <PDFDownloadLink document={<MyDocument />} fileName="somename.pdf">
      {({ loading }) => (loading ? 'Loading document...' : 'Download now!')}
    </PDFDownloadLink>
  </div>
);

export default PDFExport;

注意事项

确保打印内容在渲染时完全加载,避免打印空白页或部分内容

对于复杂布局,可能需要调整 CSS 打印样式以确保正确显示

某些浏览器可能需要用户手动允许弹出窗口进行打印操作

react如何实现直接打印pdf

考虑添加加载状态,特别是在生成大型 PDF 文件时

分享给朋友:

相关文章

如何实现vue表格联动

如何实现vue表格联动

实现Vue表格联动的方法 使用Vue的响应式数据和计算属性 通过Vue的响应式数据特性,可以轻松实现表格之间的联动。定义一个共享的数据源,并在多个表格组件中使用这个数据源。利用计算属性对数据进行处理,…

vue如何实现排序

vue如何实现排序

实现数组排序 在Vue中实现数组排序可以通过computed属性或methods来处理。假设有一个数组items,可以创建一个计算属性返回排序后的数组: data() { return {…

vue如何实现滤镜

vue如何实现滤镜

Vue 实现滤镜的方法 在 Vue 中实现滤镜效果可以通过多种方式,以下是常见的几种方法: 使用 CSS filter 属性 通过 CSS 的 filter 属性可以直接为元素添加滤镜效果。在 Vu…

vue如何实现select

vue如何实现select

Vue 实现 Select 组件的方法 在 Vue 中实现 Select 组件可以通过原生 HTML <select> 元素或使用第三方 UI 库(如 Element UI、Ant Des…

react如何实现keepalive

react如何实现keepalive

React 实现 KeepAlive 的方法 React 本身没有内置的 KeepAlive 组件,但可以通过以下方式模拟类似功能,实现组件状态保持或避免重复渲染。 使用 CSS 隐藏组件 通过 C…

vue如何实现刷新

vue如何实现刷新

实现页面刷新的方法 在Vue中实现刷新功能可以通过以下几种方式实现: 使用location.reload() 直接调用浏览器的原生方法强制刷新整个页面: methods: { refr…