TOP /  ミドルウェア /  Microsoft .NET / RDBMS からPDF帳票を出力する「iText .NET」のコーディング解説 ~DBからデータを取り出し、PDFのオンラインチケットや請求書を発行する~

Microsoft .NET / RDBMS からPDF帳票を出力する「iText .NET」のコーディング解説 ~DBからデータを取り出し、PDFのオンラインチケットや請求書を発行する~ | ミドルウェア

講演資料を見るには、 プライバシーポリシーに同意して、送付先メールアドレスをご入力しご請求ください。

またご入力いただきました情報は、当該イベントの主催・共催・協賛・講演企業とも共有させていただき、 当社及び各社のサービス、製品、セミナー、イベントなどのご案内に使用させていただきます。

メールアドレス


法人様向けの資料のため、フリーアドレスをご利用の場合は、会社名、お名前を入力してください。
会社名
お名前

「iText .NET」を使ってPDFのオンライン帳票を発行するデモのコード解説  (株式会社ヒューリンクス )

講演資料を見るには、 プライバシーポリシーに同意して、送付先メールアドレスをご入力しご請求ください。

またご入力いただきました情報は、当該イベントの主催・共催・協賛・講演企業とも共有させていただき、 当社及び各社のサービス、製品、セミナー、イベントなどのご案内に使用させていただきます。

メールアドレス


法人様向けの資料のため、フリーアドレスをご利用の場合は、会社名、お名前を入力してください。
会社名
お名前

セミナー全体の評価と、参加者からのコメント

参加者によるこのセミナーの評価は、
3.8 でした!(5点満点中)
セミナー名 Microsoft .NET / RDBMS からPDF帳票を出力する「iText .NET」のコーディング解説 ~DBからデータを取り出し、PDFのオンラインチケットや請求書を発行する~
講演企業 株式会社ヒューリンクス
開催日 2019年10月29日
匿名の参加者
コメントなし
匿名の参加者
コメントなし
匿名の参加者
コメントなし
匿名の参加者
コメントなし
匿名の参加者
わかりやすく、気になることはありませんでした。

Microsoft .NET / RDBMS からPDF帳票を出力する
「iText」のコーディング解説
~DBからデータを取り出し、PDFのオンラインチケットや請求書を発行する~
2019年10月
株式会社ヒューリンクス
本日ご説明するプログラムの
デモをご覧ください。
2/40
目次





