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