いろいろありましたが、まとめ、いきましょう。とりあえず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に変換する、という流れ。
引数で受け取る値を見ても、一見「!?」という感じですし、暗号でも見ている気分でしたよ。やすさんスゴイ!!ヽ(´ー`)ノ