Java實現web在線預覽office文檔與pdf文檔實例


https://yq.aliyun.com/ziliao/1768?spm=5176.8246799.blogcont.24.1PxYoX

 

 

摘要: 本文講的是Java實現web在線預覽office文檔與pdf文檔實例, 1、首先我們需要找到可以把office轉換成pdf的方法,查找資料發現有openoffice這一軟件可以把office轉換成pdf,這一軟件先下載下來,然后記住自己安裝的在那個位置。然后在cmd環境下進入安裝目錄的program目

1、首先我們需要找到可以把office轉換成pdf的方法,查找資料發現有openoffice這一軟件可以把office轉換成pdf,這一軟件先下載下來,然后記住自己安裝的在那個位置。然后在cmd環境下進入安裝目錄的program目錄,輸入打開openoffice的命令:
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard


輸入完成之后在任務管理器可以看見soffice.bin的進程在任務管理器,這一服務就啟動成功。當然在代碼中轉換office2pdf我們還需要一些架包。下載jodconverter-2.2.2架包,然后復制到lib目錄下,引入架包就可以了。這個架包有如下包:

Java實現web在線預覽office<a href=文檔與pdf文檔實例-office文檔在線預覽">


有一些項目重復的可以刪除,根據實際情況自己處理。

2、我們需要找到轉換pdf2swf的方法。查找資料發現swftools這個軟件可以把pdf轉換成swf文件。把它下下來安裝好就可以了。

3、我們需要一個展示swf文件的容器,發現有flexpaper這個插件。而且展示效果還不錯。所以我們需要下載這個插件。使用這個插件需要有三個js文件。分別是:jquery.js、flexpaper_flash.js、flexpaper_flash_debug.js。插件的名字是FlexPaperViewer.swf。

整個項目結如下:

Java實現web在線預覽office文檔與pdf文檔實例-html5 office文檔預覽


准備工作完成下面開始編碼.

轉換類為DocConverter 的代碼:

package com.cectsims.util;
 
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
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格式轉換 
 */
public class DocConverter {
    private static final int environment = 1;// 環境 1:Windows 2:Linux
    private String fileString;// (只涉及PDF2swf路徑問題)
    private String outputPath = "";// 輸入路徑 ,如果不設置就輸出在默認 的位置
    private String fileName;
    private File pdfFile;
    private File swfFile;
    private File docFile;
 
    public DocConverter(String fileString) {
        ini(fileString);
        System.out.println("文件路徑"+fileString);
    }
 
    /**
     * * 重新設置file
     *
     * @param fileString
     *            32.
     */
    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) {
                    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 */
    @SuppressWarnings("unused")
    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:/Program/swfttools/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();
    }
 
    /**
     * * 轉換主方法
     */
    @SuppressWarnings("unused")
    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****");
        }
        try {
            doc2pdf();
            pdf2swf();
        } catch (Exception e) {
              e.printStackTrace();
              return false;
        }
        System.out.println("文件存在嗎?"+swfFile);
        if (swfFile.exists()) {
            System.out.println("存在");
            return true;
        } else {
            System.out.println("不存在");
            return false;
        }
    }
 
    /**
     *返回文件路徑      
     * @param     
     */
    public String getswfPath(){
        if (this.swfFile.exists()){
            String tempString = swfFile.getPath();
            tempString = tempString.replaceAll("\\\\", "/");
            System.out.println("最后文件路徑為"+tempString);
            return tempString;
        } else {
            return "文件不存在";
        }
    }
 
    /**
     * 設置輸出路徑
     *
     * @param outputPath
     */
    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");
            }
        }
    }
}


調用轉換類只需要傳word、ptt、excel、pdf文件所在的路徑參數就可以了。

展示在線預覽的jsp代碼如下:

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
   String swfFilePath=session.getAttribute("swfpath").toString();
   System.out.println("展示路徑"+swfFilePath);
 %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/flexpaper_flash.js"></script>
