iTextでPDFファイルを作成する(2)

2018-02-07イントラマート

イントラマートでiTextを使用してpdfファイルを作成する方法です。

iTxetを使えばJavascriptからでもPDFファイルをさくせいすることができます。

イントラマートとは
株式会社NTTデータイントラマート社が開発・販売している、Webアプリケーションシステムのシステム共通基盤(統合型フレームワーク)で、国内の著名企業を中心に6,000社以上に導入されています。 イントラマートを導入することにより、Webシステム開発における短納期・低コスト・標準化推進・品質向上を実現できます。
詳しくはこちらをご覧ください。

イントラマートでPDFファイルを作成する(2)

イントラマートのスクリプト開発でiTextを使用してpdfファイルを作成します。

サンプルとして

  • テーブルの行の結合
  • 列の結合

をやってみます。

ただしイントラマートVer7.2に同胞されているiTextはVer.2.1.2で、
このバージョンでは「列の結合」はできましたが、行の結合はできませんでした。

setRowspan(int)メソッドはiTextのVer2.1.6から使用可能なようです。
イントラマートでsetRowspan(int)メソッドは呼び出すとエラーになります。

1.前準備

まずは出力用のOutputStreamとPDFのドキュメントオブジェクトを生成します。

    //必要なオブジェクト生成
    var bout = new java.io.ByteArrayOutputStream() ;
    var doc = new Packages.com.lowagie.text.Document( new Packages.com.lowagie.text.PageSize.getRectangle( "A4" ).rotate(), 50, 50, 50, 50 ); 
    var writer = new Packages.com.lowagie.text.pdf.PdfWriter.getInstance( doc, bout ) ;

2.FONTオブジェクト生成

次に表示用のFONTを生成しておきます。

    //フォントを作成
    var local_font = new Packages.com.lowagie.text.Font( Packages.com.lowagie.text.pdf.BaseFont.createFont( "HeiseiKakuGo-W5", "UniJIS-UCS2-H", Packages.com.lowagie.text.pdf.BaseFont.NOT_EMBEDDED), 10 ) ;
    var header_font = new Packages.com.lowagie.text.Font( Packages.com.lowagie.text.pdf.BaseFont.createFont( "HeiseiKakuGo-W5","UniJIS-UCS2-H", Packages.com.lowagie.text.pdf.BaseFont.NOT_EMBEDDED), 15, Packages.com.lowagie.text.Font.BOLD ) ;

3.Header,Footerを生成します

PDFのHeader、Footer情報を設定します。

    //ヘッダを作成
    var headers = new Packages.com.lowagie.text.HeaderFooter( new Packages.com.lowagie.text.Phrase( "ヘッダー", header_font ), false ) ;
    headers.setAlignment( Packages.com.lowagie.text.Element.ALIGN_CENTER ) ;
    headers.setBorder( Packages.com.lowagie.text.Rectangle.NO_BORDER ) ;
    doc.setHeader( headers ) ;

    //フッターを作成
    var footers = new Packages.com.lowagie.text.HeaderFooter( new Packages.com.lowagie.text.Phrase( "-", header_font ), new Packages.com.lowagie.text.Phrase( "-", header_font )) ;
    footers.setAlignment( Packages.com.lowagie.text.Element.ALIGN_CENTER ) ;
    footers.setBorder( Packages.com.lowagie.text.Rectangle.NO_BORDER ) ;
    doc.setFooter( footers ) ;

注意事項としてはこの後で呼ぶ「doc.open()」の前に呼ぶことです。
そうしないとうまく行きませんでした。

4.プロパティ設定

その他のPDFプロパティを設定します。

    //編集者を設定
    doc.addAuthor( "iTextサンプル・編集者" ) ;

    //タイトルを設定
    doc.addTitle( "iTextサンプル・タイトル" ) ; 

    //サブタイトルを設定
    doc.addSubject( "iTextサンプル・サブタイトル" ) ;

    //作成日付を設定
    doc.addCreationDate() ;

5.PDFドキュメントをオープンする

いよいよPDFドキュメントをオープンします。

    //PDFドキュメントをオープン
    doc.open() ;

これだけです。

6.PDFの内容設定

