1. 程式人生 > >基於Android的Word文件閱讀器

基於Android的Word文件閱讀器

        隨著android系統的發展,android已經得到廣泛的認可,作為一名普通的大學生,真的希望自己能在android系統上做一個可以讓大家使用、方便大家工作的一個軟體,最後決定做一個基於andriod的Word格式閱讀器。

        經過一些查詢工作,終於找到了可以在android系統上使用的用於讀取Word格式文件的開源包--POI(The Java API For Microsoft Documents)。下載地址:http://poi.apache.org/

       POI是Apache的一個子專案,其目的是提供對基於OOXML(Microsoft Office Open XML)和OLE2(Object Linking and Embedding)的各種文件操作的Java APIs包。該專案分為幾個元件,其中包括一個叫做HWPF的元件,它只能操作Word檔案。這就是我將要使用的元件。HWPF的全稱是Horrible Word Processor Format。翻譯成中文是“可怕的文件處理格式”,利用HWPF,開發者可以用純Java程式碼實現在Android系統是讀取Word文件。HWPF元件是POI專案中用來實現Word文件讀取的一個重要元件,以下是該元件中幾個重要的類:

(1)Range:是所有HWPF物件模型的核心類,Word文件中字元的所有屬性都是繼承這個類得到的。

(2)HWPFDocument:檔案類。任何形式的Word文件的最終表現形式都是對該物件進行一些屬性的定製。

(3)Paragraph:是Word文件中基本的組成部分,每個文件都被劃分成一個一個的段落,所有的段落最終組成一個Word文件。

(4)Picture:Word文件中嵌入的每張圖片都是由Picture物件來表示的,它包括了圖片的大小、內容等一系列屬性。

(5)Table:Word文件中嵌入的每張表格都是有Table物件來表示的,它包括了表格中每行的TableRow物件和行數等屬性。

       其他的類檔案對以上核心的類進行功能補充,最終完成了Word 文件的讀取。

       由於Word格式文件中有圖片、表格和字串,為了能在android系統上全部進行顯示,選擇使用WebView進行顯示。首先將Word格式文件中的內容讀取出來,加上對應的HTML標籤,然後寫入HTML檔案中,最後直接使用WebView進行讀取HTML檔案的內容。

判斷當前段落是表格、圖片還是一段文字的程式碼:

public void writeParagraphContent(Paragraph paragraph){
	Paragraph p = paragraph;
	int pnumCharacterRuns = p.numCharacterRuns();
		
	for( int j = 0; j < pnumCharacterRuns; j++){
	
		CharacterRun run = p.getCharacterRun(j);
			
		if(run.getPicOffset() == 0 || run.getPicOffset() >= 1000){
			if(presentPicture < pictures.size()){
				writePicture();
			}
		}
		else{
			try{
				String text = run.text();
				if(text.length() >= 2 && pnumCharacterRuns < 2){
					output.write(text.getBytes());
				}
				else{
	              			int size = run.getFontSize();
			        	int color = run.getColor();
				        String fontSizeBegin = "<font size=\"" + decideSize(size) + "\">";
			        	String fontColorBegin = "<font color=\"" + decideColor(color) + "\">";
			        	String fontEnd = "</font>";
				        String boldBegin = "<b>";
				        String boldEnd = "</b>";
				        String islaBegin = "<i>";
				        String islaEnd = "</i>";
	
				        output.write(fontSizeBegin.getBytes());
				        output.write(fontColorBegin.getBytes());
						
				        if(run.isBold()){
					        output.write(boldBegin.getBytes());
				        }
			        	if(run.isItalic()){
				        	output.write(islaBegin.getBytes());
				        }
						
		         		output.write(text.getBytes());
						
			        	if(run.isBold()){
				        	output.write(boldEnd.getBytes());
				        }
			        	if(run.isItalic()){
				        	output.write(islaEnd.getBytes());
				        }
		         		output.write(fontEnd.getBytes());
			        	output.write(fontEnd.getBytes());
		       		}
			}
			catch(Exception e){
				System.out.println("Write File Exception");
			}
		}
	}
}

在SDCARD上建立一個圖片的程式碼:

public void writePicture(){
	Picture picture = (Picture)pictures.get(presentPicture);
		
	byte[] pictureBytes = picture.getContent();
		
	Bitmap bitmap = BitmapFactory.decodeByteArray(pictureBytes, 0, pictureBytes.length);
		
	makePictureFile();
	presentPicture++;
		
	File myPicture = new File(picturePath);
		
	try{
		
		FileOutputStream outputPicture = new FileOutputStream(myPicture);
		
		outputPicture.write(pictureBytes);
		
		outputPicture.close();
	}
	catch(Exception e){
		System.out.println("outputPicture Exception");
	}
	
	String imageString = "<img src=\"" + picturePath + "\"";
		
	if(bitmap.getWidth() > screenWidth){
		imageString = imageString + " " + "width=\"" + screenWidth + "\"";
	}
	imageString = imageString + ">";
		
	try{
		output.write(imageString.getBytes());
	}
	catch(Exception e){
		System.out.println("output Exception");
	}
}

執行效果截圖:

讀取圖片和文字:



讀取表格和文字:


原始碼及測試Word文件打包:

本文系“暑期大學生部落格大賽-2011 Android成長篇“參賽文章