天天看点

Office文档转换成PDF

分享知识 传递快乐

Office文档转换成PDF

文档转换的方式有很多种,比如有Apache下的POI、jodconverter等技术。本例用的jodconverter-core-3.0技术对文档进行转换,首先下载所需的JAR包有:

commons-cli-1.1.jar
commons-io-1.4.jar
jodconverter-core-3.0-beta-4.jar
juh-3.2.1.jar
jurt-3.2.1.jar
ridl-3.2.1.jar
unoil-3.2.1.jar      

如果用jodconverter-core转换文档时需要安装OpenOffice,要借助OpenOffice来在线浏览office文档,前提是要转成pdf。因为浏览器不能直接找开office文档,所以只能转换一下。 想要运行些项目机器上必须要装上OpenOffice才可以运行,否则不能运行,windows和Linux都可以运行的。有些网上说要先手动启用服务,再运行项目, 但这个项目不用,只要安装了OpenOffice就可以了,项目里有开启和关闭OpenOffice服务。

本项目有3.0和2.0两个版本

源码:

package com.xh;

// 定义属性
public class Constant {
  // 可以操作的文件类型
  public static final String FILE_SUFFIX[] = { ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".txt" };
  // 转换得出的文件类型
  public static final String PDF_SUFFIX = ".pdf";
  // OpenOffice安装路径
  public static final String OFFICE_HOME = "D:/OpenOffice/OpenOffice 4";
  // 设置转换端口,默认为8100
  public static final int PORT = 8100;
  // 设置任务执行超时为2分钟
  public static final long EXECUTE_OVERTIME = 2 * 60 * 1000;
  // 设置任务队列超时为5分钟
  public static final long QUEUE_OVERTIME = 5 * 60 * 1000;
}      
package com.xh;

import java.io.File;

import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;

public class OpenOffice2Pdf {

  private static OfficeManager officeManager;

  /**
   * 文档转换
   * <hr>
   * 将doc,docx,xls,xlsx,ppt,pptx,txt等文档转换成PDF文档,如果不指定输出地址默认当前文件地址
   * 
   * @author Hyang
   * @date 2016年12月13日
   * @explain
   * 
   * @param inputFilePath
   *            - 转换文件地址(必须)
   * @param outputFilePath
   *            - 输出地址(可空)
   * @param newFileName
   *            - 新文件名(可空)
   * @return
   */
  public String execute2Pdf(String inputFilePath, String outputFilePath, String newFileName) {

    return processing(inputFilePath, outputFilePath, newFileName);
  }

  /**
   * 数据加工
   * 
   * @author Hyang
   * @date 2016年12月13日
   * @explain
   * 
   * @return
   */
  private static String processing(String inputFilePath, String outputFilePath, String newFileName) {
    File inputFile = new File(inputFilePath);
    String fileName = inputFile.getName();
    String prefix = fileName.substring(fileName.lastIndexOf(".") + 0);
    String outputPath = null;
    
    boolean isTrue = false;
    if (!inputFile.exists()) {
      System.out.println("文件不存在!");
      return null;
    }

    for (String name : Constant.FILE_SUFFIX) {
      if (fileName.endsWith(name)) {
        isTrue = true;
        break;
      }
    }
    
    if (!isTrue) {
      System.out.println("文件格式错误");
      return null;
    }
    
    if (outputFilePath != null) {
      outputPath = newFileName == null ? outputFilePath + fileName.replace(prefix, Constant.PDF_SUFFIX)
          : outputFilePath + fileName.replace(fileName, newFileName) + Constant.PDF_SUFFIX;
    } else {
      outputPath = newFileName == null ? inputFile.getPath().replace(prefix, Constant.PDF_SUFFIX)
          : inputFile.getPath().replace(fileName, newFileName) + Constant.PDF_SUFFIX;
    }
    
    File outputFile = new File(outputPath);
    if (!outputFile.exists()) {
      //执行方法服务功能
      execute(inputFile, outputFile);
    } else {
      System.out.println("文件已存在");
    }

    return outputPath;
  }

  /**
   * 执行方法服务功能
   * 
   * @author Hyang
   * @date 2016年12月13日
   * @explain
   * 
   * @param inputFile
   * @param outputFile
   */
  private static void execute(File inputFile, File outputFile) {
    long startTime = System.currentTimeMillis();// 获取开始时间

    try {
      if (startService()) {
        System.out.println("进行文档转换转换:" + inputFile + " --> " + outputFile);
        OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
        converter.convert(inputFile, outputFile);
        System.out.println("Office转换成功");
        stopService();
      }
    } catch (Exception e) {
      stopService();
      e.printStackTrace();
    }

    long endTime = System.currentTimeMillis(); // 获取结束时间
    System.out.println("程序运行时间: " + (endTime - startTime) / 1000 + "s");
  }

  /**
   * 开启服务
   * 
   * @author Hyang
   * @date 2016年12月13日
   * @explain
   * 
   * @return
   */
  private static boolean startService() {
    DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration();
    try {
      // 设置任务执行超时,
      long executeOvertime = Constant.EXECUTE_OVERTIME;
      // 设置任务队列超时
      long queueOvertime = Constant.QUEUE_OVERTIME;

      System.out.println("准备启动服务....");
      configuration.setOfficeHome(Constant.OFFICE_HOME); // 设置OpenOffice.org安装目录
      configuration.setPortNumber(Constant.PORT); // 设置转换端口,默认为8100
      configuration.setTaskExecutionTimeout(executeOvertime);
      configuration.setTaskQueueTimeout(queueOvertime);

      officeManager = configuration.buildOfficeManager();
      officeManager.start(); // 启动服务
      System.out.println("office服务启动成功!");
      return true;
    } catch (Exception ce) {
      System.out.println("office转换服务启动失败!详细信息:" + ce);
      return false;
    }
  }

  /**
   * 关闭服务
   * 
   * @author Hyang
   * @date 2016年12月13日
   * @explain
   *
   */
  private static void stopService() {
    System.out.println("准备关闭服务....");
    if (officeManager != null) {
      officeManager.stop();
    }
    System.out.println("office关闭成功!");
  }

}      
/**
 * 
 * @author Dingdong
 * @date 2016年12月14日
 * @explain
 */
public class Test {

  public static void main(String[] args) {
    
    OpenOffice2Pdf openOffice2Pdf = new OpenOffice2Pdf();
    String path = "E:/TestThreadOpenOffice/1理性追求者的福音.docx";

    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
    String dateTime = sdf.format(new Date());
    String resultPath = openOffice2Pdf.execute2Pdf(path, null, dateTime);
    System.out.println(resultPath);
  }
}      

继续阅读