java实现word文件转html文件

所属分类: 软件编程 / java 阅读数: 30
收藏 0 赞 0 分享

最近在项目开发中用户提出要在电脑上没有装office时在浏览器中打开word文件,最后确定的逻辑:用户选择想要查看的文件,页面js判断文件是否为word。不是执行下载,是后端根据word文件后缀访问对应转换方法。文件已存在对应html文件直接返回html文件地址,不存在先生成对应html文件再返回地址。js直接通过open()打开新的页签,展示word文件内容。新人一枚,如果代码中存在错误或有更好的实现万望指正!

相关jar包

代码

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

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.xwpf.converter.core.BasicURIResolver;
import org.apache.poi.xwpf.converter.core.FileImageExtractor;
import org.apache.poi.xwpf.converter.core.FileURIResolver;
import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;
import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.w3c.dom.Document;

/**
 * word 转换成html 2017-2-27 
 */
public class WordToHtml {
  
  
  /**
   * 将word2003转换为html文件 2017-2-27 
   * @param wordPath word文件路径
   * @param wordName word文件名称无后缀
   * @param suffix  word文件后缀
   * @throws IOException
   * @throws TransformerException
   * @throws ParserConfigurationException
   */
  public String Word2003ToHtml(String wordPath,String wordName,String suffix) throws IOException, TransformerException, ParserConfigurationException {
    String htmlPath = wordPath + File.separator + wordName + "_show" + File.separator;
    String htmlName = wordName + ".html";
    final String imagePath = htmlPath + "image" + File.separator;
    
    //判断html文件是否存在
    File htmlFile = new File(htmlPath + htmlName);
    if(htmlFile.exists()){ 
      return htmlFile.getAbsolutePath();
    }
    
    //原word文档
    final String file = wordPath + File.separator + wordName + suffix;
    InputStream input = new FileInputStream(new File(file));
    
    HWPFDocument wordDocument = new HWPFDocument(input);
    WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
    //设置图片存放的位置
    wordToHtmlConverter.setPicturesManager(new PicturesManager() {
      public String savePicture(byte[] content, PictureType pictureType, String suggestedName, float widthInches, float heightInches) {
        File imgPath = new File(imagePath);
        if(!imgPath.exists()){//图片目录不存在则创建
          imgPath.mkdirs();
        }
        File file = new File(imagePath + suggestedName);
        try {
          OutputStream os = new FileOutputStream(file);
          os.write(content);
          os.close();
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
        //图片在html文件上的路径 相对路径
        return "image/" + suggestedName;
      }
    });
    
    //解析word文档
    wordToHtmlConverter.processDocument(wordDocument);
    Document htmlDocument = wordToHtmlConverter.getDocument();
    
    //生成html文件上级文件夹
    File folder = new File(htmlPath);
    if(!folder.exists()){ 
      folder.mkdirs(); 
    }
    
    //生成html文件地址
    OutputStream outStream = new FileOutputStream(htmlFile);

    DOMSource domSource = new DOMSource(htmlDocument);
    StreamResult streamResult = new StreamResult(outStream);

    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer serializer = factory.newTransformer();
    serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
    serializer.setOutputProperty(OutputKeys.INDENT, "yes");
    serializer.setOutputProperty(OutputKeys.METHOD, "html");
    
    serializer.transform(domSource, streamResult);

    outStream.close();
    
    return htmlFile.getAbsolutePath();
  }
  
  /**
   * 2007版本word转换成html 2017-2-27
   * @param wordPath word文件路径
   * @param wordName word文件名称无后缀
   * @param suffix  word文件后缀
   * @return
   * @throws IOException
   */
  public String Word2007ToHtml(String wordPath,String wordName,String suffix) throws IOException {
    String htmlPath = wordPath + File.separator + wordName + "_show" + File.separator;
    String htmlName = wordName + ".html";
    String imagePath = htmlPath + "image" + File.separator;
    
    //判断html文件是否存在
    File htmlFile = new File(htmlPath + htmlName);
    if(htmlFile.exists()){ 
      return htmlFile.getAbsolutePath();
    }
        
    //word文件
    File wordFile = new File(wordPath + File.separator + wordName + suffix); 
    
    // 1) 加载word文档生成 XWPFDocument对象 
    InputStream in = new FileInputStream(wordFile); 
    XWPFDocument document = new XWPFDocument(in); 

    // 2) 解析 XHTML配置 (这里设置IURIResolver来设置图片存放的目录) 
    File imgFolder = new File(imagePath);
    XHTMLOptions options = XHTMLOptions.create();
    options.setExtractor(new FileImageExtractor(imgFolder));
    //html中图片的路径 相对路径 
    options.URIResolver(new BasicURIResolver("image"));
    options.setIgnoreStylesIfUnused(false); 
    options.setFragment(true); 
    
    // 3) 将 XWPFDocument转换成XHTML
    //生成html文件上级文件夹
    File folder = new File(htmlPath);
    if(!folder.exists()){ 
      folder.mkdirs(); 
    }
    OutputStream out = new FileOutputStream(htmlFile); 
    XHTMLConverter.getInstance().convert(document, out, options);
    
    return htmlFile.getAbsolutePath(); 
  } 
}

文件目录:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Java的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多