精华内容
下载资源
问答
  • 批量的把html 文件转换成word,不需要电脑上有word软件!并且支持本地图片,html链接的图片必须在本地,可以把图片转换到word里!
  • java html转换word

    2015-09-21 16:05:22
    java利用poi把html网友转换成word文档的小例子,包含程序代码和jar包。
  • 主要介绍了Java实现将word转换html的方法,结合实例形式分析了java针对doc与docx格式文件的相关转换操作技巧,需要的朋友可以参考下
  • Word Cleaner将 MS Word 文档存为 HTML 网页的工具软件。虽然 Microsfot Word 也能将。DOC 文件另存为WEB页面格式,但是它会增加许多”垃圾”代码,这个小工具能够为你自动去除这些”垃圾”代
  • htmlword相互转换

    千次阅读 2019-01-22 09:07:27
    目前从html转换word为doc格式,而图片处理支持的是docx格式,所以需要手动把doc另存为docx,然后才可以进行图片替换。 一.添加maven依赖 主要使用了以下和poi相关的依赖,为了便于获取html的图片元素,还使用了...

    项目后端使用了springboot,maven,前端使用了ckeditor富文本编辑器。目前从html转换的word为doc格式,而图片处理支持的是docx格式,所以需要手动把doc另存为docx,然后才可以进行图片替换。

    一.添加maven依赖

    主要使用了以下和poi相关的依赖,为了便于获取html的图片元素,还使用了jsoup:

    <dependency>    <groupId>org.apache.poi</groupId>    <artifactId>poi</artifactId>    <version>3.14</version></dependency><dependency>    <groupId>org.apache.poi</groupId>    <artifactId>poi-scratchpad</artifactId>    <version>3.14</version></dependency><dependency>    <groupId>org.apache.poi</groupId>    <artifactId>poi-ooxml</artifactId>    <version>3.14</version></dependency><dependency>    <groupId>fr.opensagres.xdocreport</groupId>    <artifactId>xdocreport</artifactId>    <version>1.0.6</version></dependency><dependency>    <groupId>org.apache.poi</groupId>    <artifactId>poi-ooxml-schemas</artifactId>    <version>3.14</version></dependency><dependency>    <groupId>org.apache.poi</groupId>    <artifactId>ooxml-schemas</artifactId>    <version>1.3</version></dependency><dependency>    <groupId>org.jsoup</groupId>    <artifactId>jsoup</artifactId>    <version>1.11.3</version></dependency>

    二.word转换为html

    在springboot项目的resources目录下新建static文件夹,将需要转换的word文件temp.docx粘贴进去,由于static是springboot的默认资源文件,所以不需要在配置文件里面另行配置了,如果改成其他名字,需要在application.yml进行相应配置。

    doc格式转换为html:

    public static String docToHtml() throws Exception {
        File path = new File(ResourceUtils.getURL("classpath:").getPath());
        String imagePathStr = path.getAbsolutePath() + "\\static\\image\\";
        String sourceFileName = path.getAbsolutePath() + "\\static\\test.doc";
        String targetFileName = path.getAbsolutePath() + "\\static\\test2.html";
        File file = new File(imagePathStr);    if(!file.exists()) {
            file.mkdirs();
        }
        HWPFDocument wordDocument = new HWPFDocument(new FileInputStream(sourceFileName));
        org.w3c.dom.Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
        WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(document);    //保存图片,并返回图片的相对路径
        wordToHtmlConverter.setPicturesManager((content, pictureType, name, width, height) -> {        try (FileOutputStream out = new FileOutputStream(imagePathStr + name)) {
                out.write(content);
            } catch (Exception e) {
                e.printStackTrace();
            }        return "image/" + name;
        });    wordToHtmlConverter.processDocument(wordDocument);    org.w3c.dom.Document htmlDocument = wordToHtmlConverter.getDocument();    DOMSource domSource = new DOMSource(htmlDocument);    StreamResult streamResult = new StreamResult(new File(targetFileName));    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);    return targetFileName;
    }123456789101112131415161718192021222324252627282930313233
    

    docx格式转换为html

    public static String docxToHtml() throws Exception {
        File path = new File(ResourceUtils.getURL("classpath:").getPath());
        String imagePath = path.getAbsolutePath() + "\\static\\image";
        String sourceFileName = path.getAbsolutePath() + "\\static\\test.docx";
        String targetFileName = path.getAbsolutePath() + "\\static\\test.html";
    
        OutputStreamWriter outputStreamWriter = null;    try {
            XWPFDocument document = new XWPFDocument(new FileInputStream(sourceFileName));
            XHTMLOptions options = XHTMLOptions.create();        // 存放图片的文件夹
            options.setExtractor(new FileImageExtractor(new File(imagePath)));        // html中图片的路径
            options.URIResolver(new BasicURIResolver("image"));
            outputStreamWriter = new OutputStreamWriter(new FileOutputStream(targetFileName), "utf-8");
            XHTMLConverter xhtmlConverter = (XHTMLConverter) XHTMLConverter.getInstance();
            xhtmlConverter.convert(document, outputStreamWriter, options);
        } finally {        if (outputStreamWriter != null) {
                outputStreamWriter.close();
            }
        }    return targetFileName;
    }
    

    转换成功后会生成对应的html文件,如果想在前端展示,直接读取文件转换为String返回给前端即可。

    public static String readfile(String filePath) {
        File file = new File(filePath);
        InputStream input = null;    try {
            input = new FileInputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        StringBuffer buffer = new StringBuffer();    byte[] bytes = new byte[1024];    try {        for (int n; (n = input.read(bytes)) != -1;) {
                buffer.append(new String(bytes, 0, n, "utf8"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }    return buffer.toString();
    }
    

    在富文本编辑器ckeditor中的显示效果: 
    这里写图片描述

    三.html转换为word

    实现思路就是先把html中的所有图片元素提取出来,统一替换为变量字符”${imgReplace}“,如果多张图片,可以依序排列下去,之后生成对应的doc文件(之前试过直接生成docx文件发现打不开,这个问题尚未找到好的解决方法),我们将其另存为docx文件,之后就可以替换变量为图片了:

    public static String writeWordFile(String content) {
            String path = "D:/wordFile";
            Map<String, Object> param = new HashMap<String, Object>();
    
            if (!"".equals(path)) {
                File fileDir = new File(path);
                if (!fileDir.exists()) {
                    fileDir.mkdirs();
                }
                content = HtmlUtils.htmlUnescape(content);
                List<HashMap<String, String>> imgs = getImgStr(content);
                int count = 0;
                for (HashMap<String, String> img : imgs) {
                    count++;
                    //处理替换以“/>”结尾的img标签
                    content = content.replace(img.get("img"), "${imgReplace" + count + "}");
                    //处理替换以“>”结尾的img标签
                    content = content.replace(img.get("img1"), "${imgReplace" + count + "}");
                    Map<String, Object> header = new HashMap<String, Object>();
    
                    try {
                        File filePath = new File(ResourceUtils.getURL("classpath:").getPath());
                        String imagePath = filePath.getAbsolutePath() + "\\static\\";
                        imagePath += img.get("src").replaceAll("/", "\\\\");
                        //如果没有宽高属性,默认设置为400*300
                        if(img.get("width") == null || img.get("height") == null) {
                            header.put("width", 400);
                            header.put("height", 300);
                        }else {
                            header.put("width", (int) (Double.parseDouble(img.get("width"))));
                            header.put("height", (int) (Double.parseDouble(img.get("height"))));
                        }
                        header.put("type", "jpg");
                        header.put("content", OfficeUtil.inputStream2ByteArray(new FileInputStream(imagePath), true));
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                    param.put("${imgReplace" + count + "}", header);
                }
                try {
                    // 生成doc格式的word文档,需要手动改为docx
                    byte by[] = content.getBytes("UTF-8");
                    ByteArrayInputStream bais = new ByteArrayInputStream(by);
                    POIFSFileSystem poifs = new POIFSFileSystem();
                    DirectoryEntry directory = poifs.getRoot();
                    DocumentEntry documentEntry = directory.createDocument("WordDocument", bais);
                    FileOutputStream ostream = new FileOutputStream("D:\\wordFile\\temp.doc");
                    poifs.writeFilesystem(ostream);
                    bais.close();
                    ostream.close();
    
                    // 临时文件(手动改好的docx文件)
                    CustomXWPFDocument doc = OfficeUtil.generateWord(param, "D:\\wordFile\\temp.docx");
                    //最终生成的带图片的word文件
                    FileOutputStream fopts = new FileOutputStream("D:\\wordFile\\final.docx");
                    doc.write(fopts);
                    fopts.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
            }
            return "D:/wordFile/final.docx";
        }
    
        //获取html中的图片元素信息
        public static List<HashMap<String, String>> getImgStr(String htmlStr) {
            List<HashMap<String, String>> pics = new ArrayList<HashMap<String, String>>();
    
            Document doc = Jsoup.parse(htmlStr);
            Elements imgs = doc.select("img");
            for (Element img : imgs) {
                HashMap<String, String> map = new HashMap<String, String>();
                if(!"".equals(img.attr("width"))) {
                    map.put("width", img.attr("width").substring(0, img.attr("width").length() - 2));
                }
                if(!"".equals(img.attr("height"))) {
                    map.put("height", img.attr("height").substring(0, img.attr("height").length() - 2));
                }
                map.put("img", img.toString().substring(0, img.toString().length() - 1) + "/>");
                map.put("img1", img.toString());
                map.put("src", img.attr("src"));
                pics.add(map);
            }
            return pics;
        }
    

    OfficeUtil工具类,之前发现网上的写法只支持一张图片的修改,多张图片就会报错,是因为添加了图片,processParagraphs方法中的runs的大小改变了,会报ArrayList的异常,就和我们循环list中删除元素会报异常道理一样,解决方法就是复制一个新的Arraylist进行循环即可:

    package com.example.demo.util;  
    
    import java.io.ByteArrayInputStream;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import org.apache.poi.POIXMLDocument;import org.apache.poi.hwpf.extractor.WordExtractor;import org.apache.poi.openxml4j.opc.OPCPackage;import org.apache.poi.xwpf.usermodel.XWPFParagraph;import org.apache.poi.xwpf.usermodel.XWPFRun;import org.apache.poi.xwpf.usermodel.XWPFTable;import org.apache.poi.xwpf.usermodel.XWPFTableCell;import org.apache.poi.xwpf.usermodel.XWPFTableRow;  
    
    /** 
     * 适用于word 2007
     */  public class OfficeUtil {  
    
        /** 
         * 根据指定的参数值、模板,生成 word 文档 
         * @param param 需要替换的变量 
         * @param template 模板 
         */  
        public static CustomXWPFDocument generateWord(Map<String, Object> param, String template) {  
            CustomXWPFDocument doc = null;        try {  
                OPCPackage pack = POIXMLDocument.openPackage(template);  
                doc = new CustomXWPFDocument(pack);  
                if (param != null && param.size() > 0) {  
    
                    //处理段落  
                    List<XWPFParagraph> paragraphList = doc.getParagraphs();  
                    processParagraphs(paragraphList, param, doc);  
    
                    //处理表格  
                    Iterator<XWPFTable> it = doc.getTablesIterator();  
                    while (it.hasNext()) {
                        XWPFTable table = it.next();  
                        List<XWPFTableRow> rows = table.getRows();  
                        for (XWPFTableRow row : rows) {  
                            List<XWPFTableCell> cells = row.getTableCells();  
                            for (XWPFTableCell cell : cells) {  
                                List<XWPFParagraph> paragraphListTable =  cell.getParagraphs();  
                                processParagraphs(paragraphListTable, param, doc);  
                            }  
                        }  
                    }  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return doc;  
        }  
        /** 
         * 处理段落 
         * @param paragraphList 
         */  
        public static void processParagraphs(List<XWPFParagraph> paragraphList,Map<String, Object> param,CustomXWPFDocument doc){  
            if(paragraphList != null && paragraphList.size() > 0){  
                for(XWPFParagraph paragraph:paragraphList){                //poi转换过来的行间距过大,需要手动调整                if(paragraph.getSpacingBefore() >= 1000 || paragraph.getSpacingAfter() > 1000) {
                        paragraph.setSpacingBefore(0);
                        paragraph.setSpacingAfter(0);
                    }                //设置word中左右间距
                    paragraph.setIndentationLeft(0);
                    paragraph.setIndentationRight(0);
                    List<XWPFRun> runs = paragraph.getRuns();                //加了图片,修改了paragraph的runs的size,所以循环不能使用runs
                    List<XWPFRun> allRuns = new ArrayList<XWPFRun>(runs);                for (XWPFRun run : allRuns) {
                        String text = run.getText(0);  
                        if(text != null){                        boolean isSetText = false;  
                            for (Entry<String, Object> entry : param.entrySet()) {  
                                String key = entry.getKey();  
                                if(text.indexOf(key) != -1){  
                                    isSetText = true;  
                                    Object value = entry.getValue();  
                                    if (value instanceof String) {//文本替换  
                                        text = text.replace(key, value.toString());  
                                    } else if (value instanceof Map) {//图片替换  
                                        text = text.replace(key, "");  
                                        Map pic = (Map)value;  
                                        int width = Integer.parseInt(pic.get("width").toString());  
                                        int height = Integer.parseInt(pic.get("height").toString());  
                                        int picType = getPictureType(pic.get("type").toString());  
                                        byte[] byteArray = (byte[]) pic.get("content");  
                                        ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);  
                                        try {  
                                            String blipId = doc.addPictureData(byteInputStream,picType);  
                                            doc.createPicture(blipId,doc.getNextPicNameNumber(picType), width, height,paragraph);
                                        } catch (Exception e) {  
                                            e.printStackTrace();  
                                        }  
                                    }  
                                }  
                            }  
                            if(isSetText){  
                                run.setText(text,0);  
                            }  
                        }  
                    }  
                }  
            }  
        }  
        /** 
         * 根据图片类型,取得对应的图片类型代码 
         * @param picType 
         * @return int 
         */  
        private static int getPictureType(String picType){  
            int res = CustomXWPFDocument.PICTURE_TYPE_PICT;  
            if(picType != null){  
                if(picType.equalsIgnoreCase("png")){  
                    res = CustomXWPFDocument.PICTURE_TYPE_PNG;  
                }else if(picType.equalsIgnoreCase("dib")){  
                    res = CustomXWPFDocument.PICTURE_TYPE_DIB;  
                }else if(picType.equalsIgnoreCase("emf")){  
                    res = CustomXWPFDocument.PICTURE_TYPE_EMF;  
                }else if(picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")){  
                    res = CustomXWPFDocument.PICTURE_TYPE_JPEG;  
                }else if(picType.equalsIgnoreCase("wmf")){  
                    res = CustomXWPFDocument.PICTURE_TYPE_WMF;  
                }  
            }  
            return res;  
        }  
        /** 
         * 将输入流中的数据写入字节数组 
         * @param in 
         * @return 
         */  
        public static byte[] inputStream2ByteArray(InputStream in,boolean isClose){  
            byte[] byteArray = null;  
            try {  
                int total = in.available();  
                byteArray = new byte[total];  
                in.read(byteArray);  
            } catch (IOException e) {  
                e.printStackTrace();  
            }finally{  
                if(isClose){  
                    try {  
                        in.close();  
                    } catch (Exception e2) {  
                        System.out.println("关闭流失败");  
                    }  
                }  
            }  
            return byteArray;  
        }  
    }
    

    我认为之所以word2003不支持图片替换,主要是处理2003版本的HWPFDocument对象被声明为了final,我们就无法重写他的方法了。而处理2007版本的类为XWPFDocument,是可以继承的,通过继承XWPFDocument,重写createPicture方法即可实现图片替换,以下为对应的CustomXWPFDocument类:

    package com.example.demo.util;    
    
    import java.io.IOException;  
    import java.io.InputStream;  
    import org.apache.poi.openxml4j.opc.OPCPackage;  
    import org.apache.poi.xwpf.usermodel.XWPFDocument;  
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;  
    import org.apache.xmlbeans.XmlException;  
    import org.apache.xmlbeans.XmlToken;  
    import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;  
    import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;  
    import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;  
    
    /** 
     * 自定义 XWPFDocument,并重写 createPicture()方法 
     */  public class CustomXWPFDocument extends XWPFDocument {    
        public CustomXWPFDocument(InputStream in) throws IOException {    
            super(in);    
        }    
    
        public CustomXWPFDocument() {    
            super();    
        }    
    
        public CustomXWPFDocument(OPCPackage pkg) throws IOException {    
            super(pkg);    
        }    
    
        /** 
         * @param ind 
         * @param width 宽 
         * @param height 高 
         * @param paragraph  段落 
         */  
        public void createPicture(String blipId, int ind, int width, int height,XWPFParagraph paragraph) {    
            final int EMU = 9525;    
            width *= EMU;    
            height *= EMU;    
            CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();    
            String picXml = ""    
                    + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"    
                    + "   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"    
                    + "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"    
                    + "         <pic:nvPicPr>" + "            <pic:cNvPr id=\""    
                    + ind    
                    + "\" name=\"Generated\"/>"    
                    + "            <pic:cNvPicPr/>"    
                    + "         </pic:nvPicPr>"    
                    + "         <pic:blipFill>"    
                    + "            <a:blip r:embed=\""    
                    + blipId    
                    + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"    
                    + "            <a:stretch>"    
                    + "               <a:fillRect/>"    
                    + "            </a:stretch>"    
                    + "         </pic:blipFill>"    
                    + "         <pic:spPr>"    
                    + "            <a:xfrm>"    
                    + "               <a:off x=\"0\" y=\"0\"/>"    
                    + "               <a:ext cx=\""    
                    + width    
                    + "\" cy=\""    
                    + height    
                    + "\"/>"    
                    + "            </a:xfrm>"    
                    + "            <a:prstGeom prst=\"rect\">"    
                    + "               <a:avLst/>"    
                    + "            </a:prstGeom>"    
                    + "         </pic:spPr>"    
                    + "      </pic:pic>"    
                    + "   </a:graphicData>" + "</a:graphic>";    
    
            inline.addNewGraphic().addNewGraphicData();    
            XmlToken xmlToken = null;    
            try {    
                xmlToken = XmlToken.Factory.parse(picXml);    
            } catch (XmlException xe) {    
                xe.printStackTrace();    
            }    
            inline.set(xmlToken);   
    
            inline.setDistT(0);      
            inline.setDistB(0);      
            inline.setDistL(0);      
            inline.setDistR(0);      
    
            CTPositiveSize2D extent = inline.addNewExtent();    
            extent.setCx(width);    
            extent.setCy(height);    
    
            CTNonVisualDrawingProps docPr = inline.addNewDocPr();      
            docPr.setId(ind);      
            docPr.setName("图片" + ind);      
            docPr.setDescr("测试");   
        }    
    }
    

    以上就是通过POI实现html和word的相互转换,对于html无法转换为可读的docx这个问题尚未解决,如果大家有好的解决方法可以交流一下~~~

    展开全文
  • 利用POI将word转换成html实现在线阅读
  • 主要为大家详细介绍了java使用POI实现htmlword的相互转换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 使用前提是:电脑已经安装了word,这里用到的是word组件Word.Application。 代码如下:<HTML> <HEAD> <TITLE>WalkingPoison’s Word-to-HTML sample</TITLE> [removed] function saveword() {...
  • html页面转化成word

    热门讨论 2011-11-29 07:13:06
    html页面转化成wordhtml页面转化成wordhtml页面转化成word
  • word(doc、docx)转换成html 然后可以调用网页控件将其显示出来
  • 批量的把html 文件转换成word,不需要电脑上有word软件!并且支持本地图片,html链接的图片必须在本地,可以把图片转换到word里! 代码简单,没有注释! 不喜勿喷!
  • 如何将word文档转换成html文档,附Java程序
  • word转换成html工具

    2012-11-03 11:39:22
    Word 转换成 Html Word 转换成 Html Word 转换成 Html 注意:转换时会删除原文件,一定要备份原文件 注意:转换时会删除原文件,一定要备份原文件 注意:转换时会删除原文件,一定要备份原文件 注意:转换...
  • java实现word转换成html实现word预览
  • 主要介绍了vue导出htmlword和pdf的实现方法,文中完成了三种文件的导出但是还有很多种方法,小编就不给大家一一列举了,需要的朋友可以参考下
  • 1.用户导入word生成pdf -首先导入word的时候读取word里面的全部内容。调用(ReadAndWriteDoc)然后将内容 传送到createPdf里面生成pdf。导入的时候读取采用poi /生成的时候采用的是itext ...4.将html转换成pdf(itext)
  • 完美解决doc、docx格式word转换Html

    热门讨论 2015-09-27 16:57:53
    由于项目需要,需要在线预览文档,所以就想转换htmL格式; 此项目为maven项目,引入的包可能需要一些时间; maven项目转换为eclipse项目命令是:mvn eclipse:eclipse,然后导入到eclipse; jar引入完成后,绝对100...
  • word文档转html格式

    2017-05-16 23:36:55
    1.在包含word文档的文件夹下执行本jar,即可将文件夹内的word文档转为html格式 2.在项目中引用此jar包,调用saveToHtml()传入一个包含word文件的目录,会将该目下的doc、docx文件转换html格式
  • 文字到HTML 将复制和粘贴从Word转换html代码
  • 参考https://gitee.com/xuwangcheng/poi-tl-html-to-word,利用poi-tl将前端富文本生成的HTML内容转换为可插入word的内容。利用poi-tl将前端富文本生成的HTML内容转换为可插入word的内容。
  • C# html转换成word

    热门讨论 2013-12-21 00:18:44
    html解析为word,并保存为word文档
  • 代码简单易懂,整理的最有效的实现方式,有问题请联系
  • word文档转换成html文档-保留word中的图片样式等信息。还原度99%。
  • office提供html2excel html2word html2pdf工具,JAVA 实现; html2excel支持宽度 边框 合并单元格 html2word支持宽度 边框 合并单元格 html2pdf 支持宽度 边框 合并单元格 另外还支持背景颜色
  • 把jacob.jar加载到工程里。 在C:\WINDOWS\system32;C:\Program Files\Java\jdk1.5.0_04\bin;C:\Program Files\Java\jdk1.5.0_04\jre\bin;下添加jacob.dll文件。 OfficeToXML.java文件是实现代码。...
  • js将HTML导出生成word文档,方式简单,不需要修改浏览器配置,引入两个js就可以解决该问题,亲测有效
  • 如何将html文档转换成word文档,附Java程序
  • 相关思路是先通过Jsoup将富文本Html迭代循环,在特定的方法里处理每一个标签,目前支持处理的...想要具体的Demo请看:https://gitee.com/xuwangcheng/poi-tl-html-to-word 有疑问请加QQ群:468324085 作者:白卡pala
  • Java 将Word文件转换HTML格式文件

    千次阅读 2020-10-25 17:16:29
    前言:在很多时候我们都需要到项目中导入word文档,但是后期再次在前段显示这个文档的时候前端往往需要的是html格式的,所以这个时候就会提出一个需求:你们存文档的时候能不能存成html格式的? 于是这篇文章的内容...
    • 前言:在很多时候我们都需要到项目中导入word文档,但是后期再次在前段显示这个文档的时候前端往往需要的是html格式的,所以这个时候就会提出一个需求: 你们存文档的时候能不能存成html格式的?  于是这篇文章的内容就可以满足这个需求

    我是通过MultiPartFile 类来实现的,上代码:

    一、首先导入需要的依赖包:

                <dependency>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi-scratchpad</artifactId>
                    <version>3.17</version>
                </dependency>
                        
                <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
                <dependency>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi-ooxml</artifactId>
                    <version>3.17</version>
                </dependency>
                    
                <!-- https://mvnrepository.com/artifact/fr.opensagres.xdocreport/fr.opensagres.xdocreport.converter.docx.xwpf -->
                <dependency>
                    <groupId>fr.opensagres.xdocreport</groupId>
                    <artifactId>fr.opensagres.xdocreport.converter.docx.xwpf</artifactId>
                    <version>2.0.1</version>
                </dependency>
    

    二、编写代码:

    package com.lmt.service.file;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.UUID;
    
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    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.usermodel.PictureType;
    import org.apache.poi.util.IOUtils;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import org.springframework.web.multipart.MultipartFile;
    import org.w3c.dom.Document;
    
    
    import fr.opensagres.poi.xwpf.converter.core.ImageManager;
    import fr.opensagres.poi.xwpf.converter.xhtml.XHTMLConverter;
    import fr.opensagres.poi.xwpf.converter.xhtml.XHTMLOptions;
    
    @Component
    public class WordToHtml {
        private static final Logger logger = LoggerFactory.getLogger(WordToHtml.class);
        
        //转换的方法
        public File convert(MultipartFile file) {
            //获得文件的名字
            String filename = file.getOriginalFilename();
            //获得文件的扩展名
            String suffix=filename.substring(filename.lastIndexOf("."));
            String newName=UUID.randomUUID().toString();
            // TODO 需要保存在一个新的位置
            // File =new File 表示目录的一个抽象,可以进一步用exists()和isDirectory()方法判断。
           
            File convFile = new File("D:/test/" + newName +suffix);
            FileOutputStream fos = null;
            try {
                //创建文件
                convFile.createNewFile(); 
     //FileOutputStream 是输出流 将文件输出到磁盘或者数据库中
                fos = new FileOutputStream(convFile); 
                fos.write(file.getBytes());
            } catch (IOException ex) {
                logger.error("上传文件出错!", ex);
                return null;
            } finally {
                IOUtils.closeQuietly(fos);
            }
            
            // 输入文件名的所在文件夹
            // 加上反斜杠
            String parentDirectory = convFile.getParent();
            if (!parentDirectory.endsWith("\\")) {
                parentDirectory = parentDirectory + "\\";
            }
            
            if (filename.endsWith(".docx")) {
                return docxConvert(parentDirectory, convFile.getAbsolutePath(),newName);
            } else if (filename.endsWith(".doc")) {
                return docConvert(parentDirectory, convFile.getAbsolutePath(),newName);
            } else {
                logger.error("不支持的文件格式!");
                return null;
            }
        }
        
        
        private File docxConvert(String parentDirectory, String filename,String newName) {
            try {
                XWPFDocument document = new XWPFDocument(new FileInputStream(filename));
                XHTMLOptions options = XHTMLOptions.create().setImageManager(new ImageManager(new File(parentDirectory), UUID.randomUUID().toString())).indent(4);
                FileOutputStream out = new FileOutputStream(new File(parentDirectory + newName+ ".html"));
                XHTMLConverter.getInstance().convert(document, out, options);
                return new File(parentDirectory + newName+ ".html");
            } catch (IOException ex) {
                logger.error("word转化出错!", ex);
                return null;
            }
            
        }
        
        
        private File docConvert(String parentDirectory, String filename,String newName) {
            try {
                HWPFDocument document = new HWPFDocument(new FileInputStream(filename));
                WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
                        DocumentBuilderFactory.newInstance().newDocumentBuilder()
                                .newDocument());
                
                // converter默认对图片不作处理,需要手动下载图片并嵌入到html中
                 wordToHtmlConverter.setPicturesManager(new PicturesManager() {
                        @Override
                        public String savePicture(byte[] bytes, PictureType pictureType, String s, float v, float v1) {
                            String imageFilename = parentDirectory + "";
                            String identity=UUID.randomUUID().toString();
                            File imageFile = new File(imageFilename, identity+s);
                            imageFile.getParentFile().mkdirs();
                            InputStream in = null;
                            FileOutputStream out = null;
    
                            try {
                                in = new ByteArrayInputStream(bytes);
                                out = new FileOutputStream(imageFile);
                                IOUtils.copy(in, out);
    
                            } catch (IOException ex) {
                                logger.error("word转化出错!", ex);
                            } finally {
                                if (in != null) {
                                    IOUtils.closeQuietly(in);
                                }
    
                                if (out != null) {
                                    IOUtils.closeQuietly(out);
                                }
    
                            }
                            return imageFile.getName();
                        }
                    });
                
                wordToHtmlConverter.processDocument(document);
                Document htmlDocument = wordToHtmlConverter.getDocument();
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                DOMSource domSource = new DOMSource(htmlDocument);
                StreamResult streamResult = new StreamResult(out);
    
                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);
                out.close();
    
                String result = new String(out.toByteArray());
                FileWriter writer = new FileWriter(parentDirectory + newName + ".html");
                writer.write(result);
                writer.close();                        
            } catch (IOException | TransformerException | ParserConfigurationException ex) {
                logger.error("word转化出错!", ex);
            }
            return new File(parentDirectory + newName + ".html");
        }
        
        /**
         * 将上传的Word文档转化成HTML字符串
         * @param attachfile
         * @return
         */
        public String convertToHtml(MultipartFile attachfile) {
            String wordContent = "";
            // 将Word文件转换为html
            File file = convert(attachfile);
            // 读取html文件
            if (file != null) {
                return "文件转换成功"
            }
            return "文件转换失败";
        }

    代码的含义已经在代码行的注释上有了,哪里有问题,欢迎大家随时在评论下方留言!

     

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 116,249
精华内容 46,499
关键字:

html格式转换word