社内で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();
        }

    }

}
カテゴリー: JavaJava 覚書

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です