Tika 與 Spring Boot 的完美結(jié)合:支持任意文檔解析的神器
環(huán)境:SpringBoot3.2.5
一、簡(jiǎn)介
文檔解析在現(xiàn)代企業(yè)和開發(fā)領(lǐng)域中應(yīng)用還是非常廣泛的,尤其是在需要從多種格式的文檔中提取有價(jià)值信息的情況下。隨著數(shù)字化轉(zhuǎn)型的加速,企業(yè)和組織越來(lái)越依賴自動(dòng)化工具來(lái)處理大量的文檔數(shù)據(jù)。Apache Tika 是一個(gè)強(qiáng)大的開源工具,專門用于從各種文件格式中提取文本和元數(shù)據(jù)。Spring AI也自動(dòng)集成了Tika作為文檔解析器。
通過使用 Tika,企業(yè)不僅可以簡(jiǎn)化文檔處理流程,還能提高數(shù)據(jù)處理的準(zhǔn)確性和效率。
Tika有哪些優(yōu)勢(shì)呢?
1. 廣泛的格式支持
Tika 支持超過 1000 種文檔格式,包括常見的 Office 文檔(如 DOCX、XLSX、PPTX)、PDF、HTML、音頻、視頻和圖像文件。
2. 易于集成
Tika 提供了一個(gè)簡(jiǎn)單易用的 Java API,可以輕松地集成到任何 Java 應(yīng)用程序中,包括 Spring Boot 應(yīng)用。
3. 內(nèi)容和元數(shù)據(jù)提取
Tika 不僅能夠提取文檔的內(nèi)容,還能提取文檔的元數(shù)據(jù),如標(biāo)題、作者、創(chuàng)建日期等。
4. 自然語(yǔ)言處理(NLP)功能
Tika 內(nèi)置了一些自然語(yǔ)言處理功能,如語(yǔ)言檢測(cè)、詞頻統(tǒng)計(jì)等。這使得 Tika 成為一個(gè)多功能工具,不僅限于文檔解析,還可以用于文本分析。
5. 批處理和自動(dòng)化
Tika 支持批處理模式,可以高效地處理大量文檔。這對(duì)于需要自動(dòng)化文檔處理流程的應(yīng)用非常有用,可以節(jié)省時(shí)間和人力資源。
6. 跨平臺(tái)兼容性
Tika 是純 Java 編寫的,因此可以在任何支持 Java 的平臺(tái)上運(yùn)行,具有很好的跨平臺(tái)兼容性。
7. 社區(qū)支持
作為 Apache 基金會(huì)的一個(gè)項(xiàng)目,Tika 擁有一個(gè)活躍的社區(qū)支持。
8. 安全性
Tika 在處理文檔時(shí)支持安全功能,如防止惡意內(nèi)容(如 XSS 攻擊)和處理加密文檔。
9. 擴(kuò)展性和插件化
Tika 設(shè)計(jì)為可擴(kuò)展的,支持通過插件來(lái)增加新的解析器和功能。
10. 輕量級(jí)
盡管功能強(qiáng)大,Tika 卻是一個(gè)相對(duì)輕量級(jí)的工具,不需要安裝復(fù)雜的依賴環(huán)境即可運(yùn)行。
接下來(lái),我們將通過幾個(gè)示例詳細(xì)介紹有關(guān)Tika的使用。
2. 實(shí)戰(zhàn)案例
Tika 提供了多種解析文件的方法。這些方法提供了不同程度的控制、靈活性和復(fù)雜性。
環(huán)境準(zhǔn)備
<properties>
<tika.version>2.9.2</tika.version>
</properties>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>${tika.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers-standard-package</artifactId>
<version>${tika.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parser-scientific-package</artifactId>
<version>${tika.version}</version>
</dependency>
注意你使用的版本,可能會(huì)有些差異。
2.1 使用 Tika 門面進(jìn)行解析
Tika Facade 提供了許多快速、簡(jiǎn)便的方法,讓 Tika 對(duì)內(nèi)容進(jìn)行解析,并返回結(jié)果純文本。
public static String parseToString() throws Exception {
Tika tika = new Tika();
try (InputStream stream = new FileInputStream(new File("e:\\technology.docx"))) {
return tika.parseToString(stream);
}
}
輸出結(jié)果
圖片
完整的將word文檔中的內(nèi)容按照格式解析出來(lái)。
2.2 解析文本文件
不管你要解析什么文檔格式,你都可以通過AutoDetectParser來(lái)完成解析動(dòng)作,不過這里我們使用具體的文本解析器TXTParser。
TXTParser parser = new TXTParser() ;
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata() ;
ParseContext context = new ParseContext() ;
try (InputStream stream = new FileInputStream(new File("C:\\execute script.txt"))) {
parser.parse(stream, handler, metadata, context) ;
}
System.out.println(handler.toString()) ;
System.out.println(metadata.toString()) ;
輸出結(jié)果
圖片
2.3 解析PDF文檔
與上面解析文本文檔一樣,我們只需要切換不同的解析器即可,如下示例:
PDFParser parser = new PDFParser() ;
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata() ;
ParseContext context = new ParseContext() ;
try (InputStream stream = new FileInputStream(new File("D:\\setups\\ReferenceCard.pdf"))) {
parser.parse(stream, handler, metadata, context) ;
}
System.out.println(handler.toString()) ;
System.out.println(metadata.toString()) ;
這里僅僅是切換了解析器而已,輸出結(jié)果:
圖片
2.4 使用自動(dòng)檢測(cè)解析器進(jìn)行解析
為了獲得更多控制權(quán),你可以直接調(diào)用 Tika 解析器。大多數(shù)情況下,你會(huì)希望從自動(dòng)檢測(cè)解析器開始使用,它會(huì)自動(dòng)找出你的內(nèi)容類型,然后為你調(diào)用相應(yīng)的解析器。
public static String parseAutoDetect() throws Exception {
AutoDetectParser parser = new AutoDetectParser() ;
BodyContentHandler handler = new BodyContentHandler() ;
Metadata metadata = new Metadata();
try (InputStream stream = new FileInputStream(new File("e:\\technology.docx"))) {
parser.parse(stream, handler, metadata);
return handler.toString();
}
}
這同樣能正確的解析文檔內(nèi)容,在這里我們不需要使用具體文檔的解析器,而是由Tika自動(dòng)的監(jiān)測(cè)。
2.5 將文檔解析為HTML
在解析時(shí),我們可以通過使用 ToXMLContentHandler,可以以字符串形式獲取整個(gè)文檔的 XHTML 內(nèi)容。
public static String parserToXHTML() throws Exception {
ToXMLContentHandler handler = new ToXMLContentHandler();
AutoDetectParser parser = new AutoDetectParser();
Metadata metadata = new Metadata();
try (InputStream stream = new FileInputStream(new File("e:\\technology.docx"))) {
parser.parse(stream, handler, metadata);
return handler.toString();
}
}
輸出結(jié)果
圖片
保存為html后,通過瀏覽器瀏覽
圖片
完美的生成HTML文檔。
2.6 定制化Tika
通過 Tika 的配置 XML,可以對(duì)使用哪些解析器以及它們的優(yōu)先級(jí)順序等進(jìn)行高度控制。如下示例配置(tika-config.xml)
<?xml versinotallow="1.0" encoding="UTF-8"?>
<properties>
<parsers>
<!-- 配置了默認(rèn)解析器,同時(shí)設(shè)置了不解析n哪些類型的文檔 -->
<parser class="org.apache.tika.parser.DefaultParser">
<!-- 這將不解析PDF文檔-->
<mime-exclude>application/pdf</mime-exclude>
</parser>
</parsers>
</properties>
使用方式
TikaConfig config = new TikaConfig(new ClassPathResource("tika-config.xml").getFile());
AutoDetectParser parser = new AutoDetectParser(config) ;
// ...
當(dāng)你解析PDF文檔時(shí)將輸出如下提示:
X-TIKA:Parsed-By=org.apache.tika.parser.EmptyParser X-TIKA:Parsed-By-Full-Set=org.apache.tika.parser.EmptyParser Content-Type=application/pdf
你也可以為具體的文檔類型,自定義解析器,可如下配置:
<?xml versinotallow="1.0" encoding="UTF-8"?>
<properties>
<parsers>
<parser class="com.pak.PackPDFParser">
<mime>application/pdf</mime>
</parser>
</parsers>
</properties>
這里定義了pdf文檔將會(huì)使用PackPDFParser進(jìn)行解析。
2.7 與Spring Boot結(jié)合
我們這里通過文件上傳的方式,將上傳的文件解析為文本數(shù)據(jù),然后輸出。
首先,配置自動(dòng)關(guān)聯(lián)文檔的解析器
@Bean
Parser parser() {
AutoDetectParser parser = new AutoDetectParser() ;
parser.setFallback(new TXTParser()) ;
return parser ;
}
接下來(lái),定義Controller接口
@RestController
@RequestMapping("/tika")
public class TikaController {
private final Parser parser ;
public TikaController(Parser parser) {
this.parser = parser ;
}
@PostMapping("/upload")
public String upload(MultipartFile file) throws Exception {
InputStream stream = file.getInputStream() ;
BodyContentHandler handler = new BodyContentHandler();
this.parser.parse(stream, handler, new Metadata(), new ParseContext()) ;
return handler.toString() ;
}
}
通過postman進(jìn)行接口調(diào)用
圖片
與Spring Boot結(jié)合非常的簡(jiǎn)單也就是簡(jiǎn)單的調(diào)用相應(yīng)的API接口。