2016-08-23 2 views
0

Я читаю текст в формате PDF из s3 ведра с использованием S3fs.readFile, и я хотел бы, чтобы получить результат, преобразование в строке и немедленно открыть икру child_process призывающей pdftotext, передавая строку:Как связать длинную строку с помощью child_process.spawn() в Node.js?

S3Fs.readFile('./my-pdf-in-s3-bucket', {encoding: 'binary'}, (error, result) => { 
    mychild = child_process.spawn('pdftotext', [ 
    result.Body 
    ]); 
}); 

Это вызывает прерывание процесса появления, потому что строка длинная, и я не хочу сохранять файл на диске, просто чтобы прочитать его снова.

Возможно ли это?

Спасибо!

ответ

0

pdftotext должен позволять чтение из стандартного ввода и записи в стандартный вывод (по крайней мере, он работал для меня с v0.41.0), так что вы могли бы сделать это вместо:

S3Fs.readFile('./my-pdf-in-s3-bucket', (err, result) => { 
    if (err) throw err; // Handle better 
    var cp = child_process.spawn('pdftotext', [ '-', '-' ]); 
    cp.stdout.pipe(process.stdout); 
    cp.on('close', (code, signal) => { 
    console.log(`pdftotext finished with status ${code}`); 
    }); 
    cp.stdin.end(result); 
}); 

Или же, возможно, лучше, вы могли бы для потоковой передачи файла в дочерний процесс, а не для буферизации всего его содержимого в памяти:

var cp = child_process.spawn('pdftotext', [ '-', '-' ]); 
var rs = S3Fs.createReadStream('./my-pdf-in-s3-bucket'); 
rs.on('error', (err) => { 
    cp.kill(); 
}); 
cp.stdout.pipe(process.stdout); 
cp.on('close', (code, signal) => { 
    console.log(`pdftotext finished with status ${code}`); 
}); 
rs.pipe(cp.stdin); 
+0

Позвольте мне попробовать. У меня есть сомнения ... Возможно ли это сделать с помощью catdoc, antiword и т. Д.? Или это зависит? –

+0

Я не знаю, но, как я уже сказал, 'cat foo.pdf | pdftotext - -' работал для меня, поэтому соединение с этой командой с узла должно работать очень хорошо. – mscdex