2009/05/18

PDFCreatorの日本語問題-PDF情報編2

やすさんのUPしてくださったソースと比較して、日本語(マルチバイトの文字列)が混ざると、PDFを[保存]できない原因がわかりました。

[保存]できない現象に対しての、修正箇所は

[Common]-[modCDlg.bas]-[SaveFileDialog]

もともとこのモジュールではOPENFILENAMEに対して下記のようにセットしていますが。

オリジナル

50160  With ofn
50170   .nStructSize = Len(ofn)
50180   .hWndOwner = hwnd
50190   .sFilter = tFil
50200   .nFilterIndex = FilterIndex
50210   .sFile = InitFilename & Space$(1024) & vbNullChar & vbNullChar
50220   .nMaxFile = Len(.sFile)
50230   .sDefFileExt = DefaultFileExtension & vbNullChar & vbNullChar
50240   .sFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar
50250   .nMaxTitle = Len(ofn.sFileTitle)

50260   If InitDir = vbNullString Then
50270     .sInitialDir = GetPDFCreatorApplicationPath & vbNullChar & vbNullChar
50280    Else
50290     .sInitialDir = InitDir & vbNullChar & vbNullChar
50300   End If
50310   .sDialogTitle = DialogTitle
50320   .Flags = Flags
50330  End With

OPENFILENAME構造体は、


.nMaxFile   :ファイル名のバッファのサイズを設定

.nMaxFileTitle :フルパス用のバッファのサイズを設定


ですので、オリジナルのようにLenで計算している(行番号07.、10.)と、マルチバイトの文字列が入るとおかしくなっちゃうんですねー。

というわけで、下記のようにLenBにあらためます。

修正後

50160  With ofn
50170   .nStructSize = Len(ofn)
50180   .hWndOwner = hwnd
50190   .sFilter = tFil
50200   .nFilterIndex = FilterIndex
50210   .sFile = InitFilename & Space$(1024) & vbNullChar & vbNullChar
'50220   .nMaxFile = Len(.sFile)
50220   .nMaxFile = LenB(.sFile)  
50230   .sDefFileExt = DefaultFileExtension & vbNullChar & vbNullChar
50240   .sFileTitle = vbNullChar & Space$(512) & vbNullChar & vbNullChar
'50250   .nMaxTitle = Len(ofn.sFileTitle)
50250   .nMaxTitle = LenB(ofn.sFileTitle)

50260   If InitDir = vbNullString Then
50270     .sInitialDir = GetPDFCreatorApplicationPath & vbNullChar & vbNullChar
50280    Else
50290     .sInitialDir = InitDir & vbNullChar & vbNullChar
50300   End If
50310   .sDialogTitle = DialogTitle
50320   .Flags = Flags
50330  End With

この部分を修正すると無事、マルチバイトの文字列が入っていても、[保存]できるようになりますねぇ。

ちなみに[ReplaceEncodingChars]については、前回の16進変換の修正のみのモジュールのままでも、とりあえずのところは動きました(←そして8進変換の役割が、相変わらず、わかっていないじょにでした。[\XXX]の8進数を文字に置換しているのはわかっていても、「何故変換するのか。なにが入ってきて、どう変換すべきなのか」というそもそもの役割とかが見えきていないッス・泣)。

2 件のコメント:

やす さんのコメント...

こんばんわ。
すみません、まさか"modCDlg.bas"を修正していたとは・・・全く記憶にありませんでした。
なぜか今も思い出せません。

あと追加した8進変換ですが、例えばFirefoxでじょにさんのblogのコメント投稿のページを印刷(PDF化)すると、"Blogger: log book - \203R\203\201\203\223\203g\202\360\223\212\215e"といったデータが渡され、8進部分が文字化けしたので16進変換と同じ修正をしました。ただ、8進数で渡されるパターンが全くわかりません。

じょに さんのコメント...

こんばんわ。

あああ、確かに8進数もどきでも、タイトル類の日本語が入ってきますね。
「\203R\203\201\203\223\203g\202\360\223\212\215e」を日本語にすると「コメントの投稿」。
たとえば「\203R」の「\数値3桁」を16進数に変換、アルファベットをASCIIの16進数に変換すると「83 54」。これはS-JISでの「コ」…。以下略。

まるで暗号の解読みたいな気分になってきました。ヽ(´ー`)ノ