Java 实现HTML富文本导出至word完美解决方案
一、 问题的提出
最近用java开发一个科技项目信息管理系统,里面有一个根据项目申请书的模板填写项目申报信息的功能,有一个科技项目申请书word导出功能。
已有的实现方式:采用标准的jsp模板输出实现,简单地说,就是把数据渲染进jsp页面,然后将此页面另存为doc文档,从而达到word导出效果。但是存在以下几个问题:
(1) 由于导出的html网页格式,打开word后,默认显示的视图模式为WEB版式视图;
(2) 修改word文档后,会新增一个相关联的文件夹,word的html中会引用这个文件夹中的资源,比如样式、图片、主题等;这样如果只转移word文档本身,会造成找不到相关联的资源。
(3) 由于我们有些字段内容是采用富文本编辑器(百度的UEditor)填写的,里面有附件的上传(主要是图片)。针对图片,HTML的img标签有一个src的属性,这个src是服务器的图片资源路径。这个如果要显示这个图片的话,客户的机器必须要保证联网,这样造成word不能离线存档。
(4) 这样导出的word打印出来的效果也是一塌糊涂,没法接受。
正因为有这些问题,急需寻找另外一种解决方案。
二、 可用方案
在网上查找资料,总结出两种比较可行的方案。
(1) 制作word模板,导出成mht文件(单页面网页格式),然后往模板里渲染数据,最终生成word文档。
(2) 制作word模板,导出成xml文件,然后往模板里渲染数据,最终生成word文档。
这两种都是采用模板的思想,模板的制作比较加单,比用poi去组织word格式简单的很多很多。唯一的不同点在于导出文件的格式不同,一个是mht文件,一个是xml文件。考虑到本项目中的项目申报书个别字段采用了富文本编辑器实现,保存进数据库中是html格式的字符串,所以我们采用第一种方案,即通过mht文件来实现。
三、 思路整理与分析
1. mht文件的文件存储结构分析
打开客户提供的项目申报书模板文件,如
,选择“另存为-》其他格式”菜单,选择“保存为mht文件(单网页文件)”,如下图所示:

保存后,用文本编辑器(UltraEdit或Sublime等)打开。打开后,有一些规律可循,具体关键的要点如下:
(1) mht文件的内容采用3Dus-ascii编码格式,里面的中文字符串都被编码成不可读的内容;
(2) mht是单网页文件,里面内嵌了很多资源内容,特别要注意的是图片资源。我们查找“image”,会找到“image001””image002”。。。。等相关的匹配值。针对每个图片(比如image002)有三个地方出现。
第一,在Html的<v:shape>标签中,如下

第二,在内嵌资源块中,对图片的内容采用base64编码。具体格式如下

第三,在文件的末尾部,有个<xml>标签,里面有个HRef属性标识,具体内容如下:

2. 具体的实现思路
(1) 制作word模板,用特定的模板引擎(我们用的freeMarker)的语法去生成占位符,然后导出出mht文件;
(2) 组织、处理数据,然后利用模板引擎去渲染模板。
(3) 将渲染后的结果保存为doc文件。
最重要的是第2个步骤中的处理数据。根据mht文件的格式要求,主要需要处理以下几个地方。
(1) 将字符串类型的数据编码成3Dus-ascii格式;
(2) 对富文本数据进行处理。主要是上述三个地方的处理,其一,对富文本的html中的img进行处理,转换成<v:shape>标签格式;其二,取出img的实际存储位置,将图片的内容按照base64进行编码,并将编码后内容添加进对应的位置;其三,在mht文件的末尾的xml标签中加入相关资源引入字符串。
四、 实现步骤及注意事项
1. 根据模板引擎的语法规则填入占位符制作word模板,保存为mht文件。

另存为mht文件后,需用文本编辑器打开,主要绑定语句不能断,比如${projectSbInfo.xmnamecn}另存为mht文件后,可能成了${projectSbInfo.=
xmnamecn}这个格式,需手动再修改一下。
另外还需在mht文件中插入图片资源的base64及xml 的href引用的占位。如下图


