|   | 
          
 
            
|  
              
 .NET TIPS 
[ASP.NET]iText.NETでPDF文書に表を追加するには?
山田 祥寛 
2005/07/01 | 
  | 
          
 
            
 
              
 
             | 
        
   「TIPS:[ASP.NET]Webフォームから動的にPDF文書を作成するには?」「TIPS:[ASP.NET]PDF文書のセキュリティ情報やヘッダ/フッタを設定するには?」「TIPS:[ASP.NET]あらかじめ用意したPDF文書をインポートするには?」では、iText.NETによるさまざまなPDF文書の生成方法について紹介してきた。本稿では、引き続きiText.NETライブラリを利用して、データベースから取り出したデータから動的に表を作成し、PDF文書に追加する方法について紹介しよう。
 なお、本稿のサンプルを利用するに当たっては、データベース上に以下のようなbooksテーブルを用意し、適当なデータを入力しておく必要がある。
| フィールド名 | 
データ型 | 
概要 | 
| isbn | 
VARCHAR(30) | 
ISBNコード | 
| title | 
VARCHAR(100) | 
書名 | 
| publish | 
VARCHAR(50) | 
出版社名 | 
  | 
| booksテーブルのフィールド・レイアウト | 
 それではさっそく、具体的なサンプル・コードを眺めてみよう。なお、本稿のサンプルを実行するには、「TIPS:[ASP.NET]Webフォームから動的にPDF文書を作成するには?」の手順に従って、iText.NETの展開とweb.configの設定を行っておく必要がある。
 
<%@ Page Language="C#" ContentType="application/pdf" %> 
<%@ Import Namespace="System.Data" %> 
<%@ Import Namespace="System.Data.SqlClient" %> 
<%@ Import Namespace="com.lowagie.text" %> 
<%@ Import Namespace="com.lowagie.text.pdf" %> 
<script runat="server"> 
void Page_Load(Object sender, EventArgs e){ 
  Response.AddHeader("content-disposition", "attachment; filename=result.pdf"); 
  Document doc = new Document(); 
  PdfWriter pw = PdfWriter.getInstance(doc, Response.OutputStream); 
  doc.open(); 
 
  // イメージを取り込み、90%の倍率でドキュメントに追加 
  com.lowagie.text.Image img = com.lowagie.text.Image.getInstance("http://www.wings.msn.to/image/wings.jpg"); 
  img.scalePercent(90); 
  doc.add(img); 
  Font font = new Font(BaseFont.createFont("HeiseiMin-W3", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED), 12, Font.NORMAL); 
 
  // 列数3の表を作成 
  com.lowagie.text.Table tbl = new com.lowagie.text.Table(3); 
 
  // 表のセル余白、幅(%)、各セルの幅(%)、水平方向の文字位置、 
  // 垂直方向の文字位置を設定 
  tbl.setPadding(4); 
  tbl.setWidth(90); 
  tbl.setWidths(new int[]{25, 50, 25}); 
  tbl.setDefaultHorizontalAlignment(ElementConst.ALIGN_CENTER); 
  tbl.setDefaultVerticalAlignment(ElementConst.ALIGN_MIDDLE); 
 
  // 表のヘッダを生成。setBackgroundColorメソッドで背景色を設定 
  String[] header = {"ISBNコード", "書名", "出版社"}; 
  for(int i = 0; i < header.Length; i++){ 
    Cell cel = new Cell(new Phrase(header[i], font)); 
    cel.setBackgroundColor(System.Drawing.Color.LightGray); 
    tbl.addCell(cel); 
  } 
 
  // ヘッダを生成することで、 
  // ページがまたがった場合には繰り返しヘッダを表示 
  tbl.endHeaders(); 
  SqlConnection objDb = new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet"); 
  SqlCommand objCom = new SqlCommand("SELECT isbn,title,publish FROM books", objDb); 
  objDb.Open(); 
  SqlDataReader objDr = objCom.ExecuteReader(); 
 
  // booksテーブルから取り出したデータを順に出力 
  while (objDr.Read()) { 
    for(int i = 0; i < 3; i++){ 
      tbl.addCell(new Cell(new Phrase(objDr.GetString(i), font))); 
    } 
  } 
  doc.add(tbl); 
  doc.close(); 
  Response.End(); 
} 
</script>
 | 
 
 
 | 
 
