Apache Tika.
Apache Tika - библиотека предназначенная для определения, извлечения данных и метаданных из различных типов файлов в простой текстовый формат plan text, для последующего анализа содержимого файла и принятия решения что же с ним(файлом) далее делать. Очень часто tika используется как парсер текста файла, и извлеченные данные передаются для дальнейшего анализа поисковым движкам которые в свою очередь индексируют файл и его содержимое. Типы файлов которые поддерживает tika можно посмотреть на сайте http://tika.apache.org/1.2/formats.html. И так давайте перейдем к работе с парсером tika, что для этого нужно: прежде всего файл, пусть для нашего примера мы будем парсить PDF - файл, далле нам нужен сам парсер будем использовать спецефический заточенный под PDF-файл PDFParser, но если мы не знаем точный тип файла можно использовать и AutoDetectParser который сам принимает решение, какой парсер вызывать. У парсера есть метод public void parse(java.io.InputStream stream, org.xml.sax.ContentHandler handler, org.apache.tika.metadata.Metadata metadata, org.apache.tika.parser.ParseContext context); который парсит файл, первый параметр принимает InputStream, источник что мы разбираем в нашем случае это InputStream is2 = new FileInputStream(file); второй параметр ContentHandler будет содержать тело документа/текст, третий параметр будет содержать метаданные - кто создал, когда и т.д., четвертый параметр какой xml-парсер будет использоваться. Давайте рассмотрим пример подробно:
package com.vit;
import org.apache.log4j.Logger;
import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.pdf.PDFParser;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class TikaSample {
private static final String filename = "bs12.pdf";
public TikaSample() throws IOException, SAXException, TikaException {
Logger log = Logger.getLogger(this.getClass().getName()); //create Logger
Metadata metadata = new Metadata(); //create metadata
Tika tika = new Tika(); //create tika
InputStream is = getClass().getResourceAsStream(filename);
File file = new File(filename);
InputStream is2 = new FileInputStream(file);// create source InputStream
ParseContext pc = new ParseContext(); //create xml-парсер
ContentHandler ch = new BodyContentHandler(-1);//сдесь будет содержаться тело документа в виде plan text
String mimeType = tika.detect(is);//определяем mimeType нашего документа
metadata.set(Metadata.CONTENT_TYPE, mimeType);//устанавливаем mimeType
PDFParser parser = new PDFParser(); //create PDFParser
//AutoDetectParser parser = new AutoDetectParser();//create универсальный парсер который на основе mimeType принимает решение какой использовать узкоспециализированный парсер
parser.parse(is2, ch, metadata, pc); //разбор файла на мелкие кусочки
log.info(ch.toString());//выводим текст документа
for (String name : metadata.names()) {//выводим метаданные документа
log.info(name + ": " + metadata.get(name));
}
if (is2 != null) is2.close();
if (is != null) is.close();
}
public static void main(String[] args) throws IOException, SAXException, TikaException {
TikaSample tikaSample = new TikaSample();
}
}
обратите внимание на -1 при создании new BodyContentHandler(-1); иначе будет ошибка если большой файл по размеру, это связано с нехваткой памяти куда будет загружается наш документ: Exception in thread "main" org.apache.tika.sax.WriteOutContentHandler$WriteLimitReachedException: Your document contained more than 100000 characters, запускаем нашу программу и получаем такой результат:
... текст документа ... 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <meta:creation-date: 2005-04-22T18:10:03Z> 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <dcterms:modified: 2005-04-23T05:28:17Z> 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <meta:save-date: 2005-04-23T05:28:17Z> 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <dcterms:created: 2005-04-22T18:10:03Z> 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <Last-Modified: 2005-04-23T05:28:17Z> 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <date: 2005-04-22T18:10:03Z> 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <modified: 2005-04-23T05:28:17Z> 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <xmpTPg:NPages: 25> 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <Creation-Date: 2005-04-22T18:10:03Z> 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <title: PC World Russia CD, May 2005> 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <created: Fri Apr 22 22:10:03 MSD 2005> 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <producer: Модуль Acrobat Web Capture 6.0> 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <Content-Type: application/pdf> 2012-10-26 12:50:22,990 INFO [com.vit.TikaSample] - <Last-Save-Date: 2005-04-23T05:28:17Z>
и конечно же приведу файл pom.xml с зависимостями:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.vit</groupId>
<artifactId>spring-jpa-utility</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>Spring JPA</name>
<properties>
<tika>1.2</tika>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>${tika}</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>${tika}</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-app</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-app</artifactId>
<version>${tika}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Комментариев нет:
Отправить комментарий