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无效)
- /**Span样式
- * 通过字体的样式进行加载
- * @param inputStream
- * @return
- */
- public static String readDocToSpanByRun(InputStream inputStream) {
- HWPFDocument hwpfDocument = null;
- if(inputStream == null)
- throw new RuntimeException("inputStream is null ...");
- try{
- hwpfDocument = new HWPFDocument(inputStream);
- }catch(Exception e) {
- throw new RuntimeException("HWPFDocment Exception", e);
- }
- Range allRange = hwpfDocument.getRange();
- int length = allRange.numCharacterRuns();
- StringBuffer sb = new StringBuffer();
- CharacterRun cur;
- String text = "";
- for (int i = 0; i < length; i++) {
- cur = allRange.getCharacterRun(i);
- sb.append(CharacterRunUtils.toSpanType(cur));
- text = CharacterRunUtils.getSpicalSysbomByRun(cur.text());
- if(cur.getSubSuperScriptIndex() == 1)
- sb.append("<sup>").append(text).append("</sup>");
- else if(cur.getSubSuperScriptIndex() == 2)
- sb.append("<sub>").append(text).append("</sub>");
- else
- sb.append(text);
- sb.append("</span>");
- }
- return sb.toString();
- }
做法2:(解析为font样式的,Html.fromHtml有效,但对应size的设置无效果)
- /**
- * Html样式
- * 通过字体样式解析
- * @param inputStream
- * @return
- */
- public static String readDocToHtml(InputStream inputStream) {
- HWPFDocument hwpfDocument = null;
- if(inputStream == null)
- throw new RuntimeException("inputStream is null ...");
- try{
- hwpfDocument = new HWPFDocument(inputStream);
- }catch(Exception e) {
- throw new RuntimeException("HWPFDocment Exception", e);
- }
- CharacterRun cur = null;
- StringBuffer sb = new StringBuffer();
- StringBuffer charStr = new StringBuffer();
- Range allRange = hwpfDocument.getRange();
- for(int i = 0; i < allRange.numCharacterRuns(); i++) {
- cur = allRange.getCharacterRun(i);
- sb.append(CharacterRunUtils.fontFaceColorSizeToHtml(cur));
- charStr.append(CharacterRunUtils.toSupOrSub(cur, CharacterRunUtils.getSpicalSysbomByRun(cur.text())));
- if(cur.isBold()) {
- charStr.insert(0, "<b>");
- charStr.insert(charStr.length(), "</b>");
- }
- if(cur.getUnderlineCode() != 0) {
- charStr.insert(0, "<u>");
- charStr.insert(charStr.length(), "</u>");
- }
- if(cur.isItalic()) {
- charStr.insert(0, "<i>");
- charStr.insert(charStr.length(), "</i>");
- }
- if(cur.isStrikeThrough()) {
- charStr.insert(0, "<s>");
- charStr.insert(charStr.length(), "</s>");
- }
- sb.append(charStr).append("</font>");
- charStr.setLength(0);
- }
- hwpfDocument = null;
- return sb.toString();
- }
以下是会用到的方法:
- /**
- *处理字体相关的属性
- */
- public class CharacterRunUtils {
- private static final short ENTER_ASCII = 13;
- private static final short SPACE_ASCII = 32;
- private static final short TABULATION_ASCII = 9;
- /**
- * 比对字体是否相同
- * 可以继续加其它属性
- * @param cr1
- * @param cr2
- * @return
- */
- public static boolean compareCharStyleForSpan(CharacterRun cr1,
- CharacterRun cr2) {
- return cr1.isBold() == cr2.isBold()
- && cr1.getFontName().equals(cr2.getFontName())
- && cr1.getFontSize() == cr2.getFontSize()
- && cr1.isItalic() == cr2.isItalic()
- && cr1.getColor() == cr2.getColor()
- && cr1.getUnderlineCode() == cr2.getUnderlineCode()
- && cr1.isStrikeThrough() == cr2.isStrikeThrough()
- && cr1.getColor() == cr2.getColor();
- }
- public static boolean compareCharColor(CharacterRun cr1, CharacterRun cr2) {
- return cr1.getFontName().equals(cr2.getFontName())
- && cr1.getFontSize() == cr2.getFontSize()
- && cr1.getColor() == cr2.getColor();
- }
- public static String getSpicalSysbom(char currentChar) {
- String tempStr = "";
- if (currentChar == ENTER_ASCII) {
- tempStr += "<br/>";
- } else if (currentChar == SPACE_ASCII) {
- tempStr += " ";
- } else if (currentChar == TABULATION_ASCII) {
- tempStr += " ";
- } else {
- tempStr += currentChar;
- }
- return tempStr;
- }
- public static String getSpicalSysbomSpan(char currentChar) {
- String tempStr = "";
- if (currentChar == ENTER_ASCII) {
- tempStr += "<br/>";
- } else if (currentChar == SPACE_ASCII) {
- tempStr += " ";
- } else if (currentChar == TABULATION_ASCII) {
- tempStr += " ";
- }
- return tempStr;
- }
- /**
- * 特殊字符的取代
- * @param currentChar
- * @return
- */
- public static String getSpicalSysbomByRun(String currentChar) {
- StringBuffer tempStr = new StringBuffer();
- int length = currentChar.length();
- for (int i = 0; i < length; i++) {
- tempStr.append(getSpicalSysbom(currentChar.charAt(i)));
- }
- return tempStr.toString();
- }
- /**
- * span方式前缀
- * @param cr
- * @return
- */
- public static String toSpanType(CharacterRun cr) {
- StringBuffer spanStyle = new StringBuffer("<span style='font-family:");
- spanStyle.append(cr.getFontName()).append("; font-size:")
- .append(cr.getFontSize() / 2).append("pt;");
- if (cr.isBold())
- spanStyle.append("font-weight:bold;");
- if (cr.isItalic())
- spanStyle.append("font-style:italic;");
- if (cr.isStrikeThrough())
- spanStyle.append("text-decoration:line-through;");
- if (cr.getUnderlineCode() != 0)
- spanStyle.append("text-decoration:underline;");
- spanStyle.append("color:")
- .append(ColorUtils.getHexColor(cr.getIco24())).append(";")
- .append("'>");
- return spanStyle.toString();
- }
- /**
- * 为font方式提供<font前缀
- * @param cr
- * @return
- */
- public static String fontFaceColorSizeToHtml(CharacterRun cr) {
- StringBuffer htmlType = new StringBuffer("<font ");
- htmlType.append("size='").append(cr.getFontSize() / 2).append("' ")
- .append("face='").append(cr.getFontName()).append("' ")
- .append("color='")
- .append(ColorUtils.getHexColor(cr.getIco24())).append("'>");
- return htmlType.toString();
- }
- /**
- * 处理上下标
- * @param cr
- * @param currentChar
- * @return
- */
- public static String toSupOrSub(CharacterRun cr, String currentChar) {
- int sub = cr.getSubSuperScriptIndex();
- if (sub != 0) {
- if (sub == 1)
- // 上标
- return "<sup>" + currentChar + "</sup>";
- else
- // 下标
- return "<sub>" + currentChar + "</sub>";
- } else
- return currentChar;
- }
- public static String toSupOrSub(CharacterRun cr, char currentChar) {
- return toSupOrSub(cr, new String(new char[]{currentChar}));
- }
- }
用到的颜色的转换(进行简单的颜色转换)
- public class ColorUtils {
- public static int red(int c) {
- return c & 0XFF;
- }
- public static int green(int c) {
- return (c >> 8) & 0XFF;
- }
- public static int blue(int c) {
- return (c >> 16) & 0XFF;
- }
- public static int rgb(int c) {
- return (red(c) << 16) | (green(c) <<8) | blue(c);
- }
- public static String rgbToSix(String rgb) {
- int length = 6 - rgb.length();
- String str = "";
- while(length > 0){
- str += "0";
- length--;
- }
- return str + rgb;
- }
- public static String getHexColor(int color) {
- color = color == -1 ? 0 : color;
- int rgb = rgb(color);
- return "#" + rgbToSix(Integer.toHexString(rgb));
- }
- }
Java读取word文件,字体,颜色的更多相关文章
- java操作office和pdf文件java读取word,excel和pdf文档内容
在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...
- Java POI 读取word文件
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 1.读取word 2003及word 2007需要 ...
- [Java] Java读取Word文档
前言 最近需要做一些NLP 方面的工作,使用的是Java,在此总结一下使用Java读取Word(.doc)格式文件的方法. Apache基金会非常厉害,开源工具包POI就可以处理微软家的文档,甚至包括 ...
- java 读取word
读取word文件 import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import org ...
- java分享第十六天( java读取properties文件的几种方法&java配置文件持久化:static块的作用)
java读取properties文件的几种方法一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取Propert ...
- Java读取Excel文件的几种方法
Java读取 Excel 文件的常用开源免费方法有以下几种: 1. JDBC-ODBC Excel Driver 2. jxl.jar 3. jcom.jar 4. poi.jar 简单介绍: 百度文 ...
- Java读取txt文件
package com.loongtao.general.crawler.slave.utils; import java.io.BufferedReader; import java.io.File ...
- java 读取XML文件作为配置文件
首先,贴上自己的实例: XML文件:NewFile.xml(该文件与src目录同级) <?xml version="1.0" encoding="UTF-8&quo ...
- java 读取TXT文件的方法
java读取txt文件内容.可以作如下理解: 首先获得一个文件句柄.File file = new File(); file即为文件句柄.两人之间连通电话网络了.接下来可以开始打电话了. 通过这条线路 ...
随机推荐
- dubbox 增加google-gprc/protobuf支持
好久没写东西了,今年实在太忙,基本都在搞业务开发,晚上来补一篇,作为今年的收官博客.google-rpc 正式发布以来,受到了不少人的关注,这么知名的rpc框架,不集成到dubbox中有点说不过去. ...
- [LeetCode] Optimal Account Balancing 最优账户平衡
A group of friends went on holiday and sometimes lent each other money. For example, Alice paid for ...
- [LeetCode] Single Number 单独的数字
Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...
- 【原创】Chrome最新版(53-55)再次爆出BUG!
前言 今年十月份,我曾发布一篇文章<Chrome53 最新版惊现无厘头卡死 BUG!>,不过那个BUG在最新的 Chrome 54 中已经修正. 而今天即将发布的Chrome弱智BUG: ...
- swfit-学习笔记(表UITableView的简单使用)
/*使用与Object-C基本类似,只做简单地使用,创建表及其设置数据源和代理*/ import UIKit class ViewController: UIViewController,UITabl ...
- android studio 集成微信登录
参考: 1.http://blog.csdn.net/suma_sun/article/details/50752528 2.这个更全面一点 : http://www.jb51.net/article ...
- javascript关闭页面
var browserName=navigator.appName; if (browserName=="Netscape") { window.open('','_parent' ...
- shell及脚本2——shell 环境及命令
一.快捷键.通配符.特殊符号 1. 快捷键 CTRL+C:终止目前的命令 CTRL+D:输入结束,EOF CTRL+M:ENTER CTRL+S:暂停屏幕输出 CTRL+Q:恢复屏幕输出 CTRL+U ...
- 【UOJ #35】后缀排序 后缀数组模板
http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...
- WebAPI IIS PUT和DELETE请求失败 405
IIS拒绝PUT和DELETE请求是由于IIS为网站默认注册的一个名为WebDAVModule的自定义HttpModule导致的,如果我们的站点不需要提供针对WebDAV的支持,解决这个问题最为直接的 ...