2015-06-23 49 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字符串直接保存在集合中,但佔用更多空間。謝謝你的幫助。 –

相關問題