You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React组件转非图片PDF:打印、下载及邮件附件方案求助

React组件转非图片格式PDF的实现需求与问题

我用MUI5开发React组件,设置了两个按钮分别用于打印和下载PDF报告。React组件的父容器为:

<Box ref={componentRef} id="pdf_vehicle_report_purchase_success">

已实现的打印功能

点击打印PDF按钮时,使用react-to-print库实现,代码如下:

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

// ...

const handlePrint = useReactToPrint({
  content: () => componentRef.current,
  documentTitle: 'PDF Report',
  pageStyle: () => `
        @page { margin: 0mm; }
        @media print {
            ...
            #buttonPdfPrint {
                display: none;
            }
        }
    `
});

该打印功能运行正常,具备以下特性:

  • 通过react-to-print准备并打开打印预览窗口,将React组件渲染为文档
  • 支持打印或下载文档
  • 可应用额外CSS(打印阶段打印图标不可见)
  • 内容以文本形式渲染,而非图片

下载PDF的尝试代码

针对下载按钮,我编写了类似逻辑,通过返回iframe并传入generateAndSavePDF函数,在该函数中为iframe添加额外CSS后尝试处理:

const vehicleReportStyles2 = `
   ...
`;

const downloadPDF = useReactToPrint({
  content: () => componentRef.current,
  documentTitle: 'PDF Report',
  print: async (printIframe) => {
    await generateAndSavePDF(printIframe);
  }
});

const generateAndSavePDF = async (iFrame) => {
  const iframeDocument = iFrame.contentDocument || iFrame.contentWindow.document;

  // 为iframe注入车辆报告的CSS样式
  const styleElement = document.createElement('style');
  styleElement.appendChild(document.createTextNode(vehicleReportStyles2));
  iframeDocument.head.appendChild(styleElement);

  // 等待样式应用
  await new Promise((resolve) => setTimeout(resolve, 100));

  console.log(iframeDocument); // 返回已注入自定义CSS的iframe
};

遇到的问题

尝试了多个库实现下载PDF,但要么将内容转为图片格式,要么完全破坏布局,涉及的库包括:

  • jsPDF
  • html2canvas
  • react-to-pdf
  • react-pdf
  • @react-pdf/renderer

需求与期望解决方案

需要实现以下功能:

  • 将React组件转为非图片格式的PDF
  • 保留打印预览功能(当前已实现,若有更优方案也可采纳)
  • 支持直接下载生成的PDF
  • 能够将PDF存储为变量或存入React.useState,用于后续作为邮件附件

内容的提问来源于stack exchange,提问作者programming_ritual

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:41:20