Как передать длинную строку через child_process.spawn() в Node.js?

Я читаю текст в формате pdf из ведра s3, используя S3fs.readFile, и я хотел бы получить результат, преобразовать в строку и сразу же открыть порождающий дочерний процесс, вызывающий pdftotext, передавая строку:

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

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

Является ли это возможным?

Спасибо!


person Community    schedule 23.08.2016    source источник


Ответы (1)


pdftotext должен разрешать чтение из стандартного ввода и запись в стандартный вывод (по крайней мере, у меня это работало с версией 0.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);
person mscdex    schedule 23.08.2016
comment
Дай мне попробовать. У меня есть сомнения... Можно ли это сделать с помощью catdoc, antiword и т.д.? Или это зависит? - person ; 23.08.2016
comment
Я не знаю, но, как я уже сказал, cat foo.pdf | pdftotext - - сработало для меня, поэтому передача этой команды из узла тоже должна работать нормально. - person mscdex; 23.08.2016