프로그램언어/자바(Java)
[Java] Tika로 문서에서 텍스트 추출 (문서 필터링)
Steve Jang
2021. 5. 26. 23:00
티카(Tika)는 아파치 재단에서 운영하는 문서 필터링 프로젝트이다. 워드(Doc)나 PDF, PPT 등 문서형태의 파일에서 내용을 추출하는 프로젝트로 오래된 만큼 괜찮은 성능을 보여준다.
라이브러리 추가(maven)
<!-- Tika -->
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.26</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>1.26</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/openxml4j -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>openxml4j</artifactId>
<version>1.0-beta</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
티카 라이브러리만 설치하면 에러가 발생하는데 아래의 2가지 openxml4j와 poi-ooxml을 설치하면 이 문제를 해결 할 수 있다.
샘플 예제
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.sax.BodyContentHandler;
/**
* Tika 테스트
*
* @throws Exception
*/
public void tika() throws Exception {
File file = new File("D:/project/Abstract_Factory.docx");
BodyContentHandler handler = new BodyContentHandler();
AutoDetectParser parser = new AutoDetectParser();
Metadata metadata = new Metadata();
try (InputStream stream = new FileInputStream(file)) {
parser.parse(stream, handler, metadata);
System.out.println(handler.toString());
}
}
몇줄만 추가하면 문서를 필터링할 수 있는 준비가 끝난다. 사실 doc, ppt 등 오피스 프로그램마다 다양한 메타데이터까지 추출할 수 있고, handler.toString()으로 출력하면 이 메타데이터까지 모조리 출력한다. 그래서 indexOf와 같은 기능을 써서 필요한 부분만 가져오거나 문서 타입에 따른 핸들링을 다르게 하면 된다.
위 예제를 실행했을때 결과는 아래와 같다. 결과가 너무 길기 때문에 본문의 내용의 뒷부분을 잘랐으며, 대충 word/document.xml 이후에 본문이 나오는 것을 확인할 수 있다. 워낙 많은 메타데이터 속성이 있기 때문에 필요한 부분이 무엇인지 확인해서 가져오면 될 것이다.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
5월 26, 2021 10:53:39 오후 org.apache.tika.config.InitializableProblemHandler$3 handleInitializableProblem
경고: J2KImageReader not loaded. JPEG2000 files will not be processed.
See https://pdfbox.apache.org/2.0/dependencies.html#jai-image-io
for optional dependencies.
5월 26, 2021 10:53:40 오후 org.apache.tika.config.InitializableProblemHandler$3 handleInitializableProblem
경고: org.xerial's sqlite-jdbc is not loaded.
Please provide the jar on your classpath to parse sqlite files.
See tika-parsers/pom.xml for the correct version.
word/document.xml
Abstract Factory Pattern(추상 팩토리 패턴) Abstract Factory 상위개념 GoF 디자인패턴...
word/endnotes.xml
...
word/webSettings.xml
위 내용과 동일한 pdf내용을 필터링하면 아래와 같이 나온다.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
5월 26, 2021 10:56:25 오후 org.apache.tika.config.InitializableProblemHandler$3 handleInitializableProblem
경고: J2KImageReader not loaded. JPEG2000 files will not be processed.
See https://pdfbox.apache.org/2.0/dependencies.html#jai-image-io
for optional dependencies.
5월 26, 2021 10:56:25 오후 org.apache.tika.config.InitializableProblemHandler$3 handleInitializableProblem
경고: org.xerial's sqlite-jdbc is not loaded.
Please provide the jar on your classpath to parse sqlite files.
See tika-parsers/pom.xml for the correct version.
Abstract Factory Pattern(추상 팩토리 패턴)
Abstract
Factory
상위개념 GoF 디자인패턴
핵심키워드 캡슐화, 추상, 생성
비교개념 families of objects, product construction, object creation,
system parameterization
...
둘의 일단 차이를 인식해야 하는데 doc의 경우 한줄에 쭈욱 나열이 되지만, pdf의 경우 한줄한줄 개행이 되면서 출력이 된다. 그러니 필터링을 하는 입장에서는 pdf가 상당히 편할 것이다. (물론 여기에 온갖 폰트 때려박고 하면 pdf가 헬이 될수도 있지만..)