2009/05/08

PDFCreatorの文字化け問題-修正箇所発見

昨日に引き続き、ソースを見ていたらキャラセット問題は解決したので、「記事を書こうかなー」と思っていたところ、前回の記事のコメント欄で匿名さんからまさに同じ結論がくだされていて笑いました。本日私が修正したソースとあまりに同じ結果でしたので。…行番号まで(w)

匿名さんのおっしゃる通り、標準モジュール([Common])の[modGeneral2]-[SetFrame]を下記のように書き換えれば(13、14行目を追加すればOK。フォントサイズも変更したければ、匿名さんのコメントどおり、11行目を「50070 ctl.Font.Name = Options.ProgramFont」に変更)、日本語表示はどーにかなります。とゆーか、キャラセット問題は全面解決しそうな予感…。未確認ですが、現状だと欧文以外は多分全部文字化けしていると思うんですよね。

Public Sub SetFrame(ByRef ctl As Control, Optional TempOptionsDesign = -1)
'---ErrPtnr-OnError-START--- DO NOT MODIFY ! ---
On Error GoTo ErrPtnr_OnError
'---ErrPtnr-OnError-END--- DO NOT MODIFY ! ---
50010  Dim tOD As Long
50020  If TempOptionsDesign > -1 Then
50030    tOD = TempOptionsDesign
50040   Else
50050    tOD = Options.OptionsDesign
50060  End If
50070  ctl.Font.Size = 10
'-----------------// 追加ここから //------------------------
50071  ctl.Font.Name = Options.ProgramFont
50072  ctl.Font.Charset = Options.ProgramFontCharset
'-----------------//  ここまで  //------------------------
50080  ctl.TextShaddowColor = &HC00000
50090  If ComputerScreenResolution <= 8 Or tOD = 1 Then
50100    ctl.UseGradient = False: ctl.Caption3D = [Flat Caption]
50110    If UCase$(ctl.Name) = "DMFRADESCRIPTION" Then
50120      ctl.BarColorFrom = vbRed
50130     Else
50140      ctl.BarColorFrom = vbBlue
50150    End If
50160   Else
50170    ctl.UseGradient = True: ctl.Caption3D = [Raised Caption]
50180    If UCase$(ctl.Name) = "DMFRADESCRIPTION" Then
50190      ctl.BarColorFrom = &HB0BED  '&HA0A0FF ' &HFB&
50200      ctl.BarColorTo = &H20564  '&HE0& ' &HDDFF&
50210     Else
50220      ctl.BarColorFrom = &HED0B0B '&HFFA0A0
50230      ctl.BarColorTo = &H640502 '&H600000
50240    End If
50250  End If
'---ErrPtnr-OnError-START--- DO NOT MODIFY ! ---
Exit Sub
ErrPtnr_OnError:
Select Case ErrPtnr.OnError("modGeneral2", "SetFrame")
Case 0: Resume
Case 1: Resume Next
Case 2: Exit Sub
Case 3: End
End Select
'---ErrPtnr-OnError-END--- DO NOT MODIFY ! ---
End Sub

これをコンパイルして、exeファイルを上書きしたら、ちゃんと日本語表示されました(色々訳アリで、setup.exeを作ってないので、exeの上書き)。

SourceForge.netだとこの辺のソース


本家で直してもらわないと、バージョンアップの度にこの作業をしなくちゃならないのでフィードバックしたいなぁ、と思っているわけですが。なにせSourceForgeみたいなものを使ったことがないので(スタンドアローン、バッチ処理、ほぼ単独での開発が身の上)、参加の仕方がわからない。(;´Д`)

Trackerの辺りで発言するのが手っ取り早そうだけれども、気後れ状態…。あーでも頑張りますー(たぶんね)。

追記→5/9、Trackerで投稿してみました。

…これからどうなるんでしょう。ヽ(。_°)ノ?

1 件のコメント:

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

じょに さん、こんにちは。先日の匿名の者(改め やす)です。
Tracker投稿、ご苦労様です。

PDFCreatorでは印刷時のPDF情報を設定する時に日本語が含まれると正しく反映されません。
そこで修正をして、それなりに動いてはいるのですが、良い(綺麗な)方法はありませんか?特に(1)の修正。

(1) PSHeaderから取得した日本語文字列が正しく変換できません。
日本語の場合は<xxxx....>(xxxxはSJISコード)となるので、SJIS(16進文字列)->Unicodeの変換が必要なのですが、良い方法がわかりませんでした。

[modPDF]-[ReplaceEncodingChars]
----ここから----
 50010 Dim i As Integer, tStr As String
>50011 Dim bStr() As Byte
 50020 tStr = ""
~中略~
 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
>50111   ReDim bStr((Len(Str1) - 2) / 2)
 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
>'50170     tStr = tStr & Chr$(CByte("&H" & Mid$(Str1, i, 2)))
>50170      bStr((i - 2) / 2) = CByte("&H" & Mid$(Str1, i, 2))
 50180    End If
 50190    Else
 50200    Exit Function
 50210   End If
 50220   Next i
>50221   tStr = StrConv(bStr, vbUnicode)
 50230  End If
 50240  End If
 50250 End If
 50260 If Len(tStr) > 0 Then
 50270  ReplaceEncodingChars = tStr
 50280 End If
-----ここまで

(2) (1)の修正後、UTF16(16進文字列)作成時にAscW()が負の値の時に落ちる。こちらは問題ないかも。

[modPDF]-[EncodeChars]
----ここから----
 50540  Case eCodePage.CP_UTF16
 50550  For i = 1 To Len(Str1)
 50560   c = AscW(Mid$(Str1, i, 1))
>'50570   tStr = tStr & String(4 - Len(Hex(c)), "0") & Hex(c)
>50570   tStr = tStr & Right("0000" & Hex(c), 4)
 50580  Next i
 50590  EncodeChars = "<FEFF" & tStr & ">"
-----ここまで