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

JavaScript中调用window.print()后如何将生成的PDF上传到数据库

纯JavaScript实现发票PDF生成与上传方案

浏览器原生window.print()接口仅能调用系统打印能力,无法直接捕获输出的PDF文件流,因此需要改用前端生成PDF的方案,复用你已完成的发票样式,生成PDF后直接上传,具体实现步骤如下:

1. 依赖引入(纯前端实现,无需后端支持)

使用业界通用的html2canvas + jsPDF组合实现DOM转PDF,完全兼容你已经开发完成的发票样式,你可以直接下载JS文件到本地引入,无需依赖包管理工具:

<script src="./html2canvas.min.js"></script>
<script src="./jspdf.umd.min.js"></script>

注:如果要求完全不引入第三方库,当前浏览器原生API没有拦截打印流的能力,无法实现自动捕获打印PDF上传的需求。


2. 发票DOM转PDF文件流

示例代码如下,参数可直接复用你已配置的打印规则(纸张大小、边距、分页逻辑等),保证生成的PDF与打印效果完全一致:

async function getInvoicePDFBlob() {
  // 替换为你实际的发票DOM节点ID
  const invoiceDom = document.querySelector('#invoice-wrapper');
  // DOM转画布,保证样式还原度
  const canvas = await html2canvas(invoiceDom, {
    scale: 2, // 提高分辨率避免内容模糊
    useCORS: true, // 发票含外部图片资源时需开启
    logging: false
  });
  // A4纸张参数,可根据你的打印配置修改
  const A4_WIDTH_MM = 210;
  const A4_HEIGHT_MM = 297;
  const imgHeight = (canvas.height * A4_WIDTH_MM) / canvas.width;
  let remainingHeight = imgHeight;
  let position = 0;
  // 初始化PDF实例
  const { jsPDF } = window.jspdf;
  const pdf = new jsPDF('p', 'mm', 'a4');
  // 写入内容,自动处理分页
  pdf.addImage(canvas.toDataURL('image/png'), 'PNG', 0, position, A4_WIDTH_MM, imgHeight);
  remainingHeight -= A4_HEIGHT_MM;
  while (remainingHeight >= 0) {
    position = remainingHeight - imgHeight;
    pdf.addPage();
    pdf.addImage(canvas.toDataURL('image/png'), 'PNG', 0, position, A4_WIDTH_MM, imgHeight);
    remainingHeight -= A4_HEIGHT_MM;
  }
  // 返回PDF Blob流用于上传
  return pdf.output('blob');
}

3. 上传PDF到后端存储到数据库

使用原生Fetch API构造上传请求,无需额外框架:

async function uploadInvoice() {
  try {
    const pdfBlob = await getInvoicePDFBlob();
    const formData = new FormData();
    // 附加PDF文件,文件名可按业务规则自定义(比如绑定订单号、发票号)
    formData.append('invoice_pdf', pdfBlob, `invoice_${new Date().getTime()}.pdf`);
    // 可附加其他业务参数,比如发票ID、所属订单号等
    formData.append('invoice_id', '你的业务唯一标识');
    // 发送请求,替换为你的实际后端接口地址
    const uploadRes = await fetch('/api/invoice/upload', {
      method: 'POST',
      body: formData,
      // 如有身份鉴权需求可补充请求头
      // headers: { 'Authorization': 'Bearer 你的鉴权token' }
    });
    const result = await uploadRes.json();
    if (result.success) {
      console.log('发票PDF上传成功');
      // 上传完成后可按需触发原打印逻辑
      // window.print();
    }
  } catch (err) {
    console.error('发票处理失败:', err);
  }
}

注意事项

  • 生成PDF的配置参数需要和你之前写的打印CSS规则完全对齐,避免出现内容偏移、分页不一致的问题
  • 如果发票包含自定义字体、特殊符号,需要提前在html2canvas配置中引入对应字体,保证样式还原
  • 后端接收到文件流后,可直接以二进制Blob格式存储到数据库,也可存储到对象存储后将访问地址存入数据库,按你的业务需求选择即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:24:03