【问题标题】:Accessing end event in PDFCrowd's saveToFile Method in Node在节点的 PDFCrowd 的 saveToFile 方法中访问结束事件
【发布时间】:2015-07-06 20:49:38
【问题描述】:

我正在使用 Node 并尝试通过访问 saveToFile 方法中的 end 事件来了解我的 PDF 何时创建。我想出了以下内容,但这实际上并没有做任何事情——没有生成 PDF:-

return new Promise(function(resolve, reject) {
client.convertHtml(html, {
            pdf: function(rstream) {
                rstream.on('end', function() {
                    pdf.saveToFile(path);
                    resolve();
                });
            }
        }, a4);
});

我可以在库中看到结束方法:-

var saveToFile = function(fname) {
    return {
        pdf: function(rstream) { 
            var wstream = fs.createWriteStream(fname);
            rstream.pipe(wstream);
        },
        error: function(errMessage, statusCode) { console.log("ERROR: " + errMessage); },
        end: function() {},
    };
}

但我不知道如何让这一切结合在一起。我目前有一个蓝鸟Promise 包裹着这个函数,我的想法是在一个成功的结束事件上解决 Promise,然后继续:-

_generatePdf(stuffs).then(function() {
console.log('all done here');
});

我想这一切都很简单——感谢帮助!

如果需要,我们很乐意用更多信息更新问题。

帮助表示赞赏。

【问题讨论】:

    标签: javascript node.js pdf-generation


    【解决方案1】:

    您正在覆盖处理写入文件的默认函数。在您的新函数中,您没有从rstream 读取任何数据,这就是为什么没有发出end 事件的原因。试试这样:

     pdf: function(rstream) { 
            rstream.on('end', function() {
                    pdf.saveToFile(path);
                    resolve();
                });
            var wstream = fs.createWriteStream(path);
            rstream.pipe(wstream)
        },
    

    【讨论】:

      【解决方案2】:

      我最后用下面的代码解决了这个问题。正如 hassansin 暗示的那样,我没有从 rstream 获取数据:-

      return new Promise(function(resolve, reject) {
              var client = new pdf.Pdfcrowd(username, key);
              var data = [];
              client.convertHtml(html, {
                  pdf: function(rstream) {
                      rstream.on('data', function(chunk) {
                          data.push(chunk);
                      });
      
                      rstream.on('end', function() {
                          var buffer = new Buffer(data.reduce(function(prev, current) {
                              return prev.concat(Array.prototype.slice.call(current));
                          }, []));
      
                          fs.writeFile(fpath, buffer, 'binary', function onComplete(err){
                              if(err){
                                  throw err;
                              }
                              resolve();
                          });
                      });
                  }
              }, a4);
          });
      

      希望这能帮助遇到同样问题的其他人:)

      【讨论】:

      • 你可以使用buffer = Buffer.concat(data)。对于大文件,管道也会更快。
      猜你喜欢
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 2020-09-21
      相关资源
      最近更新 更多