社内でExcelをPOIで加工して、PDFに変換して出力する必要があったので、自分なりにまとめてみます。
要件としては、POIでExcelファイルを加工して、JODConverter+LibreOffice+Tomcatで構成している文書変換用のサーバを使ってPDFを作成してみるテスト。
既に用意しているUbuntuサーバに文書変換機能を構成してみます。
環境...
- Ubuntu12.04 Server LTS (x86)(LAMP構成でインストール)
- Apache/tomcat6 (Ubuntuで標準に用意されているパッケージを使用)
用意したもの...
準備
Tomcatの準備や、LibreOffice3.5のインストールは終わっているものとします。
先の、JODConverbter-webapp-2.2.2.zip を解凍してできる、jodconverter-webapp-2.2.2.war を、Tomcatのwebappsディレクトリに移動(もちろんこの時、tomcatは一旦停止させておく)。
LibreOfficeをHeadLessモードで起動させる。
soffice --headless --nologo --nofirststartwizard --accept="socket,host=127.0.0.1,port=8100;urp"
実際には、下記のような、起動スクリプトを作成して、/etc/init.d に保存しました。
#!/bin/sh
OOo_HOME=/usr/bin
SOFFICE_PATH=$OOo_HOME/soffice
PIDFILE=/var/run/openoffice-server.pid
set -e
case "$1" in
start)
if [ -f $PIDFILE ]; then
echo "OpenOffice headless server has already started."
sleep 5
exit
fi
echo "Starting OpenOffice headless server."
$SOFFICE_PATH --headless --nologo --nofirststartwizard --accept="socket,host=127.0.0.1,port=8100;urp" & > /dev/null 2>&1
touch $PIDFILE
exit
;;
stop)
if [ -f $PIDFILE ]; then
echo "Stopping OpenOffice headless server."
killall -9 soffice.bin
rm -f $PIDFILE
exit
fi
echo "OpenOffice headless server is not running."
exit
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
http://tomcatserver:8080/jodconverter-webapp-2.2.2/ にアクセスすると、JODConverterの簡易ウェブアプリが開きます。実際に、Excelのファイル等を変換させてpdfのファイルが出力されてくれば、動作確認OK。
Javaから変換させるテスト
ここまでくると、Javaで作成したアプリケーションで、ExcelファイルからPDFに変換させたくなります。ネット上で検索すると、HttpClientを利用してExcelファイルをサーバに投げれば良いことがわかったので、色々調べてみましたが、このHttpClient、いまはバージョンが4.3.3ですが、ネット上の情報はバージョン3のものが多く、色々悩みましたが(なんせ、HTTPの基本がわかってないので・・) いろいろなサイトの情報を元にアタックしてみました。
HttpClient なるものを初めて触りましたが、こんな感じになりました。
これでよいのかどうかは別として、ひとまず変換できたので、OKとします。
public class JODconTest {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
String inFileName = "test.xls";
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost post = new HttpPost("http://tomcatserver:8080/jodconverter-webapp-2.2.2/service");
post.setHeader("Accept", "application/pdf");
post.setHeader("Content-Type", "application/vnd.ms-excel");
post.setEntity(new FileEntity(new File(inFileName)));
System.out.println(post.getEntity().getContentLength());
try {
CloseableHttpResponse response = httpClient.execute(post);
Header[] h;
h = response.getAllHeaders();
//for (Header h1 : h) {
// System.out.println(h1.getName() + ", " + h1.getValue());
//}
//if (response.getEntity().isStreaming()) {
// System.out.println("Is Streaming");
//}
InputStream is = response.getEntity().getContent();
try (FileOutputStream os = new FileOutputStream("test.pdf")) {
byte[] buf = new byte[1024];
int size;
while ((size = is.read(buf)) != -1) {
os.write(buf, 0, size);
}
os.flush();
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
0件のコメント