| データベースから動的にグリッド表を作成するWebフォーム(C#版:pdf_table_cs.aspx) | 
 
 
 
<%@ Page Language="VB" ContentType="application/pdf" %> 
<%@ Import Namespace="System.Data" %> 
<%@ Import Namespace="System.Data.SqlClient" %> 
<%@ Import Namespace="com.lowagie.text" %> 
<%@ Import Namespace="com.lowagie.text.pdf" %> 
<script runat="server"> 
Sub Page_Load(sender As Object, e As EventArgs) 
  Response.AddHeader("content-disposition", "attachment; filename=result.pdf") 
  Dim doc As New Document() 
  Dim pw As PdfWriter = PdfWriter.getInstance(doc, Response.OutputStream) 
  doc.open() 
 
  ' イメージを取り込み、90%の倍率でドキュメントに追加 
  Dim img As com.lowagie.text.Image = com.lowagie.text.Image.getInstance("http://www.wings.msn.to/image/wings.jpg") 
  img.scalePercent(90) 
  doc.add(img) 
  Dim font As New Font(BaseFont.createFont("HeiseiMin-W3", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED), 12, Font.NORMAL) 
 
  ' 列数3の表を作成 
  Dim tbl As New com.lowagie.text.Table(3) 
 
  ' 表のセル余白、幅(%)、各セルの幅(%)、水平方向の文字位置、 
  ' 垂直方向の文字位置を設定 
  tbl.setPadding(4) 
  tbl.setWidth(90) 
  tbl.setWidths(New Integer(){25, 50, 25}) 
  tbl.setDefaultHorizontalAlignment(ElementConst.ALIGN_CENTER) 
  tbl.setDefaultVerticalAlignment(ElementConst.ALIGN_MIDDLE) 
 
  ' 表のヘッダを生成。setBackgroundColorメソッドで背景色を設定 
  Dim header() As String = {"ISBNコード", "書名", "出版社"} 
  For i As Integer = 0 To header.Length-1 
    Dim cel As New Cell(New Phrase(header(i), font)) 
    cel.setBackgroundColor(System.Drawing.Color.LightGray) 
    tbl.addCell(cel) 
  Next 
 
  ' ヘッダを生成することで、 
  ' ページがまたがった場合には繰り返しヘッダを表示 
  tbl.endHeaders() 
  Dim objDb As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet") 
  Dim objCom As New SqlCommand("SELECT isbn,title,publish FROM books", objDb) 
  objDb.Open() 
  Dim objDr As SqlDataReader = objCom.ExecuteReader() 
 
  ' booksテーブルから取り出したデータを順に出力 
  Do While objDr.Read() 
    For i As Integer = 0 To 2 
      tbl.addCell(New Cell(New Phrase(objDr.GetString(i), font))) 
    Next 
  Loop 
  doc.add(tbl) 
  doc.close() 
  Response.End() 
End Sub 
</script>
 | 
 
 
 | 
 
| データベースから動的にグリッド表を作成するWebフォーム(VB.NET版:pdf_table_vb.aspx) | 
 iText.NETで表を作成するには、Tableクラス(com.lowagie.text名前空間)を利用する。Tableクラスの主要なコンストラクタは以下のとおりだ。
 
Table(int columns) 
Table(int columns, int rows)
 | 
 
 
 | 
 
| Tableクラスの主要なコンストラクタ構文 | 
| columnsは列数、rowsは行数を指定する。 | 
 表内のセルは、TableオブジェクトのaddCellメソッドで追加できる。このメソッドの第1パラメータには、Cellクラス(com.lowagie.text名前空間)のオブジェクトを指定するが、このCellオブジェクトが表の1つのセルを表す。
 
public override void addCell(Cell cell); | 
 
 
 
Public Overrides Sub addCell(ByVal cell As Cell) | 
 
 
 | 
 
| TableクラスのaddCellメソッドのシグネチャ(上:C#、下:VB.NET) | 
  addCellメソッドで登録したセルは表の左上から順番に追加され、指定された列がすべて埋められると、自動的に次の行が生成される、という仕組みだ。
 セルを横方向、縦方向に連結する場合には、CellオブジェクトのsetColspanメソッド、setRowspanメソッドを使用すればよい。いずれのメソッドも第1パラメータにint型の変数を指定でき、この数値はそれぞれ「列数」か「行数」を意味している。
 例えば、横3列にセルを連結するには、以下のように記述すればよい。
 以上を理解したら、前述のWebフォームのサンプル・コードの実行結果を実際にブラウザ上で確認してみよう。以下のように、データベースから取り出したデータが表に整形されて表示されれば成功だ。
 
  | 
 
| サンプル・コードの実行結果 | 
 以上、今回を含めて4本のTIPSにわたって、iText.NETに用意された主要なクラスの利用方法について見てきた。もちろん、iText.NETの機能はここで紹介したものにとどまらない。「TIPS:[ASP.NET]Webフォームから動的にPDF文書を作成するには?」でも示したが、より詳細な機能に興味があるという方は、以下のサイトからiText(iText.NETではない)のドキュメントを参照すればよい(残念ながら、iText.NET用のリファレンス・マニュアルは存在しないようだ)。
 iText:APIドキュメンテーション(オンライン版)
 iText:ドキュメンテーション
 オンラインでAPIドキュメントを参照したい場合には、
のWebページを参照すればよい。また、オフラインでドキュメントを参照したい場合には、
のWebページへアクセスしてtar.gz形式で圧縮されたファイルをダウンロードすればよい。
 
        
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間