【PHP】 SHIFT_JISに無い文字を画像変換後FPDFで表示する

  環境



さざなみフォントによる、WEB 上でのテストページ

結論から言うと、PHP のイメージ関数を使うと、フォント内にあるイメージは画像化できるので、
それを PDF に取り込んで表示します。

( japanese.php が unicode で使えれば良いのでしょうが、フォントの仕様は良く解らないので。)

1) FPDF


   こちらを参照して下さい

2) その文字を正しく Unicode で参照できるフォントファイル


   ( さざなみフォントの明朝は、かなりの文字を表示できます )

   ( Windows の文字コード表で表示できる必要があります )
     

3) フォントの配置


   SHIFT_JIS に無いフォントはサーバー側だけで良く、クライアントは PDF 作成時に指定します

4) PHP


   セッションが使用できる事。
   イメージ関数が使用できる事。





  コード



【PDF処理 -- PHP】 FPDF v1.6 + FPDI 日本語利用詳細 のサンプルコード に、
WritePng 関数と RemovePd 関数が追加されています

WritePng 関数


入力された文字列から、画像を作成しています。
いろいろ試しましたが、やはり大きめの画像を作成して使うほうが綺麗になるのを確認しましたが、
実装時は、いろいろテストしたほうが良いと思われます。

入力は SHIFT_JIS です。ブラウザの入力時は、unicode のアプリケーションですから、
入力した値を理解できるので、サーバへ渡す場合に &#UNICODE; に変換後 Urlencode して
通信します。そうすると、PHP 側ではその文字列を直接 imagettftext 関数に渡す事になり、
正しい画像が作成されます。
( ブラウザが正しくクライアントのキャラクタセットを認識するよう、META で指定してください )

( つまり、全て SHIFT_JIS に無い文字ばかりを送れば UTF-8 への変換は必要無い事になります )

※ ちなみに、本来 UTF-8 で入力するはずの imagettftext ですが、
※ Nifty の ラクーカンは EUC-JP にして渡す必要があります。

RemovePdf 関数


画像名にセッションID を使用しているので古いファイルを削除する為に使用しています


model.php
  
<?php
require('japanese.php');

class PDF_lightbox extends PDF_japanese
{
	public $bx = 0;
	public $by = 0;

# **********************************************************
# 新規ページ
# **********************************************************
function newUserPage($Title,$Option="") {

	# 新しいページを追加
	# P : ポートレイト( 縦 )
	# 背景色 セット
	$this->AddPage('P');
	$this->SetFillColor( 255, 255, 255 );

	# 号
	$this->SetFont( 'SJIS', '', 12 );
	$this->LocText( 150, -20, '第             号' );

	# タイトル印字
	$this->SetFont( 'SJIS', 'B', 20 );
	$this->LocText( 65, 0, $Title );

	# 個人情報
	$x = 40;
	$y = 23;

	WritePng();
	// 氏名
	$this->SetFont( 'SJIS', '', 16 );
//	$this->LocText( 40, 23, "山田 太郎" );
	$this->Image( session_id()."name.png", 40, 90, 0, 5 );

	$x = 40;
	$y = 60;

	$this->SetFont( 'SJIS-2', 'B', 18 );
	$Text = '上記の者は、間違い無く';
	$this->LocText( $x, $y, $Text );

	$this->SetFont( 'SJIS-2', 'I', 18 );
	$Text = '銀プログラマである事を';
	$this->LocText( $x, $y+20, $Text );

	$this->SetFont( 'SJIS-2', 'B', 18 );
	$Text = '証明致します。';
	$this->LocText( $x, $y+40, $Text );


	$dt = explode( "/", date("m/d/Y") );
	
	// 平成
	$this->SetFont( 'SJIS', 'B', 13 );
	$dt[2] = ($dt[2]+0) - 1988;
	$this->LocText( $x+7, $y+60, "平成" );

	$this->LocText( $x+20, $y+60, sprintf( "%d年", $dt[2]+0 ), 'I', 12 );
	$this->LocText( $x+37, $y+60, sprintf( "%d月", $dt[0]+0 ) );
	$this->LocText( $x+50, $y+60, sprintf( "%d日", $dt[1]+0 ) );

	$this->SetFont( 'SJIS', 'B', 13 );
	$this->LocText( $x+40, $y+95, "架空法人 システム家成育社" );
	$this->LocText( $x+40, $y+105, "SQLの窓学院" );
	$this->LocText( $x+68, $y+115, "校 長" );

	$this->LocText( $x+94, $y+115, "lightbox" );

}

# **********************************************************
# 印字基点座標設定
# **********************************************************
function LocText( $x, $y, $str, $style='NONE', $size=14 ) {

	if ( $style != 'NONE' ) {
		$this->SetFont('SJIS',$style,$size);
	}
	$this->Text( $this->bx + $x, $this->by + $y, $str );

}

# **********************************************************
# 印字基点座標設定
# **********************************************************
function SetBase( $x=0, $y=0 ) {

	$this->bx = $x;
	$this->by = $y;

}

}