2. 组织、处理数据
一般的属性数据组织起来简单,无非就是从数据库中获取,处理也简单。这里要特别注意以下数据的处理。
(1) html中image元素的处理。处理流程如下:

(2) 由于mht文件是采用的是“us-ascii”编码,属性后面都必须带有3D前缀。所以包含html内容的需进行一下替换操作。

3.渲染模板,然后另存了word格式即可。

相关源代码:http://files.cnblogs.com/files/liaofeifight/word.rar
Java 实现HTML富文本导出至word完美解决方案的更多相关文章
- asp.net2.0导出pdf文件完美解决方案【转载】
asp.net2.0导出pdf文件完美解决方案 作者:清清月儿 PDF简介:PDF(Portable Document Format)文件格式是Adobe公司开发的电子文件格式.这种文件格式与操作系统 ...
- java通过freemarker导出包含富文本图片的word文档
废话不多说,进入正题! 本文重点在于:对富文本图片的导出(基础的freemarker+word模板导出这里不做详细解说哈) 参考文章:http://www.cnblogs.com/liaofeifig ...
- 富文本编辑器从word粘贴公式
很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...
- 富文本编辑器粘贴word
很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...
- 富文本编辑器粘贴word内容
很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...
- vue2.0 通过v-html指令渲染的富文本无法修改样式的解决方案
在最近的vue项目中遇到的问题:v-html渲染的富文本,无法在样式表中修改样式: 比如下面的代码,div.descBox里面的p标签的color样式并不是"color: blue" ...
- 富文本编辑器复制word
这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用 后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下) ...
- Java开发之富文本编辑器TinyMCE
一.题外话 最近负责了一个cms网站的运维,里面存在很多和编辑器有关的问题,比如编辑一些新闻博客,论文模块.系统采用的是FCKEditor,自我感觉不是很好,如下图 特别是在用户想插入一个图片的话,就 ...
- .net下将富文本编辑器文本原样读入word文档
关键词:富文本编辑器 生成word 样式 为了解决标题中提出的问题,首选需要了解,在.net环境下读取数据库中的内容动态生成word至少有2种方式,[方式一]一种方式是在项目中添加引用,例如在“添 ...
随机推荐
- 移动端web开发的一些知识点
整理一下自己平时移动端web开发中遇到的问题,也参考一下前辈的一些总结 1.最常见的要数1像素边框了 因为Retine屏的分辨率始终是普通屏幕的2倍,1px的边框在dpr=2的retina屏下会显示成 ...
- Java中的24种设计模式与7大原则
一.创建型模式 1.抽象工厂模式(Abstract factory pattern): 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要指定具体类.2.生成器模式(Builder patter ...
- 【JS】字符串操作
1.charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码. strObj.charCodeAt(index) 说明: index将被处理字符的从零开始计数的编号.有效值为0到字符 ...
- 浅谈HTTP中Get与Post的区别
引用自:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET ...
- iOS9 中的On-Demand Resources,编辑中。。。
最近要写一个包含许多Html内容的应用,就想能不能通过ios9的这个新特性,缩小一下app的体积,也看看这个新特性和最常使用的用服务器下载资源包有什么不同. 先看官方文档: http://www.co ...
- Windows Server 2012 在桌面上显示”我的电脑”图标
1.本地方式如果是在Windows Server 2012本地控制台下,直接按Win(键盘上的微软徽标键)+R,输入: rundll32.exe shell32.dll,Control_RunDLL ...
- su与su-
1.Linux中的用户切换:su和su - 的区别 大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户,Linu ...
- mmap为什么比read/write快(兼论buffercache和pagecache)
参考文献: <从内核文件系统看文件读写过程>http://www.cnblogs.com/huxiao-tee/p/4660352.html?utm_source=tuicool& ...
- 数据库 之MySQL 简单教程
So Easy系列之MySQL数据库教程 1. 数据库概述 1.1. 数据库概述 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和 ...
- Linux 软件包管理
简介: linux中软件包的管理随着linux版本的不同而不同,一般RPM和DPKG是最常见的两类软件包管理工具.分别应用基于rpm软件包的linux发行版本和基于deb软件包的linux发行版本. ...