質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

Javaバッチで、ExcelファイルからPDFファイルへ変換時のカストマイズが反映しない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,585

Animalg7

score 9

いつも参考にさせて頂いており、大変お世話になっています。

掲題の通り、Javaバッチで「Excelファイル」から「PDFファイル」へ変換する際に、詳細な設定が正しく反映しないのです。

【開発環境】
OS:Windows7
IDE:Eclipse(ver.4.3) 
言語:jdk 1.7
ツール:Apache OpenOffice(Ver.4.1.3)、POI(Ver.3.16)、jodConverter(Ver.2.2.2)

【Javaソース】

public static Boolean conversionExcelToPDFWithOption ( String _excelFile, String _pdfFile ) throws IOException {

        boolean _return = false;

        InputStream excelData  = new FileInputStream ( _excelFile );
        Workbook wb = null;

        File file = new File( _excelFile );
        if ( file.getPath().endsWith( ".xls" ) ) {
            wb = new HSSFWorkbook( excelData );
        }
        else if ( file.getPath().endsWith( ".xlsx" ) )  {
            wb = new XSSFWorkbook( excelData );
        }
        else {
            System.out.println( "当該ファイルの拡張子が、エクセルの拡張子(\".xls\"、\".xlsx\")ではありませんので、処理を中止します。" );
            System.exit( 16 ); // 処理中止!!!
        }

        // PDF用の customPdfFormat インスタンス作成
        DocumentFormat customPdfFormat =
 new DefaultDocumentFormatRegistry().getFormatByFileExtension( ConversionUtil.isExtension( _pdfFile ) );

       Map<String, Object> pdfOptions = new HashMap<String, Object>();
        //zoom指定
        pdfOptions.put("Magnification", new Integer(0));

        // ExcelならSPREADSHEET、wordならDRAWING、pptならPRESENTATION、テキストならTEXTかと思われる
        customPdfFormat.setExportOption( DocumentFamily.SPREADSHEET, "FilterData", pdfOptions  );

        // バッファ内にExcelの内容を書き出す
        ByteArrayOutputStream buff = new ByteArrayOutputStream();
        // PDF変換時に渡すInputStreamを用意
        ByteArrayInputStream in = null;
        // PDFの出力先を開く
        FileOutputStream out=null;
        // OpenOfficeに接続(localhostの8100番ポート)
        SocketOpenOfficeConnection con = new SocketOpenOfficeConnection( 8100 );
        try {
            wb.write( buff );
            in = new ByteArrayInputStream( buff.toByteArray() );
            try {
                out = new FileOutputStream( _pdfFile );
                con.connect();
                // ExcelからPDFへ変換
                DocumentConverter converter = new OpenOfficeDocumentConverter( con );
                converter.convert(
                        in,
                        new DefaultDocumentFormatRegistry().getFormatByFileExtension( ConversionUtil.isExtension( _excelFile ) ),
                        out,
                        customPdfFormat );

                // 正常終了。
                _return = true;

            }
            catch ( Exception e ) {
                e.printStackTrace();
            }
            finally {
                wb.close();
                con.disconnect();
                if ( null != out ) {
                    try {
                        out.flush();
                        out.close();
                    }
                    catch ( IOException ioe ) {
                        // ignore
                        ioe.printStackTrace();
                    }
                }
            }
        }
        catch ( Exception e ) {
            e.printStackTrace();
        }
        finally {
            if ( null != in ) {
                try {
                    in.close();
                }
                catch ( Exception e2 ) {
                    e2.printStackTrace();
                }
            }
            try {
                buff.close(); // OpenOfficeから切断
            }
            catch ( Exception e3 ) {
                e3.printStackTrace();
            }
        }
        return _return;
    }

    public static String isExtension( String _fileName ) {
        String _return = null;
        if ( ( _fileName != null ) && ( !_fileName.equals( "" ) ) ) {
            int point = _fileName.lastIndexOf( "." );
            if ( point != -1 ) {
                _return = _fileName.substring( point + 1 );
            }
        }
        return _return;
    }


上記のMap内pdfOptions.put("Magnification", new Integer(0));に詳細な設定が出来るようですが、
"Magnification"を0に設定すると元のExcelファイルの設定で作成されるような仕様ですが、必ず100%で作成さ
れてしまい、1シートが2ページ(元々90%で設定されている)になってしまいます。

又、Excelの1Bookで複数シートあるものを全て連続で、PDF化したいのですが、
当該環境で実行するとなぜか1Bookで6シートあるものが、2シート分だけしかPDF化されません。

なぜ、このような現象になるのか、又、ここ間違っていないかなど、
皆様の貴重なご意見を頂戴出来ませんでしょうか。

大変お手数をお掛けして申し訳ありませんが、
どうぞ、宜しくお願い申し上げます。

【参考サイト】
リンク内容

以上、宜しくお願い申し上げます。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • sazi

    2017/08/16 13:28

    コードをマークダウンされて下さい。そのその方が回答が付きやすいですよ

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる