Порождение и выполнение nodejs с использованием pdf2swf

Я надеюсь, что есть кто-то, кто может помочь с этой проблемой, так как я сам не понимаю.

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

Когда я использую ту же команду, что и exec, она снова работает. Чтобы предоставить пример кода:

// convert a pdf to swf using exec (works)
var tmpSwfLocation = docsDir+'/Paper.pdf.swf';
var pdf2swf = cp.exec('pdf2swf '+tmpPDFLocation+' -o '+tmpSwfLocation+' -G -v -f -T 9 -t -j '+quality+' -s subpixels='+resolution+' -s storeallcharacters -s poly2bitmap', function(err, stdout, stderr){
  console.log(stdout);
  console.log(stderr);
  var end = Date.now();
  console.log('pdf2swf: SWF created in '+((end-start) /1000)+' seconds');
});

// convert a pdf to swf (does not work)
var tmpSwfLocation = docsDir+'/Paper.pdf.swf';
var pdf2swf = cp.spawn('pdf2swf', ['-G','-v','-f','-T 9', '-t', '-j '+quality,'-s subpixels='+resolution,'-s storeallcharacters', '-s poly2bitmap',tmpPDFLocation, '-o '+tmpSwfLocation],{setsid:true});
pdf2swf.stdout.on('data',function(output){
  console.log("pdf2swf:"+output)
});
pdf2swf.stderr.on('data',function(output){
  console.log("pdf2swf ERROR:"+output);
});
pdf2swf.stdout.on('end', function(output){
  var end = Date.now();
  console.log('pdf2swf: SWF created in '+((end-start) /1000)+' seconds');
});

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

pdf2swf:NOTICE  Writing SWF file  /home/bitnami/flipdoc/ec2-instances/worker/pdf_test/test_directory/test-Testfile_31MB_26Pages.pdf_0/docs/Paper.pdf.swf
pdf2swf:FATAL   Could not create " /home/bitnami/flipdoc/ec2-instances/worker/pdf_test/test_directory/test-Testfile_31MB_26Pages.pdf_0/docs/Paper.pdf.swf". 

Используя exec, процесс успешно завершается с помощью

pdf2swf:NOTICE  Writing SWF file  /home/bitnami/flipdoc/ec2-instances/worker/pdf_test/test_directory/test-Testfile_31MB_26Pages.pdf_0/docs/Paper.pdf.swf

и существующий файл.

Дополнительная информация: Перед всем процессом я выполняю рекурсивный chmod 777 на весь "test_directory".

Приветствует


person nnikpour    schedule 22.08.2012    source источник
comment
setsid не является допустимым вариантом для spawn.   -  person ebohlman    schedule 23.08.2012
comment
извините, я забыл написать, что использовал узел 0.6.18, в котором setsid все еще был допустимым параметром.   -  person nnikpour    schedule 24.08.2012


Ответы (1)


Решил это сам... Никогда (в смысле, даже не думайте об этом...) не используйте пробелы в аргументах для процесса порождения. если у вас есть аргумент param=value, который может использовать пробелы между ними, просто выровняйте их в массиве с каждым другим аргументом.

исходный код сверху для spawn теперь выглядит так:

var pdf2swf = cp.spawn('pdf2swf', [tmpPDFLocation, '-o',tmpSwfLocation,'-G','-vvv','-f','-T','9', '-t', '-j',quality,'-s','subpixels='+resolution,'-s','storeallcharacters', '-s','poly2bitmap']);
person nnikpour    schedule 24.08.2012
comment
Кроме того, не указывайте пустые строки! Я бился головой о стену, пытаясь понять, почему какой-то сторонний модуль npm не работал... Я думаю, что сопровождающий никогда не тестировал свой код, не меняя параметры по умолчанию, потому что в массиве, который предоставлял, были тернарные операторы. пустые строки, если параметр не был установлен по умолчанию. - person JaredMcAteer; 07.04.2013