基於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成長篇“參賽文章