<script type="text/javascript" src="js/flexpaper_flash_debug.js"></script>
<!--  <script type="text/javascript" src="js/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="js/flexpaper.js"></script>
<script type="text/javascript" src="js/flexpaper_handlers.js"></script>-->
<style type="text/css" media="screen">
html,body{
        height: 100%;
}
body{
        margin: 0;
        padding: 0;
        overflow: auto;
}
#flashContent{
       display: none;
}
</style>
<title>在線文檔預覽</title>
</head>
<body>
   <div style="position: absolute; left:50px;top:10px;">
        <a id="viewerPlaceHolder" style="width: 820px;height: 650px;display: block;"></a>
          <script type="text/javascript">
           var fp=new FlexPaperViewer('FlexPaperViewer','viewerPlaceHolder',{config:{SwfFile:escape('<%=swfFilePath%>'),Scale:1.2,
            ZoomTransition:'easeOut',ZoomTime:0.5,ZoomInterval:0.2,FitPageOnLoad:false,FitWidthOnload:false,
            FullScreenAsMaxWindow:false,ProgressiveLoading:false,MinZoomSize:0.2,MaxZoomSize:5,SearchMatchAll:false,
            InitViewMode:'SinglePage',RenderingOrder : 'flash',ViewModeToolsVisible:true,ZoomToolsVisible:true,NavToolsVisible:true,CursorToolsVisible:true,
            SearchToolsVisible:true,localeChain:'en_US'}});
          </script>
   </div>
</body>
</html>


其中可能會出現在線預覽只能實現10頁的情況,需要把RenderingOrder : 'flash',設置為flash才可以實現超過10頁的在線預覽。swfFilePat為轉換后的文件所在路徑。

注意問題:

1、發現錯誤一般是openoffice服務沒有開啟。
2、Linux環境下會存在中文亂碼的問題,是linux下不像windows支持那么多字體,需要安裝多的字體,並且把字體所在位置鏈接到flexpaper所在位置。在使用pdf2swf加上參數-s languagedir=/usr/local/xpdf-chinese-simplified/。具體的一些參數請百度。


java將office文檔pdf文檔轉換成swf文件在線預覽

 

第一步,安裝openoffice.org

  openoffice.org是一套sun的開源office辦公套件,能在widows,linux,solaris等操作系統上執行。

主要模塊有writer(文本文檔),impress(演示文稿),Calc(電子表格),Draw(繪圖),Math(公式),base(數據庫)

筆者下載的是openoffice.org 3.3.0。下載完直接安裝即可。

     但是,我們還需要啟動openoffice server。有兩種做法:

    1.以命令行方式啟動openoffice server,缺點是每次系統重啟,都需要手動去把openoffice server啟動。

    2.將openoffice server作為操作系統的服務啟動,既然成為了系統服務,就可以設定開機自動啟動了。

    我們先來看第一種方式,

1.以命令行方式啟動openoffice server

  在cmd命令下,cd opeonofiice的安裝路徑/program 如:cd c:\program files\openoffice.org 3\program\soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard


2.以系統服務的方式啟動

    這里我們還需要Windows Resource Kit tools ,將openoffice server設為系統服務。

Windows Resource Kit tools 是微軟專為管理人員、開發人員和高級用戶開發的,包括管理活動目錄、組策略、TCP/IP網絡、注冊表、系統安全、監測等涉及Windows Server 2003 操作系統的其它很多方面的非常規安裝的工具組件。Resource Kit Tools for XP的發布使得XP用戶也能使用Resource Kit Tools對這些問題進行處理。

    下載windows resource kit tools,我們進行默認安裝。

     1.打開Windows Resource Kit Tools

     在Command Shell執行以下命令:

 "C:\Program Files\Windows Resource Kits\Tools\instsrv" OpenOfficeUnoServer "C:\Program Files\Windows Resource Kits\Tools\srvany.exe"

打開 管理工具->服務 可以找到以 OpenOfficeUnoServer 命名的服務

    2.打開注冊表尋找以下路徑

    HKEY_LOCAL_MACHINE -> SYSTEM ->ControlSet001 ->Services ->OpenOfficeUnoServer

  新建項 Parameters,在該項下添加兩個字符串值:

  key:Application

     value:C:\Program Files\OpenOffice.org 3\program\soffice.exe

 

     key:AppParameters

     value:-invisible -headless -accept=socket,host=127.0.0.1,port=8100;urp; -nofirststartwizard

 

     3.在服務控制台,啟動 openoffice 服務

     4.在CMD中用以下命令查看8100是否已被監聽:netstat -anop tcp

這樣OpenOffice3.0就以服務方式運行在Windows系統上了。(使用cmd命令:netstat -anp tcp查看8100端口是否工作)

然後可以通過socket方式連接openOffice,以使用openoffice提供的某些服務,如文件轉換服務,ms office轉pdf等等。

開源項目 JODConverter 就是結合openoffice來進行文檔轉換的java組件。

