在Android读取Word文件时,在网上查看时可以用tm-extractors,但好像没有提到怎么读取Word文档中字体的颜色,字体,上下标等相关的属性。但由于需要,要把doc文档中的内容(字体,下划线,颜色等)读取应用到android中(不包括图片和图表)。

后面采用的是poi三方jar包(原包太大,可以从源代码里自己抽取有用的一些代码减少包的大小)。

我的想法是:把doc中的内容解析出来后,加上html对应的标签,在android中通过Html.fromHtml在TextView中进行显示,或者通过WebView.loadData进行加载显示

但测试后,发现如果加载太多内容的话,在Android中效率不行。

效果(该图的效果是在TextView中的效果,在WebView中效果会更好些):

doc图:

android图:

做法1:(解析为span样式的,这种做法只能用WebView方式加载,Html.fromHtml无效)

Java代码  
  1. /**Span样式
  2. * 通过字体的样式进行加载
  3. * @param inputStream
  4. * @return
  5. */
  6. public static String readDocToSpanByRun(InputStream inputStream) {
  7. HWPFDocument hwpfDocument = null;
  8. if(inputStream == null)
  9. throw new RuntimeException("inputStream is null ...");
  10. try{
  11. hwpfDocument = new HWPFDocument(inputStream);
  12. }catch(Exception e) {
  13. throw new RuntimeException("HWPFDocment Exception", e);
  14. }
  15. Range allRange = hwpfDocument.getRange();
  16. int length = allRange.numCharacterRuns();
  17. StringBuffer sb = new StringBuffer();
  18. CharacterRun cur;
  19. String text = "";
  20. for (int i = 0; i < length; i++) {
  21. cur = allRange.getCharacterRun(i);
  22. sb.append(CharacterRunUtils.toSpanType(cur));
  23. text = CharacterRunUtils.getSpicalSysbomByRun(cur.text());
  24. if(cur.getSubSuperScriptIndex() == 1)
  25. sb.append("<sup>").append(text).append("</sup>");
  26. else if(cur.getSubSuperScriptIndex() == 2)
  27. sb.append("<sub>").append(text).append("</sub>");
  28. else
  29. sb.append(text);
  30. sb.append("</span>");
  31. }
  32. return sb.toString();
  33. }

做法2:(解析为font样式的,Html.fromHtml有效,但对应size的设置无效果)

Java代码  
  1. /**
  2. * Html样式
  3. * 通过字体样式解析
  4. * @param inputStream
  5. * @return
  6. */
  7. public static String readDocToHtml(InputStream inputStream) {
  8. HWPFDocument hwpfDocument = null;
  9. if(inputStream == null)
  10. throw new RuntimeException("inputStream is null ...");
  11. try{
  12. hwpfDocument = new HWPFDocument(inputStream);
  13. }catch(Exception e) {
  14. throw new RuntimeException("HWPFDocment Exception", e);
  15. }
  16. CharacterRun  cur = null;
  17. StringBuffer sb = new StringBuffer();
  18. StringBuffer charStr =  new StringBuffer();
  19. Range allRange = hwpfDocument.getRange();
  20. for(int i = 0; i < allRange.numCharacterRuns(); i++) {
  21. cur = allRange.getCharacterRun(i);
  22. sb.append(CharacterRunUtils.fontFaceColorSizeToHtml(cur));
  23. charStr.append(CharacterRunUtils.toSupOrSub(cur, CharacterRunUtils.getSpicalSysbomByRun(cur.text())));
  24. if(cur.isBold())  {
  25. charStr.insert(0, "<b>");
  26. charStr.insert(charStr.length(), "</b>");
  27. }
  28. if(cur.getUnderlineCode() != 0) {
  29. charStr.insert(0, "<u>");
  30. charStr.insert(charStr.length(), "</u>");
  31. }
  32. if(cur.isItalic()) {
  33. charStr.insert(0, "<i>");
  34. charStr.insert(charStr.length(), "</i>");
  35. }
  36. if(cur.isStrikeThrough()) {
  37. charStr.insert(0, "<s>");
  38. charStr.insert(charStr.length(), "</s>");
  39. }
  40. sb.append(charStr).append("</font>");
  41. charStr.setLength(0);
  42. }
  43. hwpfDocument = null;
  44. return sb.toString();
  45. }

 以下是会用到的方法:

