package com.ots.project.tool; import lombok.extern.slf4j.Slf4j; import java.io.*; @Slf4j public class ShellTool { public static String execLibreofficeCommand(String type, String sourcePath, String targetPath) { String os = System.getProperty("os.name"); StringBuilder builder = new StringBuilder(); if (os.toLowerCase().startsWith("mac")) { builder.append("/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to "); } else if(os.contains("Windows")){ builder.append("cmd /c start soffice --headless --convert-to "); } else { builder.append("libreoffice6.4 --headless --convert-to "); } builder.append(type).append(" "); builder.append("--outdir " + targetPath).append(" "); builder.append(sourcePath).append(" "); try { File file = new File(sourcePath.replaceAll(".docx", ".pdf")); if (file.exists()) { file.delete(); } } catch (Exception e) { } return run_cmd(builder.toString()); } public static String run_cmd(String strcmd) { // Runtime rt = Runtime.getRuntime(); //Runtime.getRuntime()返回当前应用程序的Runtime对象 Process ps = null; //Process可以控制该子进程的执行或获取该子进程的信息。 try { ps = rt.exec(strcmd); //该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。 ps.waitFor(); //等待子进程完成再往下执行。 } catch (IOException e1) { e1.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } int i = ps.exitValue(); //接收执行完毕的返回值 if (i == 0) { System.out.println("执行完成."); } else { System.out.println("执行失败."); } ps.destroy(); //销毁子进程 ps = null; return null; } private static String exec(String command) { String returnString = ""; Runtime runTime = Runtime.getRuntime(); if (runTime == null) { System.err.println("Create runtime false!"); } try { Process pro = runTime.exec(command); BufferedReader input = new BufferedReader(new InputStreamReader(pro.getInputStream())); PrintWriter output = new PrintWriter(new OutputStreamWriter(pro.getOutputStream())); String line; while ((line = input.readLine()) != null) { returnString = returnString + line + "\n"; } input.close(); output.close(); pro.destroy(); } catch (IOException ex) { log.error("执行PDF转换Shell失败:{}", ex.getMessage(), ex); } return returnString; } public static void main(String[] args) { System.out.println(exec("libreoffice6.4 --headless --convert-to /root/小红.docx 小红.pdf ")); } }