아파치 티카(apache tika) 로 컨텐츠 파싱하기


PDF 와 동영상, 이미지등 여러 멀티 미디어 파일을 파싱해서 meta data 를 가져와야 하는 일이 생겼습니다.

먼저 PDF 를 파싱하기 위해 PHP 로 된  https://www.pdfparser.org/ 를 사용했으나 다음과 같은 에러 발생했습니다.


PHP Warning:  gzuncompress(): data error in myproj/vendor/tecnickcom/tcpdf/include/tcpdf_filters.php on line 357


확인해 보니 pdf parser 라이브러리는 다양한 PDF 파일을 지원하지 않았고 이를 해결할 방법을 찾다 보니 tika 프로젝트를 알게되었습니다.



Tika 란


Java 로 개발된 contents 를 parsing 하는 라이브러리 및 app 으로 command  line 및 GUI 모드로 동작하는 app 와 RESTFul API 로 동작하는 server 가 있습니다.


설치

커맨드용 app 는 다음 주소에서 받으면 됩니다.

$ wget http://apache.mirror.cdnetworks.com/tika/tika-app-1.19.jar


standalone 으로 구동하고 RESTFul 로 요청할 수 있는 서버도 있는데 자동화하려면 이게 더 편리하며 아래 주소에서 받으면 됩니다.

$ wget http://apache.mirror.cdnetworks.com/tika/tika-server-1.19.jar

서버로 구동할 경우 처리 결과를 DB 에 남기려면 SQLite JDBC 가 필요하며 아래 라이브러리를 다운받아서 동일한 폴더에 위치시키면 됩니다.

$ wget http://central.maven.org/maven2/org/xerial/sqlite-jdbc/3.23.1/sqlite-jdbc-3.23.1.jar


실행

실행은 java -jar 옵션으로 아래처럼 실행하면 됩니다.

App

$ java -jar tika-app-1.19.jar


Server

$ java -jar tika-server-1.19.jar


SQLite JDBC 적용하려면 -cp 옵션을 추가합니다.

$ java -cp . -jar tika-server-1.19.jar


기본 포트는 9998 이며 다른 포트(Ex: 1234)로 구동할 경우 아래와 같이 -p 옵션을 추가합니다.

$ java -cp . -jar tika-server-1.19.jar  -h 0.0.0.0 -p 1234



서버 정보

서버로 구동했으면 REST API 로 여러 가지 요청을 할 수 있습니다.

version 확인

$ curl localhost:9998/version


Apache Tika 1.19


detector 확인

$ curl localhost:9998/detectors

지원하는 mime type 확인

$ curl localhost:9998/mime-types


컨텐츠 parsing

meta 분석

$ curl -T a.pdf localhost:9998/meta


특정 필드가 필요할 경우 url 에 필드명 명시하며 아래는 저자 필드만 추출합니다.

$ curl -T a.pdf localhost:9998/meta/Author

PDF 렌더링 속도를 빠르게 하려면 JDK 8 을 사용하고 JVM 구동시 아래 옵션 추가합니다.

-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider


원하는 형식으로 출력

기존 출력은 text/csv 이며 Accept 헤더에 원하는 포맷을 설정해서 호출하면 됩니다.


XML

$ curl -T a.pdf -H "Accept: application/rdf+xml" localhost:9998/meta


아래는 json 형식으로 결과물을 전달 받습니다.

$ curl -T a.pdf -H "Accept: application/json" localhost:9998/meta


JSON 일 경우 개행을 안 해서 보기가 힘드니 jq 로 포맷팅 하면  결과물이 보기 편해집니다.

$ curl -T a.pdf -H "Accept: application/json" localhost:9998/meta | jq .

같이 보기