另外有一個命令行工具swftools,該工具可以將pdf轉換為swf格式的文檔,提供給ie客?舳肆骼饋?nbsp;   

  另外,我們可以將該配置用bat文件來快速實現,運行前請先修改相應目錄參數:

     openoffice service.bat文件

    "C:\Program Files\Windows Resource Kits\Tools\instsrv" OpenOfficeUnoServer "C:\Program Files\Windows Resource Kits\Tools\srvany.exe"
    reg add HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\OpenOfficeUnoServer\Parameters /ve /d
    reg add HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\OpenOfficeUnoServer\Parameters /v Application /t REG_SZ /d "C:\Program Files\OpenOffice.org 3\program\soffice.exe"
    reg add HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\OpenOfficeUnoServer\Parameters /v AppParameters /t REG_SZ /d "-invisible -headless -accept=socket,host=127.0.0.1,port=8100;urp; -nofirststartwizard"


第二步,使用JODConverter將office文檔轉換為pdf

JODConverter是一個java的OpenDucument文件轉換器,可以進行許多文件格式的轉換,它利用

OpenOffice來進行轉換工作,它能進行以下的轉換工作:

     1.Microsoft Office格式轉換為OpenDucument,以及OpenDucument轉換為Microsoft Office

     2.OpenDucument轉換為PDF,Word、Excel、PowerPoint轉換為PDF,RTF轉換為PDF等。

它是一個開源項目。


我的項目是在MyEclipse下開發的。

下載最新版的jodconverter-2.2.2,把lib文件夾的包導入到你的DocConverter項目的lib文件夾內。

(假設你的項目是DocConverter)

新建DOC2PDFUtil.java

package com.iori.webapp.util;
import java.io.File;  
import java.io.IOException;
import java.net.ConnectException;  
import java.util.Date;  
 
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;  
 
public class DOC2PDFUtil extends java.lang.Thread  {
     private File inputFile;// 需要轉換的文件  
      private File outputFile;// 輸出的文件  
     
      public DOC2PDFUtil(File inputFile, File outputFile) {  
         this.inputFile = inputFile;  
         this.outputFile = outputFile; 
     }  
     
     public void docToPdf() {  
         Date start = new Date();  
          
         OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);  
         try {  
             connection.connect();  
             DocumentConverter converter = new OpenOfficeDocumentConverter(connection);  
             converter.convert(inputFile, outputFile);  
         } catch (ConnectException cex) {  
             cex.printStackTrace();  
         } finally {  
             // close the connection  
             if (connection != null) {  
                 connection.disconnect();  
                 connection = null;  
             }  
         }  
     }  
     
     /** 
       * 由於服務是線程不安全的,所以……需要啟動線程 
        */ 
     public void run() {  
         this.docToPdf();  
     }  
     
     public File getInputFile() {  
         return inputFile;  
     }  
     
     public void setInputFile(File inputFile) {  
         this.inputFile = inputFile;  
     }  
     
     public File getOutputFile() {  
         return outputFile;  
     }  
     
     public void setOutputFile(File outputFile) {  
         this.outputFile = outputFile;  
     } 
     
     /**
       * 測試main方法
        * @param args
       */
     public static void main(String[] args) {
         File inputFile = new File("c://temp//333.xls");
         File outputFile = new File("c://temp//333.pdf");
         DOC2PDFUtil dp=new DOC2PDFUtil(inputFile,outputFile);
         dp.start();
     } 
}


在DOC2PDFUtil.java,右鍵屬性 - >Run as - >Java Application ,輸出main的測試結果。

在jsp中執行

新建MyDOC2PDFTest.jsp

<%@ page import="java.io.*"%>
<%@ page import="com.artofsolving.jodconverter.openoffice.connection.*"%>
<%@ page import="com.artofsolving.jodconverter.openoffice.connection.*"%>
<%@ page import="com.artofsolving.jodconverter.openoffice.converter.*"%>
<%@ page import="com.artofsolving.jodconverter.*"%>
<%@ page import="java.util.*"%>
<%@ page import="com.iori.webapp.util.*"%>
 
<%
File inputFile = new File("c://temp//333.xls");
File outputFile = new File("c://temp//333.pdf");
DOC2PDFUtil dp=new DOC2PDFUtil(inputFile,outputFile);
dp.start();
%>
<!-- 下面這些html可以去掉 -->
<html>
 <head><title>Simple jsp page</title></head>
 <body>Place your content here</body>
