iTextSharp を使用してドキュメントをゼロから作成すると、非常に時間がかかる場合があります。別の方法として、(必要に応じて) フォーム フィールドを追加して PDF の「テンプレート」ドキュメントを作成 (または再利用) することもできます。これを行う最も簡単な方法は、完全版の Adobe Acrobat を使用することですが、iTextSharp だけを使用して入力可能なフォーム フィールドを追加することもできます。
たとえば、賞や卒業証書の場合、ドキュメントのすべてのテキスト、グラフィック、飾り枠、およびフォントを含む PDF を検索、作成、または変更してから、受信者の名前用のフォーム フィールドを追加します。日付、署名欄、賞の種類などのフィールドを追加できます。
次に、Web アプリケーションから iTextSharp を使用してフォームに入力し、フラット化し、ユーザーにストリーミングするのは非常に簡単です。
この投稿の最後に、完全な ASHX ハンドラ コード例を示します。
また、iTextSharp (または単に iText) は、PDF ドキュメントまたは異なるドキュメントのページを結合するのにも役立つことを覚えておいてください。したがって、表紙または説明ページのデザインが固定されているが動的に生成されるコンテンツを持つ年次報告書の場合、表紙を開いて、レポートのテンプレート ページを開き、テンプレートの空白領域に動的コンテンツを生成して、開くことができます。裏ページの「ボイラープレート」を作成し、それらをすべて 1 つのドキュメントに結合してユーザーに返します。
using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Text;
using iTextSharp;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace iTextFormFillerDemo
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class DemoForm : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "application/pdf";
//This line will force the user to either open or save the
//file instead of it appearing on its own page - if you remove it,
//the page will appear in the browser in the same window.
context.Response.AddHeader("Content-Disposition",
"attachment; filename=DemoForm_Filled.pdf");
FillForm(context.Response.OutputStream);
context.Response.End();
}
// Fills the form and pushes it out the output stream.
private void FillForm(System.IO.Stream outputStream)
{
//Need to get the proper directory (dynamic path) for this file.
//This is a filesystem reference, not a web/URL reference...
//The PDF reader reads in the fillable form
PdfReader reader = new PdfReader("C:/DemoForm_Fillable.pdf");
//The PDF stamper creates an editable working copy of the form from the reader
//and associates it with the response output stream
PdfStamper stamper = new PdfStamper(reader, outputStream);
//The PDF has a single "form" consisting of AcroFields
//Note that this is shorthand for writing out
//stamper.AcroFields.SetField(...) for each set
AcroFields form = stamper.AcroFields;
//Set each of the text fields this way: SetField(name, value)
form.SetField("txtFieldName", "Field Value");
form.SetField("txtAnotherFieldName", "AnotherField Value");
//Set the radio button fields using the names and string values:
form.SetField("rbRadioButtons", "Yes"); //or "No"
//Form flattening makes the form non-editable and saveable with the
//form data filled in
stamper.FormFlattening = true;
//Closing the stamper flushes it out the output stream
stamper.Close();
//We're done reading the file
reader.Close();
}
public bool IsReusable
{
get
{
return false;
}
}
}
}