java準確讀取word檔案頁數
由於本人在做一個網上列印網站,遇到了一個需求是“準確讀取word檔案頁數,從而實現計費功能”,通過很長時間的學習、查資料後,終於解決了這個問題,因此把方法寫出來,方便有同樣需求的人少走彎路。
首先需要感謝kookob博主的一篇博文(http://blog.csdn.net/kookob/article/details/45038563?locationNum=3&fps=1)對我幫助很大,但裡面介紹的不夠完善,故在此更加細化的講解一下,希望對大家有所幫助。
一、本人已經實驗過,使用poi方法、java2word方法、itext方法等,都不能很好的讀取word檔案的頁數,大部分問題都是讀取的不準確。因為這裡涉及到金錢問題,所以必須準確,所以才有了本文。
二、本文思路是“pdf格式直接讀取,word格式先轉pdf再讀取”,由於在word轉pdf時需要一些時間,我們開發者如果單單用進度條,當word較大時,會造成轉的太慢,所以我在我的網站(已上線)中,在使用者“選擇檔案”後,後臺開始轉格式,此時不讓使用者看到,而去讓使用者做一些配置,比如列印的份數、是否雙面列印等,使用者設定完了,在最後的結算頁面顯示“正在讀取格式”的進度條,然後再顯示“正在計算金額”,這樣使用者體驗會更好。
三、下面將一步步實現準確讀取word頁數:
3.1 準備工作:
3.1.1開發環境:windows。請務必在windows作業系統中進行本操作,因為word需要在伺服器上轉為pdf。
3.1.2 請在電腦上安裝word,注意是安裝word,不是安裝wps。
3.1.3 請在電腦上安裝word轉pdf的外掛:“軟體名:SaveAsPDFandXPS”,下載地址:http://download.csdn.net/download/tiandixuanwuliang/10006993
3.1.4 請把系統需要呼叫的dll檔案放置在java環境的jre的bin目錄下,例如:E:\software\java\jre7\bin\jacob-1.18-x64.dll,(請注意自己電腦32位還是64位)下載地址:http://download.csdn.net/download/tiandixuanwuliang/10007003
3.1.5 java環境jdk1.7
3.2 word轉pdf:
3.2.1新建java工程,把jacob.jar新增到工程中,此jar包在3.1.4節下載的資料夾裡面有。
同時把jacob.jar檔案拷貝一份放到C:/windows/system32下
如圖:
3.2.2Word2PdfUtil.java程式碼如下:
package testJavaReadWordpage;
import java.io.File;
import java.io.IOException;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
public class Word2PdfUtil {
static final int wdDoNotSaveChanges = 0;// 不儲存待定的更改。
static final int wdFormatPDF = 17;// word轉PDF 格式
public static boolean word2pdf(String source, String target) {
System.out.println("Word轉PDF開始啟動...");
long start = System.currentTimeMillis();
ActiveXComponent app = null;
try {
app = new ActiveXComponent("Word.Application");
app.setProperty("Visible", false);
Dispatch docs = app.getProperty("Documents").toDispatch();
System.out.println("開啟文件:" + source);
Dispatch doc = Dispatch.call(docs, "Open", source, false, true).toDispatch();
System.out.println("轉換文件到PDF:" + target);
File tofile = new File(target);
if (tofile.exists()) {
tofile.delete();
}
Dispatch.call(doc, "SaveAs", target, wdFormatPDF);
Dispatch.call(doc, "Close", false);
long end = System.currentTimeMillis();
System.out.println("轉換完成,用時:" + (end - start) + "ms");
return true;
} catch (Exception e) {
System.out.println("Word轉PDF出錯:" + e.getMessage());
return false;
} finally {
if (app != null) {
app.invoke("Quit", wdDoNotSaveChanges);
}
}
}
}
注意:請在e盤下放一個test.doc的word檔案,經過上面程式碼,轉換成功顯示如下:
3.3開始讀取pdf:
3.3.1先請匯入java讀取pdf檔案頁碼的jar,下載地址:http://download.csdn.net/download/tiandixuanwuliang/10007010
3.3.2程式碼如下:
package testJavaReadWordpage;
import java.io.IOException;
import com.itextpdf.text.pdf.PdfReader;
public class GetPdfpage {
public static int getPdfPage(String filepath){
int pagecount = 0;
PdfReader reader;
try {
reader = new PdfReader("e:\\test1.pdf");
pagecount= reader.getNumberOfPages();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(pagecount);
return pagecount;
}
}
注:讀取成功如下:
3.4總結:利用java準確讀取word頁碼,採用先把word轉為pdf,再讀取pdf頁碼的方式,經過測試,本方法得到的word頁碼準確率為100%
【專案工程】:http://download.csdn.net/download/tiandixuanwuliang/10007015
注:雖說程式碼看起來不難,但是本人也是研究了大半個月才找出了這個方法,其中下載了很多無用的資源,嘗試了很多方法,故本文中有些工具、工程都設定了下載分數,也懇請大家理解,希望大家多多支援,本人將盡己所能寫出更好的博文。
四、如果有錯誤,請看下面:
4.1如果報錯:java.lang.UnsatisfiedLinkError: no jacob-1.14-x86 in java.library.path說明是jacob.dll檔案錯誤,可能是位數錯誤,請把64位的換成32的;還有可能是jacob.dll放的位置有問題,具體請看:http://blog.csdn.net/li346985170/article/details/38365889
4.2如果報錯:Unsupported major.minor version 51.0,是jdk版本錯誤,請用jdk1.7及以上,具體方法請看:https://jingyan.baidu.com/article/bea41d437363bdb4c51be6e3.html
4.3如果程式一直不能轉成功,請檢查,電腦是否安裝了word,是否安裝了轉pdf的外掛。另外,還可以,把jacod.all和jacod.jar兩個檔案在jre的bin、jdk的bin和C:\Windows\System32下到處放,但是要注意是32位還是64位(有時候呼叫可以有問題,本人對java底層不太熟悉,反正經過這些操作,就可以轉pdf成功了)。
4.4如果報錯:Could not initialize class com.jacob.activeX.ActiveXComponent請把jacob.jar檔案拷貝到C:/windows/System32中
五、本人使用上述方法,成功準確地獲取了word頁碼,本人能力有限錯誤地方,歡迎大家批評指正;或者大家有更好的辦法,或者大家在操作過程中遇到任何問題,都歡迎在評論區留言。
本文連結:http://blog.csdn.net/tiandixuanwuliang/article/details/71298406