</html>
在項目DocConverter根目錄,右鍵屬性 - >Run as - >MyEclipse Server Application
發布到之前安裝的Tomcat 6.0的根目錄,然后用url路徑訪問:Http://localhost:8080/DocConverter/MyDOC2PDFTest.jsp 進行測試。
JODConverter將office文檔轉換pdf,用到的代碼如下:
File inputFile = new File("c://temp//333.xls");
File outputFile = new File("c://temp//333.pdf");
 
// 鏈接 一個運行在8100端口的OpenOffice.org 實例
OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
connection.connect();
 
// 創建一個converter對象並轉換格式
DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
converter.convert(inputFile, outputFile);
 
// 關閉連接
connection.disconnect();


第三步,使用swftools將pdf轉換為swf

建議下載swftools-0.9.1,筆者起先下載的是最新版的swftools-1.0版。貌似轉換時出錯,缺少什么組件。

繼續筆者的DocConverter項目。筆者使用的開發環境是MyEclipse 9.0。

新建PDF2SWFUtil.java

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:/temp/333.pdf", exePath);
        } catch (IOException e) {
            System.err.println("轉換出錯!");
            e.printStackTrace();
        }
    }
}


在PDF2SWFUtil.java,右鍵屬性 - >Run as - >Java Application ,輸出main的測試結果。

在jsp中執行

新建MyPDF2SWFTest.jsp

<%@ page import="java.io.*"%>
<%@ page import="com.artofsolving.jodconverter.openoffice.connection.*"%>
<%@ page import="com.artofsolving.jodconverter.openoffice.connection.*"%>
<%@ page import="com.artofsolving.jodconverter.openoffice.converter.*"%>
<%@ page import="com.artofsolving.jodconverter.*"%>
<%@ page import="java.util.*"%>
<%@ page import="com.iori.webapp.util.*"%>
 
<%
//轉換器安裝路徑
String exePath = "c:/Program Files/SWFTools/pdf2swf.exe";
try {
    PDF2SWFUtil.pdf2swf("c:/temp/333.pdf", exePath);
} catch (IOException e) {
    System.err.println("轉換出錯!");
    e.printStackTrace();
}
%>
 
<!-- 下面這些html可以去掉 -->
<html>
<head>
<title>Simple jsp page</title>
</head>
<body>Place your content here</body>
</html>


在項目DocConverter根目錄,右鍵屬性 - >Run as - >MyEclipse Server Application

發布到之前安裝的Tomcat 6.0的根目錄,然后用url路徑訪問:Http://localhost:8080/DocConverter/MyPDF2SWFTest.jsp 進行測試。


第四步,office文檔轉為pdf,同時進一步轉為swf

網上資料有很多office文檔轉為pdf,pdf轉為swf,但都是單步轉換。關於一起轉換的資料比較少。

一起轉換有個問題就是轉為pdf時,這個轉換過程將花費一段時間才能成功,如何控制在pdf轉換成功后,才進行swf的轉換。

以及多個文檔批量轉換又該怎么辦。

 
有幸筆者還是找到了一篇同時轉換的代碼:

新建DocConverter.java

package com.iori.webapp.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
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("C:/Program Files/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 (Exception 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****");
        }
       
        try {
            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=new DocConverter("c:/temp/111.ppt");
        d.conver();
    }
}


在DocConverter.java,右鍵屬性 - >Run as - >Java Application ,輸出main的測試結果。筆者分別進行單個轉換,及批量轉換,都測試可行。

至於為什么能成功進行pdf及swf的完整轉換,在代碼中沒有看到和上述問題相關的控制。筆者在得到預期的結果,偶爾也會裝糊塗,不去繼續深究。


第五步,flexpaper在線瀏覽swf文檔

FlexPaper是一個開源輕量級的在瀏覽器上顯示各種文檔的組件,被設計用來與PDF2SWF一起使用,

使在Flex中顯示PDF成為可能,而這個過程並無需PDF軟件環境的支持。它可以被當做Flex的庫來使用。

另外你也可以通過將一些例如Word、PPT等文檔轉成PDF,然后實現在線瀏覽。

FlexPaper_1.2.4_flash:無打印功能

FlexPaper_1.4.7_flash:打印功能,右鍵打印

這里我們不需要讓用戶打印,所以筆者選擇FlexPaper_1.2.4_flash。

FlexPaper項目中有演示demo,這里筆者不多述。

綜上,一個完整的在線文檔瀏覽方案。


附一:使用iText將jpg、jpeg、png轉換為pdf

