1. 程式人生 > >Java程式實現Word文件轉為pdf以及出現的問題解決

Java程式實現Word文件轉為pdf以及出現的問題解決

做獸醫專案需要用到這種需求,很多程式設計師都遇到過,有些word文件希望直接在瀏覽器中開啟進行預覽,但是瀏覽器往往不是很配合,直接就提示下載,不像pdf文件,瀏覽器可以直接進行預覽。
1. Word文件轉為pdf直接上程式碼:
import java.io.File;

import org.apache.poi.POIXMLDocument;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant; 
public class Word2pdf {  
    static final int wdFormatPDF = 17;// PDF 格式    
    public int wordToPDF(String sfileName,String toFileName) throws Exception{    
            
        System.out.println("啟動Word...");      
        long start = System.currentTimeMillis();      
        ActiveXComponent app = null;  
        Dispatch doc = null;  
        try {      
            app = new ActiveXComponent("Word.Application"); 
            // 設定word不可見
            app.setProperty("Visible", new Variant(false));  
            // 開啟word檔案
            Dispatch docs = app.getProperty("Documents").toDispatch();   
//          doc = Dispatch.call(docs,  "Open" , sourceFile).toDispatch();   
            doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] {                    
               sfileName, new Variant(false),new Variant(true) }, new int[1]).toDispatch();
            System.out.println("開啟文件..." + sfileName);  
            System.out.println("轉換文件到PDF..." + toFileName);      
            File tofile = new File(toFileName);    
           // System.err.println(getDocPageSize(new File(sfileName)));
            if (tofile.exists()) {      
                tofile.delete();      
            }        
//          Dispatch.call(doc, "SaveAs",  destFile,  17);   
         // 作為html格式儲存到臨時檔案::引數 new Variant(8)其中8表示word轉html;7表示word轉txt;44表示Excel轉html;17表示word轉成pdf。。
            Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {                
                toFileName, new Variant(17) }, new int[1]);    
            long end = System.currentTimeMillis();      
            System.out.println("轉換完成..用時:" + (end - start) + "ms.");                
        } catch (Exception e) {  
            e.printStackTrace();  
            System.out.println("========Error:文件轉換失敗:" + e.getMessage());      
        }catch(Throwable t){
        	t.printStackTrace();
        } finally {  
        	// 關閉word
            Dispatch.call(doc,"Close",false);  
            System.out.println("關閉文件");  
            if (app != null)      
                app.invoke("Quit", new Variant[] {});      
            }  
          //如果沒有這句話,winword.exe程序將不會關閉  
           ComThread.Release();  
           return 1;
           }  
    private static Document read(File xmlFile) throws DocumentException {
        SAXReader saxReader = new SAXReader();
        return saxReader.read(xmlFile);
    }
//    public String getDocPageSize(File file){
//        String pages = null;
//        try{
//            Document doc = read(file);
//            List<Node> nodes = doc.selectNodes("//o:Pages");
//            if(nodes != null && nodes.size() > 0){
//                pages = nodes.get(0).getText();
//                System.out.println("/////////////////");
//                System.out.println("該word文件的頁數為:"+Integer.parseInt(pages));
//                System.out.println("/////////////////");
//            }else{
//                System.out.println("*********");
//                System.out.println("頁面轉換錯誤");
//                System.out.println("*********");
//            }
//        }catch(Exception ex){
//            ex.printStackTrace(); 
//        }
//        return pages;
//    }
    public  int getDocPageSize(String filePath)  throws Exception {
        XWPFDocument docx = new XWPFDocument(POIXMLDocument.openPackage(filePath));
        int pages = docx.getProperties().getExtendedProperties().getUnderlyingProperties().getPages();//總頁數
        int wordCount = docx.getProperties().getExtendedProperties().getUnderlyingProperties().getCharacters();// 忽略空格的總字元數 另外還有getCharactersWithSpaces()方法獲取帶空格的總字數。        
        System.out.println ("pages=" + pages + " wordCount=" + wordCount);
        return pages;
    }
     
    public static void main(String[] args) throws Exception {  
    	Word2pdf d = new Word2pdf();  
    	System.err.println(d.getDocPageSize("d:\\exportWord.docx"));
        d.wordToPDF("d:\\exportWord.docx", "d:\\law.pdf");  
    }  
  
}  

可是能夠完全執行的應該不可能,還要準備工作,

出錯總結:

1.沒引入jar包,,這個錯誤我就不說了,,基本上所有人都可以避免.jacob.jar

2.

出現這個錯誤是因為缺少了jacob-1.17-x64.dll這個東西,,把jacob.dll(不同版本的jacob的dll檔名有所不同)複製到C:\Program Files\Java\jdk1.6.0_17\jre\bin(專案中用到的jre)目錄下即可。

注意:名字一定要改成和報錯的時候一樣的名字,差一點也不行。

3.由於出錯沒有截圖,所以現在錯誤也不好去演示了,,簡單的就是下面的錯誤

com.jacob.com.ComFailException: Invoke of: SaveAs 

Source: Microsoft Word 

Description: 命令失敗

出現這種錯誤網上也有很多解決辦法:如下

Office版本使用2007,因為2007提供了一個載入項:Microsoft Save as PDF 或 XPS,可將文件另存為PDF格式。下載地址:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=4D951911-3E7E-4AE6-B059-A2E79ED87041,安裝即可使用。 

4.最後一步,

d.wordToPDF("d:\\exportWord.docx", "d:\\law.pdf");
這個目錄一定要寫正確,如果你寫成d:\\pdf\\law.pdf,而d盤中又沒有pdf資料夾,則會報如下錯誤
<img src="https://img-blog.csdn.net/20161027104907109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

避免上面4種錯誤,則能夠萬無一失了,,還有jar和dll檔案版本要對應。。由於我沒出現這個錯誤,不過網上有人出過,,注意下就可以了。