`
yq135314
  • 浏览: 253159 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

读取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 += "&nbsp;";
		} else if (currentChar == TABULATION_ASCII) {
			tempStr += "&nbsp;&nbsp;&nbsp;";
		} 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 += "&nbsp;";
		} else if (currentChar == TABULATION_ASCII) {
			tempStr += "&nbsp;&nbsp;&nbsp;";
		}
		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读取不同版本文档的内容以及字体大小,实现对文档格式进行匹配!

    qt操作word

    qt操作word 功能:读取word文档信息,包括文字内容,大小,颜色,字体;样式;字符间距;目录 ,把信息转换成字符串输出到txt文件

    VC++ 分析word文档的简单程序

    VC++ 分析 word文档 的 简单程序 VC++ 分析 word文档 的 简单程序 读取word文档内容 显示出来 读取字体颜色 字号,将读取内容保存到文本文件,

    .net导出word,word表格打印,设置word单元格两种颜色,.net导出报表word版,.net word操作

    对word操作,画表格,在单元格设计特别的字体颜色等等,具体教程请搜博客,标题

    WORD电子签名插件V1.2

    签名及签字对文档内容、文档字体颜色以及文档字体大小敏感,也就是说:修改文档内容、文档中任意字的字体颜色或大小,都会导致文档签名失效。这是个很重要的功能,不知大家有没有意识到。试想一下,如果对合同签字,...

    文字处理软件(Atlantis Word Processor) v3.2.13.7.zip

    软件功能强大,支持读取并编辑*.rtf *.doc *.docx *.cod *.txt等数种格式的文档,支持命令行,,并且软件的界面可以按照你的意愿自定义。Atlantis Word Processor使用方便,应用速度快,质量高,对于用户来说是一款...

    mammoth.js:将Word文档(.docx文件)转换为HTML

    例如,猛mm象会将Heading 1样式的任何段落转换为h1元素,而不是尝试完全复制Heading 1的样式(字体,文本大小,颜色等)。 .docx使用的结构与HTML的结构之间存在很大的不匹配,这意味着对于较复杂的文档而言,这种...

    PHPWord:一个纯PHP库,用于读写文字处理文档

    PHPWord是一个用纯PHP编写的库,它提供了一组用于读写不同文档文件格式的类。 当前版本PHPWord支持Microsoft (OOXML或OpenXML),OASIS(OpenDocument或ODF),(RTF),HTML和PDF。 PHPWord是根据的条款许可的...

    WNDocWebViewController - Word文档的重编排

    可以自定义文档字体颜色4. 可以自定义文档背景5. 记录并自动恢复上次已调整的字体大小#### github地址[ https://github.com/WeinanHu/WNDocWebViewController ]...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    主要内容有C#开发环境的使用、C#语言基础应用、字符串处理技术、数组和集合的使用、面向对象编程...文件、C#与Word互操作、高效应用Excel、基本图形绘制、图像处理技术、常用图表应用、动画处理技术、音频与视频控制...

    Python自动化开发-制作名片卡源代码

    在模板设计过程中,您可以考虑包括公司标识、颜色方案、字体选择等元素,以确保名片卡的专业外观和一致性。接下来,使用xlrd模块来读取Excel文件中的名片信息。通过xlrd,您可以轻松访问和提取Excel文件中的数据,为...

    关于Java使用EasyExcel导出动态数据为Excel文件SpringBoot代码项目示例

    2、若各位项目需求与本资源的样式相符度低,例如业务有渲染单元格颜色的,或者要求字体加粗,或者写入到多个Sheet页,或者设置列宽、行高,或者合并单元格,或者自动列宽,或者插入批注,或者读取Excel数据,又或者...

    Quickoffice Premier 6.03(16) s60v5 手机办公软件

    打开文档时会尽量保留原始信息:字体颜色、字体大小、字形等等。 一、该软件中Exel的特性: 1.可以打开并保存为原生Excel文档 2.包含了常用函数(科学、财务、常数、日期和时间、查找、加减等) 3.支持多重表和表间...

    C# RichTextBox制作文本编辑器

    Windows窗体中的RichTextBox控件用于显示,输入和操作格式化的文本,RichTextBox除了拥有TextBox控件的所有功能外,还可以显示字体,颜色,链接,从文件中读取和加载图像,以及查找指定的字符。RichTextBox控件通常...

    JAVA上百实例源码以及开源项目

     Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,得到Graphics实例,得到Image实例,填充颜色数组数据,初始化颜色数组。...

    WordSmith Tools

    支持从外置存储卡上直接读取、编辑文件 3.支持PalmOS 5 4.无Microsoft Word无缝整合 5.拼写检查程序和辞典功能 6.提供多平台的辅助转换工具 7.支持与PrintBoy配合打印文件 8.支持剪切、复制、粘贴、多重粘贴、全选、...

Global site tag (gtag.js) - Google Analytics