其他,使用iText將jpg/jpeg/png轉換為pdf

  iText是著名的開放源碼的站點sourceforge一個項目,是用於生成PDF文檔的一個java類庫。通過iText不僅可以生成 PDF或rtf的文檔,而且可以將XML、Html文件轉化為PDF文件。1.在企業的信息系統中,報表處理一直占比較重要的作用,iText--一種生 成PDF報表的Java組件,通過在服務器端使用Jsp或JavaBean生成PDF報表,客戶端采用超級連接顯示或下載得到生成的報表,這樣就很好的解 決了B/S系統的報表處理問題。2.支持文本,表格,圖形的操作,可以方便的跟 Servlet 進行結合。

繼續筆者的DocConverter項目。開發環境是MyEclipse 9.0。筆者下載的是iText5.0.4。

新建JPG2PDFUtil.java

package com.iori.webapp.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
 
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.PdfWriter;
 
 
public class JPG2PDFUtil {
    private String inputFileString;
    private String outputFileString;
 
    public JPG2PDFUtil(String inputFile, String outputFile) {  
        this.inputFileString = inputFile;  
        this.outputFileString = outputFile; 
       
    } 
    public void imgtopdf()
    {
        //創建一個文檔對象
        Document doc = new Document();
        try {  
            //定義輸出文件的位置  
            PdfWriter.getInstance(doc, new FileOutputStream(outputFileString));
            //開啟文檔  
            doc.open();  
            //設定字體 為的是支持中文  
            //BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);  
           // Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);  
            //向文檔中加入圖片 
            /*//以下是多圖合成一個pdf,暫時用不到
            for(int i=1;i<32;i++)
            {
                //取得圖片~~~圖片格式:
                Image jpg1 = Image.getInstance("c:/"+i+".jpg"); //原來的圖片的路徑
                //獲得圖片的高度
                float heigth=jpg1.height();
                float width=jpg1.width();
                System.out.println("heigth"+i+"----"+heigth);
                System.out.println("width"+i+"-----"+width);
                //合理壓縮,h>w,按w壓縮,否則按w壓縮
                //int percent=getPercent(heigth, width);
                //統一按照寬度壓縮
                int percent=getPercent2(heigth, width);
                //設置圖片居中顯示
                jpg1.setAlignment(Image.MIDDLE);
                //直接設置圖片的大小~~~~~~~第三種解決方案,按固定比例壓縮
                //jpg1.scaleAbsolute(210.0f, 297.0f);
                //按百分比顯示圖片的比例
                jpg1.scalePercent(percent);//表示是原來圖像的比例;
                //可設置圖像高和寬的比例
                //jpg1.scalePercent(50, 100);
                doc.add(jpg1);
            }
            */
           
            //向文檔中加入圖片 
            //取得圖片~~~圖片格式:
            Image jpg1 = Image.getInstance(inputFileString); //原來的圖片的路徑
            //獲得圖片的高度
            float heigth=jpg1.height();
            float width=jpg1.width();
            System.out.println("heigth----"+heigth);
            System.out.println("width-----"+width);
            //合理壓縮,h>w,按w壓縮,否則按w壓縮
            //int percent=getPercent(heigth, width);
            //統一按照寬度壓縮
            int percent=getPercent2(heigth, width);
            //設置圖片居中顯示
            jpg1.setAlignment(Image.MIDDLE);
            //直接設置圖片的大小~~~~~~~第三種解決方案,按固定比例壓縮
            //jpg1.scaleAbsolute(210.0f, 297.0f);
            //按百分比顯示圖片的比例
            jpg1.scalePercent(percent);//表示是原來圖像的比例;
            //可設置圖像高和寬的比例
            //jpg1.scalePercent(50, 100);
            doc.add(jpg1);
           
           
            //關閉文檔並釋放資源  
            doc.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (DocumentException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } 
    }
    /**
     * 第一種解決方案
     * 在不改變圖片形狀的同時,判斷,如果h>w,則按h壓縮,否則在w>h或w=h的情況下,按寬度壓縮
     * @param h
     * @param w
     * @return
     */
   
    public int getPercent(float h,float w)
    {
        int p=0;
        float p2=0.0f;
        if(h>w)
        {
            p2=297/h*100;
        }
        else
        {
            p2=210/w*100;
        }
        p=Math.round(p2);
        return p;
    }
    /**
     * 第二種解決方案,統一按照寬度壓縮
     * 這樣來的效果是,所有圖片的寬度是相等的,自我認為給客戶的效果是最好的
     * @param args
     */
    public int getPercent2(float h,float w)
    {
        int p=0;
        float p2=0.0f;
        p2=530/w*100;
        p=Math.round(p2);
        return p;
    }
    /**
     * 第三種解決方案,就是直接壓縮,不安像素比例,全部壓縮到固定值,如210*297
     *
     * @param args
     */
    public static void main(String[] args) {
        JPG2PDFUtil pt=new JPG2PDFUtil("c:/temp/ddd.jpg","c:/temp/ddd.pdf");
        pt.imgtopdf();
    }
}


在JPG2PDFUtil.java,右鍵屬性 - >Run as - >Java Application ,輸出main的測試結果。

在jsp中執行

新建MyJPG2PDFTest.jsp

<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="com.iori.webapp.util.*"%>
<%
JPG2PDFUtil pt=new JPG2PDFUtil("c:/temp/333.jpg", "c:/temp/333.pdf");
pt.imgtopdf();
%>
<!-- 下面這些html可以去掉 -->
<html>
 <head>
<title>Simple jsp page</title>
</head>
 <body>Place your content here</body>
</html>


在項目DocConverter根目錄,右鍵屬性 - >Run as - >MyEclipse Server Application

發布到之前安裝的Tomcat 6.0的根目錄,然后用url路徑訪問:Http://localhost:8080/DocConverter/MyDOC2PDFTest.jsp 進行測試。


附二:常見問題集FAQ

1.txt轉換swf,發生中文亂碼。

txt轉換為utf-8編碼,或txt格式手動改為odt,上傳就不會發生亂碼。從根源上解決,暫時就算了...暫時不想去糾結這些雞毛。

2.加密的pdf可能導致轉換為swf失敗。

3.Microsoft Excel在公式運算中支持文本型的數值,而OpenOffice.org Calc不支持

此問題暫無解,請手動將Excel中文本型的數值修改為數值型的數值。

4.部分Excel存在過於豐富的樣式(大部分指沒有數據的單元格也填充了各種樣式),即使用專業Adobe Acrobat 7(或9) Pro來進行轉換,

本來可能預計將產生20-30分頁的pdf,結果卻產生800-900分頁的pdf。此類文檔在線轉換,難以避免的將導致轉換死鎖。

請在你的Excel文檔中刪除多余的,毫無必要的樣式,或者你有更靈活的做法。

5.有些中文PDF文件轉換為SWF后,出現亂碼(特別一些專業期刊)

