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 | このブログの読者になる | 更新情報をチェックする

2010年10月07日


PHP : COM 経由( ODBC ) での Oracle アクセス

<?
header( "Content-Type: text/html; Charset=euc-jp" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

	// 日本語設定
	mb_language( "ja" );
	// 内部エンコード
	mb_internal_encoding("UTF-8");

	// 接続オブジェクト
	$cn = new COM( "ADODB.Connection" );
	// クライアント側カーソル
	$cn->CursorLocation = 3;
	// レコードセットオブジェクト
	$rs = new COM( "ADODB.Recordset" );

	// 接続文字列作成
	// Microsft ドライバ
	$ConnectionString = "Provider=MSDASQL;" .
		"Driver={Microsoft ODBC for Oracle}" .
		";SERVER=vpc-019/orcl" .
		";UID=LIGHTBOX" .
		";PWD=LIGHTBOX" .
		";";

	// 純正 ドライバ
	//$ConnectionString = "Provider=MSDASQL;" .
	//	";Driver={Oracle in OraClient11g_home1}" .
	//	";DBQ=vpc-019/ORCL" . 
	//	";UID=LIGHTBOX" .
	//	";PWD=LIGHTBOX" .
	//	";";

	// 接続
	$cn->Open( $ConnectionString );

	$query = "select * from 社員マスタ";
	$query = mb_convert_encoding( $query, "SHIFT_JIS", "EUC-JP" );

	// レコードセット取得
	$rs->Open( $query, $cn );
	while( !$rs->EOF ) {

		// レコードセットを PHP で使いやすいように変換
		$ret = ms_convert_fetch_array( $rs, "EUC-JP", "SHIFT_JIS" );

		print "{$ret['氏名']},{$ret['フリガナ']},{$ret['生年月日']},{$ret['給与']}";
		print "<br>";

		$query = "update 社員マスタ set 生年月日 = null where 社員コード = '{$ret['社員コード']}'";
		$query = mb_convert_encoding( $query, "SHIFT_JIS", "EUC-JP" );
		// 行を返さない SQL の実行
		$cn->Execute( $query );

		$rs->MoveNext();
	}

	// レコードセットを閉じる
	$rs->Close();

	// 接続解除
	@$cn->Close();

// ***********************************************
// レコードセット内のデータのキャラクタセットを
// 変換して、インデックス配列と連想配列作成
// ***********************************************
function ms_convert_fetch_array( &$rs, $to_encoding , $from_encoding ) {

	$ret = array();
	for( $i = 0; $i < $rs->Fields->count; $i++ ) {
		// 値変換(インデックス配列)
		$ret[$i] = mb_convert_encoding(
			$rs->Fields[$i]->value."",
			$to_encoding,
			$from_encoding
		);
		// 列名変換
		$k = mb_convert_encoding(
			$rs->Fields[$i]->name,
			$to_encoding,
			$from_encoding
		);
		// 連想配列作成
		$ret[$k] = $ret[$i];
	}

	return $ret;
}
?>



posted by at 2010-10-07 14:23 | PHP+COM | このブログの読者になる | 更新情報をチェックする

PHP : COM 経由( OO4O ) での Oracle アクセス

OpenDatabaseメソッドの3つ目の引数は、デフォルト(Visual Basicモード)のモードです。

CreateDynasetメソッドの第二引数は、データベースから取り出された文字列データから、
後続するブランクを削除しない事を意味します。
<?
header( "Content-Type: text/html; Charset=euc-jp" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

	// 日本語設定
	mb_language( "ja" );
	// 内部エンコード
	mb_internal_encoding("UTF-8");

	// Oracleオブジェクト
	$OracleOO4O = new COM( "OracleInProcServer.XOraSession" );

	// 接続文字列作成
	$db_path = realpath(mb_convert_encoding( "./販売管理C.mdb", "SHIFT_JIS", "EUC-JP" ));
	$ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;";
	$ConnectionString .= "Data Source=$db_path;";

	// 接続
	$cn = $OracleOO4O->OpenDatabase("VPC-019/ORCL", "LIGHTBOX/LIGHTBOX", 0);

	$query = "select * from 社員マスタ";
	$query = mb_convert_encoding( $query, "SHIFT_JIS", "EUC-JP" );

	// レコードセット取得
	$rs = $cn->CreateDynaset($query,2);
	while( !$rs->EOF ) {

		// レコードセットを PHP で使いやすいように変換
		$ret = ms_convert_fetch_array( $rs, "EUC-JP", "SHIFT_JIS" );

		print "{$ret['氏名']},{$ret['フリガナ']},{$ret['生年月日']},{$ret['給与']}";
		print "<br>";

		$query = "update 社員マスタ set 生年月日 = null where 社員コード = '{$ret['社員コード']}'";
		$query = mb_convert_encoding( $query, "SHIFT_JIS", "EUC-JP" );
		// 行を返さない SQL の実行
		$cn->ExecuteSQL( $query );

		$rs->MoveNext();
	}

	// レコードセットを閉じる必要はありません

	// 接続解除は必要ありません

// ***********************************************
// レコードセット内のデータのキャラクタセットを
// 変換して、インデックス配列と連想配列作成
// ***********************************************
function ms_convert_fetch_array( &$rs, $to_encoding , $from_encoding ) {

	$ret = array();
	for( $i = 0; $i < $rs->Fields->count; $i++ ) {
		// 値変換(インデックス配列)
		$ret[$i] = mb_convert_encoding(
			$rs->Fields[$i]->value."",
			$to_encoding,
			$from_encoding
		);
		// 列名変換
		$k = mb_convert_encoding(
			$rs->Fields[$i]->name,
			$to_encoding,
			$from_encoding
		);
		// 連想配列作成
		$ret[$k] = $ret[$i];
	}

	return $ret;
}
?>



posted by at 2010-10-07 13:10 | PHP+COM | このブログの読者になる | 更新情報をチェックする

PHP : COM 経由の MDB に対するアクセス

<?
header( "Content-Type: text/html; Charset=euc-jp" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

	// 日本語設定
	mb_language( "ja" );
	// 内部エンコード
	mb_internal_encoding("UTF-8");

	// 接続オブジェクト
	$cn = new COM( "ADODB.Connection" );
	// クライアント側カーソル
	$cn->CursorLocation = 3;
	// レコードセットオブジェクト
	$rs = new COM( "ADODB.Recordset" );

	// 接続文字列作成
	$db_path = realpath(mb_convert_encoding( "./販売管理C.mdb", "SHIFT_JIS", "EUC-JP" ));
	$ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;";
	$ConnectionString .= "Data Source=$db_path;";

	// 接続
	$cn->Open( $ConnectionString );

	$query = "select * from 社員マスタ";
	$query = mb_convert_encoding( $query, "SHIFT_JIS", "EUC-JP" );

	// レコードセット取得
	$rs->Open( $query, $cn );
	while( !$rs->EOF ) {

		// レコードセットを PHP で使いやすいように変換
		$ret = ms_convert_fetch_array( $rs, "EUC-JP", "SHIFT_JIS" );

		print "{$ret['氏名']},{$ret['フリガナ']},{$ret['生年月日']},{$ret['給与']}";
		print "<br>";

		$query = "update 社員マスタ set 生年月日 = null where 社員コード = '{$ret['社員コード']}'";
		$query = mb_convert_encoding( $query, "SHIFT_JIS", "EUC-JP" );
		// 行を返さない SQL の実行
		$cn->Execute( $query );

		$rs->MoveNext();
	}

	// レコードセットを閉じる
	$rs->Close();

	// 接続解除
	@$cn->Close();

// ***********************************************
// レコードセット内のデータのキャラクタセットを
// 変換して、インデックス配列と連想配列作成
// ***********************************************
function ms_convert_fetch_array( &$rs, $to_encoding , $from_encoding ) {

	$ret = array();
	for( $i = 0; $i < $rs->Fields->count; $i++ ) {
		// 値変換(インデックス配列)
		$ret[$i] = mb_convert_encoding(
			$rs->Fields[$i]->value."",
			$to_encoding,
			$from_encoding
		);
		// 列名変換
		$k = mb_convert_encoding(
			$rs->Fields[$i]->name,
			$to_encoding,
			$from_encoding
		);
		// 連想配列作成
		$ret[$k] = $ret[$i];
	}

	return $ret;
}
?>



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

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

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

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

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


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

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

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

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

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