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>