.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列にセルを連結するには、以下のように記述すればよい。

cel.setColspan(3);
横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形式で圧縮されたファイルをダウンロードすればよい。End of Article

カテゴリ:Webフォーム 処理対象:PDF
使用ライブラリ:Tableクラス(com.lowagie.text名前空間)
使用ライブラリ:Cellクラス(com.lowagie.text名前空間)
関連TIPS:[ASP.NET]Webフォームから動的にPDF文書を作成するには?
関連TIPS:[ASP.NET]PDF文書のセキュリティ情報やヘッダ/フッタを設定するには?
関連TIPS:[ASP.NET]あらかじめ用意したPDF文書をインポートするには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]Webフォームから動的にPDF文書を作成するには?
[ASP.NET]PDF文書のセキュリティ情報やヘッダ/フッタを設定するには?
[ASP.NET]あらかじめ用意したPDF文書をインポートするには?
[ASP.NET]DataGridコントロールの同一列内のセルを結合するには?
[ASP.NET]バイナリ・データをアップロードしてデータベースに登録するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間