# ***********************************************************
# 画像化
# ***********************************************************
function WritePng() {

	$font_path = "./";

# ***********************************************************
# 画像の大きさ
# ***********************************************************
	$im = imagecreate(900,50);	// 大きめに設定

# ***********************************************************
# 画像の背景色
# ***********************************************************
	$white = imagecolorallocate($im, 255,255,255);

# ***********************************************************
# 画像の文字色
# ***********************************************************
	$black = imagecolorallocate($im, 0,0,0);

# ***********************************************************
# フォントを使用した文字の画像化 16
# ***********************************************************
imagettftext(
	$im,
	40,		// 大きめに設定
	0,
	10,
	45,
	$black,
	"{$font_path}sazanami-mincho.ttf",
	mb_convert_encoding( $_GET['text'], "UTF-8", "SHIFT_JIS" ));

# ***********************************************************
# PNG 出力
# ***********************************************************
	imagepng($im,session_id()."name.png",9);

# ***********************************************************
# 終了処理
# ***********************************************************
	imagecolordeallocate( $im, $black );
	imagecolordeallocate( $im, $white );
	imagedestroy($im);
}

# ***********************************************************
# 使用済み画像の削除
# ***********************************************************
function RemovePdf() {
	$DirHandle = @opendir("./");
	if ( $DirHandle ) {
		$Target = readdir( $DirHandle );
		while( $Target !== false ) {
	
			if ( $Target != "." ) {
				$ext = strrchr( $Target, "." );
				$ext = strtolower($ext);
				if ( $ext == ".png" ) {
					$astamp = stat($Target);
					$laststamp = $astamp[9];
					if ( $laststamp < time() - 300 ) {
							@unlink($Target);
					}
				}
			}
			$Target = readdir( $DirHandle );
	
		}
		
		closedir( $DirHandle );
	}
}
?>
  


control.php
  
<?
session_start();
# **********************************************************
# ライブラリ類の参照
# **********************************************************
$sep = PATH_SEPARATOR;
set_include_path( ".{$sep}fpdf16" );

# **********************************************************
# SJIS への変換環境( このファイルは SHIFT_JIS )
# **********************************************************
mb_language( "ja" );
mb_internal_encoding("UTF-8");

# **********************************************************
# PDF を使用する為のユーザ環境
# **********************************************************
require_once( "model.php");
RemovePdf();

# **********************************************************
# PDF アクセス用のインスタンス作成
# ( PDF_lightbox は、model.php 定義 )
# **********************************************************
$pdf = new PDF_lightbox();
// 基点の定義
$pdf->SetBase( 0, 60 );

# **********************************************************
# 日本語環境
# ( デフォルトの MS-Mincho )
# **********************************************************
$pdf->AddSJISFont( );
$pdf->AddSJISFont("MS-Gothic", "SJIS-2");

# **********************************************************
# 印刷処理
# **********************************************************
$pdf->newUserPage( '銀 色 の 証 明 書' );

# **********************************************************
# PDF を ブラウザに出力
# **********************************************************
$pdf->Output();

?>
  













   SQLの窓    create:2008/08/26  update:2018/02/23   管理者用(要ログイン)





フリーフォントツール

SQLの窓ツール

SQLの窓フリーソフト

写真素材

一般ツールリンク

SQLの窓

フリーソフト

JSライブラリ