导出pdf,自动分页

 要将导出的 PDF 固定为 A4 纸大小并在超出 A4 长度时进行分页,你需要进行一些修改。以下是修改后的代码:

<template>
  <div id="print-content">
    <!-- 内容包括 div、表单和表格 -->
    ...
  </div>
  <el-button type="primary" @click="exportPDF">导出 PDF</el-button>
</template>

<script>
import jsPDF from 'jspdf';
import html2canvas from 'html2canvas';

export default {
  methods: {
    exportPDF() {
      const printContent = document.querySelector('#print-content');
      const filename = 'export.pdf';
      const A4_WIDTH = 210; // A4 纸的宽度(单位:毫米)
      const A4_HEIGHT = 297; // A4 纸的高度(单位:毫米)
      const pdf = new jsPDF('p', 'mm', 'a4'); // 创建 A4 尺寸的 PDF 实例

      const options = {
        background: 'white',
        scale: 2, // 2 表示 Retina 屏幕
        useCORS: true
      };

      let pdfHeight = 0;
      let currentPage = 1;

      function addPage() {
        pdf.addPage();
        currentPage++;
        pdfHeight = 0;
      }

      function generatePDF(canvas) {
        if (pdfHeight + canvas.height &gt; A4_HEIGHT) {
          addPage();
        }

        pdf.addImage(canvas.toDataURL('image/jpeg'), 'JPEG', 0, pdfHeight, A4_WIDTH, 0);
        pdfHeight += canvas.height;
      }

      html2canvas(printContent, options).then(canvas =&gt; {
        generatePDF(canvas);
        const totalHeight = printContent.offsetHeight;
        let scrollHeight = A4_HEIGHT - pdfHeight;

        if (totalHeight &gt; pdfHeight) {
          let page = 2;
          let yOffset = A4_HEIGHT - scrollHeight;

          while (scrollHeight &lt;= totalHeight) {
            printContent.scrollTo(0, yOffset);
            html2canvas(printContent, options).then(canvas =&gt; {
              generatePDF(canvas);
              scrollHeight += A4_HEIGHT;
              yOffset = A4_HEIGHT * page - scrollHeight;
              page++;
            });
          }
        }

        pdf.save(filename);
      });
    }
  }
};
</script>


在修改后的代码中,我们首先定义了 A4 纸的宽度和高度,然后创建了一个 A4 尺寸的 PDF 实例。接着,我们在 generatePDF 函数中判断当前页的高度是否超过 A4 高度,如果超过,则新增一页,并将 pdfHeight 重置为 0。我们使用 addImage 方法将 canvas 添加到 PDF 中,并更新 pdfHeight 的值。然后,我们获取整个打印内容的总高度,并计算出需要滚动的高度 scrollHeight。如果总高度超过当前页面的高度,则继续滚动页面,并使用 html2canvas 生成新的 canvas,并调用 generatePDF 方法将其添加到 PDF 中,直到滚动到超出总高度为止。最后,我们使用 pdf.save 方法保存并下载 PDF 文件。
请注意,由于 html2canvas 在跨域图片的情况下可能会出现问题,以上代码中的 options 使用了 useCORS: true 来解决该问题。如果你的应用中没有涉及跨域图片,可以将 useCORS 设置为 false,即 useCORS: false。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在 React 中生成 PDF 并且自动分页,可以使用第三方库 React-PDF。该库提供了一个 `<Document>` 组件和 `<Page>` 组件,其中 `<Page>` 组件可以自动分页。 要生成表格,可以使用 `<Table>` 组件。以下是一个示例代码: ```jsx import React from 'react'; import { Document, Page, Text, View, StyleSheet, Font, Table, TableRow, TableCell } from '@react-pdf/renderer'; // 定义字体 Font.register({ family: 'Noto Sans', src: 'https://fonts.gstatic.com/s/notosans/v12/o-0IIpQlx3QUlC5A4PNb4j5Ba_2iuOw.ttf', }); const styles = StyleSheet.create({ page: { padding: 20, fontFamily: 'Noto Sans', }, section: { marginBottom: 10, }, table: { width: '100%', borderStyle: 'solid', borderWidth: 1, borderColor: '#000', borderLeftWidth: 0, borderTopWidth: 0, }, tableRow: { flexDirection: 'row', }, tableCell: { width: '33.33%', borderStyle: 'solid', borderWidth: 1, borderColor: '#000', borderRightWidth: 0, borderBottomWidth: 0, }, }); const MyDocument = () => { return ( <Document> <Page style={styles.page}> <View style={styles.section}> <Text>这是第一页</Text> </View> <View style={styles.section}> <Table style={styles.table}> <TableRow style={styles.tableRow}> <TableCell style={styles.tableCell}> <Text>列1</Text> </TableCell> <TableCell style={styles.tableCell}> <Text>列2</Text> </TableCell> <TableCell style={styles.tableCell}> <Text>列3</Text> </TableCell> </TableRow> {/* 生成多行 */} {Array.from(Array(20).keys()).map((index) => ( <TableRow style={styles.tableRow} key={index}> <TableCell style={styles.tableCell}> <Text>{index + 1}</Text> </TableCell> <TableCell style={styles.tableCell}> <Text>内容</Text> </TableCell> <TableCell style={styles.tableCell}> <Text>内容</Text> </TableCell> </TableRow> ))} </Table> </View> {/* 自动分页 */} <View style={styles.section}> <Text>这是第二页</Text> </View> </Page> </Document> ); }; export default MyDocument; ``` 在上面的代码中,我们定义了一个 `<MyDocument>` 组件,其中包含了一个表格。表格使用了 `<Table>`、`<TableRow>`、`<TableCell>` 组件,每个单元格都有一个样式 `styles.tableCell`。我们使用了 `Array.from(Array(20).keys())` 来生成表格的多行,同时也演示了自动分页的效果。 最后,我们将 `<MyDocument>` 组件导出,然后在需要使用的地方引入即可。例如可以使用以下代码将 PDF 文件保存到本地: ```jsx import ReactPDF from '@react-pdf/renderer'; import MyDocument from './MyDocument'; const savePDF = async () => { const pdfBlob = await ReactPDF.renderToBlob(<MyDocument />); saveAs(pdfBlob, 'my-document.pdf'); }; ``` 在上面的代码中,我们使用了 `ReactPDF.renderToBlob()` 方法将 `<MyDocument>` 组件渲染成 PDF 文件,并将其保存到本地。需要注意的是,我们使用了第三方库 FileSaver.js 来实现下载操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SKMA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值