TOP /  ミドルウェア /  JavaからPDF出力する「iText」のコーディング解説 ~PDFのオンラインチケットを発行するコードの解説~

JavaからPDF出力する「iText」のコーディング解説 ~PDFのオンラインチケットを発行するコードの解説~ | ミドルウェア

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

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

メールアドレス


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

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

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

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

メールアドレス


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

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

参加者によるこのセミナーの評価は、
3.9 でした!(5点満点中)
セミナー名 JavaからPDF出力する「iText」のコーディング解説 ~PDFのオンラインチケットを発行するコードの解説~
講演企業 株式会社ヒューリンクス
開催日 2019年07月30日
匿名の参加者
コメントなし
匿名の参加者
コメントなし
匿名の参加者
イスが狭かった。真ん中のイスは片づけても良かったのでは お土産のボールペンはいらない
匿名の参加者
コメントなし
匿名の参加者
コメントなし
匿名の参加者
コメントなし
匿名の参加者
ありがとうございました。
匿名の参加者
コメントなし
匿名の参加者
コメントなし
匿名の参加者
コメントなし
匿名の参加者
コメントなし
匿名の参加者
コメントなし
匿名の参加者
コメントなし
匿名の参加者
コメントなし
匿名の参加者
とくにありません。ありがとうございました
匿名の参加者
コメントなし
匿名の参加者
わかりやすかったです 資料もわかりやすかったです 流れも良かったです

JavaからPDF出力する
「iText」のコーディング解説
~PDFのオンラインチケットを発行するコードの解説~
2019年7月
株式会社ヒューリンクス
本日ご説明するプログラムの
デモをご覧ください。
2/33
目次
開発環境の準備
デモプロジェクトの主なクラス一覧
コード説明
1.
2.
3.
4.
5.
6.
7.
8.
全体的な処理の流れ
白紙のPDFを作成する
デフォルトフォントの設定
先頭部に画像と文字を追加
段落を追加
表を追加
座標を指定して画像を追加
ウォーターマークを追加
参考になるサイトのご紹介
3/33
開発環境の準備①
今回のデモプログラムは、以下の環境で開発をしており
ます。
Eclipse
Java 1.8
iText 7.1.7
Spring Framework 2.0.5.RELEASE
後日、デモプロジェクトを公開しますので、ソースコー
ド一式をダウンロード頂けます。
4/33
開発環境の準備②
Mavenプロジェクトを新規作成し、親プロ
ジェクトを以下のように設定します。
項目 設定値
グループId org.springframework.boot
アーティファクトId spring-boot-starter-parent
バージョン 2.0.5.RELEASE
※以下の設定は、後日配布するデモプロジェクトでは設定済みです。
新規に環境を構築するための手順になります。
5/33
開発環境の準備③
iText7の依存関係を追加します。
項目 設定値
グループId com.itextpdf
アーティファクトId itext7-core
バージョン 7.1.7
型 pom
スコープ compile
6/33
開発環境の準備④
SpringFrameworkの依存関係(3つ)を追加します。
項目 設定値
グループId org.springframework.boot
アーティファクトId spring-boot-starter-web
項目 設定値
グループId org.springframework.boot
アーティファクトId spring-boot-starter-thymeleaf
項目 設定値
グループId org.springframework.boot
アーティファクトId spring-boot-devtools
7/33
ご参考:VisualStudioでのiTextの準備
NuGetでiText7を検索し、プロジェクトにイ
ンストールします。
8/33
ご参考: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)
※本日はJavaのコードで説明をしますが、上記を除き、クラス名や
メソッド名は同じですので、使い勝手にほぼ差はありません。
9/33
デモプロジェクトの主なクラス一覧
Application
main関数を含みます。実行の構成で、このクラ
スのmain関数をメインクラスとしています。
InputData
ユーザーが画面で入力したデータを格納します。
PdfCreator
Pdfを作成します。InputDataと出力するファ
イル名を受け取り、その内容に応じたPDFを出
力しています。
10/33
今回作成するPDFの内容
11/33
全体的な処理の流れ①
1.
2.
3.
4.
5.
6.
7.
A4縦の白紙PDFを作成する
デフォルトフォントを設定する
先頭部に画像と文字を追加する
段落を追加する
表を追加する
座標を指定して画像を追加する
ウォーターマークを追加する
12/33
全体的な処理の流れ②
public void createPdf(InputData inputData, String outFileName) throws IOException
{
PdfDocument pdfDoc = createNewPdf(outFileName);
// 1.A4縦の白紙文書の作成
setDefaultFont(doc); // 2.デフォルトフォントを設定
addHeaderData(pdfDoc, doc, inputData); // 3.先頭部に画像と文字を追加
addText(doc, inputData); // 4.段落を追加
addTable(doc); // 5.表を追加
addStampImage(doc); // 6.座標を指定して画像を追加
try (Document doc = new Document(pdfDoc)) {
if(inputData.getIsOutWaterMark()) addWaterMark(pdfDoc, doc); //
7.ウォーターマークを追加
}
}
13/33
1. A4縦の白紙PDF文書を作成する
private PdfDocument createNewPdf(String outFileName) throws IOException
{
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName));
pdfDoc.setDefaultPageSize(PageSize.A4);
return pdfDoc;
}
※A4横にしたい場合は、
pdfDoc.setDefaultPageSize(PageSize.A4.rotate());
とします。
※PageSizeクラスのコンストラクタには幅と高さを指定する物もありますので、
独自の用紙サイズを指定する事も可能です。
14/33
2. デフォルトフォントを設定する
private void setDefaultFont(Document doc, InputData inputData) throws IOException
{
String fontPath = FONT + inputData.getFont();
PdfFont font = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H, true);
doc.setFontSize(12).setFont(font);//文書のデフォルトフォントを設定
}
※ttc形式のフォントを使用する場合は、
PdfFontFactory.createTtcFont
関数を使用します。(ttc内の番号を指定するパラメータが追加されています)
※デモでは、フォントはIPAゴシックとIPA明朝を使用してPDFに埋め込んでいます。
https://ipafont.ipa.go.jp/
15/33
3. 先頭部に画像と文字を追加する①
主な処理内容
① オレンジのバー(画像)
を追加
② 見積番号を追加(右寄せ、
下線)
③ QRコードを追加
④ ITEXTロゴ画像を追加
16/33
3. 先頭部に画像と文字を追加する②
private void addHeaderData(Document doc, InputData inputData) throws IOException
{
//ここでは画像を文字と同じ扱いとして追加します。(Wordでの行内画像です)
//よって、ページ上部から段落として画像が追加されます。この方法では画像がPDFの段落から成り行きで追加されます。

Image orange = new Image(ImageDataFactory.create(IMG_ORANGE_BAR));
doc.add(orange);
//受付番号
doc.add(new Paragraph("n"));

Paragraph numberPara = new Paragraph("受付No. :" + inputData.getReceiptNo() + "n");
numberPara.setTextAlignment(TextAlignment.RIGHT).setUnderline();//この段落だけ下線、右寄せにする
doc.add(numberPara);
段落に対してアライメントや下線を設定する事で、
段落ごとに書式を個別に設定できます。
17/33
3. 先頭部に画像と文字を追加する③
//QRコード
BarcodeQRCode barcode = new BarcodeQRCode();

barcode.setCode("iText:" + inputData.getReceiptNo());
Image barcodeImg = new Image(barcode.createFormXObject(ColorConstants.BLACK, pdfDoc)).scale(2, 2);
doc.add(barcodeImg.setHorizontalAlignment(HorizontalAlignment.RIGHT));
//ロゴ画像
Image logo = new Image(ImageDataFactory.create(IMG_LOGO));

logo.scaleToFit(100, 28);
doc.add(logo);
doc.add(new Paragraph("n"));
}
※QRコード以外では、以下のバーコードにも対応しています。
CODE 25, CODE 32, EAN, MSI, PDF417
18/33
4.段落を追加する①
主な処理内容
① 御見積を追加
② 顧客名、合計金額、見
積有効期限を追加
19/33
4. 段落を追加する②
private void addText(Document doc, InputData inputData)
{
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("お客様名 : " + inputData.getName() + "様"));
doc.add(new Paragraph("ご注文日 : " + new SimpleDateFormat("yyyy/MM/dd").format(new Date())));

