Word文档转html并提取标题
最近做了一个功能,需要将word文档转化成html的格式,并提取出标题生成导航。考虑到功能的复杂程度,将需要降低为对“标题1”这种格式进行提取。
docx为后缀的文档(word2007)支持XML的文件格式,本质上是一个zip压缩包,解压出来就可以看到所有信息,可能正因为如果,使用XHTMLConverter便可以得到对应的html文档,且标题元素的class属性被标注为"X"+n(n为标题层级)。
但doc文档但相对麻烦,doc文档一般使用poi读取,用的比较多的html转换方式是使用poi中的WordToHtmlConverter进行转换,这个转换器并不会对标题进行特殊处理,将其当做普通有样式的一个段落(Paragraph)进行处理,因此会和其他普通段落混合在一起。对此有两种处理方法:
方案一:重写processParagraph方法,在注释的判断处加上对标题的判断,对标题进行特殊处理,但由于WordToHtmlConverter的成员变量均声明为private,因此我采用了另一种方案。
protected void processParagraph(HWPFDocumentCore hwpfDocument, Element parentElement, int currentTableLevel, Paragraph paragraph, String bulletText) {
Element pElement = this.htmlDocumentFacade.createParagraph();
parentElement.appendChild(pElement);
StringBuilder style = new StringBuilder();
WordToHtmlUtils.addParagraphProperties(paragraph, style);
int charRuns = paragraph.numCharacterRuns();
if(charRuns != 0) {
CharacterRun characterRun = paragraph.getCharacterRun(0);
String pFontName;
int pFontSize;
if(characterRun != null) {
Triplet triplet = this.getCharacterRunTriplet(characterRun);
pFontSize = characterRun.getFontSize() / 2;
pFontName = triplet.fontName;
WordToHtmlUtils.addFontFamily(pFontName, style);
WordToHtmlUtils.addFontSize(pFontSize, style);
} else {
pFontSize = -1;
pFontName = "";
}
this.blocksProperies.push(new WordToHtmlConverter.BlockProperies(pFontName, pFontSize));
try {
if(WordToHtmlUtils.isNotEmpty(bulletText)) {
if(bulletText.endsWith("\t")) {
float defaultTab = 720.0F;
float firstLinePosition = (float)(paragraph.getIndentFromLeft() + paragraph.getFirstLineIndent() + 20);
float nextStop = (float)(Math.ceil((double)(firstLinePosition / 720.0F)) * 720.0D);
float spanMinWidth = nextStop - firstLinePosition;
Element span = this.htmlDocumentFacade.getDocument().createElement("span");
this.htmlDocumentFacade.addStyleClass(span, "s", "display: inline-block; text-indent: 0; min-width: " + spanMinWidth / 1440.0F + "in;");
pElement.appendChild(span);
Text textNode = this.htmlDocumentFacade.createText(bulletText.substring(0, bulletText.length() - 1) + '\u200b' + ' ');
span.appendChild(textNode);
} else {
Text textNode = this.htmlDocumentFacade.createText(bulletText.substring(0, bulletText.length() - 1));
pElement.appendChild(textNode);
}
}
this.processCharacters(hwpfDocument, currentTableLevel, paragraph, pElement);
} finally {
this.blocksProperies.pop();
}
// 此处需要修改
if(style.length() > 0) {
this.htmlDocumentFacade.addStyleClass(pElement, "p", style.toString());
}
WordToHtmlUtils.compactSpans(pElement);
}
}
方案二:在word文档中进行埋点,然后在处理过后的html文档中根据itTitleMap进行再处理
private Map<String,String> setTitleElements(HWPFDocument wordObject ){
// 获取样式表
StyleSheet styleSheet = wordObject.getStyleSheet();
int styleTotal = wordObject.getStyleSheet().numStyles();
// 使用map映射存储标题信息
Map<String,String> idTitleMap = Maps.newHashMap();
Range range = wordObject.getRange();
for (int i = 0; i < range.numParagraphs(); i++) {
// 获取样式信息
Paragraph paragraph = range.getParagraph(i);
int styleIndex = paragraph.getStyleIndex();
if (styleTotal > styleIndex) {
StyleDescription styleDescription = styleSheet.getStyleDescription(styleIndex);
String descriptionName = styleDescription.getName();
if ( descriptionName != null && descriptionName.contains(FIRST_LEVEL_TITLE_DESCRIPTION)) {
String uuid = UUIDHelper.getUuid();
String text = paragraph.text().replaceAll( "[\r\n]", "" );
paragraph.replaceText( uuid, false );
idTitleMap.put( uuid, text );
}
}
}
return idTitleMap;
}
Word文档转html并提取标题的更多相关文章
- java对word文档的操作(提取标题和内容等)-直接操作或poi工具包或freemarker+xml或html转word
1,java自带工具包实现对word的排版和写入 import java.awt.Color; import java.io.FileNotFoundException; import java.io ...
- C# Word文档中插入、提取图片,文字替换图片
Download Files:ImageOperationsInWord.zip 简介 在这篇文章中我们可以学到在C#程序中使用一个Word文档对图像的各种操作.图像会比阅读文字更有吸引力,而且图像是 ...
- 用java语言通过POI实现word文档的按标题提取
最近有一个项目需要将一个word文档中的数据提取到数据库中.就去网上查了好多资料,最靠谱的就是用poi实现word文档的提取. 喝水不忘挖井人,我查了好多资料就这个最靠谱,我的这篇博客主要是借鉴htt ...
- java读取word文档,提取标题和内容
使用的工具为poi,需要导入的依赖如下 <dependency> <groupId>org.apache.poi</groupId> <artifactId& ...
- C# 提取Word文档中的图片
C# 提取Word文档中的图片 图片和文字是word文档中两种最常见的对象,在微软word中,如果我们想要提取出一个文档内的图片,只需要右击图片选择另存为然后命名保存就可以了,今天这篇文章主要是实现使 ...
- word文档标题级别批量更改——批量降级与升级实例
word文档标题级别批量更改——批量降级与升级实例 word文档标题级别批量更改——批量降级实例 2012年12月21日16:30:44 现有一个3级文档结构的word文档,如下图所示 先需要将上 ...
- 读取Word文档的标题
一:描述,将读取的文档标题添加到下拉框中 二:代码 #region 方法:得到Word文档标题的内容 public static List<string> GetTitles(int j, ...
- 使用Java POI来选择提取Word文档中的表格信息
通过使用Java POI来提取Word(1992)文档中的表格信息,其中POI支持不同的ms文档类型,在具体操作中需要注意.本文主要是通过POI来提取微软2003文档中的表格信息,具体code如下(事 ...
- 在word文档里提取出所有的邮箱地址
怎样在word文档里提取出所有的邮箱地址 文档内容太多,邮箱也有很多,一个个复制粘贴太浪费时间,怎样把这些邮箱简单的提取出来 答案:用查找功能. 查找目标:[A-z,0-9]{1,}\@[A-z,0 ...
随机推荐
- js移动端滑倒顶部加载历史消息解决方案!
最近做了一个语音直播聊天的项目,有一个功能是当没有直播时,进入房间可以查看历史消息,滑动到顶部加载之前的历史消息,我用jquery scroll事件,来判断是否滚动到顶部,问题来了: 首先触发请求事件 ...
- Python学习笔记--迭代
在Python中,迭代是通过for ... in来实现.只要是可迭代的对象都可以用for ... in来进行历遍. 常用的有list.tuple.dict等.举例如下: 列表的迭代: L=[1,2,3 ...
- JZOJ 3518. 【NOIP2013模拟11.6A组】进化序列(evolve)
3518. [NOIP2013模拟11.6A组]进化序列(evolve) (File IO): input:evolve.in output:evolve.out Time Limits: 1000 ...
- MacOS麦克风输入监听的方法
Windows上很多人都知道,然而实际上并没什么用——延迟太大,根本没法用. MacOS上有两种方法: QuickTime Player新建音频录制(不需要真的录音),如下图: 这个方法和Window ...
- GPS北斗NTP校时服务器原理及功能介绍
在科技的发展下GPS北斗NTP校时服务器也得到了广泛应用,比如工业.科研.航空航天.公共场所等领域都用到了GPS北斗NTP校时服务器,该时间服务器以卫星时间为基准授时准确,替代了传统钟表授时的单一和时 ...
- 编译 openwrt 及初始配置
主机为 ubuntu 14 x64 硬件: 优酷土豆宝 cpuMT7620A,内存128M,flash 32M有2个源,用哪个也可以git clone https://github.com/openw ...
- python之二分法求平方根
前几天学完python的程序分支结构后,老师课后留了一个问题,用两种方法计算一个大于或等于 1 的实数 n 数的平方根. 描述设计一个用二分法计算一个大于或等于 1 的实数 n 的平方根的函数sqrt ...
- Linux启动nginx时报错nginx: [emerg] getpwnam("nginx") failed
编译时指定了用户而没有创建用户导致报错 解决: 查看你添加的用户是什么, [root@localhost nginx]# sbin/nginx -Vnginx version: nginx/1.10. ...
- hdu(杭电oj)输入输出练习题目总结
1000.1001 .1089.1090.1091.1092.1093.1094.1095.1096
- iview mock main.js
main.js // 实际打包时应该不引入mock /* eslint-disable */ // if (process.env.NODE_ENV !== 'production') require ...