2015-06-23 2 views
12

Я пытаюсь вставить изображение в pdf. Я создаю серверную сторону с помощью PDFkit. Я использую cfs: dropbox для хранения моих файлов. Раньше, когда я использовал cvs: файловую систему, было легко добавить изображения в файл 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

«Никогда не возвращается» Я имею в виду, что обратный вызов для события «end» никогда не выполняется (я не вижу сообщение журнала в консоли). –

ответ

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

Я не тестировал его, но это похоже на то, что я пытался выяснить. Еще в июле я просто сохранил строку базы 64 прямо в коллекции, но это больше пространства. Спасибо за вашу помощь. –

Смежные вопросы