使用phantom.js和node.js计划PDF生成

时间:2016-03-15 00:54:01

标签: javascript node.js performance pdf phantomjs

我是node.js和phantom.js的新手,所以我不确定如何更好地利用它们比我在下面所做的更好。

我有100多所学校的着装价格表,可以从相应的学校页面下载为PDF格式。我们所做的是生成PDF并在一夜之间上传到服务器。

现在我们想要使用node.js和phantom.js批量生成PDF并尽可能地自动化该过程。

下面的链接不是价格表页面,而是用于测试PDF的示例网址。

```

var schedule = require('node-schedule'),
    path = require('path'),
    childProcess = require('child_process'),
    phantomjs = require('phantomjs'),
    binPath = phantomjs.path,
    childArgs = [
        // phantomjs rasterize.js http://codefight.org codefight.pdf
        path.join(__dirname, 'rasterize.js'),
            'http://codefight.org/',
            'codefight.pdf',
            '400*300'
        ]

// add all the URLs and name of PDF here
var pdfSources = [
            ['codefight.pdf', 'http://codefight.org/'],
            ['dltr.pdf', 'http://dltr.org/']
        ];

// schedule generating PDFs
// running every minute for now to test
var j = schedule.scheduleJob('* * * * *', function(){

  // loop through the pdfSources and generate new PDFs
  pdfSources.forEach(function(item, index){

    // update childArgs
    childArgs[1] = item[1]; // pdf content source url
    childArgs[2] = item[0]; // pdf filename

    childProcess.execFile(binPath, childArgs, function(err, stdout, stderr) {
        // for some reason childArgs[2] always prints last item of pdfSources
        // not sure how to make it work :(
        console.log('New PDF - "' + childArgs[2] + '" generated!');
        console.log(err + stdout + stderr);
    });
  });
});

```

1。我想知道为什么console.log('New PDF - "' + childArgs[2] + '" generated!');始终打印相同的输出。即“新PDF - ”dltr.pdf“生成!”

2。有没有更好的方法来实现与node.js&相同的事情。 phantom.js和你想建议的任何改进?

谢谢!

1 个答案:

答案 0 :(得分:1)

答案1.由于execFile的异步性质,输出相同。基本上在forEach循环中,您将值分配给childArgs[2]并调用execFile但是它的回调被放入队列然后在第二个循环中覆盖childArgs[2]并调用execFile再次。现在是回调运行的时间,但事情是childArgs[2]具有您为其分配的最后一个值。解决方法可能是将execFile放入一个像bellow

这样的闭包中
(function(cArgs){

      childProcess.execFile(binPath, cArgs, function(err, stdout, stderr) { 
          console.log('New PDF - "' + cArgs[2] + '" generated!');       
          console.log(err + stdout + stderr); 
      });

})(childArgs);

我对问题2没有任何补充。