2016-08-23 8 views
0

ich eine PDF-Text aus einem s3 Eimer Lesen S3fs.readFile verwenden, und ich möchte das Ergebnis erhalten, in String umwandeln und sofort einen Laich child_process Aufruf pdftotext öffnen, die Zeichenfolge übergeben:Wie pipe ich eine lange Zeichenfolge über child_process.spawn() in Node.js?

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

Dies führt dazu, dass der Spawn-Prozess unterbrochen wird, weil der String zu lang ist, und ich möchte die Datei nicht auf dem Datenträger speichern, nur um sie erneut zu lesen.

Ist es möglich?

Danke!

Antwort

0

pdftotext sollte von stdin lesen lassen und auf stdout schreiben (zumindest für mich mit v0.41.0 gearbeitet hat), so können Sie diese stattdessen tun könnte:

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

Oder vielleicht noch besser, Sie könnten in der Lage sein, um die Datei an den Kindprozess zu streamen, anstatt zuerst den gesamten Inhalt im Speicher zu puffern:

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

Lassen Sie mich versuchen. Ich habe Zweifel ... Ist es möglich, dies mit Catdoc, Antiword usw. zu tun? Oder hängt es davon ab? –

+0

Ich weiß es nicht, aber wie ich sagte 'cat foo.pdf | pdftotext - -' funktionierte für mich, also sollte es auch gut sein, diesen Befehl vom Knoten zu übernehmen. – mscdex

Verwandte Themen