2010年10月26日


VB.net : iTextSharp でPDF を出力する

dll のダウンロード

Browse iTextSharp Files on SourceForge.net

2010/10/26 現在で、2010-08-21 ぶんの itextsharp-5.0.4-dll.zip が最新です。
オリジナルのマニュアルは無いので、以下から CHM をダウンロードします。

iTextSharp クラスライブラリリファレンス : Vector


※ itextsharp-5.0.4.zip をダウンロードすると、C# のサンプルコードは付いていますが
※ VB.net はありません。


dll の参照

Ref_dll


VB.net サンプルコード
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports System.IO

Public Class Form1


	Private Sub Button1_Click(ByVal sender As System.Object, _
	   ByVal e As System.EventArgs) Handles Button1.Click

		' PDF 出力パス
		Dim pdf As String = My.Application.Info.DirectoryPath & "\pdftest.pdf"

		Dim doc As Document = New Document()

		' 出力先を指定し、文書をPDFとして出力する為のオブジェクト
		Dim pw As PdfWriter = _
		PdfWriter.GetInstance( _
		 doc, _
		 New FileStream(pdf, FileMode.Create) _
		)

		' 出力開始
		doc.Open()

		' フォント用のシステムフォルダ
		Dim windir As String = System.Environment.GetEnvironmentVariable("windir")


		' 日本語フォントの設定
		Dim font As Font = New Font( _
		  BaseFont.CreateFont( _
		  windir & "\Fonts\MSGOTHIC.TTC,0", _
		  BaseFont.IDENTITY_H, _
		  BaseFont.EMBEDDED))

		Dim font2 As Font = New Font( _
		  BaseFont.CreateFont( _
		  windir & "\Fonts\MSGOTHIC.TTC,1", _
		  BaseFont.IDENTITY_H, _
		  BaseFont.EMBEDDED))


		' *******************************************
		' 座標指定する為のオブジェクト
		' *******************************************
		' 一番上のレイヤー
		Dim pcb As PdfContentByte = pw.DirectContent

		' 一番上のレイヤーに直線を引く
		pcb.MoveTo(250, 10)
		pcb.LineTo(250, 800)
		pcb.Stroke()

		Dim ct As ColumnText = New ColumnText(pcb)

		Dim myText As Phrase = Nothing

		' MS GOTHIC
		myText = New Phrase("ABCDEFGHIJKLMN", font)
		ct.SetSimpleColumn( _
		 myText, _
		 100, 0, _
		 300, 820, _
		 0, _
		 Element.ALIGN_LEFT _
		)
		ct.Go()

		myText = New Phrase("漢字表示", font)
		ct.SetSimpleColumn( _
		 myText, _
		 100, 0, _
		 300, 810, _
		 0, _
		 Element.ALIGN_LEFT _
		)
		ct.Go()

		' MS P GOTHIC
		myText = New Phrase("ABCDEFGHIJKLMN", font2)
		ct.SetSimpleColumn( _
		 myText, _
		 100, 0, _
		 300, 800, _
		 0, _
		 Element.ALIGN_LEFT _
		)
		ct.Go()

		myText = New Phrase("漢字表示", font2)
		ct.SetSimpleColumn( _
		 myText, _
		 100, 0, _
		 300, 790, _
		 0, _
		Element.ALIGN_LEFT _
		)
		ct.Go()

		Dim top As Integer = 750
		myText = New Phrase("left:" & doc.PageSize.Left.ToString(), font2)
		ct.SetSimpleColumn( _
		 myText, _
		 100, 0, _
		 300, top, _
		 0, _
		 Element.ALIGN_LEFT _
		)
		ct.Go()

		top -= 10
		myText = New Phrase("right:" & doc.PageSize.Right.ToString(), font2)
		ct.SetSimpleColumn( _
		 myText, _
		 100, 0, _
		 300, top, _
		 0, _
		 Element.ALIGN_LEFT _
		)
		ct.Go()

		top -= 10
		myText = New Phrase("top:" & doc.PageSize.Top.ToString(), font2)
		ct.SetSimpleColumn( _
		 myText, _
		 100, 0, _
		 300, top, _
		 0, _
		 Element.ALIGN_LEFT _
		)
		ct.Go()

		top -= 10
		myText = New Phrase("bottom:" & doc.PageSize.Bottom.ToString(), font2)
		ct.SetSimpleColumn( _
		 myText, _
		 100, 0, _
		 300, top, _
		 0, _
		 Element.ALIGN_LEFT _
		)
		ct.Go()

		' 真ん中のレイヤー( 画像レイヤーの上 )
		' 自然な改行の出力
		Dim pg As Paragraph = New Paragraph("標準", font)
		doc.Add(pg)
		doc.Add(pg)
		doc.Add(pg)
		doc.Add(pg)
		doc.Add(pg)
		' 空文字は無視されるので " "
		pg = New Paragraph(" ")
		doc.Add(pg)
		doc.Add(pg)

		Dim p As Paragraph = New Paragraph()
		Dim i
		For i = 0 To 24
			p.Add( _
			 New Chunk( _
			  "一般テキスト   一般テキスト   一般テキスト" _
			  , font _
			 ) _
			)
		Next
		doc.Add(p)

		' 真ん中のレイヤー( 画像レイヤー )
		'Dim img As Image = _
		' Image.GetInstance(My.Application.Info.DirectoryPath & "\sample.png")
		'img.SetAbsolutePosition(120, 500)
		'doc.Add(img)

		' 一番上のレイヤー( 灰色の小さな円 )
		pcb.SetRGBColorFill(&HAA, &HAA, &HAA)
		pcb.Circle(250.0, 500.0, 50.0)
		pcb.Fill()

		' 一番下のレイヤー( 赤いおおきな円 )
		Dim cbu As PdfContentByte = pw.DirectContentUnder
		cbu.SetRGBColorFill(&HFF, &H0, &H0)
		cbu.Circle(250.0, 500.0, 100.0)
		cbu.Fill()

		' 一番上のレイヤーに直線を引く
		pcb.MoveTo(255, 10)
		pcb.LineTo(255, 800)
		pcb.Stroke()

		' 出力終了
		doc.Close()

		' PDF を拡張子実行
		System.Diagnostics.Process.Start(pdf)


	End Sub

