整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          Spring Boot集成tika實(shí)現(xiàn)word轉(zhuǎn)html

          .什么是tika?

          Tika是一個內(nèi)容分析工具,自帶全面的parser工具類,能解析基本所有常見格式的文件,得到文件的metadata,content等內(nèi)容,返回格式化信息。總的來說可以作為一個通用的解析工具。特別對于搜索引擎的數(shù)據(jù)抓去和處理步驟有重要意義。Tika是Apache的Lucene項(xiàng)目下面的子項(xiàng)目,在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 支持大量的文件格式。這些格式的具體類不同的文件格式提供支持,無論是通過直接實(shí)現(xiàn)邏輯分析器或使用外部解析器庫。

          Tika Facade 類

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

          2.代碼工程

          實(shí)驗(yàn)?zāi)繕?biāo)

          實(shí)現(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 href="http://stackoverflow.com/a/9053258/313554">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/
          • http://www.liuhaihua.cn/archives/710679.html

          當(dāng)今數(shù)字化的時代,HTML和PDF已經(jīng)成為兩種最常用的文件格式。HTML用于網(wǎng)頁內(nèi)容的展示,而PDF則以其高度的可讀性和不依賴于平臺的特性,成為文檔分享和傳播的首選格式。然而,在辦公環(huán)境中,我們經(jīng)常需要在這兩種格式之間進(jìn)行轉(zhuǎn)換。那有沒有一種方法可以一鍵完成,批量轉(zhuǎn)換HTML為PDF格式,從而提升我們的辦公效率呢?現(xiàn)在一起來看看“辦公提效工具”如何批量操作的技巧吧。

          把想要的網(wǎng)頁保存在本地磁盤中。

          如何實(shí)現(xiàn)一鍵完成,批量轉(zhuǎn)換HTML為PDF呢?這里我們介紹一款常用的工具——辦公提效工具。辦公提效工具是一款強(qiáng)大的PDF編輯軟件,它提供了“批量轉(zhuǎn)換”功能,可以方便地將多個HTML文件一次性轉(zhuǎn)換為PDF格式。具體步驟如下:

          操作1、在辦公提效工具面板上選擇“PDF編輯工具”進(jìn)入該編輯頁。

          操作2、選擇轉(zhuǎn)換模式,支持多種格式轉(zhuǎn)換。下面選擇“html轉(zhuǎn)pdf”。

          操作3、在面板上點(diǎn)擊“添加文件”,接著在彈出的文件選擇對話框中,選擇需要轉(zhuǎn)換的HTML文件,然后點(diǎn)擊“打開”自動導(dǎo)入到列表中。

          操作4、選擇新文件保存位置,下面選擇“原文件相同位置”。

          操作5、以上都設(shè)定好后,在面板上點(diǎn)擊“開始轉(zhuǎn)換”進(jìn)入任務(wù)轉(zhuǎn)換,接著看到狀態(tài)欄中轉(zhuǎn)換進(jìn)度發(fā)生變化。

          操作6、轉(zhuǎn)換成功點(diǎn)擊“打開文件夾”進(jìn)入路徑看到已轉(zhuǎn)的兩個pdf文件。

          操作7、打開pdf文件看到內(nèi)容與網(wǎng)頁相同。該有的文字和圖片等內(nèi)容版面一致。

          通過以上步驟,我們就可以輕松實(shí)現(xiàn)一鍵完成,批量轉(zhuǎn)換HTML為PDF格式。這種方法不僅可以大大提升我們的辦公效率,還可以避免一個個等待的煩惱。同時,辦公提效工具還提供了許多其他的功能,如新建PDF文檔、修改原PDF文檔等,使得我們可以在處理PDF文件時更加得心應(yīng)手。

          總之,一鍵完成,批量轉(zhuǎn)換HTML為PDF格式的方法,是提升辦公效率的有效途徑之一。通過合理地利用工具和技術(shù),我們可以更加高效地處理大量的文件和數(shù)據(jù),從而更好地滿足工作需求。

          擬機(jī)為我們提供了一個無限可能的世界。在這個世界里,我們可以嘗試、學(xué)習(xí)、甚至犯錯,而不必?fù)?dān)心現(xiàn)實(shí)生活中的后果。Emacs,作為一款強(qiáng)大的文本編輯器,它的Org模式更是讓人們在組織復(fù)雜信息時如魚得水。但是,當(dāng)我們嘗試將Org文件轉(zhuǎn)換為HTML格式時,有時會遇到一個令人困惑的問題:“source block missing language specification #include”。這是什么意思?它又該如何解決呢?

          在深入探討之前,讓我們先來思考一個問題:為什么我們要將Org文件轉(zhuǎn)換為HTML?答案可能各有不同,但一個共同點(diǎn)是,我們都希望能夠更好地分享和展示我們的工作。HTML作為一種廣泛支持的格式,能夠讓我們的內(nèi)容在不同的平臺上呈現(xiàn)出一致的效果。這就像是我們穿上了一件合身的外衣,讓內(nèi)在的價值得以外顯。

          當(dāng)我們遇到“source block missing language specification #include”的提示時,我們應(yīng)該怎么辦呢?首先,我們需要理解這個提示的含義。在Emacs的Org模式中,當(dāng)我們使用源代碼塊時,通常需要指定語言類型,比如#+BEGIN_SRC python。這樣,Emacs就能夠知道如何高亮和格式化我們的代碼。但如果我們忘記了這一步,就會收到上述的提示。

          解決這個問題的方法其實(shí)很簡單。我們只需要回到源代碼塊的開始,確保正確地指定了語言類型。如果是包含在文件中的代碼,比如C語言的頭文件,我們可以使用#+INCLUDE: "file.h" src c這樣的語法來引入。

          通過這個簡單的修正,我們就能夠順利地將Org文件轉(zhuǎn)換為HTML,而不會再有任何阻礙。這個過程就像是我們在虛擬世界中解決了一個謎題,獲得了前進(jìn)的鑰匙。

          并且可以嘗試以下幾種方法來解決:

          方法一:添加語言規(guī)范

          在 Org 文檔中,對于包含代碼塊的文本,需要添加語言規(guī)范,以便 Org-mode 正確地解析和轉(zhuǎn)換代碼。

          具體步驟如下:

          在代碼塊的開頭,添加一行指示語言規(guī)范的注釋。例如,對于 C 語言代碼,可以添加以下注釋:

          #lang c

          再次嘗試將 Org 文檔轉(zhuǎn)換為 HTML。

          方法二:使用 org-babel

          org-babel 是 Org-mode 的一個擴(kuò)展包,可以用于將代碼塊轉(zhuǎn)換為各種格式,包括 HTML。

          具體步驟如下:

          安裝 org-babel 擴(kuò)展包。

          M-x package-install RET org-babel

          在 Org 文檔中,將代碼塊標(biāo)記為 babel 塊。例如,對于 C 語言代碼,可以使用以下標(biāo)記:

          #+begin_src c#include <stdio.h>int main() {  printf("Hello, world!\n");  return 0;}#+end_src

          再次嘗試將 Org 文檔轉(zhuǎn)換為 HTML。

          方法三:使用 org-html-export-filter

          org-html-export-filter 是 Org-mode 的一個函數(shù),可以用于在導(dǎo)出 HTML 時自定義代碼塊的轉(zhuǎn)換。

          具體步驟如下:

          在 Emacs 配置文件中,添加以下代碼:

          (defun my-org-html-export-filter (block)  "自定義代碼塊的轉(zhuǎn)換。"  (if (string-match-p "^#lang\s+c\s*$" (org-block-property block :language))    (org-html-export-filter-block-as-code block "c" "highlight")    (org-html-export-filter-block-as-verbatim block)))(add-hook 'org-html-export-filter-alist 'my-org-html-export-filter)

          再次嘗試將 Org 文檔轉(zhuǎn)換為 HTML。

          以上三種方法都可以解決 Org 轉(zhuǎn)為 HTML 時提示“source block missing language specification #include<stdio.h>”的問題。具體選擇哪種方法,可以根據(jù)自己的實(shí)際情況和需求來決定。


          主站蜘蛛池模板: 无码人妻久久一区二区三区免费| 国模精品一区二区三区| 精品国产亚洲一区二区在线观看 | 综合一区自拍亚洲综合图区| а天堂中文最新一区二区三区| 亚洲中文字幕在线无码一区二区| 国产韩国精品一区二区三区| 精品香蕉一区二区三区| 蜜桃传媒视频麻豆第一区| 日本中文字幕在线视频一区 | 国产精品男男视频一区二区三区| 国产精品电影一区| 久久综合九九亚洲一区| 亚洲第一区在线观看| 日韩精品一区二区三区国语自制 | 国产一区二区三区精品久久呦| 激情内射亚洲一区二区三区爱妻| 国产无线乱码一区二三区| 亚洲国产激情一区二区三区| 欧洲精品一区二区三区| 精品一区二区ww| 国产精品第一区揄拍| 亚洲一区二区三区久久久久| 国产a∨精品一区二区三区不卡| 精品国产日韩亚洲一区| 精品伦精品一区二区三区视频| 国产一区韩国女主播| 色婷婷亚洲一区二区三区 | 亚洲色大成网站www永久一区 | 熟女大屁股白浆一区二区| 日本一区二区在线免费观看| 八戒久久精品一区二区三区| 国产日韩精品一区二区在线观看播放 | 精品国产一区二区麻豆| 亚洲国产精品一区二区三区在线观看| 无码日韩精品一区二区免费暖暖| 久久亚洲AV午夜福利精品一区| 亚洲日韩精品一区二区三区| 精品国产日产一区二区三区 | 少妇人妻偷人精品一区二区| 国产在线精品一区免费香蕉|