Node.js用D3 6.5.0绘制饼图报错d3.entries is not a function 及SVG转PDF方案咨询
问题1:d3.entries is not a function报错解决
原因:d3从v5版本开始就移除了d3.entries方法,你使用的6.5.0版本已经不存在这个API,该功能已经被原生JS的Object.entries替代。
原来的d3.entries(data)会返回结构为[{key: 'MacOS', value: 29}, ...]的数组,而原生Object.entries(data)返回的是[['MacOS', 29], ...]的二元数组,你只需要对报错行代码做如下修改即可:
把
var data_ready = pie(d3.entries(data));
替换为:
var data_ready = pie(Object.entries(data).map(([key, value]) => ({key, value})));
修改后即可正常生成饼图数据。
问题2:Node.js中生成SVG并插入PDF的方案
你当前依赖中已经安装了pdfkit和d3-node,可以直接用以下两种方案实现:
方案1:基于现有代码改造
你当前代码已经可以输出SVG字符串,直接将生成的SVG字符串传入pdfkit即可插入PDF,示例代码如下:
const PDFDocument = require('pdfkit'); const fs = require('fs'); // 原有生成svg的代码不变,拿到svg字符串 const svgStr = body.html(); // 生成PDF const doc = new PDFDocument(); doc.pipe(fs.createWriteStream('output.pdf')); // 插入SVG,可自定义x、y坐标和宽高 doc.svg(svgStr, { x: 50, y: 50, width: 400, height: 400 }); doc.end();
方案2:使用d3-node简化流程
d3-node已经封装了Node.js环境下的DOM模拟,不需要自己手动初始化JSDOM,生成SVG的流程更简洁,适合服务端生成图表的场景。
内容的提问来源于stack exchange,提问作者Subham Subhasis Patra
相关产品推荐
相关产品推荐

