.NET TIPS

[ASP.NET]Webフォームから動的にPDF文書を作成するには?

山田 祥寛
2005/06/10

 「ペーパレス化」という言葉が叫ばれて久しいが、Webアプリケーションから帳票を印刷したいというニーズはさほどに少なくなったように思われない。ビジネス・プロセスの自動化が進んだとはいえ、そこに確認と判断という「人間の手」が介在する以上、PDFやExcelファイル、HTMLページといった電子帳票も(一覧性という意味で断然優れた)紙帳票もなくなることはないだろう。

 さて、これら帳票をWebアプリケーション上で発行しようとした場合、読者諸兄はどのような方法を用いているだろうか。HTML+CSS(Cascading StyleSheet)を使えば、それなりに精密なレイアウトを設計することはもちろん可能だ。しかし、HTML+CSSではどうしても環境による微妙なずれを完全に排除することはできないし、そもそもそれだけ精密なレイアウトをCSSで設計するのはなかなかの手間でもあるはずだ。また、HTML+CSSで作成されたドキュメントは、ユーザーが改ざんするのも簡単だ。確証を目的とした帳票を作成する場合、そもそもHTML+CSSによる帳票作成はあり得ない。

 しかし、このような問題はPDF(Portable Document Format)を利用すれば解決する。PDFとはなんぞや、という説明はもはや不要だろう。「クライアント環境を選ばない」「文書レイアウトを忠実に再現できる」「セキュリティ設定を細かく定義できる」などの性質から、PDFはいまやドキュメント・プラットフォームにおけるデファクト・スタンダードの地位を確立したといえる。

 本稿では、ASP.NETアプリケーションからPDF文書を動的に生成するためのライブラリとして、「iText.NET」を紹介する。iText.NETは、もともとはJava向けのライブラリとして開発されたオープンソース製品「iText」を、J#言語で書き直したものだ(iTextに関する詳細は、Java TIPS「フリーのライブラリを使いPDFを生成する」を参照)。Java版と.NET版では構文上の微妙な違いがあるとはいえ、iTextを利用したことがあれば、iText.NETもほとんど同じ要領でプログラミングできてしまうのがうれしい。

1.iText.NETを利用可能にする

 上述したように、iText.NETはASP.NETに標準で備わったライブラリではない。使用するに当たっては、以下のサイトから必要なファイルをダウンロードする必要がある。なお、本稿では執筆時点での最新バージョンである1.3.0-5を例に取り上げるが、iText.NETは日々精力的に更新が行われているので、その時々の最新安定版を利用していただきたい。

 iText.NETのインストールは簡単だ。上記のサイトからダウンロードしたiTextdotNET-dll-1.3.0-5.zipに含まれる以下のファイルを仮想ディレクトリ直下のbinフォルダに配置するだけでよい。

  • Gnu.Classpath.Core.dll
  • Gnu.Classpath.JAXP.dll
  • iTextdotNET.dll
  • iText.AsianFonts.dll
  • iText.HYPH.dll

2.アセンブリ“vjslib”への参照を追加する

 iText.NETを動作させるには、.NET Framework 1.1のほかに、Visual J# .NET 1.1再頒布可能パッケージをインストールしておく必要がある。また、J#のアセンブリである“vjslib.dll”への参照をweb.configに追加しておくこと(アセンブリの追加に関する詳細については、「TIPS:[ASP.NET]ASP.NETでVB.NET固有の関数をC#から利用するには?」を参照されたい)。

 “vjslib”へ参照を追加するための具体的なweb.configの記述は以下のとおりだ。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
  <system.web>
    <compilation debug="true">
      <assemblies>
        <add assembly="vjslib, Version=1.0.5000.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </assemblies>
    </compilation>
  </system.web>
</configuration>
vjslib.dllへの参照を追加する設定(web.config)

3.WebフォームからPDF文書を生成する

 以上の設定ができたら、正常にiText.NETが導入できたことを確認するために、以下のようなWebフォームを作成してみよう。