Java代码  
  1. /**
  2. *处理字体相关的属性
  3. */
  4. public class CharacterRunUtils {
  5. private static final short ENTER_ASCII = 13;
  6. private static final short SPACE_ASCII = 32;
  7. private static final short TABULATION_ASCII = 9;
  8. /**
  9. * 比对字体是否相同
  10. * 可以继续加其它属性
  11. * @param cr1
  12. * @param cr2
  13. * @return
  14. */
  15. public static boolean compareCharStyleForSpan(CharacterRun cr1,
  16. CharacterRun cr2) {
  17. return cr1.isBold() == cr2.isBold()
  18. && cr1.getFontName().equals(cr2.getFontName())
  19. && cr1.getFontSize() == cr2.getFontSize()
  20. && cr1.isItalic() == cr2.isItalic()
  21. && cr1.getColor() == cr2.getColor()
  22. && cr1.getUnderlineCode() == cr2.getUnderlineCode()
  23. && cr1.isStrikeThrough() == cr2.isStrikeThrough()
  24. && cr1.getColor() == cr2.getColor();
  25. }
  26. public static boolean compareCharColor(CharacterRun cr1, CharacterRun cr2) {
  27. return cr1.getFontName().equals(cr2.getFontName())
  28. && cr1.getFontSize() == cr2.getFontSize()
  29. && cr1.getColor() == cr2.getColor();
  30. }
  31. public static String getSpicalSysbom(char currentChar) {
  32. String tempStr = "";
  33. if (currentChar == ENTER_ASCII) {
  34. tempStr += "<br/>";
  35. } else if (currentChar == SPACE_ASCII) {
  36. tempStr += "&nbsp;";
  37. } else if (currentChar == TABULATION_ASCII) {
  38. tempStr += "&nbsp;&nbsp;&nbsp;";
  39. } else {
  40. tempStr += currentChar;
  41. }
  42. return tempStr;
  43. }
  44. public static String getSpicalSysbomSpan(char currentChar) {
  45. String tempStr = "";
  46. if (currentChar == ENTER_ASCII) {
  47. tempStr += "<br/>";
  48. } else if (currentChar == SPACE_ASCII) {
  49. tempStr += "&nbsp;";
  50. } else if (currentChar == TABULATION_ASCII) {
  51. tempStr += "&nbsp;&nbsp;&nbsp;";
  52. }
  53. return tempStr;
  54. }
  55. /**
  56. * 特殊字符的取代
  57. * @param currentChar
  58. * @return
  59. */
  60. public static String getSpicalSysbomByRun(String currentChar) {
  61. StringBuffer tempStr = new StringBuffer();
  62. int length = currentChar.length();
  63. for (int i = 0; i < length; i++) {
  64. tempStr.append(getSpicalSysbom(currentChar.charAt(i)));
  65. }
  66. return tempStr.toString();
  67. }
  68. /**
  69. * span方式前缀
  70. * @param cr
  71. * @return
  72. */
  73. public static String toSpanType(CharacterRun cr) {
  74. StringBuffer spanStyle = new StringBuffer("<span style='font-family:");
  75. spanStyle.append(cr.getFontName()).append("; font-size:")
  76. .append(cr.getFontSize() / 2).append("pt;");
  77. if (cr.isBold())
  78. spanStyle.append("font-weight:bold;");
  79. if (cr.isItalic())
  80. spanStyle.append("font-style:italic;");
  81. if (cr.isStrikeThrough())
  82. spanStyle.append("text-decoration:line-through;");
  83. if (cr.getUnderlineCode() != 0)
  84. spanStyle.append("text-decoration:underline;");
  85. spanStyle.append("color:")
  86. .append(ColorUtils.getHexColor(cr.getIco24())).append(";")
  87. .append("'>");
  88. return spanStyle.toString();
  89. }
  90. /**
  91. * 为font方式提供<font前缀
  92. * @param cr
  93. * @return
  94. */
  95. public static String fontFaceColorSizeToHtml(CharacterRun cr) {
  96. StringBuffer htmlType = new StringBuffer("<font ");
  97. htmlType.append("size='").append(cr.getFontSize() / 2).append("' ")
  98. .append("face='").append(cr.getFontName()).append("' ")
  99. .append("color='")
  100. .append(ColorUtils.getHexColor(cr.getIco24())).append("'>");
  101. return htmlType.toString();
  102. }
  103. /**
  104. * 处理上下标
  105. * @param cr
  106. * @param currentChar
  107. * @return
  108. */
  109. public static String toSupOrSub(CharacterRun cr, String currentChar) {
  110. int sub = cr.getSubSuperScriptIndex();
  111. if (sub != 0) {
  112. if (sub == 1)
  113. // 上标
  114. return "<sup>" + currentChar + "</sup>";
  115. else
  116. // 下标
  117. return "<sub>" + currentChar + "</sub>";
  118. } else
  119. return currentChar;
  120. }
  121. public static String toSupOrSub(CharacterRun cr, char currentChar) {
  122. return toSupOrSub(cr, new String(new char[]{currentChar}));
  123. }
  124. }

用到的颜色的转换(进行简单的颜色转换)