End Class

以下は、上記処理より機能を抜粋した簡易的なクラスのサンプルです
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports System.IO

Public Class Class1

	Public doc As Document
	Public pw As PdfWriter
	Public pcb As PdfContentByte
	' フォント用のシステムフォルダ
	Public windir As String = System.Environment.GetEnvironmentVariable("windir")

	' *********************************************************
	' コンストラクタ
	' *********************************************************
	Public Sub New(ByVal pdf As String)

		doc = New Document()

		' 出力先を指定し、文書をPDFとして出力する為のオブジェクト
		pw = _
		 PdfWriter.GetInstance( _
		  doc, _
		  New FileStream(pdf, FileMode.Create) _
		 )

		' 出力開始
		doc.Open()

		' 
		pcb = pw.DirectContent

	End Sub

	' *********************************************************
	' 終了処理
	' *********************************************************
	Public Sub Close()

		' 出力終了
		doc.Close()

	End Sub

	' *********************************************************
	' 直線を引く
	' *********************************************************
	Public Sub Line( _
	 ByVal x1 As Integer, _
	 ByVal y1 As Integer, _
	 ByVal x2 As Integer, _
	 ByVal y2 As Integer)

		' 一番上のレイヤーに直線を引く
		pcb.MoveTo(x1, y1)
		pcb.LineTo(x2, y2)
		pcb.Stroke()

	End Sub

	' *********************************************************
	' 四角形を書く
	' *********************************************************
	Public Sub Box( _
	  ByVal x1 As Integer, _
	  ByVal y1 As Integer, _
	  ByVal x2 As Integer, _
	  ByVal y2 As Integer)

		' 一番上のレイヤーに直線を引く
		pcb.MoveTo(x1, y1)
		pcb.LineTo(x2, y1)
		pcb.LineTo(x2, y2)
		pcb.LineTo(x1, y2)
		pcb.LineTo(x1, y1)
		pcb.Stroke()

	End Sub

	' *********************************************************
	' フォントの取得(1) : デフォルトサイズ
	' *********************************************************
	Public Function GetFont(ByVal TTCName As String, ByVal FontNo As Integer) As Font

		' 日本語フォントの設定
		Dim font As Font = New Font( _
		  BaseFont.CreateFont( _
		  windir & "\Fonts\" & TTCName & "," & FontNo, _
		  BaseFont.IDENTITY_H, _
		  BaseFont.NOT_EMBEDDED))

		Return font

	End Function

	' *********************************************************
	' フォントの取得(2) : サイズ指定
	' *********************************************************
	Public Function GetFont(ByVal TTCName As String, ByVal FontNo As Integer, ByVal FontSize As Double) As Font

		' 日本語フォントの設定
		Dim font As Font = New Font( _
		  BaseFont.CreateFont( _
		  windir & "\Fonts\" & TTCName & "," & FontNo, _
		  BaseFont.IDENTITY_H, _
		  BaseFont.NOT_EMBEDDED), FontSize)

		Return font

	End Function

	' *********************************************************
	' 矩形内にテキスト出力( はみ出すと表示されない )
	' *********************************************************
	Public Sub SetCellText( _
	 ByVal x1 As Integer, _
	 ByVal y1 As Integer, _
	 ByVal x2 As Integer, _
	 ByVal y2 As Integer, _
	 ByVal text As String, _
	 ByVal font As Font)

		'SetSimpleColumn(
		'  Phrase phrase,  // コラムに設定するテキストを保持する Phrase オブジェクト
		'  float llx,      // 矩形の左下隅の X 座標
		'  float lly,      // 同、Y 座標
		'  float urx,      // 右上隅の X 座標
		'  float ury,      // 同、Y 座標
		'  float leading,  // レディング量
		'  int alignment // 整列方法
		');

		Dim ct As ColumnText = New ColumnText(pcb)
		Dim myText As Phrase = Nothing

		Dim offy As Double

		If font.Size = -1 Then
			offy = 12
		Else
			offy = font.Size
		End If

		myText = New Phrase(text, font)
		ct.SetSimpleColumn( _
		 myText, _
		 x1, y1 - offy, _
		 x2, y2 - offy, _
		 0, _
		 Element.ALIGN_LEFT _
		)
		ct.Go()

	End Sub


End Class



posted by at 2010-10-26 09:51 | Java/VB.net | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します