最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot集成tika實現(xiàn)word轉(zhuǎn)html的操作代碼

 更新時間:2024年06月12日 08:56:43   作者:HBLOG  
Tika是一個內(nèi)容分析工具,自帶全面的parser工具類,能解析基本所有常見格式的文件,得到文件的metadata,content等內(nèi)容,返回格式化信息,本文給大家介紹了SpringBoot集成tika實現(xiàn)word轉(zhuǎn)html的操作,需要的朋友可以參考下

1.什么是tika?

Tika是一個內(nèi)容分析工具,自帶全面的parser工具類,能解析基本所有常見格式的文件,得到文件的metadata,content等內(nèi)容,返回格式化信息??偟膩碚f可以作為一個通用的解析工具。特別對于搜索引擎的數(shù)據(jù)抓去和處理步驟有重要意義。Tika是Apache的Lucene項目下面的子項目,在lucene的應(yīng)用中可以使用tika獲取大批量文檔中的內(nèi)容來建立索引,非常方便,也很容易使用。Apache Tika toolkit可以自動檢測各種文檔(如word,ppt,xml,csv,ppt等)的類型并抽取文檔的元數(shù)據(jù)和文本內(nèi)容。Tika集成了現(xiàn)有的文檔解析庫,并提供統(tǒng)一的接口,使針對不同類型的文檔進(jìn)行解析變得更簡單。Tika針對搜索引擎索引、內(nèi)容分析、轉(zhuǎn)化等非常有用。

Tika架構(gòu)

應(yīng)用程序員可以很容易地在他們的應(yīng)用程序集成Tika。Tika提供了一個命令行界面和圖形用戶界面,使它比較人性化。在本章中,我們將討論構(gòu)成Tika架構(gòu)的四個重要模塊。下圖顯示了Tika的四個模塊的體系結(jié)構(gòu):

  • 語言檢測機(jī)制。
  • MIME檢測機(jī)制。
  • Parser接口。
  • Tika Facade 類.

語言檢測機(jī)制

每當(dāng)一個文本文件被傳遞到Tika,它將檢測在其中的語言。它接受沒有語言的注釋文件和通過檢測該語言添加在該文件的元數(shù)據(jù)信息。支持語言識別,Tika 有一類叫做語言標(biāo)識符在包org.apache.tika.language及語言識別資料庫里面包含了語言檢測從給定文本的算法。Tika 內(nèi)部使用N-gram算法語言檢測。

MIME檢測機(jī)制

Tika可以根據(jù)MIME標(biāo)準(zhǔn)檢測文檔類型。Tika默認(rèn)MIME類型檢測是使用org.apache.tika.mime.mimeTypes。它使用org.apache.tika.detect.Detector 接口大部分內(nèi)容類型檢測。內(nèi)部Tika使用多種技術(shù),如文件匹配替換,內(nèi)容類型提示,魔術(shù)字節(jié),字符編碼,以及其他一些技術(shù)。

解析器接口

org.apache.tika.parser 解析器接口是Tika解析文檔的主要接口。該接口從提取文檔中的文本和元數(shù)據(jù),并總結(jié)了其對外部用戶愿意寫解析器插件。采用不同的具體解析器類,具體為各個文檔類型,Tika 支持大量的文件格式。這些格式的具體類不同的文件格式提供支持,無論是通過直接實現(xiàn)邏輯分析器或使用外部解析器庫。

Tika Facade 類

使用的Tika facade類是從Java調(diào)用Tika的最簡單和直接的方式,而且也沿用了外觀的設(shè)計模式??梢栽?Tika API的org.apache.tika包Tika 找到外觀facade類。通過實現(xiàn)基本用例,Tika作為facade的代理。它抽象了的Tika庫的底層復(fù)雜性,例如MIME檢測機(jī)制,解析器接口和語言檢測機(jī)制,并提供給用戶一個簡單的接口來使用。

2.代碼工程

實驗?zāi)繕?biāo)

實現(xiàn)word文檔轉(zhuǎn)html

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>tika</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-parsers</artifactId>
            <version>1.17</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>
</project>

controller

package com.et.tika.controller;

import com.et.tika.convertor.WordToHtmlConverter;
import com.et.tika.dto.ConvertedDocumentDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;

