Java读取word文件,字体,颜色

在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.     }  
  34.       

 

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

 

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

 

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET 20周年软件趋势随想

从2000年微软启动.NET战略时&#xff0c;我还是一位大学生&#xff0c;当年著名的黑客Miguel de Icaza , Miguel 为了寻找GNOME项目开发框架经过充分的调研启动了一个志存高远的项目&#xff1a;Mono&#xff0c;一个Microsoft .NET Framework的自由GNU/Linux实现&#xff0c;我…

c++ console 取实时输入_灵活使用 console 让 js 调试更简单

译者&#xff1a;前端小智原文&#xff1a; https://medium.com/mattburgess/beyond-console-log-2400fdf4a9d8https://medium.freecodecamp.org/10-tips-to-maximize-your-javascript-debugging-experience-b69a75859329Web开发最常用的高度就是 console.log &#xff0c;虽然…

windows之DNS7种资源记录和flushdns命令清除DNS缓存以及nslookup解析域名和ipconfig/all命令查看网络配置使用总结

1、DNS7种资源记录 DNS分为正向查找区域和反向查找区域&#xff0c;然后在分为&#xff0c;主要&#xff0c;辅助&#xff0c;存根区域&#xff0c;在这些区域里&#xff0c;又存在着很多的记录&#xff0c;今天&#xff0c;就让我们来看看这些记录&#xff1a;1&#xff0c;A记…

第2章 C语言概述

学习笔记——《C Primer Plus》 第2章 C语言概述2.1 简单的C程序实例2.2 实例解释2.2.1 快速概要1. #include指令和头文件2. main() 函数3. 声明4. 赋值5. printf() 函数5. return 语句2.3 简单程序的结构2.4 多个函数2.1 简单的C程序实例 #include <stdio.h> int main(…

KMP学习

2019独角兽企业重金招聘Python工程师标准>>> 从头到尾彻底理解KMP 字符串匹配的KMP算法 KMP算法的Next数组详解 package leetcode;import java.util.Arrays;public class ImplementStrStr {public int strStr(String haystack, String needle) {if(haystacknull||ne…

MVC应用程序实现文件库(FlexPaper)

很久之前Insus.NET在实现了《FlexPaper实现文档在线浏览》http://www.cnblogs.com/insus/archive/2011/07/21/2112369.html。 当时也只是实现了显示而已&#xff0c;也没有实现在线转换功能。现在&#xff0c;Insus.NET已经从asp.net转向了asp.net MVC应用程序开发了。因此再想…

海量数据处理面试题集锦

十七道海量数据处理面试题与Bit-map具体解释作者&#xff1a;小桥流水&#xff0c;redfox66&#xff0c;July。前言本博客内以前整理过有关海量数据处理的10道面试题&#xff08;十道海量数据处理面试题与十个方法大总结&#xff09;&#xff0c;此次除了反复了之前的10道面试题…

java的linux执行的shell

2019独角兽企业重金招聘Python工程师标准>>> #!/bin/sh #该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用&#xff0c; #也可以作为启动java程序的独立脚本来使用。 # # #警告!!!&#xff1a;该脚本stop部分使用系统kill命…

统计 Github 2021 贡献过的开源项目

统计一下 2021 贡献过的开源项目Intro新的一年的开始了&#xff0c;有很多总结和回顾还没有做&#xff0c;今天就盘点一下贡献过的开源项目吧~起初想着手动地通过 Github Dashboard 来统计但是感觉有些麻烦&#xff0c;还得一个个地复制标题链接等&#xff0c;好麻烦&#xff0…

IntentService使用

说实话&#xff0c;对于这个类在我实际工作中并没有用到过&#xff0c;通常也只是用了它的父类Service&#xff0c;通过官方文档可以看出类的层次结构: 而在今年的一次面试当中&#xff0c;有个面试官提起了它&#xff0c;所以虽说目前还没有真实在项目中用它&#xff0c;但是有…

如何使用 Barracuda 防火墙设置/保护 Azure 应用程序

&#xfeff;&#xfeff;如果某企业在 Windows Azure 上托管某个应用程序&#xff0c;该应用程序会在某个特定时间暴露到 Internet&#xff0c;以用于商业用途。公共 Internet 带来客户的同时也带来了攻击者。 Tim Omta 发表的新博客文章中介绍了如何使用 PaaS 应用程序之前的…

Git 简单命令行指令

为什么80%的码农都做不了架构师&#xff1f;>>> 这些git命令来自gitlab的简单提示&#xff0c;挺人性化&#xff0c;记录下。 Git 全局设置 git config --global user.name "yourname" git config --global user.email "yournamemail.com" 创…

第4章 字符串和格式化输入/输出

学习笔记——《C Primer Plus》 第4章 字符串和格式化输入/输出4.1 前导程序4.2 字符串简介4.2.1 char 类型数组和 null 字符4.2.2 使用字符串4.2.3 strlen() 函数4.3 常量和 C 预处理器4.3.1 符号常量1. 使用**符号常量**的好处:2. 创建符号常量4.3.2 const 限定符4.3.3 转换说…

ios之第一个程序Hello word, I am chenyu !

1、下载Xcode 个人建议网上下载Xcode&#xff0c;快些&#xff0c;特么再应用商店下载像日了狗一样&#xff0c;还要填写资料&#xff0c; 最后资料没有写好&#xff0c;无效字符。2、新建项目 下载好了Xcode&#xff0c;一步一步往下点就行&#xff0c;然后create 项目然后找m…

小博老师解析Java核心技术 ——JSwing绘图技术

2019独角兽企业重金招聘Python工程师标准>>> [引言] 我们在学习Java编程的时候&#xff0c;如果需要开发客户端窗体类型的程序&#xff0c;可以使用JDK中的awt和swing库。本文开始小博老师就继续为大家演示Java窗体编程中的绘图技术&#xff0c;今天主要讲解绘图技术…

.NET6之MiniAPI(十三):健康检查

程序员开发程序&#xff0c;是“生”的过程&#xff0c;运维人员负责日常运维&#xff0c;是“养”的过程&#xff0c;在养的过程&#xff0c;运维人员希望在第一时间了解程序的状况&#xff0c;健康检查&#xff0c;是最基础的手段。var builder WebApplication.CreateBuilde…

linux之用 grep -r 关键字 快速搜索在目录下面的含有关键字的文件

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程 1、快速搜索在目录下面的含有关键字的文件 我们采用下面命令cd directoriesgrep -r 关键字2、搜索结果

python 抓包基于pypcap

2019独角兽企业重金招聘Python工程师标准>>> 1、查询python和python-dev是否安装 dpkg-query -l python dpkg-query -l python-dev #没安装就先安装 sudo apt-get install python python-dev 2、安装flex和bison sudo apt-get install flex bison3、下载libpcap并安…

推荐一个基于Dapr的 Red Dog 的完整微服务应用程序

微服务尽管构建起来非常困难&#xff0c;但它们已成为一种越来越流行的架构模式。随着开发人员开始将他们现有的单体代码库迁移到微服务系统&#xff0c;他们花费大量时间来处理分布式应用程序带来的固有挑战&#xff0c;例如状态管理和服务调用。通过引入Dapr 通过以 http/gRP…

基于事件的 NIO 多线程服务器

2019独角兽企业重金招聘Python工程师标准>>> JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程开销的问题&#xff0c;在 NIO 中使用多线程&#xff0c;主要目的已不是为了应对每个客户端请求而分配独立的服务线程&#xff0c;而是通过多线程充分使用用多个 CPU 的处…