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(←長按可複製)獲取學習資料可