2010年06月27日


VBScript : TCPDFで MS ゴシック、MS Pゴシック、MS UIゴシック、MS 明朝、MS P明朝を非埋め込み型で利用できるように全てを自動化したスクリプトを作成時に気が付いたTCPDFに関する3つの誤解


VBScript : TCPDFで MSフォントが使えるようにする全自動スクリプト
とにかく手作業ではとても時間がかかるので、全て自動化しました。それでも結構な 時間がかかります。3分くらいは待たないといけないと思います。 そもそも、方法として誤解が多かったのが印象です。チータエンジニアってところで いろいろ日本語サポートしてくれているのですが、日本語訳が中途半端で事実を誤解 するような日本語です。 まず第一に、TCPDF は FPDF から引き継がれているはずなので、元々 FPDF は非埋め 込み型で動作していました。一通り実装したので、そのへんは間違い無いです。 TCPDF も、非埋め込み型にする事ができます。職種によっては、それではまずい事が あるのは承知していますが、システム的には、フォントデータを埋め込むのはよろし くありません。その PC に そのフォントが無いと表示不可能になりますが、アプリケ ーションとしては、「読めれば」良いので、MS の通常フォントが欲しいのです。 ※ MS ゴシック、MS Pゴシック、MS UIゴシック、MS 明朝、MS P明朝 誤解その1 で、サンプルとして実装されていたのが何故か、Arial Unicode MS です。こんなフォ ントがあったなんて、この作業で初めて気が付きましたが、これは PC にフォント データのある「非埋め込み型」です。サンプルそのものがそもそも、フォントデータ を必要としない日本語フォントなのです。 誤解その2 さらに、新しいフォントを作成する下りでは、一応日本語フォントの追加の手順を 想定しているようなのですが、イタリックやボールドを実装するのに、出来上がった フォントファイルをコピーして増産するように読み取れます。ここは、フォントに ついては素人なので、良くは解らないところですが、調べた限りMSのフォントにイ タリック文字としての書体は無く、実装はアプリケーションでしているようなのです。 で、.php 定義ファイルは一つしか必要無い。 ※ 結局イタリックはできません。以下はイタリック指定した結果です 元々利用可能なフォントに加えて、MSフォントの印字サンプルです 誤解その3 チータエンジニアでの記述は、全てフォントを埋め込む事を前提に書かれています。 要するにこれが職種としての方向性の違いによる誤解の元ですが、きちんと README 読まないと、非埋め込み型の引数については知る事ができません。さらに、古い記述 では、非埋め込みにする古い方法しか乗っておらず、知らないとそれでいいのかと 思ってしまいますし、文字化けの対処にいたっては、サンプルそのものが化けてます し。つまり、フォントの埋め込みと非埋め込みの違いをはっきりさせるには、 REEADME 読みましょう。という事になります。
posted by at 2010-06-27 14:30 | ツール | このブログの読者になる | 更新情報をチェックする

2010年06月26日


VBScript : maglog 既存記事ページの取得

次に、投稿( 更新 ) するつもりです。
アップロードのフォーマットは調査済です。

とにかく死ぬほど重たいので、アプリでコントロールするようにと思っていますが、
それでもやはり重たいので、最終的には VB.net でスレッドにする必要があるかも
解りません( あまり長い場合は終了してリトライ )

この手の作業用のスケルトンを作ったので、そのテストも兼ねています。
なので、Function 部分はいずれ、ホスティングしてすっきりするつもりです
<JOB>
<COMMENT>
************************************************************
■ maglog 記事ページ読み出し

base : WEB アクセススケルトン( web_access.wsf )

■ 著作権その他

このプログラムはフリーです。どうぞ自由に御使用ください。
著作権は作者である私(lightbox)が保有しています。
また、本ソフトを運用した結果については、作者は一切責任を
負えせんのでご了承ください。
************************************************************
</COMMENT>

<OBJECT id="objHTTP" progid="Msxml2.XMLHTTP" />
<OBJECT id="Stream" progid="ADODB.Stream" />
<OBJECT id="Stream2" progid="ADODB.Stream" />
<OBJECT id="StreamBin" progid="ADODB.Stream" />
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />

<SCRIPT language=VBScript>
' ***********************************************************
' 処理開始
' ***********************************************************
bDebug = False

user = "ユーザー"
pass = "パスワード"

strBlogName = "lightbox"
strArticleNo = "713301"

strTargetUrl1 = "http://maglog.jp/"&strBlogName&"/index.php?&module=Login&action=LoginDef"
strTargetUrl2 = "https://passport.vector.co.jp/passport/passport.php?p=VP_PROC_LOGIN_EXECUTE&f=VT"
strTargetUrl3 = "http://maglog.jp/"&strBlogName&"/index.php?module=Article&action=Edit&article_id="&strArticleNo

' 追加書き込み
Set LogFile = Fso.OpenTextFile( "web_access.log", 8, True )
LogFile.WriteLine( "処理を開始しました" )

' ***********************************************************
' (1) : GET
' ***********************************************************
Call objHTTP.Open("GET",strTargetUrl1, False)
Call objHTTP.Send()

strHeaders = objHTTP.getAllResponseHeaders()
LogFile.WriteLine( strHeaders & vbCrLf )
if bDebug then
	Wscript.Echo strHeaders
end if
Call WriteBinData("page1.htm", objHTTP.responseBody )


' ***********************************************************
' (2) : POST
' ***********************************************************
Call objHTTP.Open("POST",strTargetUrl2,False)
' POST 用ヘッダ
Call objHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
strData = ""
strData = strData & "VP_UID="&user
strData = strData & "&VP_PW="&pass
Call objHTTP.SetRequestHeader("Content-Length",Len(strData))
Call objHTTP.Send(strData)

