java读取word转换HTML格式,保留内容的样式和格式


title: java读取word转换HTML格式,保留内容的样式和格式
date: 2023-08-11
categories:

  • 后端
    tags:
  • 文件操作
  • 总结

java读取word转换HTML格式,保留内容的样式和格式

pom依赖

   <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.15</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.15</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.15</version>
        </dependency>
 
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.17</version>
        </dependency>
 
 
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId>
            <version>1.0.6</version>
        </dependency>

java

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.converter.WordToHtmlConverter;
import org.apache.poi.xwpf.converter.core.BasicURIResolver;
import org.apache.poi.xwpf.converter.core.FileImageExtractor;
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.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
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.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;


/**
 * 功能描述
 *
 * @author: konglignxin
 * @date: 2023年04月04日 16:54
 */

public class Test {


    /**
     * 上传Word文档,返回解析后的Html
     */
    public static String docToHtmlText(MultipartFile file) throws Exception {
        //使用字符数组流获取解析的内容
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        OutputStream outStream = new BufferedOutputStream(baos);
        try {
            //将上传的文件传入Document转换
            HWPFDocument wordDocument = new HWPFDocument(file.getInputStream());
            Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
            WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(document);
            //将读取到的图片上传并添加链接地址
            //wordToHtmlConverter.setPicturesManager((imageStream, pictureType, name, width, height) -> {
            //    try {
            //        //首先要判断图片是否能识别
            //        if (pictureType.equals(PictureType.UNKNOWN)) {
            //            return "[不能识别的图片]";
            //        }
            //        //此处上传到自己的文件服务器 todo
            //        String qiNiuName = "";//文件名
            //        boolean upload = FileUtil.upload(new        FileInputStream(fileImage), qiNiuName);
            //        return "上传后的图片地址";
            //
            //    } catch (Exception e) {
            //        logger.info("upload exception", e);
            //    }
            //    return "[图片上传失败]";
            //});
            // word文档转Html文档
            wordToHtmlConverter.processDocument(wordDocument);
            Document htmlDocument = wordToHtmlConverter.getDocument();
            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);
            String content = baos.toString();

            return content;
        } catch (Exception e) {

        } finally {
            baos.close();
            outStream.close();
        }
        return "";
    }

    /**
     * 上传docx文档,返回解析后的Html
     */
    public static String docxToHtmlText(MultipartFile file) throws Exception {
        ByteArrayOutputStream htmlStream = new ByteArrayOutputStream();
        try {
            // 将上传的文件传入Document转换
            XWPFDocument docxDocument = new XWPFDocument(file.getInputStream());
            XHTMLOptions options = XHTMLOptions.create();
            // 设置图片存储路径
            String path = System.getProperty("java.io.tmpdir");
            String firstImagePathStr = path + "/" + System.currentTimeMillis();
            options.setExtractor(new FileImageExtractor(new File(firstImagePathStr)));
            options.URIResolver(new BasicURIResolver(firstImagePathStr));
            // 转换html
            docxDocument.createNumbering();
            XHTMLConverter.getInstance().convert(docxDocument, htmlStream, options);
            String htmlStr = htmlStream.toString();

            String middleImageDirStr = "/word/media";
            String imageDirStr = firstImagePathStr + middleImageDirStr;
            File imageDir = new File(imageDirStr);
            String[] imageList = imageDir.list();
            if (imageList != null) {
                for (int i = 0; i < imageList.length; i++) {
                    try {
                        String oneImagePathStr = imageDirStr + "/" + imageList[i];
                        File fileImage = new File(oneImagePathStr);
                        if (fileImage.exists()) {
                            String name = fileImage.getName();
                            String suffix = name.substring(name.indexOf("."), name.length()).toLowerCase();
                            //此处上传到自己的文件服务器 todo
                            String qiNiuName = "";//文件名
                            //boolean upload = FileUtil.upload(new FileInputStream(fileImage), qiNiuName);
                            //if (!upload) {
                            //    continue;
                            //} else {
                            //    //修改文档中的图片信息
                            //    htmlStr = htmlStr.replace(oneImagePathStr, "上传后的图片地址");
                            //}
                        }
                    } catch (Exception e) {

                    }
                }
            }
            //删除图片路径
            File firstImagePath = new File(firstImagePathStr);
            FileUtils.deleteDirectory(firstImagePath);
            return htmlStr;
        } catch (Exception e) {

        } finally {
            if (htmlStream != null) {
                htmlStream.close();
            }
        }
        return "";
    }


    public static void main(String[] args) {
        try {
            String content = docxToHtmlText(getMulFileByPath("E:\\temp.docx"));
//            String div = HtmlUtil.unwrapHtmlTag(articleContent, "div");
//            String head = HtmlUtil.removeHtmlTag(div, "head");
            System.out.println(content);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 获取MultipartFile文件
     *
     * @param picPath
     * @return
     */
    public static MultipartFile getMulFileByPath(String picPath) {
        FileItem fileItem = createFileItem(picPath);
        MultipartFile mfile = new CommonsMultipartFile(fileItem);
        return mfile;
    }

    private static FileItem createFileItem(String filePath) {
        FileItemFactory factory = new DiskFileItemFactory(16, null);
        String textFieldName = "textField";
        int num = filePath.lastIndexOf(".");
        String extFile = filePath.substring(num);
        FileItem item = factory.createItem(textFieldName, "text/plain", true,
                "MyFileName" + extFile);
        File newfile = new File(filePath);
        int bytesRead = 0;
        byte[] buffer = new byte[8192];
        try {
            FileInputStream fis = new FileInputStream(newfile);
            OutputStream os = item.getOutputStream();
            while ((bytesRead = fis.read(buffer, 0, 8192))
                    != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return item;
    }
    
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要将Java Word文档转换HTML保留样式,可以使用Apache POI库。该库提供了一些类和方法,可以读取和操作Word文档,并将其转换HTML格式。在转换过程中,可以使用CSS样式表来保留文档的样式。具体实现可以参考Apache POI的官方文档和示例代码。 ### 回答2: 在开发Java程序中,有时候需要将Word文档转化为HTML格式,而且还需要保留文档中的样式。实现这个功能的方法有很多种,接下来我将介绍一种比较简单易懂的实现方式。 在Java中,将Word转化为HTML格式需要用到poi等第三方库和jdk自带的工具。首先,需要导入poi和lucene的jar包。然后,用poi将Word文档转为html文件,接着使用jsoup将生成的html文件中的图片和样式抽取出来,并加以调整。最后将调整后的html标签加入自己写的格式代码中,放置于web页面上即可。 具体实现过程如下: 1、建立POIFSFileSystem对象,载入格式化后的word文档。 2、使用HWPFDocument类打开文件对象。 3、通过WordToHtmlConverter类的processDocument()方法将word转换Html。 4、通过一些简单的dom技术,将HTML标签进行样式调整和加工。 5、调整好的HTMl文件第一步要去掉左侧的缩进,调整HTML每行的左边距;将所有背景透明样式背景全部去掉;调整HTML文件img路径和大小等属性;再根据需求,调整HTML的布局和样式等。 6、将调整好的HTML代码放到JSP网页中显示。 通过以上步骤,就可以实现将Word文档转为HTML格式,并保留文档样式的功能。需要注意的是,实现这个功能需要较强的编程能力和对Java语言和相关技术的掌握。同时,对于HTML的布局和样式调整,也需要有一定的前端技术,以确保生成的HTML文件具备良好的视觉效果和浏览体验。 ### 回答3: Java是目前世界上最流行的编程语言之一,它被广泛应用于各种领域,包括软件开发、网站开发、游戏开发等。在Java中,我们经常会遇到需要将Word转换HTML的需求,而如何保留Word中的样式成为了一个非常关键的问题。 Word中的样式包括文字的字体、字号、颜色、加粗、斜体等,以及段落的对齐方式、缩进、行距等。为了保留这些样式,我们可以使用一些开源的第三方库,比如Apache POI和IText等,在Java中进行WordHTML的处理。 首先,我们需要将Word文档转换HTML格式。对于这一过程,我们可以使用Apache POI库中的HWPF和XWPF模块,分别用于处理.doc和.docx格式Word文档。具体步骤如下: 1.读取Word文档,使用HWPF或XWPF模块进行解析。 2.使用CSS样式表为HTML文档设置文字和段落样式,可以参考Word中的样式设置。 3.将Word文档中的文字和段落转换HTML格式,并应用CSS样式表。 4.将生成的HTML文档保存到指定的输出路径。 在这一过程中,我们需要注意几点: 1.尽可能使用内联样式,而不是外部样式表,以便更好地保留Word中的样式。 2.注意处理Word中的特殊符号,如换行符、段落符等。 3.为了更好地支持不同的浏览器和平台,我们需要尽可能使用标准的HTML和CSS语法。 在整个过程中,Apache POI和IText都提供了非常丰富的API接口,可以为我们提供更好的Word文档处理能力。此外,我们还可以根据具体需求,自定义相关的代码实现,进一步提高WordHTML的处理效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值