出力するPDFの内容
データベースの説明
開発環境の準備
デモプロジェクトの主なクラス一覧
PDFを作成するコードの説明
1.
2.
3.
4.
5.
6.
7.
A4縦の白紙PDFを作成
デフォルトフォントを設定
先頭部に画像と文字を追加
段落を追加
表を追加
位置を指定して画像を追加
全ページに透かし文字を追加
参考になるサイトのご紹介
3/40
出力するPDFの内容
4/40
データベースの説明①
5/40
データベースの説明②
Order:注文テーブル
このテーブル1レコードが1注文書(PDF)に対応します。
デモプログラムでは、PDF作成処理にこの情報を渡しています。
OrderItem:注文商品テーブル
1商品の注文情報になります。
このテーブル1レコードが、表の1行分のデータに対応します。
OrderテーブルのID、注文した商品のIDと個数を保持します。
CustomerMaster:顧客マスタ
顧客情報です。顧客名を保持します。
Orderテーブルから参照されます。
ItemMaster:商品マスタ
商品情報です。商品名、単価、単位を保持します。
OrderItemテーブルから参照されます。
6/40
データベースの説明③
Order
CustomerMaster
OrderItem
ItemMaster
7/40
開発環境の準備①
今回のデモプログラムは、以下の環境で開発をしており
ます。
Visual Studio 2017 Professional
C#
.NET Framework 4.5.2
Entity Framework 6.3
SQL Server 2017 Express
iText 7.1.8
後日、デモプロジェクトを公開しますので、ソースコー
ド一式をダウンロード頂けます。
8/40
開発環境の準備②
SQL Server 2017にデータベースの定義を
行います。
※本日のデモで使用しているデータベースのバックアップデータもソースと一緒に
配布しますので、こちらをリストアして頂く事も可能です。
9/40
開発環境の準備③
Visual Studioを起動し、新規プロジェクトを
作成します。
※今回のデモはWindowsフォームアプリですが、iTextにそのような制限がある
わけではなく、コンソールアプリでもASP.NET Webアプリでも使用できます。
10/40
開発環境の準備④
NuGetのパッケージマネージャーからiText7
をプロジェクトにインストールします。
iText7で検索
※iText7はAGPLライセンスです。ご使用の際は、インストール時に表示される
ライセンス条項を必ずご確認ください。
11/40
開発環境の準備⑤
プロジェクトにADO.NET Entity Data
Modelを追加します。
※データベースとのやりとりを簡略化にするために使用しています。
iTextがEntity Data Modelを必要としているわけではありません。
12/40
ご参考:EclipseでのiTextの準備
MavenからiText7の依存関係を追加します。
項目 設定値
グループId com.itextpdf
アーティファクトId itext7-core
バージョン 7.1.8
型 pom
スコープ compile
13/40
ご参考:Javaと.NETの使い方の違い
クラスのフルネームが異なる
例:PdfDocumentクラス
Java
com.itextpdf.kernel.pdf.PdfDocument
.NET
iText.Kernel.Pdf.PdfDocument
関数の命名ルールが異なる
Java .NET
キャメル式(1文字目が小文字) Pascal式(1文字目が大文字)
例: 例:
setDefaultPageSize(PageSize.A4); SetDefaultPageSize(PageSize.A4)
※本日はC#のコードで説明をしますが、上記を除き、クラス名や
メソッド名は同じですので、使い勝手にほぼ差はありません。
14/40
デモプロジェクトの主なクラス一覧
MainForm
プログラム起動時に表示されるフォームです。
Order
Entity Frameworkが自動生成したOrderテー
ブル1レコード分の情報を格納するクラス。
1注文書分のデータに該当します。
PdfCreator
Pdfを作成します。Orderクラスのインスタンス
とMainFormの入力情報、出力ファイル名を受
け取り、その内容に応じたPDFを出力します。
15/40
PDFを作成するコードの説明①
PDF作成処理の流れは以下の通りです。
1.
2.
3.
4.
5.
6.
7.
A4縦の白紙PDFを作成
デフォルトフォントを設定
先頭部に画像と文字を追加
段落を追加
表を追加
位置を指定して画像を追加
全ページに透かし文字を追加
16/40
PDFを作成するコードの説明②
public void CreatePdf(Database.Order order, string pdfFileName, bool isGothic,
BarcodeType barcodeType, string waterMarkText)
{
PdfDocument pdfDoc = CreateNewPdfDocument(pdfFileName); // 1.A4縦の白紙文書を作成
using (Document doc = new Document(pdfDoc)) {
SetDefaultFont(doc, isGothic); // 2.デフォルトフォントを設定
AddHeaderData(pdfDoc, doc, order, barcodeType); // 3.先頭部に画像と文字を追加
AddText(doc, order); // 4.段落を追加
AddTable(doc, order); // 5.表を追加
AddStampImage(pdfDoc.GetNumberOfPages(), doc); // 6.位置を指定して画像を追加
AddWaterMark(pdfDoc, doc, waterMarkText); // 7.全ページに透かし文字を追加
}
}
※GetNumnerOfPages()関数はPDFのページ数を返します。
デモでは、最終ページのみにスタンプ画像を出力するようにしています。
17/40
1. A4縦の白紙PDFを作成
private PdfDocument CreateNewPdfDocument(string pdfFileName)
{
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(pdfFileName));
pdfDoc.SetDefaultPageSize(PageSize.A4);
return pdfDoc;
}
※A4横にしたい場合は、
pdfDoc.SetDefaultPageSize(PageSize.A4.Rotate());
とします。
※PageSizeクラスのコンストラクタには幅と高さを指定する物もありますので、
独自の用紙サイズを指定する事も可能です。
18/40
2. デフォルトフォントを設定①
private void SetDefaultFont(Document doc, bool isGothic)
{
PdfFont font = null;
if (isGothic) {
font = PdfFontFactory.CreateFont(Properties.Resources.ipag,
PdfEncodings.IDENTITY_H, true);
}
else {
font = PdfFontFactory.CreateFont(Properties.Resources.ipam,
PdfEncodings.IDENTITY_H, true);
}
doc.SetFontSize(12).SetFont(font);
}
※デモでは、フォントはIPAゴシックかIPA明朝を使用してPDFに埋め込んでいます。
https://ipafont.ipa.go.jp/
フォントを埋め込む場合、フォントの著作権にご注意ください。
19/40
2. デフォルトフォントを設定②
PdfFontFactory.CreateFont関数には、
いくつかバリエーションがあります。
・フォントファイルのバイナリデータを指定
PdfFont CreateFont(byte[] fontData, string encoding, bool embedded);
・フォントファイルへの位置を指定
PdfFont CreateFont(string fontPath, string encoding, bool embedded);
デモでは、フォントをリソースに含めましたので、前者を使用しています。
※複数のフォント情報を含むttc形式のフォントファイルを使用する場合は、
CreateTtcFont関数を使用します。使い方は、使用するフォント番号を指定する
パラメータが追加されている以外、CreateFont関数と同じです。
20/40
3. 先頭部に画像と文字を追加①
主な処理内容
① オレンジのバー(画像)
を追加
② 受付番号を追加(右寄せ、
下線)
③ QRコードを追加
④ ITEXTロゴ画像を追加
21/40
3. 先頭部に画像と文字を追加②
private void AddHeaderData(PdfDocument pdfDoc, Document doc, Database.Order order,
BarcodeType barcodeType)
{
Image orangeBar = new Image(ImageDataFactory.Create(Properties.Resources.orangeBar, null));

doc.Add(orangeBar).Add(new Paragraph("n"));
Paragraph numberPara = new Paragraph("受付No. :" + order.OrderNo);

numberPara.SetTextAlignment(TextAlignment.RIGHT).SetUnderline();
doc.Add(numberPara);
Image barcodeImg = CreateBarocdeImage(pdfDoc, barcodeType, order.OrderNo);

doc.Add(barcodeImg.SetHorizontalAlignment(HorizontalAlignment.RIGHT));
Image logo = new Image(ImageDataFactory.Create(Properties.Resources.itextLogo, null));

logo.ScaleToFit(100, 28);
doc.Add(logo).Add(new Paragraph("n"));
}
22/40
3. 先頭部に画像と文字を追加③
private Image CreateBarocdeImage(PdfDocument pdfDoc, BarcodeType barcodeType, string orderNo)
{
switch (barcodeType) {
case BarcodeType.CODE128: {
Barcode128 barcode = new Barcode128(pdfDoc);
barcode.SetCode(orderNo);
return new Image(barcode.CreateFormXObject(pdfDoc));
}
case BarcodeType.PDF417: {
BarcodePDF417 barcode = new BarcodePDF417();
barcode.SetCode(orderNo);
return new Image(barcode.CreateFormXObject(ColorConstants.BLACK, pdfDoc));
}
default: {
BarcodeQRCode barcode = new BarcodeQRCode();
barcode.SetCode(orderNo);
Image img = new Image(barcode.CreateFormXObject(ColorConstants.BLACK, pdfDoc));
return img.Scale(1.5f, 1.5f);
}
}
}
23/40
3. 先頭部に画像と文字を追加④
ImageDataFactory.Create関数には、
いくつかバリエーションがあります。
・画像ファイルのバイナリデータを指定
ImageData Create(byte[] imageData);
・画像ファイルの位置を指定
ImageData Create(string imagePath);
ImageData Create(System.Uri imageUri);
・System.Drawing.Imageインスタンスを指定
ImageData Create(System.Drawing.Image image, Color? backColor);
デモでは、画像をリソースに含めましたので、Imageインスタンス版を使用し
ています。(第2パラメータのColorは背景色です)
24/40
4.段落を追加①
主な処理内容
① 見出し段落を追加
② 顧客名、ご注文日、支
払期限を追加
25/40
4. 段落を追加②
private void AddText(Document doc, Database.Order order)
{
Color blue = new DeviceRgb(2, 72, 119);
Color orange = new DeviceCmyk(0, 37, 86, 3);
Paragraph titlePara = new Paragraph("オンラインショッピング").SetFontColor(blue);
titlePara.Add(new Text("払込票").SetFontColor(orange));
titlePara.SetTextAlignment(TextAlignment.CENTER).SetFontSize(24).SetBold();
doc.Add(titlePara);

doc.Add(new Paragraph("n"));
doc.Add(new Paragraph("n"));
doc.Add(new Paragraph("お客様名 : " + order.CustomerMaster.CustomerName + "様"));
doc.Add(new Paragraph("ご注文日 : " + order.OrderDate.ToString("yyyy/MM/dd")));
doc.Add(new Paragraph("支払期限 : " + order.OrderDate.AddDays(7).ToString("yyyy/MM/dd")));

doc.Add(new Paragraph("n"));
}
26/40
5. 表を追加①
主な処理内容
① 見出し行を追加
② 商品行を追加
③ 消費税を追加
④ 合計行を追加
この空白は、2×2で結合
したセルに対し、左と下
の罫線を消した状態です。
27/40
5. 表を追加②
表には、見出し行、通常行、フッタ行の3種類あ
り、それぞれaddHeaderCell、addCell、
addFooterCell関数で追加します。
見出し行(全ページに出力)
通常行(1回ずつ出力)
フッタ行(全ページに出力)
※見出し行、フッタ行は表が複数ページに跨る場合、全ページに
出力されます。
28/40
5. 表を追加③
private Cell CreateCell(string text, TextAlignment align, bool isHeader)
{
Cell cell = new Cell();
if(isHeader) cell.SetBackgroundColor(ColorConstants.LIGHT_GRAY);
cell.SetTextAlignment(align).Add(new Paragraph(text));
return cell;
}
private void AddTable(Document doc, Database.Order order)
{
Table tbl = new Table(UnitValue.CreatePercentArray(4)).UseAllAvailableWidth();

tbl.AddHeaderCell(CreateCell("商品名", TextAlignment.CENTER, true));
tbl.AddHeaderCell(CreateCell("単価", TextAlignment.CENTER, true));
tbl.AddHeaderCell(CreateCell("数量", TextAlignment.CENTER, true));
tbl.AddHeaderCell(CreateCell("販売価格", TextAlignment.CENTER, true));
※次のページに続く
29/40
5. 表を追加④
※前のページからの続き
int total = 0; //
合計金額を保持
foreach (Database.OrderItem oi in order.OrderItem) {
// 商品名
tbl.AddCell(CreateCell(oi.ItemMaster.ItemName, TextAlignment.LEFT, false));
// 単価
tbl.AddCell(CreateCell(String.Format(@“{0:#,0}”, oi.ItemMaster.Price),
TextAlignment.RIGHT, false));
// 個数
tbl.AddCell(CreateCell(String.Format("{0}{1}", oi.Count, oi.ItemMaster.Unit),
TextAlignment.RIGHT, false));

// 価格
int price = oi.ItemMaster.Price * oi.Count;
tbl.AddCell(CreateCell(String.Format(@"{0:#,0}", price), TextAlignment.RIGHT, false));
total += price;
}
※次のページに続く
30/40
5. 表を追加⑤
※前のページからの続き
Border dblBdr = new DoubleBorder(2.0f); //消費税行の上の2重線
//空白分のセル(2×2)を追加
Cell cell = new Cell(2, 2);
cell.SetBorderLeft(Border.NO_BORDER).SetBorderBottom(Border.NO_BORDER);
cell.SetBorderTop(dblBdr);
tbl.AddCell(cell);
//消費税行のセルを追加
table.AddCell(CreateCell("消費税(10 %)", TextAlignment.RIGHT, false).SetBorderTop(dblBdr));

int tax = (int)(total * 0.1);
tbl.AddCell(CreateCell(String.Format(@"{0:#,0}", tax), TextAlignment.RIGHT, false)
.SetBorderTop(dblBdr));
//合計行のセルを追加
tbl.AddCell("合 計").SetTextAlignment(TextAlignment.RIGHT);
tbl.AddCell(CreateCell(String.Format(@"{0:#,0}", total + tax), TextAlignment.RIGHT, false));

doc.Add(tbl);
}
31/40
補足:セルオブジェクトの追加①
作成した表では、行や列オブジェクトが登場せず、
表に対し複数回セルを追加しています。
サンプルで追加したセルの順序は以下の通りです。
① ② ③ ④
⑤ ⑥ ⑦ ⑧
⑨ ⑩ ⑪ ⑫
⑬ ⑭ ⑮ ⑯
⑱ ⑲


※結合しているセルを表に追加した場合、その領域が確保され、
埋められている領域を飛ばして次のセルが追加されます。
32/40
補足:セルオブジェクトの追加②
追加するセルの数を間違えると、以下のような歯
抜けの表ができあがります。
4列の表に対して5個の
見出しセルを追加した
行にセルが1つ足りない
33/40
補足:その他の表の設定
表に設定できる項目をいくつか紹介します。
SetCaption
表タイトルをセット(位置は上下選択可)
SetKeepTogether
表の途中で改ページを禁止する(セルにも設定可能)
SetFixedPosition
ページ上で任意の位置に表を配置
SetSkipFirstHeader
最初の見出し行を出力しない
見出し行に「前ページから続く」のような文言を出せる
SetSkipLastFooter
最後のフッター行を出力しない
フッター行に「次ページに続く」のような文言を出せる
※表はiText7からかなり機能強化されています。
34/40
6. 位置を指定して画像を追加①
主な処理内容
① 画像のサイズを設定す

② 指定ページに座標を指
定して画像を追加する
35/40
6. 位置を指定して画像を追加②
private void AddStampImage(int page, Document doc)
{
Image stamp = new Image(ImageDataFactory.Create(Properties.Resources.stamp, null));
① //画像の幅と高さを指定
stamp.ScaleToFit(100, 100);
② //ページ左下を原点とし、X=450, Y=160の位置に画像を配置
stamp.SetFixedPosition(page, 450, 160);
doc.Add(stamp);
}
※同一の範囲に画像を複数配置した場合、後から追加した画像が
上に重なって表示されます。
36/40
7. 透かし文字を追加①
主な処理内容
① ページサイズを取得し、
文字の範囲を計算する
② 文字に半透明の色を設
定する
③ 計算した範囲に角度を
つけて文字を追加する
37/40
7. 透かし文字を追加②
private void AddWaterMark(PdfDocument pdfDoc, Document doc, string waterMarkText)
{
int pageCnt = pdfDoc.GetNumberOfPages();
for (int page = 1; page <= pageCnt; ++page) {
① //指定ページのサイズを取得
Rectangle pageSize = pdfDoc.GetPage(page).GetPageSize();
② //フォントサイズは128pt、色は透明度30%のグレー
Paragraph para = new Paragraph(waterMarkText).SetFontSize(128);
para.SetFontColor(ColorConstants.GRAY, (float)0.3);
③ //ページ幅、高さに対して50%の範囲に中央寄せで、45度の角度で出力
doc.ShowTextAligned(para, pageSize.GetWidth() / 2, pageSize.GetHeight() / 2,
page, TextAlignment.CENTER, VerticalAlignment.MIDDLE,
(float)(Math.PI / 180 * 45));
}
}
※角度に指定する値は分度法ではなく弧度法での値です。
38/40
参考になるサイトのご紹介
APIリファレンス
https://api.itextpdf.com/iText7/
サンプルコード
https://itextpdf.com/en/resources/examples
チュートリアル(公式ではありません)
https://www.tutorialspoint.com/itext/index.htm
その他、YouTubeでも様々な情報が公開され
ております。
39/40
ご清聴ありがとうございました。

他のカテゴリから探す

IT業界の改革にご協力いただけませんか?

本サイトは、株式会社オープンソース活用研究所がプロデュースする、中小IT企業による”本気”の情報提供セミナー「マジセミ」の結果レポートページです。「マジセミ」は、次を目的として活動しています。

我々はITエンジニアが、今よりももっと「誇り」と「喜び」をもって仕事をし、今よりももっと企業や社会に貢献できる、そんなIT業界を創りたいと考えています。

そのためには、技術をもった中小のIT企業がもっと元気になる必要がある。その為には、技術をもった中小のIT企業を、もっと皆様に知って頂く必要がある、と考えました。

株式会社オープンソース活用研究所
代表取締役所長 寺田雄一

本当かウソか、あなたが見極めてください。

もし、我々のこの活動にご賛同していただけるのであれば、ぜひ下のセミナーに参加してください。

「なんだ、結局ただの売り込みセミナーじゃないか」

もしそう感じたら、アンケートなり、あなたのFacebookなりに、そのままお書き頂き、拡散して頂いて構いません。

参加者からのお褒めの言葉、お叱りの言葉が、我々中小IT企業を成長させ、それが日本のIT業界を変えていくのだと、強く確信しています。

あなたの行動が、日本のIT業界を変えるのです。

日程を確認していただき、ご興味のあるセミナータイトルをクリックしてください。

「マジセミ」のFacebookページ

今後のセミナー情報などを提供させていただきたますので、「マジセミ」のFacebookページに「いいね!」をお願いします。

日本のIT業界を変えるためのアクション、ありがとうございました!

関連するセミナーの講演資料
Oracleの次世代データベース「Autonomous Database」とは? ~Autonomousの解説と、Oracle Cloud 及びマネージドサービスの紹介~ Microsoft .NET / RDBMS からPDF帳票を出力する「iText .NET」のコーディング解説 ~DBからデータを取り出し、PDFのオンラインチケットや請求書を発行する~ JavaからPDF出力する「iText」のコーディング解説 ~PDFのオンラインチケットを発行するコードの解説~ MySQLでマルチマスター型クラスターを実現する「MySQL InnoDB Cluster 」の解説 【ユーザー企業優先】コンテナ技術の製造業における活用事例と、AWSかオンプレかの検討 MariaDB Meetup 2019 vol.2「最新のMariaDB機能と事例紹介およびビジネス概要」 DB障害によるWebビジネスの機会損失はしたくない! ~MySQLのActive/Active型HA と 靴&ファッション通販 ロコンド様の可用性への取り組み事例紹介~ MySQLやMariaDBでダウンタイム"ゼロ"を実現する「マルチマスター」解説 「MySQL InnoDB Cluster」、「Galera Cluster」の紹介 MySQLやMariaDBでダウンタイム"ゼロ"を実現する「マルチマスター」解説 ~「MySQL InnoDB Cluster」、「Galera Cluster」の紹介~ 今知っておくべき「最新OSSデータベース」比較  ~MySQL NDB Cluster/MongoDB/Redis/Elasticsearch/MariaDB ColumnStore など~