PDFの行、表、表示内容等を設定します。

    //行を作成
    doc.add( new Packages.com.lowagie.text.Paragraph( "これは1行目" , local_font )) ;
    doc.add( new Packages.com.lowagie.text.Paragraph( "これは2行目" , local_font )) ;

    //テーブルを作成
    var basetable = new Packages.com.lowagie.text.pdf.PdfPTable( 6 ) ;

    //テーブルを中央寄せ
    basetable.setHorizontalAlignment( Packages.com.lowagie.text.Element.ALIGN_CENTER ) ;

    //カラムの大きさを指定
    var col_width = java.lang.reflect.Array.newInstance( java.lang.Integer.TYPE , 6 ) ;
    col_width[ 0 ] = new java.lang.Integer( 50 ).intValue() ;
    col_width[ 1 ] = new java.lang.Integer( 20 ).intValue() ;
    col_width[ 2 ] = new java.lang.Integer( 30 ).intValue() ;
    col_width[ 3 ] = new java.lang.Integer( 40 ).intValue() ;
    col_width[ 4 ] = new java.lang.Integer( 30 ).intValue() ;
    col_width[ 5 ] = new java.lang.Integer( 30 ).intValue() ;
    basetable.setWidths( col_width ) ;

    //セルを作成
    var cell1_1 = new Packages.com.lowagie.text.pdf.PdfPCell( new Packages.com.lowagie.text.Phrase( "No", local_font )) ;
    var cell2_1 = new Packages.com.lowagie.text.pdf.PdfPCell( new Packages.com.lowagie.text.Phrase( "コード", local_font )) ;
    var cell3_1 = new Packages.com.lowagie.text.pdf.PdfPCell( new Packages.com.lowagie.text.Phrase( "名称", local_font )) ;
    var cell4_1 = new Packages.com.lowagie.text.pdf.PdfPCell( new Packages.com.lowagie.text.Phrase( "金額", local_font )) ;
    var cell5_1 = new Packages.com.lowagie.text.pdf.PdfPCell( new Packages.com.lowagie.text.Phrase( "単価", local_font )) ;
    var cell6_1 = new Packages.com.lowagie.text.pdf.PdfPCell( new Packages.com.lowagie.text.Phrase( "平均", local_font )) ;

    //テーブルにセルを設定
    basetable.addCell( cell1_1 ) ;
    basetable.addCell( cell2_1 ) ;
    basetable.addCell( cell3_1 ) ;
    basetable.addCell( cell4_1 ) ;
    basetable.addCell( cell5_1 ) ;
    basetable.addCell( cell6_1 ) ;

    //枠なしテーブルを作成するためにダミーの四角形を作成
    var no_border = new Packages.com.lowagie.text.Rectangle( 0, 0, 0, 0 ) ;
    no_border.setBorderWidthLeft( 0 ) ;
    no_border.setBorderWidthBottom( 0.5 ) ;
    no_border.setBorderWidthRight( 0 ) ;
    no_border.setBorderWidthTop( 0 ) ;
    no_border.setBorderColor( java.awt.Color.black );

    //枠なしテーブルを作成するためにダミーの四角形を作成
    var no_border2 = new Packages.com.lowagie.text.Rectangle( 0, 0, 0, 0 ) ;
    no_border2.setBorderWidthLeft( 0 ) ;
    no_border2.setBorderWidthBottom( 0 ) ;
    no_border2.setBorderWidthRight( 0 ) ;
    no_border2.setBorderWidthTop( 0 ) ;
    no_border2.setBorderColor( java.awt.Color.black );

    //行を作成
    for( var i = 0 ; i < 50 ; i++ ){
        //Rowspanの代わりにテーブルを挿入
        //テーブルを作成(枠線なし)
        var newtable = new Packages.com.lowagie.text.pdf.PdfPTable( 1 ) ;
        var span_1 = new Packages.com.lowagie.text.pdf.PdfPCell( new Packages.com.lowagie.text.Phrase( "rowspan1", local_font )) ;
        var span_2 = new Packages.com.lowagie.text.pdf.PdfPCell( new Packages.com.lowagie.text.Phrase( "rowspan2", local_font )) ;
        span_1.cloneNonPositionParameters( no_border ) ;
        span_2.cloneNonPositionParameters( no_border2 ) ;

        newtable.addCell( span_1 ) ;
        newtable.addCell( span_2 ) ;

        //枠線にぴたっとくっつけるために再度セルに設定
        var row_spancell = new Packages.com.lowagie.text.pdf.PdfPCell( newtable ) ;
        row_spancell.setPadding( 0 ) ;

        //元のテーブルに設定
        basetable.addCell( row_spancell ) ;

        //セルを作成
        var cell1_2 = new Packages.com.lowagie.text.pdf.PdfPCell( new Packages.com.lowagie.text.Phrase( new String( i ) , local_font )) ;
        var cell2_2 = new Packages.com.lowagie.text.pdf.PdfPCell( new Packages.com.lowagie.text.Phrase( "code" + new String( i ), local_font )) ;
        var cell3_2 = new Packages.com.lowagie.text.pdf.PdfPCell( new Packages.com.lowagie.text.Phrase( "name" + new String( i ), local_font )) ;
        var cell4_2 = new Packages.com.lowagie.text.pdf.PdfPCell( new Packages.com.lowagie.text.Phrase( "money" + new String( i ), local_font )) ;
        var cell5_2 = new Packages.com.lowagie.text.pdf.PdfPCell( new Packages.com.lowagie.text.Phrase( "tanka" + new String( i ), local_font )) ;

        //セルデータを作成
        basetable.addCell( cell1_2 ) ;
        basetable.addCell( cell2_2 ) ;
        if( i % 2 == 0 ){      //2行に1回Colspanを設定
            cell3_2.setColspan( 2 ) ;
            basetable.addCell( cell3_2 ) ;
        }
        else{
            basetable.addCell( cell3_2 ) ;
            basetable.addCell( cell4_2 ) ;
        }

        basetable.addCell( cell5_2 ) ;

        //1行として行を終了させる
        basetable.completeRow() ;

    }

    //テーブルのヘッダー行を指定
    basetable.setHeaderRows( 1 ) ;

    //テーブルをドキュメントオブジェクトに追加
    doc.add( basetable ) ;

    //ドキュメントをクローズ
    doc.close() ;

7.PDFファイルをブラウザーに送信

作成しPDFファイルをブラウザーに送信します。

    //PDFをブラウザーに出力
    var strPdfFileName =  Client.identifier() + ".pdf" ;
    var local_file = new Packages.jp.co.intra_mart.foundation.service.client.file.NetworkFile( strPdfFileName ) ;
    if(local_file.exists()){
        local_file.remove() ;
    }
    local_file.save( bout.toByteArray()) ;
    local_file.close() ;

    var pdffile = new VirtualFile( strPdfFileName ) ;
    var strFileData = pdffile.load() ;
    pdffile.remove() ;
    Module.download.send( strFileData, "test.pdf", "application/pdf" ) ;

ブラウザー送信にはイントラマートのModule.download.send()を利用して送信します。

 

株式会社システムトラスト

人材募集中です。

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