当前位置: 首页 > 面试题库 >

SVG到PNG服务器端-使用node.js

慕容兴贤
2023-03-14
问题内容

我正在尝试按照本教程将d3.js SVG
Vis转换为PNG服务器端(使用Node.js)http://eng.wealthfront.com/2011/12/converting-
dynamic-svg-to- png-with.html

链接到完整代码: https :
//gist.github.com/1509145

但是,每当尝试请求加载页面时,我都会不断收到此 错误

    /Users/me/Node/node_modules/jsdom/lib/jsdom.js:171
        features   = JSON.parse(JSON.stringify(window.document.implementation._fea
                                                              ^
    TypeError: Cannot read property 'implementation' of undefined
        at exports.env.exports.jsdom.env.processHTML (/Users/dereklo/Node/node_modules/jsdom/lib/jsdom.js:171:59)
        at Object.exports.env.exports.jsdom.env (/Users/dereklo/Node/node_modules/jsdom/lib/jsdom.js:262:5)
        at Server.<anonymous> (/Users/dereklo/Node/Pie/pie_serv.js:26:9)
        at Server.EventEmitter.emit (events.js:91:17)
        at HTTPParser.parser.onIncoming (http.js:1785:12)
        at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:111:23)
        at Socket.socket.ondata (http.

有人知道为什么会这样吗?我已经很好地安装了jsdom模块,所以我真的不知道是什么导致了这些问题。

编辑

这是我用来实现node.js服务器的代码。我的最新一期刊物在此消息下方…

var http = require('http'),
    url = require('url'),
    jsdom = require('jsdom'),
    child_proc = require('child_process'),
    w = 400,
    h = 400,
    __dirname = "Users/dereklo/Node/pie/"

   scripts = ["/Users/dereklo/Node/pie/d3.min.js",
               "/Users/dereklo/Node/pie/d3.layout.min.js",
               "/Users/dereklo/Node/pie/pie.js"],
      //scripts = ["./d3.v2.js",
        //         "./d3.layout.min.js",
          //       "./pie.js"]

    htmlStub = '<!DOCTYPE html><div id="pie" style="width:'+w+'px;height:'+h+'px;"></div>';

http.createServer(function (req, res) {

  res.writeHead(200, {'Content-Type': 'image/png'});
  var convert = child_proc.spawn("convert", ["svg:", "png:-"]),
      values = (url.parse(req.url, true).query['values'] || ".5,.5")
        .split(",")
        .map(function(v){return parseFloat(v)});

  convert.stdout.on('data', function (data) {
    res.write(data);
  });
  convert.on('exit', function(code) {
    res.end();
  });

  jsdom.env({features:{QuerySelector:true}, html:htmlStub, scripts:scripts, done:function(errors, window) {
    var svgsrc = window.insertPie("#pie", w, h, values).innerHTML;

  console.log("svgsrc",svgsrc);

    //jsdom's domToHTML will lowercase element names
    svgsrc = svgsrc.replace(/radialgradient/g,'radialGradient');
    convert.stdin.write(svgsrc);
    convert.stdin.end();
  }});
}).listen(8888, "127.0.0.1");

console.log('Pie SVG server running at http://127.0.0.1:8888/');
console.log('ex. http://127.0.0.1:8888/?values=.4,.3,.2,.1');

最新一期

    events.js:66
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: This socket is closed.
    at Socket._write (net.js:519:19)
    at Socket.write (net.js:511:15)
    at http.createServer.jsdom.env.done (/Users/dereklo/Node/Pie/pie_serv.js:38:19)
    at exports.env.exports.jsdom.env.scriptComplete (/Users/dereklo/Node/node_modules/jsdom/lib/jsdom.js:199:39)

问题答案:

如果您排除“使用node.js”的规定,这可能是对您的问题的有用答案。如果它没有帮助您,也许以后的访客会发现它很有趣。

我已经工作了一段时间解决了同样的问题(服务器端d3栅格化),并且我发现PhantomJS是最好的解决方案。

server.js:

var page = require('webpage').create(),
    renderElement = require('./renderElement.js'),
    Routes = require('./Routes.js'),
    app = new Routes();

page.viewportSize = {width: 1000, height: 1000};
page.open('./d3shell.html');

app.post('/', function(req, res) {
    page.evaluate(new Function(req.post.d3));
    var pic = renderElement(page, '#Viewport');
    res.send(pic);
});

app.listen(8000);

console.log('Listening on port 8000.');

Routes.js:https
://gist.github.com/3061477
renderElement.js:https://gist.github.com/3176500

d3shell.html应该看起来像:

<!DOCTYPE HTML>
<html>
<head>
    <title>Shell</title>
</head>
<body>
    <div id="Viewport" style="display: inline-block"></div>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/d3/2.8.1/d3.v2.min.js" type="text/javascript"></script>
</body>
</html>

然后,您可以使用phantomjs server.jsPOST d3 =
[d3渲染为#Viewport的代码]启动服务器,服务器将以base64编码的png进行响应。

(需要PhantomJS 1.7或更高版本。)



 类似资料:
  • 当使用Apache Batik从SVG转换为PNG时,我有时会出现奇怪的错误。例如,对于这个SVGhttps://www.macstories.net/app/themes/macstories4/images/logo-shape-bw.svg它会抛出一个异常,但对于这个https://upload.wikimedia.org/wikipedia/commons/0/02/SVG_logo.sv

  • 在开发阶段,在页面中嵌入一个 Less.js 将Less在线编译成CSS样式,确实很方便。但是,在线编译会产生加载延迟,即便在浏览器中有不足一秒的加载延迟,也会降低性能。如果Javascrip执行错误,还会引起美观问题。因此,在生产环境中,并不推荐这种方式,而是推荐在服务器端使用Less。 在服务器端使用Less,需要借助于 Less 的编译器,由它将 Less 源文件编译成最终的 CSS 文件。

  • 问题内容: 我有一个网站,该网站使用SVG进行交互式客户端thingamabob。我想提供下载完成输出的PDF的选项。我可以将最终的SVG输出传递回服务器,在这里我要转换为PDF,然后将其返回给客户端进行下载。 这将需要在无头共享linux服务器上工作,在该服务器上安装或编译既费劲又是不可能的。该网站是PHP,因此理想的解决方案是PHP,或使用易于安装在共享Web服务器上的软件。可以使用Pytho

  • 问题内容: 我正在创建一个简单的SOAP Web服务。我要确保它在tomcat Web服务上运行。 我试图用JAX-WS来实现这一点(参见代码) 我的问题是:Endpoint.publish是否使用tomcat服务器来托管该服务器,或者它是小型的glassfish服务器? 我应该扩展UnicastRemoveObject还是类似的东西? 理想情况下,它可以打包成.WAR文件并放在目录中即可正常工作

  • 所有的 我正在尝试连接到Oracle 19C数据库。我安装了两个Oracle客户端(11g和12c),因为我们需要支持遗留程序。我可以通过12c客户端与使用sqlplus的任何用户连接,没有问题。但是如果我与任何用户一起使用11g(11.2.0)客户端。我总是得到: 两个客户端都有完全相同的sqlnet。ora和tnsnames。ora文件,因此两个客户端都指向同一个数据库。 有什么想法吗?我是否

  • 由于 SOFALookout Metrics Server 兼容 Prometheus API,所以 Grafana 集成 Lookout 很简单,只需要选择 Prometheus 作为数据源协议即可 (注意 Lookout Server 的默认查询端口也是: 9090)。 下图展示 Grafana 新增数据源配置: 使用 PromQL 查询展示数据: