最近做了一个功能,需要将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并提取标题的更多相关文章

  1. java对word文档的操作(提取标题和内容等)-直接操作或poi工具包或freemarker+xml或html转word

    1,java自带工具包实现对word的排版和写入 import java.awt.Color; import java.io.FileNotFoundException; import java.io ...

  2. C# Word文档中插入、提取图片,文字替换图片

    Download Files:ImageOperationsInWord.zip 简介 在这篇文章中我们可以学到在C#程序中使用一个Word文档对图像的各种操作.图像会比阅读文字更有吸引力,而且图像是 ...

  3. 用java语言通过POI实现word文档的按标题提取

    最近有一个项目需要将一个word文档中的数据提取到数据库中.就去网上查了好多资料,最靠谱的就是用poi实现word文档的提取. 喝水不忘挖井人,我查了好多资料就这个最靠谱,我的这篇博客主要是借鉴htt ...

  4. java读取word文档,提取标题和内容

    使用的工具为poi,需要导入的依赖如下 <dependency> <groupId>org.apache.poi</groupId> <artifactId& ...

  5. C# 提取Word文档中的图片

    C# 提取Word文档中的图片 图片和文字是word文档中两种最常见的对象,在微软word中,如果我们想要提取出一个文档内的图片,只需要右击图片选择另存为然后命名保存就可以了,今天这篇文章主要是实现使 ...

  6. word文档标题级别批量更改——批量降级与升级实例

    word文档标题级别批量更改——批量降级与升级实例   word文档标题级别批量更改——批量降级实例 2012年12月21日16:30:44 现有一个3级文档结构的word文档,如下图所示 先需要将上 ...

  7. 读取Word文档的标题

    一:描述,将读取的文档标题添加到下拉框中 二:代码 #region 方法:得到Word文档标题的内容 public static List<string> GetTitles(int j, ...

  8. 使用Java POI来选择提取Word文档中的表格信息

    通过使用Java POI来提取Word(1992)文档中的表格信息,其中POI支持不同的ms文档类型,在具体操作中需要注意.本文主要是通过POI来提取微软2003文档中的表格信息,具体code如下(事 ...

  9. 在word文档里提取出所有的邮箱地址

    怎样在word文档里提取出所有的邮箱地址 文档内容太多,邮箱也有很多,一个个复制粘贴太浪费时间,怎样把这些邮箱简单的提取出来  答案:用查找功能. 查找目标:[A-z,0-9]{1,}\@[A-z,0 ...

随机推荐

  1. Java基础:浅谈数据输入流/数据输出流《DataInputstream类与DataOutputstream类》

     一.理论概述 数据输入/输出流(DataInputStream类与DataOutputStream类) 允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型. 说白了就是,当读取一个 ...

  2. 三个值得期待的JavaScript新功能!

    让我们来看看JavaScript中一些有用的即将推出的功能.您将看到他们的语法,链接以及时了解他们的进度,我们将编写一个小型测试套件,以展示如何立即开始使用这些提案! JavaScript是如何更新迭 ...

  3. moment太重? 那就试试miment--一个超轻量级的js时间库

    介绍 Miment 是一个轻量级的时间库(打包压缩后只有1K),没有太多的方法,Miment的设计理念就是让你以几乎为零的成本快速上手,无需一遍一遍的撸文档 由来 首先 致敬一下Moment,非常好用 ...

  4. iOS围绕某点缩放或旋转的AnchorPoint的设定

    经常会遇到需求,要求手势的缩放或者旋转操作,要求动作变化围绕某一个特定点,或者是两指的中心点,或者是某一个点. 这个问题首先要清晰的知道,iOS各个view的层次关系.特别是,要清除的知道,当前vie ...

  5. 17 Spring Data JPA的常用接口分析

    思考 在客户的案例中,我们发现在自定义的CustomerDao中,并没有提供任何方法就可以使用其中的很多方法,那么这些方法究竟是怎么来的呢?答案很简单,对于我们自定义的Dao接口,由于继承了JpaRe ...

  6. 2020ubuntu1804server编译安装redis笔记(三)启动服务和使用redis

    第一篇笔记记录了ubuntu1804server编译安装redis5,接下来要配置redis5了 网址:https://www.cnblogs.com/qumogu/p/12435694.html 第 ...

  7. LSP原则—关于正方形不是长方形

    长方形有二个属性长和宽.并有一个设置长的方法和设置宽的方法,还有一个求面积的方法. 像下面 private int length; private int width; public void set ...

  8. C语言程序设计(十) 字符串

    第十章 字符串 字符串常量是由一对双引号括起来的一个字符串序列 字符串实际就是由若干个有效数字构成且以字符'\0'作为结束的一个字符序列 C语言没有提供字符串数据类型,因此字符串的存取要用字符型数组来 ...

  9. 用Setuptools构建和分发程序包

    目录 使用Setuptools构建和分发软件包 开发人员指南 安装setuptools 基本使用 指定项目的版本 新增和更改的setup()关键字 包括数据文件 参考示例 使用Setuptools构建 ...

  10. 《ASP.NET Core 3框架揭秘》5折预售暨样章发布

    <ASP.NET Core 3框架揭秘>于昨天在下午京东正式开始预售,并在半天之内销售近一千套.为了回馈读者,出版社与京东谈了一个5折的价格.与此同时,我将本书最核心的内容作为样章(3章) ...