`
zhangzcz1999
  • 浏览: 148201 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

(转)Word文档解析介绍(using Jacob & HtmlParser)

阅读更多
Java中Word的解析方法据我了解有多种,如通过jacob调用office com组件处理Word文档对象,这里介绍的方法是结合jacob与HtmlParser解析word文档内容,希望对利用该方法解析word的网友有帮助。

1. word转换为html
    这里使用Jacob实现word到html的转换。Jacob的使用这里就不详述了,不过前提条件是服务器端需要安装微软的Office(当然操作系统也需要是微软家的)。word转换为html功能写在工具类Word2Html中(类似的做法网络上有很多介绍),这样针对word的解析转换为对html的解析。



2. 解析html(using HtmlParser)
    在介绍html解析前,有必要说明一下word文档的内容结构。

    对一份有标题编号的word文档来说,从首页至尾页以编号为依据可以看作是一棵深度遍历树,相邻编号之间是父子或兄弟关系,编号所在的层次通过标题格式定 义。另外,文档中可以认为是结构化的内容包括:各种约定格式的标题、表格、约定格式的段落、项目符号 和 编号。转换为html后,利用HtmlParser可以方便地解析这些结构化的数据。如果解析出来的数据要求保持父子关系的引用,则需要记录解析对象在html文档中的位置,HtmlParser有提供这些功能。

    在HtmlParser API中,识别节点主要通过标签名称构造过滤器(NodeFilter)得到NodeList,在处理NodeList中的Node,关于HtmlParser介绍可以参考 http://htmlparser.sourceforge.net/

    下面介绍应用HtmlParser解析html常用元素的一些通用方法,这些方法封装在抽象类AbstractHtmlParser中,下面针对一些常用方法进行说明(详见附件):

    1. 获取一个节点下所有的text

protected String getAllTextInNode(Node node) {
		StringBuffer sb = new StringBuffer();
		if (node instanceof TextNode) {
			TextNode textNode = (TextNode) node;
			String text = textNode.getText().trim();
			if (!StringUtil.isEmpty(text)) {
				sb.append(text.replace(" ", " ").replace(">", ">")
						.replace("&lt;", "<").replace("&quot;", "\"").replace(
								"&amp;", "&").replace("&apos;", "'"));
			}
		} else if (node instanceof RemarkNode) {
			// do nothing
		} else if (node instanceof TagNode) {
			TagNode tagNode = (TagNode) node;
			NodeList nl = tagNode.getChildren();
			if (null != nl) {
				for (SimpleNodeIterator i = nl.elements(); i.hasMoreNodes();) {
					sb.append(getAllTextInNode(i.nextNode()));
				}
			}
		}
		return sb.toString();
	}
 

    2. 解析带有表头的表格,返回List<Map<String, String>>

编码编码名称描述
18k
216k
332k
4


/**
	 * 以表第一行(带有thead元素)作为表头,后续行为List,首行作为List中Map的key,后续行每列作为该Map的value。<br>
	 * 后续行如果列数与表头不匹配,将终止处理。
	 * <p>
	 * @param table
	 * @return
	 */
	protected List<Map<String, String>> getListFromTheadTable(Node table) {
		List<Map<String, String>> result = new ArrayList<Map<String,String>>();
		TagNameFilter theadFilter = new TagNameFilter(TAG_THEAD);
		NodeList theadList = table.getChildren().extractAllNodesThatMatch(
				theadFilter);
		TagNode theadNode = null;
		if (theadList != null && theadList.size() > 0) {
			theadNode = (TagNode)theadList.elementAt(0);
		}
		if (theadNode == null) {
			return result;
		}
		
		// process rows following <thead>
		HasSiblingFilter theadSibFilter = new HasSiblingFilter(theadFilter);
		AndFilter andFilter = new AndFilter(new TagNameFilter(TAG_TR), theadSibFilter);
		NodeList trNodeList = table.getChildren().extractAllNodesThatMatch(new TagNameFilter(TAG_TR));
		String[] keys = getTdTextInRow(trNodeList.elementAt(0));
		for (int i=1; i<trNodeList.size(); i++) {
			Map<String, String> map = new HashMap<String, String>();
			String [] values = getTdTextInRow(trNodeList.elementAt(i));
			if (values.length != keys.length) {
				break; // 后续行如果列数与表头不匹配,将终止处理后续行
			}
			for (int k=0; k<keys.length; k++) {
				map.put(keys[k], values[k]);
			}
			result.add(map);
		}

		return result;
	}


    3. 解析获取形如下Table的数据对,返回Map<String, String> :

编号 0001 名称 卡状态
编码长度 2 发布序号 01
说明



/**
	 * @param table
	 * @return
	 */
	protected Map<String, String> getMapFormTable(Node table) {
		Map<String, String> result = new HashMap<String, String>();
		NodeList trNodeList = table.getChildren();
		for (SimpleNodeIterator trIter = trNodeList.elements(); trIter
				.hasMoreNodes();) {
			Node trNode = trIter.nextNode();
			if (!isNodeType(trNode, TAG_TR)) {
				continue;
			}
			NodeList tdNodeList = trNode.getChildren();
			Node tdKeyNode = tdNodeList.elementAt(0);
			Node tdValNode = null;
			while (true) {
				if (!isNodeType(tdKeyNode, TAG_TD)) {
					tdKeyNode = getNextSiblingNode(tdKeyNode, TAG_TD);
					continue;
				}
				tdValNode = getNextSiblingNode(tdKeyNode, TAG_TD);
				if (null == tdValNode) {
					break;
				}
				result.put(getAllTextInNode(tdKeyNode),
						getAllTextInNode(tdValNode));

				tdKeyNode = getNextSiblingNode(tdValNode, TAG_TD);
				if (null == tdKeyNode) {
					break;
				}
			}
		}
		return result;
	}
   


    4. 获取一行中td标记包含的text,返回String[]
/**
	 * 获取一行中td标记包含的text,返回String[]
	 * 
	 * @param trNode
	 * @return
	 */
	protected String[] getTdTextInRow(Node trNode) {
		if (!isNodeType(trNode, TAG_TR)) {
			return null;
		}
		List<String> values = new ArrayList<String>();
		NodeList tdNodeList = trNode.getChildren().extractAllNodesThatMatch(
				new TagNameFilter(TAG_TD));
		for (SimpleNodeIterator it = tdNodeList.elements(); it.hasMoreNodes();) {
			values.add(getAllTextInNode(it.nextNode()));
		}
		return values.toArray(new String[] {});
	}
 
    5. 在指定父节点下查找指定TagName的子孙节点,按照深度遍历返回第一个TagName的子孙节点

/**
	 * 在指定父节点下查找指定TagName的子孙节点,按照深度遍历返回第一个TagName的子孙节点
	 * 
	 * @param parent
	 * @param tagName
	 * @return
	 */
	protected Node getNodeInChildren (Node parent, String tagName) {
		if (parent == null) {
			return null;
		}
		NodeList children = parent.getChildren();
		if (children == null) {
			return null;
		}
		for (SimpleNodeIterator it=children.elements(); it.hasMoreNodes(); ) {
			Node child = it.nextNode();
			if (child instanceof TagNode) {
				if (tagName.equalsIgnoreCase(((TagNode) child).getTagName())) {
					return child;
				} else {
					return getNodeInChildren(child, tagName);
				}
			}
		}
		return null;
	}
分享到:
评论

相关推荐

    jacob以目录和段落分析读取Word文档(自己写的)

    在这个场景下,我们将详细探讨如何利用Jacob来分析和处理Word文档,特别是目录、段落以及它们之间的关系。 首先,标题和目录在Word文档中起着组织和导航的作用。Jacob提供了API,可以让我们访问到Word文档的内置...

    jacob 操作word 文档详解

    在本文中,我们将详细介绍如何使用 Jacob 库来操作 Word 文档。 Jacob 库的基本概念 在使用 Jacob 库之前,需要了解一些基本概念。Jacob 库使用了 COM 组件来访问 Word 应用程序。COM 组件是一个软件组件模型,...

    Java 实现word文件增加图片水印 jacob实现 用到的jar

    总结,通过结合iTextPDF和Jacob这两个库,Java开发者可以在Word文档中添加图片水印,从而实现对文档的个性化定制和保护。这种方法需要对Java、COM组件以及Word API有一定的理解,但是一旦掌握,就可以灵活地处理各种...

    (转)Java jacob调用打印机打印word文档

    在这个特定的情况下,Jacob被用来调用打印机来打印Word文档。这个过程涉及到几个关键的知识点: 1. **Jacob库**:Jacob全称为Java COM Bridge,是一个开源的Java库,通过JNI(Java Native Interface)技术实现,...

    Jacob操作word 文档的方法集!(含创建目录),使用的Jacob版本是1.5

    在这个“Jacob操作word文档的方法集”中,我们将探讨如何使用Jacob 1.5版本来创建和操作Word文档,特别是创建目录。 首先,为了使用Jacob,你需要在你的项目中添加Jacob的jar文件。这通常涉及到将库添加到项目的类...

    Jacob实现word转PDF之格式最美转化

    在这个场景中,我们使用Jacob来实现Word文档到PDF的转换,以保持格式的一致性和美观性。在转换过程中,确保你的计算机上已经安装了Office 2010或更高版本,因为较低版本可能无法支持某些功能,导致转换失败或出现...

    java操作word:jacob(方法解析+环境配置)

    通过上述介绍和示例代码,可以看出使用Jacob来操作Word文档是非常方便的。开发者只需要几个简单的步骤就能实现Word文档的创建、编辑、保存等功能。这对于需要自动化处理大量文档的应用场景非常有用,如报表生成、...

    Jacob处理Word文档搞定了

    载Jacob_1.11_zip,终于把Jacob处理Word文档搞定了

    Java读取Word文档页数

    本主题将深入探讨如何利用给定的`itextpdf-5.5.9.jar`和`jacob.jar`这两个库来实现Java读取Word文档页数的功能。 `jacob.jar`是一个Java到COM桥接库,它允许Java应用程序调用Microsoft Office组件,如Word,从而...

    jacob操作word文档

    在IT行业中, Jacob是一个强大的Java库,用于与Microsoft Office应用程序进行交互,特别是Word文档的处理。这个库允许Java开发者在不使用COM(组件对象模型)的情况下,直接在Java程序中控制Word应用程序,实现对...

    SSM+freemaker+jacob实现生成word文档并转换为PDF 另一个是错的

    错误可能出现在生成Word文档、使用Jacob操作Word,或者转换为PDF的任一阶段。可能的原因包括但不限于: 1. FreeMarker模板语法错误:模板中的表达式或控制结构可能有误。 2. 数据绑定问题:Java代码未能正确地将...

    利用Jacob 实现了word转PDF

    以下是对利用Jacob实现Word转PDF的详细说明: 1. **Jacob库介绍**: Jacob是一个Java到COM桥接器,它使得Java开发者能够使用COM组件,如Microsoft Office的Word应用,来执行特定的任务。Jacob通过JNI(Java Native...

    jacob 导出word 整理

    以下将详细介绍如何使用Jacob库来导出Word文档。 1. **Jacob库的安装与配置** 首先,你需要下载Jacob的JAR文件,并将其添加到项目的类路径中。此外,还需要在系统环境变量中设置`JAVA_DLL_PATH`,指向Jacob的动态...

    jacob读取word表格

    标题“jacob读取word表格”涉及到的是使用Jacob库来操作Microsoft Word文档,特别是从中读取表格数据。Jacob是一个Java到COM桥接库,允许Java应用程序调用COM组件,如Microsoft Office的应用程序。 在Java中,直接...

    jacob操作word转换成pdf

    在这个场景中,我们将讨论如何利用JACOB将Word文档转换为PDF。 首先,我们需要理解JACOB的工作原理。JACOB是通过Java的JNI(Java Native Interface)来调用COM接口的,这样就可以在Java代码中直接操纵COM对象,例如...

    java将word转图片转pdf_jacob.zip

    本项目“java将word转图片转pdf_jacob.zip”是关于利用Java进行文档格式转换的一个实例,主要涉及的技术点包括Java与Microsoft Office文档的交互以及图片和PDF的生成。 首先,我们需要了解Java中的Jacob库。Jacob...

    java使用jacob通过模板生成word文档完整项目

    Java使用Jacob库通过模板生成Word文档是一个常见的技术实践,尤其在企业级应用中,这种技术常用于批量生成报告、合同等文档。Jacob全称为Java Advanced COM Bridge,它为Java提供了与COM组件交互的能力,让我们可以...

    jacob给Word文档添加页脚

    本文将详细介绍如何使用jacob控件在Word文档中添加动态页脚,实现页码的自动生成与更新。 #### jacob简介 jacob(Java COM Bridge)是一款开源库,它允许Java程序调用Windows平台上的COM对象。通过jacob,开发人员...

    通过jacob实现word转为HTML

    在IT行业中,转换文档格式是一项常见的任务,例如将Word文档转换为HTML网页。"通过jacob实现word转为HTML"这个主题就是关于如何利用Java的一个库——Jacob来完成这项工作。Jacob是一个Java到COM桥接库,允许Java程序...

Global site tag (gtag.js) - Google Analytics