1. 程式人生 > >java準確讀取word檔案頁數

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