模仿百度文庫線上瀏覽功能

G.G發表於2013-07-17

這個功能可能很多人都知道是怎麼回事了。不過還是寫給那些有興趣愛好的人,而又不知道的人吧。這個東西百度上一搜一大把。但是都比較零散。所以我這個也算是一個整理。

需要用的工具: OpenOffice.org3 swftloos jodconverter flexpaper 需要用到的包: 親。在jodconverter裡面自己找吧。

大致思路: 就是講使用者上傳的msoffice文件進行轉換。首先通過OpenOffice將msoffice文件轉換成pdf.然後通過swftools將pdf轉換成swf檔案。最後通過flexpaper進行展示。jodconverter是進行轉換的第三方外掛。

轉換成pdf原始碼:

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration;
import org.artofsolving.jodconverter.office.OfficeManager;

public class OfficeToPdf {

/**
 * 將Office文件轉換為PDF. 執行該函式需要用到OpenOffice
 * 
 * @param sourceFile
 *            原始檔,絕對路徑. 可以是Office2003-2007全部格式的文件, Office2010的沒測試. 包括.doc,
 *            .docx, .xls, .xlsx, .ppt, .pptx,.dot等.
 * 
 * @param destFile
 *            目標檔案.絕對路徑.
 * @throws IOException 
 */
public static String word2pdf(String inputFilePath) throws IOException {
    String converterPath = inputFilePath.substring(0,inputFilePath.lastIndexOf("/"))+"/temp";
    //建立連線
    DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();
    //獲取openoffice home
    String officeHome = getOfficeHome();
    config.setOfficeHome(officeHome);
    //啟動服務
    OfficeManager officeManager = config.buildOfficeManager();
    officeManager.start();
    OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
    //獲取swf名稱
    String swfname = getDate();
    //制定輸出路徑
    String fileName = inputFilePath.substring(inputFilePath.lastIndexOf("/"),inputFilePath.lastIndexOf("."));
    String outputFilePath = converterPath+fileName+".pdf";
    System.out.println("openoffice轉換時的輸出路徑_"+outputFilePath);
    File inputFile = new File(inputFilePath);
    System.out.println("openoffice轉換時的輸入路徑_"+inputFile);
    if (inputFile.exists()) {// 找不到原始檔, 則返回
        File outputFile = new File(outputFilePath);
        if (!outputFile.getParentFile().exists()) { // 假如目標路徑不存在, 則新建該路徑
            outputFile.getParentFile().mkdirs();
        }
        try{
        converter.convert(inputFile, outputFile);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    officeManager.stop();
    String swfpath = PdfToSwf.pdf2swf(outputFilePath,swfname);
    return swfpath;

}
//時間獲取方法。用於設定swf的名稱
public static String getDate(){
    Date date = new Date();
    SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmss");
    String datetime = format.format(date);
    return datetime;
}


/**
 * openoffice home 佈置專案時需更改
 * @return
 */
public static String getOfficeHome() {
    String osName = System.getProperty("os.name");
    if (Pattern.matches("Linux.*", osName)) {
        return OfficeViewPath.OpenOfficeHome_linux;
    } else if (Pattern.matches("Windows.*", osName)) {
        return OfficeViewPath.OpenOfficeHome_windows;
    } else if (Pattern.matches("Mac.*", osName)) {
        return OfficeViewPath.OpenOfficeHome_Mac;
    }
    return null;
}
}

轉換成swf原始碼:

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

public class PdfToSwf {

/**
 * 利用SWFTools工具將pdf轉換成swf,轉換完後的swf檔案與pdf同名
 * 
 * @author iori
 * @param fileDir
 *            PDF檔案存放路徑(包括檔名)
 * @param exePath
 *            轉換器安裝路徑
 * @throws IOException
 */
public static synchronized String pdf2swf(String fileDir,String name)
        throws IOException {
    //swftools路徑。不知專案時需更改
    String exePath = OfficeViewPath.SwfToolsHome;
    // 檔案路徑
    String filePath = fileDir.substring(0, fileDir.lastIndexOf("/"));
    Process pro = null;
    if (isWindowsSystem()) {
        // 如果是windows系統
        // 命令列命令
        //"E:/SWFTools/pdf2swf.exe" "E:/Tomcat/webapps/CatsicProject/upload/zonggui/planning/problem/20130521052142/temp/[feiq]變更請求跟蹤表.pdf" -o "E:/Tomcat/webapps/CatsicProject/upload/zonggui/planning/problem/20130521052142/temp/20130521052146.swf" -s flashversion=9 -f
        String cmd = exePath + " \"" + fileDir + "\" -o \"" + filePath + "/"+ name + ".swf\" -s flashversion=9 -f";
        System.out.println("當前系統為windows,目錄為:"+cmd);
        // Runtime執行後返回建立的程式物件
        try{
        pro = Runtime.getRuntime().exec(cmd);
        }catch (Exception e) {
            e.printStackTrace();
        }
    } 
    else {
        // 如果是linux系統,路徑不能有空格,而且一定不能用雙引號,否則無法建立程式
        String[] cmd = new String[3];
        cmd[0] = exePath;
        cmd[1] = fileDir;
        cmd[2] = filePath + "/"+ name + ".swf";
        // Runtime執行後返回建立的程式物件
        System.out.println("當前系統為linux,目錄為:"+cmd);
        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();
    }
    return filePath+"/"+name+".swf";
}

/**
 * 判斷是否是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) {
    // 轉換器安裝路徑

    try {
        PdfToSwf.pdf2swf("E:\\aaaa.pdf");
    } catch (IOException e) {
        System.err.println("轉換出錯!");
        e.printStackTrace();
    }
}*/
 }

中間可能有一些開發人員可以通過上面的原始碼進行修改。改造成你專案中需要的方式。

相關文章