<%@ Page Language="C#" %>
<%@ Import Namespace="com.lowagie.text" %>
<%@ Import Namespace="com.lowagie.text.pdf" %>
<html>
<head>
<script runat="server">
void PdfCreate_Click(Object sender, EventArgs e){
   // コンテンツ・タイプの設定
  Response.ContentType = "application/pdf";
  Response.AddHeader("content-disposition","attachment; filename=result.pdf");
   // 新規PDF文書の生成
  Document doc = new Document();
   // 出力先としてバイナリ・ストリームを設定
  PdfWriter.getInstance(doc, Response.OutputStream);
   // 出力を開始
  doc.open();
   // フォントを設定したうえで、入力値に基づいて文字列を文書に追加
  Font font =new Font(BaseFont.createFont("HeiseiMin-W3", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED), 12, Font.NORMAL);
  doc.add(new Paragraph("こんにちは、" + name.Text + "さん", font));
   // 出力の終了
  doc.close();
  Response.End();
}
</script>
</head>
<body>
<h1>PDF文書の生成</h1>
<form runat="Server">
名前:
<asp:TextBox id="name" runat="Server" />
<asp:Button id="PdfCreate" runat="Server"
  Text="生成" OnClick="PdfCreate_Click" />
</form>
</body>
</html>
iText.NETを使用してPDF文書を生成するWebフォームの例(C#版:pdf_cs.aspx)
 
<%@ Page Language="VB" %>
<%@ Import Namespace="com.lowagie.text" %>
<%@ Import Namespace="com.lowagie.text.pdf" %>
<html>
<head>
<script runat="server">
Sub PdfCreate_Click(sender AS Object, e As EventArgs)
   ' コンテンツ・タイプの設定
  Response.ContentType = "application/pdf"
  Response.AddHeader("content-disposition","attachment; filename=result.pdf")
   ' 新規PDF文書の生成
  Dim doc As New Document()
   ' 出力先としてバイナリ・ストリームを設定
  PdfWriter.getInstance(doc, Response.OutputStream)
   ' 出力を開始
  doc.open()
   ' フォントを設定したうえで、入力値に基づいて文字列を文書に追加
  Dim font As New Font(BaseFont.createFont("HeiseiMin-W3", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED), 12, Font.NORMAL)
  doc.add(New Paragraph("こんにちは、" & name.Text & "さん", font))
   ' 出力の終了
  doc.close()
  Response.End()
End Sub
</script>
</head>
<body>
<h1>PDF文書の生成</h1>
<form runat="Server">
名前:
<asp:TextBox id="name" runat="Server" />
<asp:Button id="PdfCreate" runat="Server"
  Text="生成" OnClick="PdfCreate_Click" />
</form>
</body>
</html>
iText.NETを使用してPDF文書を生成するWebフォームの例(VB.NET版:pdf_vb.aspx)

 PDF文書生成の大まかな流れはソース・コード内のコメントを参照していただくとして、iText.NETを利用するに当たって特に注目していただきたいポイントは、以下の4点だ。

(1)PDF文書であることを宣言する

 ASP.NETが出力するデフォルトのコンテンツ・タイプは“text/html”(HTML文書)だ。「TIPS:[ASP.NET]データベースの内容をクライアントにダウンロード提供するには?」などでも紹介しているように、もしもASP.NETアプリケーションでHTML以外の文書を出力する場合には、明示的にそのコンテンツ・タイプを宣言する必要がある。

 PDFを出力する場合は“application/pdf”(PDF文書)としておく。また、ここでは併せて、Content-Dispositionヘッダを宣言し、ダウンロード時にデフォルトで表示されるPDF文書のファイル名を指定している。

(2)getInstanceメソッドでPDF文書の出力先を宣言する

 PDFの出力先を設定するために、PdfWriterクラス(com.lowagie.text.pdf名前空間)のgetInstanceメソッドでは、第1パラメータに出力対象のDocumentオブジェクト(com.lowagie.text名前空間)を、第2パラメータに出力先となるStreamオブジェクト(System.IO名前空間)を指定する必要がある。

public static PdfWriter getInstance(Document doc, Stream output);
Public Shared Function getInstance(ByVal doc As Document, ByVal output As Stream) As PdfWriter
PdfWriter.getInstanceメソッドのシグネチャ(上:C#、下:VB.NET)

 第2パラメータの出力先の指定は、本稿の例では、クライアントに対して直接に出力したいので、HttpResponseオブジェクト(System.Web名前空間)のOutputStreamプロパティからStreamオブジェクトを取得しているが、例えばファイルに対して出力を行いたいならば、FileStreamオブジェクトを指定すればよい。

(3)コンテンツを管理するオブジェクトは3種類

 iText.NETで文書を生成するには、Chunk、Phrase、Paragraphのいずれかのクラスを選択可能だ(いずれもcom.lowagie.text名前空間のクラス)。文書を構成する最小の単位を表すのがChunkオブジェクトで、これはフォントと文字列情報とを保持する。Chunkオブジェクトに行間情報を加えたものがPhraseオブジェクト、さらにPhraseオブジェクトに位置情報を加えたものがParagraphオブジェクトだと思っていただければよい。

 ここでは、一例としてParagraphオブジェクトを採用しているが、もちろん、Chunk、Phraseオブジェクトで書き換えることも可能だ。

 以下に各クラスのコンストラクタ構文(主要なもののみ)を示しておく。

Chunk()
Chunk(String value)
Chunk(String value, Font font)
Phrase()
Phrase(float leading)
Phrase(String value)
Phrase(String value, Font font)
Phrase(float leading, String value, Font font)
Paragraph()
Paragraph(float leading)
Paragraph(String value)
Paragraph(String value, Font font)
Paragraph(float leading, String value, Font font)
Chunkクラス、Phraseクラス、Paragraphクラスのコンストラクタ構文(主要なもの)

 なお、日本語を利用する場合には、BaseFontクラスのcreateFontメソッドで日本語フォント(ここでは“HeiseiMin-W3”)とエンコード方法(ここでは“UniJIS-UCS2-H”)を指定して生成する必要がある。iText.NET標準では、iText.NETとともにインストールされた“KozMinPro-Regular”“HeiseiMin-W3”“HeiseiKakuGo-W5”などのフォントを利用することができる。また、“UniJIS-UCS2-H”“UniJIS-UCS2-V”“UniJIS-UCS2-HW-H”“UniJIS-UCS2-HW-V”などのエンコーディングを利用することができる。

 以上が理解できたら、さっそく、サンプル・プログラムを起動してみよう。

表示されたWebフォーム(上の画面)の入力値から動的にPDF文書(下の画面)が生成される

 上の図のように、表示されたWebフォーム(上の画面)で入力した値から、PDF文書(下の画面)が生成されれば成功だ。

 ちなみに、iText.NETのリファレンス・マニュアルは残念ながら存在しないようだ。しかしiText(Java版)のAPIドキュメントはあるので、これを参考にすればよい。

iText:APIドキュメンテーション(オンライン版)

iText:ドキュメンテーション

 オンラインでAPIドキュメントを参照したい場合には、のWebページを参照すればよい。また、オフラインでドキュメントを参照したい場合には、のWebページへアクセスしてtar.gz形式で圧縮されたファイルをダウンロードすればよい。End of Article

カテゴリ:Webフォーム 処理対象:PDF
使用ライブラリ:PdfWriterクラス(com.lowagie.text.pdf名前空間)
使用ライブラリ:Documentクラス(com.lowagie.text名前空間)
使用ライブラリ:Chunkクラス(com.lowagie.text名前空間)
使用ライブラリ:Phraseクラス(com.lowagie.text名前空間)
使用ライブラリ:Paragraphクラス(com.lowagie.text名前空間)
使用ライブラリ:Streamクラス(System.IO名前空間)
関連TIPS:[ASP.NET]ASP.NETでVB.NET固有の関数をC#から利用するには?
関連TIPS:
[ASP.NET]データベースの内容をクライアントにダウンロード提供するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]iText.NETでPDF文書に表を追加するには?
[ASP.NET]PDF文書のセキュリティ情報やヘッダ/フッタを設定するには?
[ASP.NET]あらかじめ用意したPDF文書をインポートするには?
[ASP.NET]データベースに登録したバイナリ・データを表示するには?
[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 記事ランキング

本日 月間