如何通过Node.js中的child_process.spawn()管长字符串?

时间:2016-08-23 02:43:50

标签: node.js bash amazon-s3 child-process pdftotext

我正在使用S3fs.readFile从s3存储桶读取pdf文本,我想得到结果,转换为字符串并立即打开一个spawn child_process调用pdftotext,传递字符串:

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

这导致生成进程中断,因为字符串很长,我不想将文件保存在磁盘中只是为了再次读取它。

有可能吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

pdftotext应该允许从stdin读取并写入stdout(至少它对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);