2010年03月25日

ASPメモ8

PDFファイルにページ番号を入れる方法についてです。
今回もまたしても悩んでしまったので、自分メモです。


結構あちこちでサンプルを探し回ったんですが、なかなか良いのがなくて…。
VB版のマニュアルが欲しい…。どっかに良いのありませんかね?

あ、続きを読むで。





PDFにページ番号を入れるのには、2通りあって、HeaderFooterを使うのと、PdfContentByteを使用するパターンです。

PdfContentByteを使用するパターンは、こちらにお世話になりました。
【ATMEL AVR RTOS館】
iTextSharp関連→★iTextSharp を使用してVB.NETでPDF帳票を読み込む
http://akiba.geocities.jp/atmel_avr_atros/itextsharp1.html

ヘッダーフッターを使う場合

pdf_samp1.JPG


  ※ フッター(ftPage、docはそれぞれHeaderFooter、Documentで定義しておく)

ftPage = New HeaderFooter(New Phrase("page ", fntText), True)
ftPage.Alignment = Element.ALIGN_CENTER '中央
ftPage.Border = Rectangle.NO_BORDER 'ボーダーなし(上下の)
'ヘッダーとフッターは、ドキュメントのオープン前にセット
doc.Footer = ftPage



これで、ページの下に「page 1」とかって表示されるようになります。
HeaderFooterでNewしている所は、
ftPage = New HeaderFooter(New Phrase("page ", fntText), New Phrase("of this document", fntText))

とかすると、「page 1 of this document」と言う出力になります。

もう一つのPdfContentByteの方はちょっとやり方が長いです。

pdf_samp2.JPG

1)PDFファイルを作成し、ドキュメントをとりあえず閉じる。
2)1のファイルを読み取り(PDFReader)で開く。
3)一次ファイルをPDFWriterで開く。
4)2から総ページ数を取得。
5)2のページごとに、PDFContentByteに取り、ShowTextAlignedで書き込み。



 lngPages = reader.NumberOfPages    '総ページ数取得
 doc = New Document
 tmpWriter = PdfWriter.GetInstance(doc, New FileStream("C:\temp\tmp.pdf", FileMode.Create))

 doc.Open()      '書き込み用ドキュメントオープン

 For lngPageCnt = 1 To lngPages
  If lngPageCnt > 1 Then
   doc.NewPage()
  End If

  '読み取り元ファイルからページ数を指定して、ページオブジェクトに取り込む
  objPage = tmpWriter.GetImportedPage(reader, lngPageCnt)

  'PDFContentByteオブジェクトへページを設定
  contentByte = tmpWriter.DirectContent
  contentByte.AddTemplate(objPage, 0, 0)

  'ページ数の書き込み
  contentByte.BeginText()
  contentByte.SetFontAndSize(bFont, 8)
  contentByte.ShowTextAligned( _
    PdfContentByte.ALIGN_CENTER, _
    lngPageCnt.ToString & "/" & lngPages.ToString, _
    doc.PageSize.Width / 2, 20, 0)
  contentByte.EndText()

 Next lngPageCnt

 doc.Close()


6)3の一時ファイルを2の名前に上書きモードでコピー。
7)3の一時ファイル削除。
と言う手段です。

もしかしたらもっとスマートなやり方があったかなぁ?
データをテーブルに幾つも追加してから、ドキュメントに追加するので、ページの切り替えはお任せなのですよね。
ページ切り替えイベントみたいなメソッドも見当たらなかったし。
PageEventHelperの使い方が全くわからなくてですね…。
1ファイルが何十ページもあって、それが何百ファイルもあるようなら、このやり方は宜しくないかも知れませんが、ページ数もそんなに多くなくて、数ファイルならOKかと思います。

タグ:ASP
posted by detti at 18:25 | Comment(1) | TrackBack(0) | PC関連 | このブログの読者になる | 更新情報をチェックする|
この記事へのコメント
こんにちは。
リンクありがとうございます。
geocitiesのサイトが終わってしまいましたので、サイトを
http://atmel.uunyan.com/ に引っ越しさせました。
Posted by あやのすけ at 2013年07月24日 22:51
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック