2015-06-23 50 views
12

我试图将图像插入到pdf中我正在使用PDFkit创建服务器端。我正在使用cfs:dropbox来存储我的文件。之前当我使用cvs:filesystem时,很容易将图像添加到我的pdf中,因为它们就在那里。既然它们是远程存储的,我不知道如何添加它们,因为PDFkit不支持仅使用url添加图像。但是,它会接受缓冲区。我如何从我的CollectionFS文件获取缓冲区?我如何从CollectionFS获取文件(图像)的缓冲区

到目前为止,我有这样的事情:

var portrait = Portraits.findOne('vS2yFy4gxXdjTtz5d'); 
readStream = portrait.createReadStream('portraits'); 

我试图得到缓冲两种方式至今:使用的DataMan

第一,但最后一个命令永不再来:

var dataMan = new DataMan.ReadStream(readStream, portrait.type()); 
var buffer = Meteor.wrapAsync(Function.prototype.bind(dataMan.getBuffer, dataMan))(); 

手动缓冲流:

var buffer = new Buffer(0); 
readStream.on('readable', function() { 
    buffer = Buffer.concat([buffer, readStream.read()]); 
}); 
readStream.on('end', function() { 
    console.log(buffer.toString('base64')); 
}); 

这似乎永远也不会回来。我仔细检查了我的文档以确保它在那里,并且它具有有效的url,并且在将URL放入浏览器时出现图像。我错过了什么吗?

+0

你是什么意思的“永不回来”?您的代码中使用这些解决方案的方式/位置。第二个应该工作。 –

+0

另外,你是否在任何地方调用'readStream.read()'? –

+0

“永远不会回来”我的意思是“结束”事件的回调永远不会执行(我没有在控制台中看到日志消息)。 –

回答

5

我不得不做类似的东西,因为没有回答这个问题,这里是我怎么做到这一点:

// take a cfs file and return a base64 string 
var getBase64Data = function(file, callback) { 
    // callback has the form function (err, res) {} 
    var readStream = file.createReadStream(); 
    var buffer = []; 
    readStream.on('data', function(chunk) { 
    buffer.push(chunk); 
    }); 
    readStream.on('error', function(err) { 
    callback(err, null); 
    }); 
    readStream.on('end', function() { 
    callback(null, buffer.concat()[0].toString('base64')); 
    }); 
}; 

// wrap it to make it sync  
var getBase64DataSync = Meteor.wrapAsync(getBase64Data); 

// get a cfs file 
var file = Files.findOne(); 

// get the base64 string 
var base64str = getBase64DataSync(file); 

// get the buffer from the string 
var buffer = new Buffer(base64str, 'base64') 

希望对大家有所帮助!

+0

我没有测试过它,但它看起来正是我想要弄清楚的。早在7月份,我就将基础64字符串直接保存在集合中,但占用更多空间。谢谢你的帮助。 –

相关问题