아파치 티카(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 .