在使用 React 和 jsPDF 生成 PDF 文件时,如果中文字符出现乱码,通常是因为默认字体不支持中文字符。要解决这个问题,可以按照以下步骤操作:
方法一:使用支持中文的字体
下载支持中文的字体: 可以选择如
Noto Sans CJK
或者Source Han Sans
等字体。转换字体为 Base64 编码: 使用工具将
.ttf
字体文件转换为 Base64。例如,可以使用 ttf2base64 这样的工具。在 jsPDF 中注册该字体并使用它:
下面是一个完整的示例代码:
import { jsPDF } from 'jspdf';
import 'jspdf-autotable'; // 如果你需要用到自动表格功能
// 导入你的 Base64 字体(这是示例,需替换为实际的 base64 数据)
const fontBase64 = 'data:font/truetype;base64,...'; // 替换成你的Base64字符串
const App = () => {
const generatePDF = () => {
const pdf = new jsPDF();
// 添加自定义字体
pdf.addFileToVFS("NotoSansCJK-Regular.ttf", fontBase64);
pdf.addFont("NotoSansCJK-Regular.ttf", "NotoSansCJK", "normal");
// 设置使用自定义字体
pdf.setFont("NotoSansCJK");
// 添加文本
pdf.text("这是我的 ECharts 图表", 10, 10);
// 保存 PDF
pdf.save("example.pdf");
};
return (
<div>
<button onClick={generatePDF}>生成 PDF</button>
</div>
);
};
export default App;
方法二:将图表导出为图片
如果主要是想展示 ECharts 图表,可以考虑将其导出为图片,然后再插入到 PDF 中。这样也能避免乱码的问题。
- 导出 ECharts 为 PNG 图片:
const chartImage = myChart.getDataURL({
type: 'png',
pixelRatio: 2,
backgroundColor: '#fff'
});
- 将图片添加到 PDF 中:
const generatePDFWithImage = () => {
const pdf = new jsPDF();
// 将图像插入到 PDF 中
pdf.addImage(chartImage, 'PNG', 10, 20);
// 添加文本
pdf.setFontSize(12);
pdf.text("这是我的 ECharts 图表", 10, 10);
// 保存 PDF
pdf.save("chart.pdf");
};
小结
- 如果直接在 PDF 中写中文,需要确保使用了支持中文的字体。
- 若只需展示图表,建议将其转为图像,并插入到 PDF,以保持良好的显示效果。
内容由零声教学AI助手提供,问题来源于学员提问