在Node.js中执行命令

在Node.js中执行命令,node.js,process,libreoffice,Node.js,Process,Libreoffice,我正在尝试执行Node.js中的命令,以便使用libreoffice将office文档转换为PDF。这是核心代码: var fs = require('fs'); var path = require('path'); var exec = require('child_process').exec; var convert = function (file, cb) { try { var p = path.parse(file); var pdf

我正在尝试执行Node.js中的命令,以便使用
libreoffice
将office文档转换为PDF。这是核心代码:

var fs = require('fs');
var path = require('path');
var exec = require('child_process').exec;


var convert = function (file, cb) {
    try {
        var p = path.parse(file);
        var pdf = path.join(p.dir, p.name) + '.pdf';
        var cmd = 'soffice --headless --convert-to pdf --outdir "' + p.dir + '" "' + file + '"';
        console.info(cmd);
        exec(cmd, function (err, stdout, stderr) {
            if (err) {
                cb(err);
                return;
            }
            if (fs.existsSync(pdf)) {
                cb(null, pdf);
            } else {
                cb("not exist");
            }
        });
    } catch (err) {
        cb(err);
    }
};
module.exports = {convert: convert};
然而,有两个问题:

  • 无法得到预期的结果

    每次执行代码时,都会出现如下错误:

    {"error":    
      {"killed":false,
       "code":1,
       "signal":null,
       "cmd":"C:\\WINDOWS\\system32\\cmd.exe /s /c \"soffice --headless --convert-to pdf --outdir \"D:/test\" \"D:/test/a.doc\"\""
      }
    }
    
    但一旦我手动运行命令:

    soffice --headless --convert-to pdf --outdir "D:/test" "D:/test/a.doc"
    
    我可以得到PDF文件

  • 该命令不会阻止该进程

    我发现
    soffice….
    命令将在生成PDF之前立即返回,这意味着我无法确定文件是何时生成的


  • 我可以将word转换为HTML:

         execHTML = exec('soffice --headless --invisible --nolockcheck --convert-to html --outdir ' + fileNameHTML + ' ' + filesString,
          function(error, stdout, stderr) {
            if (error !== null) {
              console.log('exec error: ', error);
            }
          });
    
        execHTML.on('close', function(code) {
          if (code > 0) {
            return callback(code);
          } else {
            callback();
          }
        })