|
.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 記事ランキング
本日
月間