@RestController
@Slf4j
public class HelloWorldController {
    @RequestMapping("/hello")
    public Map<String, Object> showHelloWorld(){
        Map<String, Object> map = new HashMap<>();
        map.put("msg", "HelloWorld");
        return map;
    }
    @Autowired
    WordToHtmlConverter converter;



    /**
     * Transforms the Word document into HTML document and returns the transformed document.
     *
     * @return  The content of the uploaded document as HTML.
     */
    @RequestMapping(value = "/api/word-to-html", method = RequestMethod.POST)
    public ConvertedDocumentDTO convertWordDocumentIntoHtmlDocument(@RequestParam(value = "file", required = true) MultipartFile wordDocument) {
        log.info("Converting word document into HTML document");

        ConvertedDocumentDTO htmlDocument = converter.convertWordDocumentIntoHtml(wordDocument);

        log.info("Converted word document into HTML document.");
        log.trace("The created HTML markup looks as follows: {}", htmlDocument);

        return htmlDocument;
    }
}

WordToHtmlConverter

package com.et.tika.convertor;


import com.et.tika.dto.ConvertedDocumentDTO;
import com.et.tika.exception.DocumentConversionException;
import lombok.extern.slf4j.Slf4j;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.parser.microsoft.ooxml.OOXMLParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import org.xml.sax.SAXException;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.TransformerException;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;

/**
 *
 */
@Component
@Slf4j
public class WordToHtmlConverter {


    /**
     * Converts a .docx document into HTML markup. This code
     * is based on <a  rel="external nofollow" >this StackOverflow</a> answer.
     *
     * @param wordDocument  The converted .docx document.
     * @return
     */
    public ConvertedDocumentDTO convertWordDocumentIntoHtml(MultipartFile wordDocument) {
        log.info("Converting word document: {} into HTML", wordDocument.getOriginalFilename());
        try {
            InputStream input = wordDocument.getInputStream();
            Parser parser = new OOXMLParser();

            StringWriter sw = new StringWriter();
            SAXTransformerFactory factory = (SAXTransformerFactory)
                    SAXTransformerFactory.newInstance();
            TransformerHandler handler = factory.newTransformerHandler();
            handler.getTransformer().setOutputProperty(OutputKeys.ENCODING, "utf-8");
            handler.getTransformer().setOutputProperty(OutputKeys.METHOD, "html");
            handler.getTransformer().setOutputProperty(OutputKeys.INDENT, "yes");
            handler.setResult(new StreamResult(sw));

            Metadata metadata = new Metadata();
            metadata.add(Metadata.CONTENT_TYPE, "text/html;charset=utf-8");
            parser.parse(input, handler, metadata, new ParseContext());
            return new ConvertedDocumentDTO(wordDocument.getOriginalFilename(), sw.toString());
        }
        catch (IOException | SAXException | TransformerException | TikaException ex) {
            log.error("Conversion failed because an exception was thrown", ex);
            throw new DocumentConversionException(ex.getMessage(), ex);
        }
    }
}

dto

package com.et.tika.dto;

import org.apache.commons.lang.builder.ToStringBuilder;

/**
 *
 */
public  class ConvertedDocumentDTO {

    private final String contentAsHtml;
    private final String filename;

    public ConvertedDocumentDTO(String filename, String contentAsHtml) {
        this.contentAsHtml = contentAsHtml;
        this.filename = filename;
    }

    public String getContentAsHtml() {
        return contentAsHtml;
    }

    public String getFilename() {
        return filename;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this)
                .append("filename", this.filename)
                .append("contentAsHtml", this.contentAsHtml)
                .toString();
    }
}

自定義異常

package com.et.tika.exception;

/**
 *
 */
public final class DocumentConversionException extends RuntimeException {

    public DocumentConversionException(String message, Exception ex) {
        super(message, ex);
    }
}

以上只是一些關(guān)鍵代碼,所有代碼請參見下面代碼倉庫

代碼倉庫

https://github.com/Harries/springboot-demo

3.測試

啟動Spring Boot應(yīng)用

測試word轉(zhuǎn)html

4.引用

https://tika.apache.org/

