SSブログ

iTextを使ってPDF作成 - ページ番号 - [プログラミング]

(PDFファイルを作成するためのJava用ライブラリ)「iText」を使ってPDFを作っているわけなのですが、ページ番号を出力してくれる機能が無い。

そこで、自分でページ番号を出力することにします。

PdfWriter#setPageEvent()PdfPageEventインターフェースを持つクラスのオブジェクトを渡しておけば、ページ切り替え時にPdfPageEvent#onEndPage()を呼び出してくれるので、そこでページの隅っこに座標を指定してページ番号を出力します。

import java.io.*;
import com.lowagie.text.*;
import com.lowagie.text.pdf.*;

public class Sample
{
    // ページ番号のフォントサイズ
    static private final int PAGE_FONT_SIZE = 10;

    // 本文とページの隙間
    static private final int BETWEEN_TEXT_AND_PAGE = 20;

    static public void main(String[] args)
    {
        BufferedReader in = null;

        final Document doc = new Document();
        try {
            final PdfWriter writer =
                PdfWriter.getInstance(doc, new FileOutputStream("sample.pdf"));

            doc.open();

            // 本文のフォント
            final Font font = new Font(BaseFont.createFont("HeiseiKakuGo-W5",
                                                           "UniJIS-UCS2-H",
                                                           BaseFont.NOT_EMBEDDED));

            // ページ番号のフォント
            final BaseFont page_font = BaseFont.createFont("HeiseiKakuGo-W5",
                                                           "UniJIS-UCS2-H",
                                                           BaseFont.NOT_EMBEDDED);

           // ----- ここらへんから、ページ番号出力のための仕組み

            writer.setPageEvent(new PdfPageEventHelper() {
                // 次のページに切り替わる直前に呼び出される。
                public void onEndPage(PdfWriter writer, Document document)
                {
                    final PdfContentByte cb = writer.getDirectContent();
                    cb.saveState();

                    cb.beginText();
                    cb.setFontAndSize(page_font, PAGE_FONT_SIZE);

                    // ページ番号の表示内容
                    final String page_text = writer.getPageNumber() + " ";
                    // 右詰の時、少しずれるので末尾に空白を1つ追加しておく。

                    // ページ番号のY座標
                    final float y = document.bottom(-BETWEEN_TEXT_AND_PAGE);
                    // ページの上側に出すなら
                    // document.top(-BETWEEN_TEXT_AND_PAGE);

                    // 中央に表示
                    cb.showTextAligned(PdfContentByte.ALIGN_CENTER,
                                       page_text,
                                       (document.right() + document.left())/2,
                                       y, 0);
/*                  左詰の場合
                    cb.showTextAligned(PdfContentByte.ALIGN_LEFT,
                                       page_text,
                                       document.left(), y, 0);
*/
/*                  右詰の場合
                    cb.showTextAligned(PdfContentByte.ALIGN_RIGHT,
                                       page_text,
                                       document.right(), y, 0);
*/

                    cb.endText();
                    
                    cb.restoreState();
                }
            });

            // ----- ここらへんまで、ページ番号出力のための仕組み

            in = new BufferedReader(new FileReader("sample.txt"));

            String line;
            while ((line = txt.readLine()) != null) {
                doc.add(new Paragraph(line, font));
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null)
                    in.close();
            } catch (IOException e) {
            }
        }

        doc.close();
    }
}
[車(セダン)] 今日の一冊
図解 古代・中世の超技術38―「神殿の自動ドア」から「聖水の自動販売機」まで (ブルーバックス)

図解 古代・中世の超技術38

  • 作者: 小峯 龍男
  • 出版社/メーカー: 講談社
  • 発売日: 1999/08
  • メディア: 単行本

タグ:Java iText
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。