| const fs = require("fs");
const path = require("path");
const {spawn} = require("child_process");
function parseCommand(librePath, cmd, convert) {
  let _args = [];
  if (process.platform === "win32" && convert === "pdf") {
    _args.push("/c");
    _args.push(librePath);
  }
  _args = _args.concat(cmd);
  return {_args};
}
function fileExist(file) {
  return new Promise((resolve, reject) => {
    fs.access(file, fs.constants.F_OK, (err) => {
      if (err && err.code === "ENOENT") {
        resolve(false);
      } else {
        resolve(true);
      }
    });
  });
}
const getFileThatExist = async (...files) => {
  for (const file of files) {
    if (file && await fileExist(file) === true) {
      return file;
    }
  }
  return false;
}
const filesExist = (...files) => {
  return Promise.resolve(!!getFileThatExist(...files));
}
function run(libreOfficeBin, cmd, convert) {
  return new Promise((resolve, reject) => {
    const {_args} = parseCommand(libreOfficeBin, cmd, convert);
    let _cmd = libreOfficeBin;
    if (convert === "img") {
      _cmd = "convert";
    } else if (process.platform === "win32" && convert === "pdf") {
      _cmd = process.env.ComSpec;
    }
    const proc = spawn(_cmd, _args);
    // proc.stdout.on("data", (data) => {
    //   // console.log("stdout", data.toString());
    // });
    proc.stderr.on("error", function (err) {
      reject(err);
    });
    proc.on("close", (code) => {
      const status = code === 0 ? "Success" : "Error";
      resolve(status);
    });
  });
}
exports.convert = async ({
                           libreofficeBin,
                           libreofficeBins,
                           sourceFile,
                           outputDir,
                           img,
                           imgExt,
                           reSize,
                           density,
                           disableExtensionCheck
                         }) => {
  const baseFileName = path.basename(sourceFile);
  const outputFile = baseFileName.replace(/\.[^.]+$/, ".pdf");
  const outputImg = outputFile.replace(/\.pdf$/, `-%d.${imgExt || "png"}`);
  const ext = path.extname(sourceFile.toLowerCase());
  const extensions = [".pdf", ".pptx", ".ppt", ".odp", ".key"];
  const pdf = [
    "--headless",
    "--convert-to",
    "pdf",
    "--outdir",
    outputDir,
    sourceFile,
  ];
  const image = [
    "-verbose",
    "-resize",
    reSize || 1200,
    "-density",
    density || 120,
    `${outputDir}${outputFile}`,
    `${outputDir}${outputImg}`,
  ];
  const pdf2Img = [
    "-verbose",
    "-resize",
    reSize || 1200,
    "-density",
    density || 120,
    sourceFile,
    `${outputDir}${outputImg}`,
  ];
  const libreOfficeBins = [
    ...(libreofficeBin ? [libreofficeBin] : []),
    ...(Array.isArray(libreofficeBins) ? libreofficeBins : [])
  ];
  if (!libreofficeBin) {
    libreOfficeBins.push(path.resolve("/usr/bin/libreoffice"));
    libreOfficeBins.push(path.resolve("/usr/bin/soffice"));
    libreOfficeBins.push(path.resolve("/Applications/LibreOffice.app/Contents/MacOS/soffice"));
    libreOfficeBins.push(path.resolve("C:\\\\Program Files\\\\LibreOffice\\\\program\\\\soffice.exe"));
    libreOfficeBins.push(path.resolve("C:\\\\Program Files (x86)\\\\LibreOffice\\\\program\\\\soffice.exe"));
    libreOfficeBins.push(path.resolve("C:\\\\Program Files (x86)\\\\LIBREO~1\\\\program\\\\soffice.exe"));
  }
  return getFileThatExist(...libreOfficeBins).then((libreofficeBin) => {
    if (libreofficeBin) {
      //Re arrange the array for more efficient future runs
      if (libreOfficeBins[0] !== libreofficeBin) {
        libreOfficeBins.splice(libreOfficeBins.indexOf(libreofficeBin), 1);
        libreOfficeBins.unshift(libreofficeBin);
      }
      return filesExist(sourceFile).then((srcExist) => {
        if (srcExist) {
          if (ext === ".pdf")
            return run(libreofficeBin, pdf2Img, "img").then((res) => res);
          if (disableExtensionCheck || extensions.includes(ext)) {
            return run(libreofficeBin, pdf, "pdf").then((pdfRes) => {
              if (pdfRes !== "Error") {
                if (!img) {
                  return pdfRes;
                } else {
                  return run(libreofficeBin, image, "img").then((imageRes) => {
                    if (imageRes !== "Error") {
                      return imageRes;
                    } else {
                      throw new Error("Error on image conversion process.");
                    }
                  });
                }
              } else {
                throw new Error("Error on pdf conversion process.");
              }
            });
          } else {
            throw new Error("Invalid extension.");
          }
        }
      });
    }
  });
};
 |