Java代码  
  1. public class ColorUtils {
  2. public static int  red(int c) {
  3. return c & 0XFF;
  4. }
  5. public static int green(int c) {
  6. return (c >> 8) & 0XFF;
  7. }
  8. public static int blue(int c) {
  9. return (c >> 16) & 0XFF;
  10. }
  11. public static int rgb(int c) {
  12. return (red(c) << 16) | (green(c) <<8) | blue(c);
  13. }
  14. public static String rgbToSix(String rgb) {
  15. int length = 6 - rgb.length();
  16. String str = "";
  17. while(length > 0){
  18. str += "0";
  19. length--;
  20. }
  21. return str + rgb;
  22. }
  23. public static String getHexColor(int color) {
  24. color = color == -1 ? 0 : color;
  25. int rgb = rgb(color);
  26. return "#" + rgbToSix(Integer.toHexString(rgb));
  27. }
  28. }

Java读取word文件,字体,颜色相关推荐

  1. java读取word文件并设置其字体样式_Java读取word文件,字体,颜色(示例代码)

    在Android读取Word文件时,在网上查看时可以用tm-extractors,但好像没有提到怎么读取Word文档中字体的颜色,字体,上下标等相关的属性.但由于需要,要把doc文档中的内容(字体,下 ...

  2. Java 读取word文件的页数

    实现思路: 1,由于现有的插件读取word的页数不是很准确,于是将word文件转换为PDF文件 2,读取PDF文件的页数以获取word文件的页数 需要的插件:链接:https://pan.baidu. ...

  3. Java 读取 Word文档的字体、字号、文字颜色、文字背景、文字是否加粗或倾斜、文字下划线、段落等属性

    Work库:free spire.doc.jar 3.9.0 由于这个包比较大,maven依赖容易下载失败,故此提供百度云下载地址,下载地址在最下面         可支持读取字体.字号.文字颜色.文 ...

  4. java操作office和pdf文件java读取word,excel和pdf文档内容

    在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...

  5. Java POI 读取word文件

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 1.读取word 2003及word 2007需要 ...

  6. txt doc rtf html,JAVA读取WORD,EXCEL,PDF,TXT,RTF,HTML文件文本内容的方法示例.docx

    JAVA读取WORD,EXCEL,PDF,TXT,RTF,HTML文件文本内容的方法示例 JAVA读取WORD,EXCEL,PDF,TXT,RTF,HTML文件文本内容的方法示例??2012-06-2 ...

  7. java准确读取word文件页数

    转自:https://blog.csdn.net/tiandixuanwuliang/article/details/71298406 由于本人在做一个网上打印网站,遇到了一个需求是"准确读 ...

  8. Java获取文档页数_java准确读取word文件页数

    由于本人在做一个网上打印网站,遇到了一个需求是"准确读取word文件页数,从而实现计费功能",通过很长时间的学习.查资料后,终于解决了这个问题,因此把方法写出来,方便有同样需求的人 ...

  9. java读取word中的英语音标(Kingsoft Phonetic Plain字体的)

    java读取word中的英语音标(Kingsoft Phonetic Plain字体的) 代码: 读取word中的文档遇到了带音标的,Kingsoft Phonetic Plain这种字体在后台打断点 ...

最新文章

  1. hadoop上的pageRank算法
  2. ie对java的设置字体,css3文字特效和浏览器兼容性
  3. JS权威指南阅读笔记
  4. 强大的PHP给图片加水印
  5. asp.net生成高质量缩略图通用函数
  6. Python初学者的资源总结
  7. GAOT工具箱设置交叉概率和变异概率
  8. web前端简历个人技能该怎么写?
  9. Linux常见Bug解决方案
  10. Swagger报错:missed comma between flow collection entries
  11. 有搜python题目的软件吗_Python开发及应用-中国大学mooc-试题题目及答案
  12. 牛客网 2018年全国多校算法寒假训练营练习比赛(第二场) A.吐泡泡-STL(stack)
  13. centos7 后端部署文档
  14. The first day。
  15. STM32的介绍及MDK
  16. Barsetto百胜图BAV02自助咖啡机,创造便捷生活的无限可能
  17. 数据结构与常用集合总结
  18. AIoT-人工智能物联网
  19. mint-ui 图片懒加载及请求数据加载中提示方法
  20. JSP: Taglib

热门文章

  1. 长语音识别体验_如何为语音体验写作
  2. 一道很熟悉的前端面试题,你怎么答?
  3. 面试官问 async、await 函数原理是在问什么?
  4. checkPathValidity 检查所有agent的corridor的m_path是否有效
  5. cs-Panination
  6. Android 中文api (81)——InputMethod [输入法]
  7. 中兴a2018拆机图片_中兴天机拆机步骤详解【图文】
  8. 四叶草社交平台——十天冲刺(10)
  9. 【原理图操作】原理图更新PCB时未改动元器件布局变动问题?
  10. C语言学习笔记--函数与指针