.NET TIPS

[ASP.NET]あらかじめ用意したPDF文書をインポートするには?

山田 祥寛
2005/06/24

 「TIPS:[ASP.NET]Webフォームから動的にPDF文書を作成するには?」や「TIPS:[ASP.NET]PDF文書のセキュリティ情報やヘッダ/フッタを設定するには?」では、iText.NETライブラリを利用して、WebフォームからPDF文書を生成する方法を紹介した。

 しかし、PDF文書を動的に生成するといっても、定型的なデザインを一から動的に生成する必要はない。そのようなことをすれば、コードが無駄に冗長になり、サーバに対する負荷を増やしてしまう一因ともなる。また、帳票レイアウトに変更が生じた場合に、コードを直接修正しなければならないのもうれしいことではないだろう。

 そこで、一般的には定型的な枠組みの部分は「テンプレート」としてあらかじめ用意しておき、動的にデータベースなどから取得するべきデータ部分だけをASP.NETから操作するのが好ましい。

 本稿では、あらかじめ用意したテンプレートPDF「template.pdf」に対してデータを動的に追記する方法について紹介しよう。なお、本稿ではあらかじめ以下のようなPDF文書を用意し、サーバ上に配置しておくものとする。

あらかじめ用意しておくPDFテンプレート(template.pdf)

 それではさっそく、具体的なサンプル・コードを眺めてみることにしよう。なお、本稿のサンプルを実行するには、「TIPS:[ASP.NET]Webフォームから動的にPDF文書を作成するには?」の手順に従って、iText.NETの展開とweb.configの設定を行っておく必要がある。

<%@ 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(PageSize.A4, 20, 20, 20, 20);
  PdfWriter pw = PdfWriter.getInstance(doc, Response.OutputStream);
  doc.open();

  // template.pdfを現在のPDF文書に対して適用
  PdfReader pr = new PdfReader("template.pdf");
  PdfImportedPage page=pw.getImportedPage(pr, 1);
  PdfContentByte pcb = pw.getDirectContent();
  pcb.addTemplate(page, 0, 0);
  Font font = new Font(BaseFont.createFont("HeiseiMin-W3", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED), 12, Font.NORMAL);

  // 文書に追加するパラグラフを設定
  // setAlignmentメソッドで左寄せ、右寄せ、中央寄せを指定したり、
  // setIdentationメソッドで左端からのマージンを指定することも可能
  Paragraph prg = new Paragraph(200, "こんにちは、" + name.Text + "さん", font);
  prg.setAlignment(ElementConst.ALIGN_CENTER);
  doc.add(prg);
  Paragraph prg2=new Paragraph(20, "こんばんは、" + name.Text + "さん", font);
  prg2.setIndentationLeft(50);
  doc.add(prg2);
  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>
テンプレートPDFを基にPDF文書を生成するWebフォーム(C#版:pdf_template_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(PageSize.A4, 20, 20, 20, 20)
  Dim pw As PdfWriter = PdfWriter.getInstance(doc, Response.OutputStream)
  doc.open()

  ' template.pdfを現在のPDF文書に対して適用
  Dim pr As New PdfReader("template.pdf")
  Dim page As PdfImportedPage = pw.getImportedPage(pr, 1)
  Dim pcb As PdfContentByte = pw.getDirectContent()
  pcb.addTemplate(page, 0, 0)
  Dim font As New Font(BaseFont.createFont("HeiseiMin-W3", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED), 12, Font.NORMAL)

  ' 文書に追加するパラグラフを設定。
  ' setAlignmentメソッドで左寄せ、右寄せ、中央寄せを指定したり、
  ' setIdentationメソッドで左端からのマージンを指定することも可能
  Dim prg As New Paragraph(200, "こんにちは、" & name.Text & "さん", font)
  prg.setAlignment(ElementConst.ALIGN_CENTER)
  doc.add(prg)
  Dim prg2 As New Paragraph(20, "こんばんは、" & name.Text & "さん", font)
  prg2.setIndentationLeft(50)
  doc.add(prg2)
  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>
テンプレートPDFを基にPDF文書を生成するWebフォーム(VB.NET版:pdf_template_vb.aspx)

 ここで注目していただきたいのは、ソースコード中、太字で示した部分だ。テンプレートを利用するには、PdfReaderクラス(com.lowagie.text.pdf名前空間)でまず、あらかじめ用意したテンプレートPDFを読み込む必要がある。読み込んだテンプレートは、PdfWriterオブジェクト(com.lowagie.text.pdf名前空間)のgetImportedPageメソッドからページ数を指定してインポートすることが可能だ。

public override PdfImportedPage getImportedPage(PdfReader reader, int pageNumber);
Public Overrides Function getImportedPage(ByVal reader As PdfReader, ByVal pageNumber As Integer) As PdfImportedPage
PdfWriter.getImportedPageメソッドのシグネチャ(上:C#、下:VB.NET)
このメソッドでは、第1パラメータにPdfReaderオブジェクトを、第2パラメータにページ数を渡すことができる。戻り値として、インポートされたページを表現するPdfImportedPageオブジェクト(com.lowagie.text.pdf名前空間)を返す。

 インポートしたページを現在のページに追加するには、PdfContentByteオブジェクト(com.lowagie.text.pdf名前空間)のaddTemplateメソッドを使用すればよい。

public override void addTemplate(PdfTemplate template, float x, float y);
Public Overrides Sub addTemplate(ByVal template As PdfTemplate, ByVal x As Single, ByVal y As Single)
PdfContentByte.addTemplateメソッドのシグネチャ(上:C#、下:VB.NET)
このメソッドでは、第1パラメータにPdfTemplateオブジェクト(com.lowagie.text.pdf名前空間)を、第2パラメータにx座標、第3パラメータにy座標を渡すことができる。

 以上を理解したら、実際にサンプルを動かしてみよう。以下の画面のように、テンプレートtemplate.pdfに対して、文字列が追記されていれば成功だ。

pdf_template_cs.aspx/pdf_template_vb.aspxの実行結果

 ちなみに、本サンプルではインポートしたテンプレートをそのまま貼り付けているが、貼り付け前に(先ほど示したaddTemplateメソッドの別バージョンのメソッドを利用することで)縮小/拡大処理を施すことも可能だ。End of Article

カテゴリ:Webフォーム 処理対象:PDF
使用ライブラリ:PdfWriterクラス(com.lowagie.text.pdf名前空間)
使用ライブラリ:PdfReaderクラス(com.lowagie.text.pdf名前空間)
使用ライブラリ:PdfContentByteクラス(com.lowagie.text.pdf名前空間)
使用ライブラリ:PdfTemplateクラス(com.lowagie.text.pdf名前空間)
関連TIPS:[ASP.NET]Webフォームから動的にPDF文書を作成するには?
関連TIPS:
[ASP.NET]PDF文書のセキュリティ情報やヘッダ/フッタを設定するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]iText.NETでPDF文書に表を追加するには?
[ASP.NET]PDF文書のセキュリティ情報やヘッダ/フッタを設定するには?
[ASP.NET]Webフォームから動的にPDF文書を作成するには?
[ASP.NET]Repeater/DataListコントロールのテンプレートを別ファイルで管理するには?
[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 記事ランキング

本日 月間