1. 程式人生 > >Java實現文件線上閱讀

Java實現文件線上閱讀

Java平臺要實現類似豆丁百度文科的文件線上閱讀,總體思路是講doc docx等檔案格式利用openoffice轉換成pdf再用swftools轉為swf。再用flexpaper元件顯示swf。

此過程涉及軟體(實測)

openoffice3.2(window)

swftools-2011-01-23-1815.exe(window)

openoffice3.1.1(linux)

swftools-2011-01-23-1815.tar.gz(linux)

jar包jodconverter-2.2.2(裡面lib目錄下含多個要用到的jar檔案)

flexpaper1.4.0 (直接複製過來,專案上執行成功,本地執行還沒成功)

FlexPaper_1.4.5_flash(網上下載的最新版本沒試過, 二選一即可)

附上自己寫的java轉換Demo DocConverter.java

import java.io.BufferedInputStream;

import java.io.File;

import java.io.IOException;

import java.io.InputStrem;

import com.artofsolving.jodconverter.DocumentConverter;

import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;

import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;

/**

* doc docx格式轉換

* @author Administrator

*

*/

public class DocConverter {

private static final int environment = 1;//環境 1:windows 2:linux (只涉及pdf2swf路徑問題) private String fileString;

private String outputPath = "";//輸入路徑,如果不設定就輸出在預設的位置

private String fileName;

private File pdfFile;

private File swfFile;

private File docFile;

public DocConverter(String fileString) {

ini(fileString);

}

/**

* 重新設定file

* @param fileString

*/

public void setFile(String fileString){

ini(fileString);

}

/**

* 初始化

* @param fileString

*/

private void ini(String fileString) {

this.fileString = fileString;

fileName = fileString.substring(0, fileString.lastIndexOf("."));

docFile = new File(fileString);

pdfFile = new File(fileName + ".pdf");

swfFile = new File(fileName + ".swf");

}

/**

* 轉為PDF

* @param file

*/

private void doc2pdf() throws Exception{

if(docFile.exists()) {

if(!pdfFile.exists()) {

OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);

try {

connection.connect();

DocumentConverter converter = new OpenOfficeDocumentConverter(connection); converter.convert(docFile, pdfFile);

// close the connection

connection.disconnect();

System.out.println("****pdf轉換成功,PDF輸出:" + pdfFile.getPath() + "****");

} catch (java.net.ConnectException e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println("****swf轉換器異常,openoffice服務未啟動!****");

throw e;

} catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) { e.printStackTrace();

System.out.println("****swf轉換器異常,讀取轉換檔案失敗****");

throw e;

} catch (Exception e){

e.printStackTrace();

throw e;

}

} else {

System.out.println("****已經轉換為pdf,不需要再進行轉化****");

}

} else {

System.out.println("****swf轉換器異常,需要轉換的文件不存在,無法轉換****"); }

}

/**

* 轉換成 swf

*/

private void pdf2swf() throws Exception{

Runtime r = Runtime.getRuntime();

if(!swfFile.exists()){

if(pdfFile.exists()) {

if(environment == 1){//windows環境處理

try {

Process p = r.exec("D:/TOOLS/SWFTools/pdf2swf.exe " +

pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9");

System.out.print(loadStream(p.getInputStream()));

System.err.print(loadStream(p.getErrorStream()));

System.out.print(loadStream(p.getInputStream()));

System.err.println("****swf轉換成功,檔案輸出:" + swfFile.getPath() + "****");

if(pdfFile.exists()) {

pdfFile.delete();

}

} catch (IOException e) {

e.printStackTrace();

throw e;

}

} else if(environment == 2){//linux環境處理

try {

Process p = r.exec("pdf2swf " +

pdfFile.getPath() + " -o " + swfFile.getPath() + " -T 9");

System.out.print(loadStream(p.getInputStream()));

System.err.print(loadStream(p.getErrorStream()));

System.err.println("****swf轉換成功,檔案輸出:" + swfFile.getPath() + "****");

if(pdfFile.exists()) {

pdfFile.delete();

}

} catch (Exception e) {

e.printStackTrace();

throw e;

}

}

} else {

System.out.println("****pdf不存在,無法轉換****");

}

} else {

System.out.println("****swf已經存在不需要轉換****");

}

}

static String loadStream(InputStream in) throws IOException {

int ptr = 0;

in = new BufferedInputStream(in);

StringBuffer buffer = new StringBuffer();

while( (ptr = in.read()) != -1 ) {

buffer.append((char)ptr);

}

return buffer.toString();

}

/**

* 轉換主方法

*/

public boolean conver() {

if(swfFile.exists()) {

System.out.println("****swf轉換器開始工作,該檔案已經轉換為swf****");

return true;

}

if(environment == 1){

System.out.println("****swf轉換器開始工作,當前設定執行環境windows****"); } else {

System.out.println("****swf轉換器開始工作,當前設定執行環境linux****");

}

doc2pdf();

pdf2swf();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

return false;

}

if (swfFile.exists()){

return true;

} else {

return false;

}

}

/**

* 返回檔案路徑

* @param s

*/

public String getswfPath(){

if(swfFile.exists()){

String tempString = swfFile.getPath();

tempString = tempString.replaceAll("\\\\", "/");

return tempString;

} else {

return "";

}

}

/**

* 設定輸出路徑

*/

public void setOutputPath(String outputPath){

this.outputPath = outputPath;

if(!outputPath.equals("")){

String realName = fileName.substring(fileName.lastIndexOf("/"), fileName.lastIndexOf(".")); if(outputPath.charAt(outputPath.length()) == '/'){

swfFile = new File(outputPath + realName + ".swf");

} else {

swfFile = new File(outputPath + realName + ".swf");

}

}

public static void main(String s[]) {

DocConverter d =

DocConverter("D:/data/FTP/midlongforecast/midweatherforecast/20010202.xml");

d.conver();

}

}

以上即是所有用到的轉換需要用到的檔案

windows安裝過程省略,linux下安裝swftools命令

解壓到目錄後

./configure

make

make install

無論在哪個平臺安裝完以上兩個軟體後

需要在將openoffice以服務方式啟動

Window 啟動方式

cd C:\Program Files\OpenOffice.org 3\program

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" –nofirststartwizard Linux啟動

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

new

以上是實現兩個平臺下的轉換,但是會有openoffice解析不了的字型亂碼問題,或者顯示字型變形等

java資料直播思維交流群:175161984(←長按可複製)獲取學習資料可