【问题标题】:How do i pipe a long string to via child_process.spawn() in Node.js?如何在 Node.js 中通过 child_process.spawn() 将长字符串通过管道传输?
【发布时间】:2016-08-23 02:43:50
【问题描述】:

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

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

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

有可能吗?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    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);
    

    【讨论】:

    • 让我试试。我有一个疑问......是否可以使用 catdoc、antiword 等来做到这一点?还是视情况而定?
    • 我不知道,但就像我说的 cat foo.pdf | pdftotext - - 为我工作,所以从节点管道到该命令应该也可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2015-06-06
    相关资源
    最近更新 更多