【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();

?>
  




yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[phpVarious]
CCBot/2.0 (http://commoncrawl.org/faq/)
17/09/26 23:30:35
InfoBoard Version 1.00 : Language=Perl

BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube