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

不依赖第三方库实现React/JavaScript中JSON转PDF并下载的方案咨询

无第三方库实现JSON转PDF并下载

先排查你现有代码的问题

你之前的代码逻辑完全错误:请求的是返回JSON数据的接口,却设置Content-Type: application/pdf,接口不会返回PDF格式内容,导致下载的是无效文件,自然无法正常工作。

可行方案(无第三方库)

方案1:利用浏览器打印功能转PDF

将JSON格式化后生成纯文本,通过浏览器打印对话框让用户保存为PDF,这是最简便的原生方案:

// 格式化JSON为目标文本格式
function formatJsonToText(jsonData) {
  let text = "Employees\n\n";
  jsonData.employees.forEach(emp => {
    text += `FirstName: ${emp.firstName}  LastName: ${emp.lastName}\n\n`;
  });
  return text;
}

// 你的目标JSON数据
const targetJson = {"employees":[
    {"firstName":"John", "lastName":"Doe"}, 
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
]};

// 生成格式化文本
const formattedContent = formatJsonToText(targetJson);

// 创建隐藏容器存放内容
const printWrapper = document.createElement('div');
printWrapper.style.position = 'fixed';
printWrapper.style.top = '-9999px';
printWrapper.style.left = '-9999px';
printWrapper.style.whiteSpace = 'pre'; // 保留换行与空格
printWrapper.textContent = formattedContent;
document.body.appendChild(printWrapper);

// 触发打印,用户可选择"保存为PDF"
window.print();

// 打印完成后清理容器
document.body.removeChild(printWrapper);

方案2:手动构建简单PDF文件并下载

PDF是二进制格式,需遵循其基础规范。以下代码可生成包含格式化文本的基础PDF文件并直接下载:

// 格式化JSON为目标文本格式
function formatJsonToText(jsonData) {
  let text = "Employees\n\n";
  jsonData.employees.forEach(emp => {
    text += `FirstName: ${emp.firstName}  LastName: ${emp.lastName}\n\n`;
  });
  return text;
}

// 将文本转为符合PDF规范的Blob
function textToPdfBlob(text) {
  // 处理PDF特殊字符转义
  const escapedText = text.replace(/\n/g, '\\n').replace(/\(/g, '\\(').replace(/\)/g, '\\)');
  // 基础PDF结构模板
  const pdfContent = `%PDF-1.4
1 0 obj
<< /Type /Catalog /Pages 2 0 R >>
endobj
2 0 obj
<< /Type /Pages /Kids [3 0 R] /Count 1 >>
endobj
3 0 obj
<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>
endobj
4 0 obj
<< /Length ${escapedText.length + 100} >>
stream
BT
/F1 12 Tf
100 700 Td
(${escapedText}) Tj
ET
endstream
endobj
5 0 obj
<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>
endobj
xref
0 6
0000000000 65535 f 
0000000009 00000 n 
0000000079 00000 n 
0000000173 00000 n 
0000000323 00000 n 
0000000523 00000 n 
trailer
<< /Size 6 /Root 1 0 R >>
startxref
625
%%EOF`;

  return new Blob([pdfContent], { type: 'application/pdf' });
}

// 执行转换与下载
const targetJson = {"employees":[
    {"firstName":"John", "lastName":"Doe"}, 
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
]};

const formattedText = formatJsonToText(targetJson);
const pdfBlob = textToPdfBlob(formattedText);

// 创建下载链接
const downloadUrl = window.URL.createObjectURL(pdfBlob);
const downloadLink = document.createElement('a');
downloadLink.href = downloadUrl;
downloadLink.download = 'employees.pdf';
document.body.appendChild(downloadLink);
downloadLink.click();

// 清理资源
document.body.removeChild(downloadLink);
window.URL.revokeObjectURL(downloadUrl);

注意:方案2的PDF为基础版本,仅支持短文本内容,若需处理长文本分页、复杂格式,建议使用专业PDF库,但符合你"无第三方库"的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:12:23