iText 5レポート_ヘッダーとフッター
1.概要
iText 5では、以前のバージョンのHeaderFooterオブジェクトでヘッダーとフッターが設定されていません.PdfPageEventHelperを使用してヘッダーのフッターの設定を完了できます.PdfPageEventHelperには、次のイベントプロセッサが含まれています.
onOpenDocument()-ドキュメントを開くとトリガーされ、ドキュメントのグローバル変数を初期化できます.
onStartPage()-ページの初期化時にトリガーされ、ページの設定パラメータの初期化に使用できますが、この関数がトリガーされた場合、ページは作成されていません.この関数を使用してコンテンツを追加する必要はありません.onEndPage()を使用してページの初期化を処理することが望ましいです.
onEndPage()-新しいページの作成が完了し、書き込みが完了する前にトリガーされるのは、ヘッダー、フッター、ウォーターマークなどを追加するのに最適なタイミングです.
onCloseDocument()-ドキュメントが閉じる前にトリガーされ、一部のリソースを解放できます.
2.PdfPageEventHelperクラスの再ロード
親PdfPageEventHelperを継承するクラスHeaderFooterを定義します.
ドキュメントの各ページでは、パラメータがartであるRactangle長方形を定義する必要があります.これにより、HeaderFooterクラスでこの長方形を使用して、ドキュメントの枠線位置を取得し、ヘッダーとフッターを設定できます.
3.第Xページ/共Yページの問題を解決する
PdfWriterのgetPageNumber()関数で現在何ページ目かを取得しましたが、ドキュメントの合計数ページを取得することはできません.
XObjectオブジェクトを使用すると、iTextはリリーステンプレートメソッドを呼び出した後にのみPdfTemplateをOutputStreamに書き込むことができます.そうしないと、ドキュメントを閉じるまでオブジェクトはメモリに保存されます.
最初のページにtemplateを追加して、最後のページまでこのテンプレートに内容を書き込むことができます.
呼び出しコードは上の通りですJAvaに示す
iText 5では、以前のバージョンのHeaderFooterオブジェクトでヘッダーとフッターが設定されていません.PdfPageEventHelperを使用してヘッダーのフッターの設定を完了できます.PdfPageEventHelperには、次のイベントプロセッサが含まれています.
onOpenDocument()-ドキュメントを開くとトリガーされ、ドキュメントのグローバル変数を初期化できます.
onStartPage()-ページの初期化時にトリガーされ、ページの設定パラメータの初期化に使用できますが、この関数がトリガーされた場合、ページは作成されていません.この関数を使用してコンテンツを追加する必要はありません.onEndPage()を使用してページの初期化を処理することが望ましいです.
onEndPage()-新しいページの作成が完了し、書き込みが完了する前にトリガーされるのは、ヘッダー、フッター、ウォーターマークなどを追加するのに最適なタイミングです.
onCloseDocument()-ドキュメントが閉じる前にトリガーされ、一部のリソースを解放できます.
2.PdfPageEventHelperクラスの再ロード
親PdfPageEventHelperを継承するクラスHeaderFooterを定義します.
ドキュメントの各ページでは、パラメータがartであるRactangle長方形を定義する必要があります.これにより、HeaderFooterクラスでこの長方形を使用して、ドキュメントの枠線位置を取得し、ヘッダーとフッターを設定できます.
public class HeaderFooter extends PdfPageEventHelper {
public void onEndPage(PdfWriter writer, Document document) {
Rectangle rect = writer.getBoxSize("art");
switch (writer.getPageNumber() % 2) {
case 0:
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_RIGHT, new Phrase("even header"),
rect.getRight(), rect.getTop(), 0);
break;
case 1:
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_LEFT, new Phrase("odd header"),
rect.getLeft(), rect.getTop(), 0);
break;
}
ColumnText.showTextAligned(writer.getDirectContent(),
Element.ALIGN_CENTER,
new Phrase(String.format("- %d -", writer.getPageNumber())),
(rect.getLeft() + rect.getRight()) / 2, rect.getBottom() - 18,
0);
}
}
public class HeadFootTest {
public static void main(String[] args) {
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
try {
PdfWriter writer = PdfWriter.getInstance(document,
new FileOutputStream("E:\\iText5.pdf"));
Rectangle rect = new Rectangle(36, 54, 559, 788);
rect.setBorderColor(BaseColor.BLACK);
writer.setBoxSize("art", rect);
HeaderFooter header = new HeaderFooter();
writer.setPageEvent(header);
document.open();
document.newPage();
Paragraph par = new Paragraph("first paragraph");
document.add(par);
document.newPage();
Paragraph par2 = new Paragraph("second paragraph");
document.add(par2);
document.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.第Xページ/共Yページの問題を解決する
PdfWriterのgetPageNumber()関数で現在何ページ目かを取得しましたが、ドキュメントの合計数ページを取得することはできません.
XObjectオブジェクトを使用すると、iTextはリリーステンプレートメソッドを呼び出した後にのみPdfTemplateをOutputStreamに書き込むことができます.そうしないと、ドキュメントを閉じるまでオブジェクトはメモリに保存されます.
最初のページにtemplateを追加して、最後のページまでこのテンプレートに内容を書き込むことができます.
public class TableHeader extends PdfPageEventHelper {
String header;
PdfTemplate total;
public void setHeader(String header) {
this.header = header;
}
public void onOpenDocument(PdfWriter writer, Document document) {
total = writer.getDirectContent().createTemplate(30, 16);
}
public void onEndPage(PdfWriter writer, Document document) {
PdfPTable table = new PdfPTable(3);
try {
table.setWidths(new int[] { 24, 24, 2 });
table.setTotalWidth(527);
table.setLockedWidth(true);
table.getDefaultCell().setFixedHeight(20);
table.getDefaultCell().setBorder(Rectangle.BOTTOM);
table.addCell(header);
table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
table.addCell(String.format("page %d of", writer.getPageNumber()));
PdfPCell cell = new PdfPCell(Image.getInstance(total));
cell.setBorder(Rectangle.BOTTOM);
table.addCell(cell);
table.writeSelectedRows(0, -1, 34, 803, writer.getDirectContent());
} catch (DocumentException de) {
throw new ExceptionConverter(de);
}
}
public void onCloseDocument(PdfWriter writer, Document document) {
ColumnText.showTextAligned(total, Element.ALIGN_LEFT,
new Phrase(String.valueOf(writer.getPageNumber() - 1)),2, 2, 0);
}
}
呼び出しコードは上の通りですJAvaに示す