以上就是SpringBoot集成tika實現(xiàn)word轉(zhuǎn)html的操作代碼的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot tika實現(xiàn)word轉(zhuǎn)html的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 十個最常見的Java字符串問題(翻譯)

    十個最常見的Java字符串問題(翻譯)

    這篇文章主要介紹了十個最常見的Java字符串問題(翻譯),需要的朋友可以參考下
    2015-03-03
  • Java中遍歷Map的六種方法實現(xiàn)

    Java中遍歷Map的六種方法實現(xiàn)

    這篇文章主要介紹了Java中遍歷Map的六種方法,Map是常用的數(shù)據(jù)結(jié)構(gòu)之一,它提供了鍵值對的存儲方式,可以方便地進(jìn)行數(shù)據(jù)查找和操作,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05
  • 聊聊SpringCloud中的Ribbon進(jìn)行服務(wù)調(diào)用的問題

    聊聊SpringCloud中的Ribbon進(jìn)行服務(wù)調(diào)用的問題

    SpringCloud-Ribbon是基于Netflix?Ribbon實現(xiàn)的一套客戶端負(fù)載均衡的工具。本文給大家介紹SpringCloud中的Ribbon進(jìn)行服務(wù)調(diào)用的問題,感興趣的朋友跟隨小編一起看看吧
    2022-01-01
  • Java?ServletContext與ServletConfig接口使用教程

    Java?ServletContext與ServletConfig接口使用教程

    ServletConfig對象,叫Servlet配置對象。主要用于加載配置文件的初始化參數(shù)。我們知道一個Web應(yīng)用里面可以有多個servlet,如果現(xiàn)在有一份數(shù)據(jù)需要傳給所有的servlet使用,那么我們就可以使用ServletContext對象了
    2022-09-09
  • Spring學(xué)習(xí)JdbcTemplate數(shù)據(jù)庫事務(wù)參數(shù)

    Spring學(xué)習(xí)JdbcTemplate數(shù)據(jù)庫事務(wù)參數(shù)

    這篇文章主要為大家介紹了Spring學(xué)習(xí)JdbcTemplate數(shù)據(jù)庫事務(wù)參數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Springboot+SpringSecurity實現(xiàn)圖片驗證碼登錄的示例

    Springboot+SpringSecurity實現(xiàn)圖片驗證碼登錄的示例

    本文主要介紹了Springboot+SpringSecurity實現(xiàn)圖片驗證碼登錄的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Mybatis實現(xiàn)增刪改查及分頁查詢的方法

    Mybatis實現(xiàn)增刪改查及分頁查詢的方法

    MyBatis是支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持 久層框架,通過本文給大家介紹Mybatis實現(xiàn)增刪改查及分頁查詢的方法,感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • 詳解如何在低版本的Spring中快速實現(xiàn)類似自動配置的功能

    詳解如何在低版本的Spring中快速實現(xiàn)類似自動配置的功能

    這篇文章主要介紹了詳解如何在低版本的Spring中快速實現(xiàn)類似自動配置的功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Java中防止數(shù)據(jù)重復(fù)提交超簡單的6種方法

    Java中防止數(shù)據(jù)重復(fù)提交超簡單的6種方法

    在平時開發(fā)中,如果網(wǎng)速比較慢的情況下,用戶提交表單后,發(fā)現(xiàn)服務(wù)器半天都沒有響應(yīng),那么用戶可能會以為是自己沒有提交表單,就會再點(diǎn)擊提交按鈕重復(fù)提交表單,這篇文章主要給大家介紹了關(guān)于Java中防止數(shù)據(jù)重復(fù)提交超簡單的6種方法,需要的朋友可以參考下
    2021-11-11
  • SpringBoot3集成Redis的方法詳解

    SpringBoot3集成Redis的方法詳解

    緩存在項目開發(fā)中,基本上是必選組件之一,Redis作為一個key-value存儲系統(tǒng),具備極高的數(shù)據(jù)讀寫效率,并且支持的數(shù)據(jù)類型比較豐富,下面我們就來看看SpringBoot3是如何集成Redis的吧
    2023-08-08

最新評論

新平| 瑞安市| 遵义市| 垣曲县| 东光县| 清镇市| 上栗县| 大荔县| 昌宁县| 泸西县| 内黄县| 孟村| 肥城市| 绿春县| 仪征市| 台南县| 西乌珠穆沁旗| 广元市| 子长县| 永和县| 江山市| 易门县| 舒兰市| 阿城市| 阿坝县| 平泉县| 保定市| 枞阳县| 周口市| 华容县| 耒阳市| 新建县| 普宁市| 开封市| 双鸭山市| 龙南县| 茂名市| 黄石市| 浙江省| 崇仁县| 盘锦市|