doc.add(new Paragraph("支払期限 : " + inputData.getPeriod1() + " ~ " + inputData.getPeriod2()));
doc.add(new Paragraph("n"));
}
20/33
5. 表を追加する①
主な処理内容
① 見出し行を追加
② 商品行を追加
③ 消費税と合計行を追加
この空白は、2×2で結合
したセルに対し、左と下
の罫線を消した状態です。
21/33
5. 表を追加する②
表には、見出し行、通常行、フッター行の3種類
あり、それぞれaddHeaderCell、addCell、
addFooterCell関数で追加します。
見出し行(全ページに出力)
通常行(1回ずつ出力)
フッター行(全ページに出力)
※ヘッダ行、フッタ行は表が複数ページに跨る場合、全ページに
出力されます。
22/33
5. 表を追加する③
private Cell createHeaderCell(String text)
{
Cell cell = new Cell();
cell.setBackgroundColor(ColorConstants.LIGHT_GRAY); // セルの背景色をライトグレーにする
cell.setTextAlignment(TextAlignment.CENTER); // 文字を中央寄せにする
cell.add(new Paragraph(text));
return cell;
}
private void addTable(Document doc)
{
//ページ幅に対して100%の5列の表を作成
Table table = new Table(UnitValue.createPercentArray(4)).useAllAvailableWidth();
//ヘッダ行のセルを追加(ヘッダ行は表が複数ページに跨る場合、前ページの先頭に表示されます)
table.addHeaderCell(createHeaderCell("商品名"));

table.addHeaderCell(createHeaderCell("単価"));
table.addHeaderCell(createHeaderCell("数量"));
table.addHeaderCell(createHeaderCell("販売価格"));
23/33
5. 表を追加する④
//1行分のセルを追加(実際には3行ありますが、同じ処理なので略しています)
table.addCell(new Cell().setTextAlignment(TextAlignment.LEFT).add(new Paragraph("コーヒー")));
table.addCell("1,000");

table.addCell("3ケース");
table.addCell("3,000").setHorizontalAlignment(HorizontalAlignment.RIGHT);
//消費税行のセルを追加
Cell cell = new Cell(2, 2);
//空白分のセル(2×2)
cell.setBorderLeft(Border.NO_BORDER);
cell.setBorderBottom(Border.NO_BORDER);
table.addCell(cell);

table.addCell("消費税(8%)").setHorizontalAlignment(HorizontalAlignment.RIGHT);
table.addCell("464").setTextAlignment(TextAlignment.RIGHT);
//合計行のセルを追加
table.addCell("合 計").setHorizontalAlignment(HorizontalAlignment.RIGHT);
table.addCell("6,264").setTextAlignment(TextAlignment.RIGHT);
doc.add(table);
}
24/33
補足:セルオブジェクトの追加①
作成した表では、行や列オブジェクトが登場せず、
表に対し複数回セルを追加しています。
サンプルで追加したセルの順序は以下の通りです。
① ② ③ ④
⑤ ⑥ ⑦ ⑧
⑨ ⑩ ⑪ ⑫
⑬ ⑭ ⑮ ⑯
※Table自体が列数を知っているので、セルが右端に来た時に、
自動的に次の行にセルが送られます。
25/33
補足:セルオブジェクトの追加②
結合しているセルを追加すると、その分の領域
が確保され、以降追加されるセルは、その領域
以外の場所からになります。



2行2列のセルを追加したので、
その領域が確保される
⑮ ⑯
⑱ ⑲

確保済みの領域を除き、
セルが追加される
※表組は単純にTableオブジェクトにCellを追加するだけでOK!
よって、非常にシンプルなコードになります。
26/33
補足:セルオブジェクトの追加③
追加するセルの数を間違えると、以下のような歯
抜けの表ができあがります。
4列の表に対して5個の
見出しセルを追加した
行にセルが1つ足りない
27/33
補足:その他の表の設定
表に設定できる項目をいくつか紹介します。
setCaption
表タイトルをセット(位置は上下選択可)
setKeepTogether
表の途中で改ページを禁止する(セルにも設定可能)
setFixedPosition
ページ上で任意の位置に表を配置
setSkipFirstHeader
最初の見出し行を出力しない
見出し行に「前ページから続く」のような文言を出せる
setSkipLastFooter
最後のフッター行を出力しない
フッター行に「次ページに続く」のような文言を出せる
※表はiText7からかなり機能強化されています。
28/33
6. 座標を指定して画像を追加する①
主な処理内容
① 画像のサイズを設定す

② 座標を指定して画像を
追加する
29/33
6. 座標を指定して画像を追加する②
private void addStampImage(Document doc) throws IOException
{
//ここではページ上の位置を指定して画像を追加しています。
Image stamp = new Image(ImageDataFactory.create(IMG_STAMP));
//画像の幅と高さを指定

stamp.scaleToFit(100, 100);
//ページ左下を原点とし、1ページ目のX=450, Y=160の位置に画像を配置(単位はポイント)

stamp.setFixedPosition(1, 450, 160);
doc.add(stamp);
}
30/33
7. ウォーターマークを追加する①
主な処理内容
① ページサイズを取得し、
文字の範囲を計算する
② 文字に半透明の色を設
定する
③ 計算した範囲に角度を
つけて文字を追加する
31/33
7. ウォーターマークを追加する②
private void addWaterMark(PdfDocument pdfDoc, Document doc)
{
PdfPage page =pdfDoc.getPage(1);

Rectangle pageSize = page.getPageSize();
//フォントサイズは120pt、色は透明度30%のグレー

Paragraph p = new Paragraph(WATER_MARK_TEXT).setFontSize(120);
p.setFontColor(ColorConstants.GRAY, (float) 0.3);
//ページ幅、高さに対して50%の範囲に中央寄せで、45度の角度で出力

doc.showTextAligned(p, pageSize.getWidth() / 2, pageSize.getHeight() / 2, 1,
TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);
}
32/33
参考になるサイトのご紹介
APIリファレンス
https://api.itextpdf.com/iText7/
サンプルコード
https://itextpdf.com/en/resources/examples
チュートリアル(公式ではありません)
https://www.tutorialspoint.com/itext/index.htm
その他、YouTubeでも様々な情報が公開され
ております。
33/33
ご清聴ありがとうございました。

他のカテゴリから探す

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

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

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

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

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

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

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

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

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

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

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

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

「マジセミ」のFacebookページ

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

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