 1.下載XPDF:xpdf-chinese-simplified.tar.gz

 2.下載字體:gkai00mp.rar

 3.修改xpdf-chinese-simplified目錄下的add-to-xpdfrc文件。將里面的路徑設為自己的路徑:

#----- begin Chinese Simplified support package (2011-sep-02)
cidToUnicode Adobe-GB1    C:\xpdf-chinese-simplified\Adobe-GB1.cidToUnicode
unicodeMap   ISO-2022-CN C:\xpdf-chinese-simplified\ISO-2022-CN.unicodeMap
unicodeMap   EUC-CN         C:\xpdf-chinese-simplified\EUC-CN.unicodeMap
unicodeMap   GBK              C:\xpdf-chinese-simplified\GBK.unicodeMap
cMapDir        Adobe-GB1    C:\xpdf-chinese-simplified\CMap
toUnicodeDir                     C:\xpdf-chinese-simplified\CMap
fontDir                             C:\WINDOWS\Fonts
displayCIDFontTT Adobe-GB1 C:\xpdf-chinese-simplified\CMap\gkai00mp.ttf
#fontFileCC Adobe-GB1 /usr/..../gkai00mp.ttf
#----- end Chinese Simplified support package

 4.參照上面的代碼,在調用pdf2swf命令中加入“ -s languagedir=D:\\xpdf\\xpdf-chinese-simplified ”參數。

PDF2SWFUtil.java

String cmd = exePath + " \"" + fileDir + "\" -o \"" + filePath + "/" + fileName + ".swf\" -T 9 -s languagedir=c:\\xpdf-chinese-simplified";

這樣亂碼的問題就解決了。


以上是雲棲社區小編為您精心准備的的內容,在雲棲社區的博客、問答、公眾號、人物、課程等欄目也有的相關內容,歡迎繼續使用右上角搜索按鈕進行搜索文檔 , 文件 , new 轉換器 office文檔在線預覽、html5 office文檔預覽、office文檔預覽插件、office365文檔預覽、h5 office文檔預覽,以便於您獲取更多的相關知識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM