いろいろありましたが、まとめ、いきましょう。とりあえずPDFCreatorのverは0.9.8になります。
PDFCreator0.9.8 (日本語対応バイナリ配布)
コンパイル環境のない方の為に、やすさんからいただいたバイナリとソースをUPしておきますね。やすさん、ありがとう!
配布
- PDFCreator0.9.8 (日本語対応exeファイル)
PDFCreator_0516.zip
(MD5 : 91ae1b27a964be1cfdbd111b286e445f) - 参考 PDFCreator0.9.8(上記ソース)
Version 0.9.8_090516.zip
(MD5 : db8944afaa2e672b31d9f66a8a473060)
使い方
- 本家からPDFCreator0.9.8をDLしていただき、一旦インストールします。
- その後、PDFCreator.exeを上記1.の日本語版exeファイルと差し替えます。
動作環境の報告
当バイナリは、W2K(SP4)/XP(SP3)での動作が確認されています。
Vista(32bit SP2)環境では、"VB6JP.DLL"をインストールする必要があるようです(これはVisual Basic 6.0 SP6あたりのランタイムを入れれば入ると思われ…)。
以下は上記ソースにいたるまでの解説・経緯のまとめになります。本家でバージョンアップがされたときのために…。
メニュー画面の日本語化について。
- PDFCreatorの文字化けをなおす…必須
- PDFCreatorの文字化けをなおす2…小手先
- PDFCreatorの文字化け問題-修正箇所発見…Vb6.0でコンパイルできるヒト向け(これで完璧に)
PDF情報の日本語入力について(※すべて、VB6.0でコンパイルできるヒト向け)
- PDFCreatorの日本語問題-PDF情報編2
- PDFCreatorの日本語問題-PDF情報編…(2)EncodeCharsについての部分のみ利用してください
2.の記事にある「(1)ReplaceEncodingCharsについて」は不完全だということがわかりましたので、以下がやすさんの差し替えソースです。
[Common]-[modPDF.bas]
Public Function ReplaceEncodingChars(Str1 As String) As String '---ErrPtnr-OnError-START--- DO NOT MODIFY ! --- On Error GoTo ErrPtnr_OnError '---ErrPtnr-OnError-END--- DO NOT MODIFY ! --- 50010 Dim i As Integer, tStr As String '---2009/05/16-START--- by yasu Dim bStr() As Byte Dim j, k As Integer '---2009/05/16-End--- by yasu 50020 tStr = "" 50030 ' First we look for oct encoding chars '---2009/05/16-START--- by yasu '50040 For i = 127 To 255 '50050 Str1 = Replace$(Str1, "\" & Oct$(i), Chr$(i)) '50060 Next i 50070 ReplaceEncodingChars = Str1 j = 0 ReDim bStr(Len(Str1)) For i = 1 To Len(Str1) Do If Mid$(Str1, i, 1) <> "\" Then bStr(j) = AscB(Mid$(Str1, i, 1)): j = j + 1 Else If i <> Len(Str1) Then If Mid$(Str1, i + 1, 1) Like "[\{}()]" Then bStr(j) = AscB(Mid$(Str1, i + 1, 1)): j = j + 1: i = i + 1 Exit Do End If End If If Len(Str1) - i > 3 Then For k = 1 To 3 If Not Mid$(Mid$(Str1, i + 1, 3), k, 1) Like "[0-9]" Then Exit For End If Next If k = 4 Then bStr(j) = CByte("&O" & Mid$(Str1, i + 1, 3)): j = j + 1: i = i + 3 Else bStr(j) = AscB(Mid$(Str1, i, 1)): j = j + 1 End If Else bStr(j) = AscB(Mid$(Str1, i, 1)): j = j + 1 End If End If Loop Until 1 Next tStr = StrConv(bStr, vbUnicode) '---2009/05/16-End--- by yasu 50080 ' Second we look for hex encoding chars 50090 If Len(Str1) >= 4 Then 50100 If Mid$(Str1, 1, 1) = "<" And Mid$(Str1, Len(Str1), 1) = ">" Then 50110 If Len(Str1) Mod 2 = 0 Then '---2009/05/16-START--- by yasu ReDim bStr((Len(Str1) - 2) / 2) '---2009/05/16-END--- 50120 For i = 2 To Len(Str1) - 1 Step 2 50130 If IsNumeric("&H" & Mid$(Str1, i, 2)) = True Then 50140 If CByte("&H" & Mid$(Str1, i, 2)) > 255 Then 50150 Exit Function 50160 Else '---2009/05/09-START--- by yasu bStr((i - 2) / 2) = CByte("&H" & Mid$(Str1, i, 2)) '50170 tStr = tStr & Chr$(CByte("&H" & Mid$(Str1, i, 2))) '---2009/05/09-END--- by yasu 50180 End If 50190 Else 50200 Exit Function 50210 End If 50220 Next i '---2009/05/09-START--- by yasu tStr = StrConv(bStr, vbUnicode) '---2009/05/09-END--- by yasu 50230 End If 50240 End If 50250 End If 50260 If Len(tStr) > 0 Then 50270 ReplaceEncodingChars = tStr 50280 End If '---ErrPtnr-OnError-START--- DO NOT MODIFY ! --- Exit Function ErrPtnr_OnError: Select Case ErrPtnr.OnError("modPDF", "ReplaceEncodingChars") Case 0: Resume Case 1: Resume Next Case 2: Exit Function Case 3: End End Select '---ErrPtnr-OnError-END--- DO NOT MODIFY ! --- End Function
後半だけでなく、前半の8進変換もどきもバイト配列に一端いれてから日本語変換する必要があったようです。
前段の8進もどきで一体なにをやっているかといいますと…。
たとえば「\203R\203\201\203\223\203g\202\360\223\212\215e」を日本語にすると「コメントの投稿」となるわけですが。「\203R」の「\数値3桁」を16進数に変換、アルファベットをASCIIの16進数に変換すると「83 54」。これはS-JISでの「コ」…。以下略。──という具合に日本語に変換していかなくてはならないわけですよ。数値にアルファベットと入り交ざっているこいつらを一端16進数に戻して、S-JISに変換する、という流れ。
引数で受け取る値を見ても、一見「!?」という感じですし、暗号でも見ている気分でしたよ。やすさんスゴイ!!ヽ(´ー`)ノ