strHeaders = objHTTP.getAllResponseHeaders()
LogFile.WriteLine( strHeaders & vbCrLf )
if bDebug then
	Wscript.Echo strHeaders
end if
Call WriteBinData("page2.htm", objHTTP.responseBody )

' ***********************************************************
' (3) : GET
' ***********************************************************
Call objHTTP.Open("GET",strTargetUrl3, False)
Call objHTTP.Send()

strHeaders = objHTTP.getAllResponseHeaders()
LogFile.WriteLine( strHeaders & vbCrLf )
if bDebug then
	Wscript.Echo strHeaders
end if
Call WriteBinData("page3.htm", objHTTP.responseBody )


' ***********************************************************
' 処理終了
' ***********************************************************
LogFile.WriteLine( "処理を終了しました" & vbCrLf & vbCrLf )
LogFile.Close()
Wscript.Echo "処理が終了しました"
Wscript.Quit




' ***********************************************************
' ソース内テキストデータの取得
' ***********************************************************
Function GetMyText( strName )

	GetMyText = RegTrim(GetResource(strName))

End Function

' ***********************************************************
' 文字列前後の漢字スペースを含むホワイトスペースの削除
' ***********************************************************
Function RegTrim( strValue )

	Dim regEx, str

	Set regEx = New RegExp
	regEx.IgnoreCase = True
	regEx.Pattern = "^[ \s]+"
	str = regEx.Replace( strValue, "" )
	regEx.Pattern = "[ \s]+$"
	RegTrim = regEx.Replace( str, "" )

End Function

' ***********************************************************
' ランダムな文字列
' ***********************************************************
Function Nonce( )

	Dim base_str,str,I,nLen,Random
	base_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	base_str = base_str & "abcdefghijklmnopqrstuvwxyz0123456789"

	nLen = Len(base_str)

	str = ""
	For I = 1 to 32
		Randomize
		Random = 1 + Int(Rnd * nLen)
		str = str & Mid(base_str,Random,1)
	Next

	Nonce = str

End function

' ********************************************************** 
' Unix タイムスタンプ 
' ********************************************************** 
Function UnixTimestamp( )

	UnixTimestamp = DateDiff("s", "1970/1/1 0:00:00",DateAdd("h",-9,now)) 

End Function

' ***********************************************************
' boundary 作成 ( Unix タイムスタンプ そのままでも可 )
' ***********************************************************
Function GetBoundary( )

	GetBoundary = "---------------------------" & UnixTimestamp()

End Function

' ***********************************************************
' バイナリデータの保存( 上書き )
' ***********************************************************
Function WriteBinData( strFile, BinData )

	Stream.Open
	Stream.Type = 1 ' バイナリ
	Stream.Write BinData
	Stream.SaveToFile strFile, 2
	Stream.Close

End Function

' ***********************************************************
' fromCharset を toCharset に変換して URLエンコード
' ※ 全ての文字をパーセントエンコーディングします
' ***********************************************************
Function URLEncode(str,fromCharset,toCharset)

	Stream.Open
	Stream.Charset = fromCharset
	Stream.WriteText str
	' コピーの為にデータポインタを先頭にセット
	Stream.Position = 0
 
	Stream2.Open
	Stream2.Charset = toCharset
	Stream.CopyTo Stream2
	Stream.Close

	' コピーの為にデータポインタを先頭にセット
	Stream2.Position = 0

	' バイナリで開く
	StreamBin.Open
 	StreamBin.Type = 1

	' テキストをバイナリに変換
	Stream2.CopyTo StreamBin
	Stream2.Close

	' 読み込みの為にデータポインタを先頭にセット
	StreamBin.Position = 0

	Buffer = ""
	if UCase( toCharset ) = "UTF-8" then
		StreamBin.Read(3)
	end if
	Do while not StreamBin.EOS
		LineBuffer = StreamBin.Read(16)
 
		For i = 1 to LenB( LineBuffer )
			CWork = MidB(LineBuffer,i,1)
			Cwork = AscB(Cwork)
			Cwork = Hex(Cwork)
			Cwork = Ucase(Cwork)
			if Len(Cwork) = 1 then
				Buffer = Buffer & "%0" & Cwork
			else
				Buffer = Buffer & "%" & Cwork
			end if
		Next
 
	Loop

	StreamBin.Close

	URLEncode = Buffer

End Function

' ***********************************************************
' 仕様を明確にする為に単純変換
' ***********************************************************
Function rfc3986_convert(str)

	Dim strResult,I,strWork

	strResult = str

	strResult = Replace(strResult,"%2D", "-")
	strResult = Replace(strResult,"%2E", ".")

	' 0〜9
	For I = &H30 to &H39
		strWork = Hex(I)
		strWork = "%" & Ucase(strWork)
		strResult = Replace(strResult,strWork, Chr(I))
	Next

	' A〜Z
	For I = &H41 to &H5A
		strWork = Hex(I)
		strWork = "%" & Ucase(strWork)
		strResult = Replace(strResult,strWork, Chr(I))
	Next

	strResult = Replace(strResult,"%5F", "_")

	' a〜z
	For I = &H61 to &H7A
		strWork = Hex(I)
		strWork = "%" & Ucase(strWork)
		strResult = Replace(strResult,strWork, Chr(I))
	Next

	strResult = Replace(strResult,"%7E", "~")
	
	rfc3986_convert = strResult

End Function
</SCRIPT>

<COMMENT>
************************************************************
 ソース内テキストデータ
************************************************************
</COMMENT>
<RESOURCE id="myTextData">
<![CDATA[
]]>
</RESOURCE>

</JOB>



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

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

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

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

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


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

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

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

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

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