前因后果
然而,理想很美好,现实很骨感:
无法达到100%还原,word里面转译html会存在各种问题
有存在无法解析和翻译的部分
客户不会买账!(核心原因)
然后几乎所有的带word导入粘贴的,几乎都是商业收费软件(还很贵)
所以最后结果就是:我瞎忙活了几天(内心一万个草泥马)。
既然知道了结果为什么还要写这篇文章,我其实很不甘心,一个方案被否决,我决定记录一下这个可行的数据方案
不扯那么多,直接上菜:
//为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起
var btnCmds = [‘undo’, ‘redo’, ‘formatmatch’,
‘bold’, ‘italic’, ‘underline’, ‘fontborder’, ‘touppercase’, ‘tolowercase’,
‘strikethrough’, ‘subscript’, ‘superscript’, ‘source’, ‘indent’, ‘outdent’,
‘blockquote’, ‘pasteplain’, ‘pagebreak’,
‘selectall’, ‘print’,’horizontal’, ‘removeformat’, ‘time’, ‘date’, ‘unlink’,
‘insertparagraphbeforetable’, ‘insertrow’, ‘insertcol’, ‘mergeright’, ‘mergedown’, ‘deleterow’,
‘deletecol’, ‘splittorows’, ‘splittocols’, ‘splittocells’, ‘mergecells’, ‘deletetable’, ‘drafts’,’getword’];
注意到最后一个getword了么,这就是刚刚加进去的
在Lang/zh-cn/zh-cn.js文件当中,增加按钮说明,直接照着截图加就行
在help的后面加一个getword就好了,注意以下json格式,逗 不能少
增加样式,修改Themes/default/ueditor.css,直接在最底下增加
.edui-default .edui-toolbar .edui-for-getword .edui-icon {
background-image: url(../images/wordT1.png);
background-repeat: no-repeat;
width: 20px !important;
background-size: 18px;
background-position: center;
}
Tip:wordT1.png 是一个word的小图标,这里就不提供了
才怪:Themes/default/images/wordT1.png
2. 后端为word文件做转化为html的操作,然后将html原文返回给前端
做这个接口要特别的小心,需要防止接口被滥用,拖垮服务器资源,因为转化和图片存储的代价还是不小的,需要控制可以转化的大小
注意以下:docx 和 doc 在poi里面是需要用不同的对象进行操作的,后续自己也会补一补这一块的内容
poi 还是挺强的,很牛逼,把巨硬的那一套治的服服帖帖
import org.apache.commons.io.FileUtils;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.converter.PicturesManager;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hwpf.model.PAPX;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.PictureType;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFNumbering;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTNumbering;
import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* 根据poi写的word帮助类
* home.phpod=space&uid=686237 2020/10/12 18:26
**/
public class WordHelper {
public static void parseDocx2Html() throws Throwable {
final String path = “D:\XXX\mark\XXX\XXXX\”;
final String file = “XXXX.doc”;
InputStream input = new FileInputStream(path + file);
String suffix = file.substring(file.indexOf(“.”)+1);// //截取文件格式名
//实例化WordToHtmlConverter,为图片等资源文件做准备
WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
DocumentBuilderFactory.newInstance().newDocumentBuilder()
.newDocument());
wordToHtmlConverter.setPicturesManager(new PicturesManager() {
@Override
public String savePicture(byte[] content, PictureType pictureType,
String suggestedName, float widthInches, float heightInches) {
return suggestedName;
}
});
if (“doc”.equals(suffix.toLowerCase())) {
// docx
HWPFDocument wordDocument = new HWPFDocument(input);
wordToHtmlConverter.processDocument(wordDocument);
//处理图片,会在同目录下生成 image/media/ 路径并保存图片
List pics = wordDocument.getPicturesTable().getAllPictures();
if (pics != null) {
for (int i = 0; i < pics.size(); i++) {
Picture pic = (Picture) pics.get(i);
try {
pic.writeImageContent(new FileOutputStream(path
+ pic.suggestFullFileName()));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
// 转换
Document htmlDocument = wordToHtmlConverter.getDocument();
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
DOMSource domSource = new DOMSource(htmlDocument);
StreamResult streamResult = new StreamResult(outStream);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer serializer = tf.newTransformer();
serializer.setOutputProperty(OutputKeys.ENCODING, “utf-8”);//编码格式
serializer.setOutputProperty(OutputKeys.INDENT, “yes”);//是否用空白分割
serializer.setOutputProperty(OutputKeys.METHOD, “html”);//输出类型
serializer.transform(domSource, streamResult);
outStream.close();
String content = new String(outStream.toByteArray());
System.err.println(content);
FileUtils.writeStringToFile(new File(path, “interface.html”), content,
“utf-8”);
}
public static void main(String[] args) throws Throwable {
WordHelper.parseDocx2Html();
}
}
后续
滚回去继续升级ewebeditor了,擦公司的前辈居然有人做了一个一键排版和文章重排,直接动了源代码,有时间研究一下,果然老系统出神仙。
PS:老系统代码里面老板的名字在上面,老板是大公司程序员出身,挺好。
总结:
永远不要小看任何细节的点,看似平平无奇的功能,其实真正考虑要实现的时候。
一个简单的复制粘贴其实也并不简单。word的复制和原样粘贴要实现其实不太容易。
那么这种word转译的exe插件,他们是怎么做到的,我现在产生了无限的思考……
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!