PDF2SWFUtil

来源:互联网 发布:淘宝返利购买什么意思 编辑:程序博客网 时间:2024/05/21 06:28

 

package com.iori.webapp.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class PDF2SWFUtil {

 /**
  * 利用SWFTools工具将pdf转换成swf,转换完后的swf文件与pdf同名
  *
  * @author iori
  * @param fileDir
  *            PDF文件存放路径(包括文件名)
  * @param exePath
  *            转换器安装路径
  * @throws IOException
  */
 public static synchronized void pdf2swf(String fileDir, String exePath)
   throws IOException {
  // 文件路径
  String filePath = fileDir.substring(0, fileDir.lastIndexOf("/"));
  // 文件名,不带后缀
  String fileName = fileDir.substring((filePath.length() + 1), fileDir
    .lastIndexOf("."));
  Process pro = null;
  if (isWindowsSystem()) {
   // 如果是windows系统
   // 命令行命令
   String cmd = exePath + " /"" + fileDir + "/" -o /"" + filePath
     + "/" + fileName + ".swf/"";
   // Runtime执行后返回创建的进程对象
   pro = Runtime.getRuntime().exec(cmd);
  } else {
   // 如果是linux系统,路径不能有空格,而且一定不能用双引号,否则无法创建进程
   String[] cmd = new String[3];
   cmd[0] = exePath;
   cmd[1] = fileDir;
   cmd[2] = filePath + "/" + fileName + ".swf";
   // Runtime执行后返回创建的进程对象
   pro = Runtime.getRuntime().exec(cmd);
  }
  // 非要读取一遍cmd的输出,要不不会flush生成文件(多线程)
  new DoOutput(pro.getInputStream()).start();
  new DoOutput(pro.getErrorStream()).start();
  try {
   // 调用waitFor方法,是为了阻塞当前进程,直到cmd执行完
   pro.waitFor();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }

 /**
  * 判断是否是windows操作系统
  *
  * @author iori
  * @return
  */
 private static boolean isWindowsSystem() {
  String p = System.getProperty("os.name");
  return p.toLowerCase().indexOf("windows") >= 0 ? true : false;
 }

 /**
  * 多线程内部类 读取转换时cmd进程的标准输出流和错误输出流,这样做是因为如果不读取流,进程将死锁
  *
  * @author iori
  */
 private static class DoOutput extends Thread {
  public InputStream is;

  // 构造方法
  public DoOutput(InputStream is) {
   this.is = is;
  }

  public void run() {
   BufferedReader br = new BufferedReader(new InputStreamReader(
     this.is));
   String str = null;
   try {
    // 这里并没有对流的内容进行处理,只是读了一遍
    while ((str = br.readLine()) != null)
     ;
   } catch (IOException e) {
    e.printStackTrace();
   } finally {
    if (br != null) {
     try {
      br.close();
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
   }
  }
 }

 /**
  * 测试main方法
  *
  * @param args
  */
 public static void main(String[] args) {
  // 转换器安装路径
  String exePath = "C:/Program Files/SWFTools/pdf2swf.exe";
  try {
   PDF2SWFUtil.pdf2swf("c:/PureMVC_Implementation_Idioms_and_Best_Practices_cn.pdf", exePath);
   
   System.out.println("success");
  } catch (IOException e) {
   System.err.println("转换出错!");
   e.printStackTrace();
  }
 }
}