在 PDF 的 Save ToFile 方法中访问结束事件



我正在使用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() {},
    };
}

但我不知道如何把这一切结合在一起。我目前有一个围绕函数的bluebird Promise,其想法是在成功结束事件时解决Promise,然后继续:-

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

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

如有需要,我们将乐意为您提供更多信息。

感谢您的帮助。

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

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

我最终用以下代码解决了这个问题。正如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);
    });

希望这能帮助其他有同样问题的人:(

相关内容

最新更新