2016年11月17日木曜日

Windows で Java から OpenOffice を使い Excel-PDF 変換を試した時のメモ書き

Windows で Java から OpenOffice を叩いて Excel-PDF 変換を試してみた時のメモ書きです。

環境整備


1. Java 開発環境は整備されている前提


2. OpenOffice をダウンロードしてインストール
http://www.openoffice.org/download/

※単体で OpenOffice が動くことを確認


3. OpenOffice 接続用モジュールの依存関係を追加

  Maven の pom.xml であれば以下

実装


シンプルに実装、解説するまでも無く、コードを実際動かして追いかければ解るでしょう。

private static final String OFFICE_HOME = "C:/Program Files (x86)/OpenOffice 4";
private static final int OFFICE_PORT = 8100;

public static void convertExcelToPdf(File srcExcelFile, File dstPdfFile) {
    DefaultOfficeManagerConfiguration config = new DefaultOfficeManagerConfiguration();

    config.setOfficeHome(OFFICE_HOME);
    config.setPortNumber(OFFICE_PORT);

    OfficeManager manager = config.buildOfficeManager();
    manager.start();

    OfficeDocumentConverter converter = new OfficeDocumentConverter(manager);
    converter.convert(srcExcelFile, dstPdfFile);
    manager.stop();
}

テスト


手元の環境では、適当な入力 Excel ファイルと出力 PDF ファイルを変換処理に渡すことで、あっさり動き、明らかに元ファイルから変換された PDF が出力されているのが確認できました。

レスポンスなど


感覚的な話にはなりますが、手元の環境では OpenOffice が一度でも起動していれば、2回目以降の起動は軽快でした。実際はバックエンドのサービスとして使う事の方が多いでしょうから、OpenOffice 自体をサービスとして起動しておき、連携させると良いでしょう。

注意点


Excel-PDF 変換を行う状況は Excel テンプレートを加工して、その後工程として変換を行うパターンが多いと考えられます。実際に様々な Excel ファイルでテストをすると解る通り、Excel と OpenOffice ではデフォルトの印刷範囲の扱いが異なります。そのため、意図した出力結果を得たいのであれば、OpenOffice でテンプレートを作成、編集するべきです。

ただし、OpenOffice で印刷範囲を編集されたファイルは、Excel での編集~保存時に警告が出てしまいます。システムから、Excel ファイルをダウンロードするような機能が無ければ全く問題は無いと思いますが、システム利用者が PDF 変換前の Excel ファイルを直接扱う状況があるならば、テンプレートを OpenOffice で修正。その後、更に Excel で読み、保存し直した加工テンプレートファイルを元ファイルとして使うべきです。こういった手間をかけなければ、運用シーンで下らないQ&Aサポート対応に追われる事が予想されます。


変換対象のページ指定も Excel と異なるようで、変換処理で行っている内容は PDF 形式でのエクスポートのようですが、OfficeDocumentConverter を使うと、ページを問わず、印刷範囲の指定が行われている箇所が変換対象になるようです。そのため、システム開発の依頼元や、システム利用者から受け取った素の Excel ファイルを使ってしまうと、Excel の印刷範囲の設定だけになるため、意図しない出力結果になる可能性もあります。利用者が Excel の環境を使うことが多い場合は、ここで述べている観点から現実の運用まで含めて見通した上でシステムを調整しておかないとと色々不都合が生じるでしょう。


同時並列的なリクエストに対する検証などは全くしていません。調べている最中に、古い情報では排他制御をした方がいいような情報も見受けられたので、必ず実運用の環境で検証してみることをお薦めします。この手のバックエンドのサービスが固まると、運用上非常に厄介な事になるのは間違いありませんからね。

0 件のコメント:

コメントを投稿