欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

后台实现word转pdf输出文件流

程序员文章站 2022-03-13 22:46:14
...
  1. 首先需要安装好LibreOffice,支持免费使用,安装包太大没法上传,可以去官网下载:https://zh-cn.libreoffice.org/download/download/  根据系统选择需要安装的版本
  2. 废话不多说,贴上后端的java代码

 word转pdf的代码:

    public byte[] WordtoPDF(String pdfDirectory, String filename) throws IOException {
        byte[] bytes = null;
        long start = System.currentTimeMillis();
        //目标word文件的路径(srcPath),生成pdf文件的路径(desPath )
        String srcPath = pdfDirectory+File.separator+filename, desPath = pdfDirectory;
        String command = "";
        String osName = System.getProperty("os.name");
        if (osName.contains("Windows")) {
            //命令语句
            command = "D:/LibreOffice/program/soffice --headless --convert-to pdf " + srcPath + " --outdir " + desPath;
            try {
                //执行命令
                CmdUtil.exec(command);
                String pdfname = filename.substring(0, filename.lastIndexOf("."));
                File pdf = new File(pdfDirectory +File.separator+ pdfname + ".pdf");
                // 检验是否已生成文件
                int idx = 1;
                while (idx < 100) {
                    idx = idx + 1;
                    Thread.sleep(100);
                    if (pdf.exists()) {
                        //logger.info("文件{}已转换完成,耗时={}毫秒", pdf.getName(), idx * 100);
                        break;
                    }
                }
                //获取生成的pdf的byte
                bytes = FileUtils.readFileToByteArray(pdf);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        long end = System.currentTimeMillis();
        logger.debug("用时:{} ms", end - start);
        return bytes;
    }

命令执行工具类

/**
 * 命令行工具类
 */
public class CmdUtil {
    private static final Logger logger = LoggerFactory.getLogger(CmdUtil.class);

    /**
     * 执行命令
     * @param cmd 命令
     * @return
     * @throws IOException
     * @throws InterruptedException
     */
    public static boolean exec(String cmd) throws IOException, InterruptedException {
        logger.info("执行命令 [{}]", cmd);
        Runtime run = Runtime.getRuntime();//返回与当前 Java 应用程序相关的运行时对象
        Process process = run.exec(cmd);// 启动另一个进程来执行命令
        BufferedInputStream in = new BufferedInputStream(process.getInputStream());
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
        //logger.info( IOUtils.toString(process.getInputStream()));// 打印输出信息
        //String msg;
        //while ((msg = bufferedReader.readLine()) != null) {
        //    //获得命令执行后在控制台的输出信息
        //    logger.info(msg);// 打印输出信息
        //}
        //检查命令是否执行失败。
        new ProcessClearStream(process.getInputStream(), "INFO").start();
        new ProcessClearStream(process.getErrorStream(), "ERROR").start();
        int waitFor = process.waitFor();
        int exitValue = process.exitValue();

        logger.info("命令行处理结果:waitFor={}, exitValue={}", waitFor, exitValue);
        if (waitFor != 0) {
            //p.exitValue()==0表示正常结束,1:非正常结束
            if (exitValue == 1) {
                logger.error("命令执行失败!");
                return false;
            }
            return false;
        }
        logger.error("命令执行成功!");
        bufferedReader.close();
        in.close();
        return true;
    }
}

 

相关标签: java word pdf