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

如何在Node-React应用中利用md-to-pdf返回的PDF十进制数据创建下载?

解决前端从后端Buffer数据生成可下载PDF的问题

问题根源

后端返回的是包含Buffer类型数据的对象,但前端直接将整个对象传入Blob构造函数,导致生成的文件并非有效的PDF二进制数据:

  • 下载PDF时,文件内容错误,阅读器提示“failed to load the document”
  • 改为.md后缀时,对象被默认转为字符串[object object],因此打开后显示该内容

解决步骤

1. 确保前端拿到正确的二进制数据

如果后端通过接口返回数据,请求时必须设置responseType为arraybuffer,确保获取到的是原始二进制数据而非JSON对象:

// 示例:用fetch请求后端接口
fetch('/api/generate-pdf', {
  method: 'POST',
  body: JSON.stringify({ markdown: '你的Markdown内容' }),
  headers: { 'Content-Type': 'application/json' },
  responseType: 'arraybuffer' // 关键配置
})
.then(res => res.arrayBuffer())
.then(pdfBuffer => startDownload(pdfBuffer));

2. 修改下载函数,正确生成Blob

创建Blob时必须指定MIME类型为application/pdf,确保浏览器识别文件格式:

function startDownload(pdfBuffer) {
  const element = document.createElement('a');
  // 传入二进制数据并指定PDF的MIME类型
  const blob = new Blob([pdfBuffer], { type: 'application/pdf' });
  element.href = URL.createObjectURL(blob);
  element.download = 'userTable.pdf';
  element.click();
  // 释放URL对象,避免内存泄漏
  URL.revokeObjectURL(element.href);
}

特殊情况:后端返回十进制数组形式的Buffer

如果后端返回的是包含十进制数组的JSON对象(如{ pdfData: [255, 216, ...] }),需要先将数组转为Uint8Array再创建Blob:

function startDownload(responseObj) {
  // 将十进制数组转为Uint8Array
  const uint8Array = new Uint8Array(responseObj.pdfData);
  const blob = new Blob([uint8Array], { type: 'application/pdf' });
  
  const element = document.createElement('a');
  element.href = URL.createObjectURL(blob);
  element.download = 'userTable.pdf';
  element.click();
  URL.revokeObjectURL(element.href);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:06:41