最近のでまとまった記事がなかったので。
プロジェクトはVisual Studio 2017で作成、
iTextSharpはNuGetでインストール済みとします。
- こちら(http://ukezara.net/hueho2013/?p=109)を参考に、iTextAsian-src-2.1.zipを解凍して出てくるiTextAsian.csprojをVisual Studio 2013で読み込み(自動でプロジェクト変換してくれます)、そのままビルド。(2013じゃなくてもいけるかもしれません)
- 1でビルドしてできたiTextAsian.dllをプロジェクトの参照に追加。
- Global.asax.csのApplication_Start()の最後に、
iTextSharp.text.io.StreamUtil.AddToResourceSearch(Server.MapPath("bin\\iTextAsian.dll"));
を追加。
これで準備OK。
実際にPDFを作る時は、以下のようにBaseFontを設定してやります。
BaseFont myBaseFont = BaseFont.CreateFont("KozMinPro-Regular", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED);
これで日本語PDFファイルが作成できます。
日本語フォントについてはこちらも参考になります。
http://csfun.blog49.fc2.com/blog-entry-98.html
ちなみにPDFの様式が決まっているなら、AcrobatでPDFにフォームの設定をしてやってテンプレートとして使うと、フォントのサイズとか表示位置とか、フォームで調整できるので超楽です。
以下は、Shuttle Sticker シールの注文管理画面で納品書兼領収書のPDFファイルを出力するソースコード。参考まで。
public async Task<ActionResult> Doc(int? id) { // 注文情報を取得 Order order = await db.Orders.FindAsync(id); string pdfTemplate = @"d:\home\site\pdf\doc.pdf"; string basePath = @"d:\home\site\pdf\" + order.OrderNo + @"\"; string newFile = basePath + order.OrderNo + "doc.pdf"; PdfReader pdfReader = new PdfReader(pdfTemplate); PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFile, FileMode.Create)); // 日本語フォントの設定 BaseFont myBaseFont = BaseFont.CreateFont("KozMinPro-Regular", "UniJIS-UCS2-H", BaseFont.NOT_EMBEDDED); pdfStamper.AcroFields.AddSubstitutionFont(myBaseFont); AcroFields pdfFormFields = pdfStamper.AcroFields; // ¥マーク 005Cではなく00A5 string charCode = "00A5"; int charCode16 = Convert.ToInt32(charCode, 16); char c = Convert.ToChar(charCode16); string newChar = c.ToString(); // フォームに値をセット pdfFormFields.SetField("納品書-氏名", order.Name); pdfFormFields.SetField("納品書-金額", newChar + order.OrderTotalFee.ToString("#,0")); // 略 pdfStamper.FormFlattening = true; pdfStamper.Close(); pdfReader.Close(); return File(newFile, "applicatioin/pdf", order.OrderNo + "doc.pdf"); }