随着android系统的发展,android已经得到广泛的认可,作为一名普通的大学生,真的希望自己能在android系统上做一个可以让大家使用、方便大家工作的一个软件,最后决定做一个基于andriod的Word格式阅读器。
经过一些查找工作,终于找到了可以在android系统上使用的用于读取Word格式文档的开源包--POI(The Java API For Microsoft Documents)。
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文件的内容。
判断当前段落是表格、图片还是一段文字的代码:
1. public void writeParagraphContent(Paragraph paragraph){
2. Paragraph p = paragraph;
3. int pnumCharacterRuns = p.numCharacterRuns();
4.
5. for( int j = 0; j < pnumCharacterRuns; j++){
6.
7. CharacterRun run = p.getCharacterRun(j);
8.
9. if(run.getPicOffset() == 0 || run.getPicOffset() >= 1000){
10. if(presentPicture < pictures.size()){
11. writePicture();
12. }
13. }
14. else{
15. try{
16. String text = run.text();
17. if(text.length() >= 2 && pnumCharacterRuns < 2){
18. output.write(text.getBytes());
19. }
20. else{
21. int size = run.getFontSize();
22. int color = run.getColor();
23. "<font size=\"" + decideSize(size) + "\">";
24. "<font color=\"" + decideColor(color) + "\">";
25. "</font>";
26. "<b>";
27. "</b>";
28. "<i>";
29. "</i>";
30.
31. output.write(fontSizeBegin.getBytes());
32. output.write(fontColorBegin.getBytes());
33.
34. if(run.isBold()){
35. output.write(boldBegin.getBytes());
36. }
37. if(run.isItalic()){
38. output.write(islaBegin.getBytes());
39. }
40.
41. output.write(text.getBytes());
42.
43. if(run.isBold()){
44. output.write(boldEnd.getBytes());
45. }
46. if(run.isItalic()){
47. output.write(islaEnd.getBytes());
48. }
49. output.write(fontEnd.getBytes());
50. output.write(fontEnd.getBytes());
51. }
52. }
53. catch(Exception e){
54. "Write File Exception");
55. }
56. }
57. }
58. }
在SDCARD上创建一个图片的代码:
1. public void writePicture(){
2. Picture picture = (Picture)pictures.get(presentPicture);
3.
4. byte[] pictureBytes = picture.getContent();
5.
6. 0, pictureBytes.length);
7.
8. makePictureFile();
9. presentPicture++;
10.
11. new File(picturePath);
12.
13. try{
14.
15. new FileOutputStream(myPicture);
16.
17. outputPicture.write(pictureBytes);
18.
19. outputPicture.close();
20. }
21. catch(Exception e){
22. "outputPicture Exception");
23. }
24.
25. "<img src=\"" + picturePath + "\"";
26.
27. if(bitmap.getWidth() > screenWidth){
28. " " + "width=\"" + screenWidth + "\"";
29. }
30. ">";
31.
32. try{
33. output.write(imageString.getBytes());
34. }
35. catch(Exception e){
36. "output Exception");
37. }
38. }
运行效果截图:
读取图片和文字:
读取表格和文字:
源代码及测试Word文档打包: