2009/05/08

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

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

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

  1. Public Sub SetFrame(ByRef ctl As Control, Optional TempOptionsDesign = -1)  
  2. '---ErrPtnr-OnError-START--- DO NOT MODIFY ! ---  
  3. On Error GoTo ErrPtnr_OnError  
  4. '---ErrPtnr-OnError-END--- DO NOT MODIFY ! ---  
  5. 50010  Dim tOD As Long  
  6. 50020  If TempOptionsDesign > -1 Then  
  7. 50030    tOD = TempOptionsDesign  
  8. 50040   Else  
  9. 50050    tOD = Options.OptionsDesign  
  10. 50060  End If  
  11. 50070  ctl.Font.Size = 10  
  12. '-----------------// 追加ここから //------------------------  
  13. 50071  ctl.Font.Name = Options.ProgramFont  
  14. 50072  ctl.Font.Charset = Options.ProgramFontCharset  
  15. '-----------------//  ここまで  //------------------------  
  16. 50080  ctl.TextShaddowColor = &HC00000  
  17. 50090  If ComputerScreenResolution <= 8 Or tOD = 1 Then  
  18. 50100    ctl.UseGradient = False: ctl.Caption3D = [Flat Caption]  
  19. 50110    If UCase$(ctl.Name) = "DMFRADESCRIPTION" Then  
  20. 50120      ctl.BarColorFrom = vbRed  
  21. 50130     Else  
  22. 50140      ctl.BarColorFrom = vbBlue  
  23. 50150    End If  
  24. 50160   Else  
  25. 50170    ctl.UseGradient = True: ctl.Caption3D = [Raised Caption]  
  26. 50180    If UCase$(ctl.Name) = "DMFRADESCRIPTION" Then  
  27. 50190      ctl.BarColorFrom = &HB0BED  '&HA0A0FF ' &HFB&  
  28. 50200      ctl.BarColorTo = &H20564  '&HE0& ' &HDDFF&  
  29. 50210     Else  
  30. 50220      ctl.BarColorFrom = &HED0B0B '&HFFA0A0  
  31. 50230      ctl.BarColorTo = &H640502 '&H600000  
  32. 50240    End If  
  33. 50250  End If  
  34. '---ErrPtnr-OnError-START--- DO NOT MODIFY ! ---  
  35. Exit Sub  
  36. ErrPtnr_OnError:  
  37. Select Case ErrPtnr.OnError("modGeneral2""SetFrame")  
  38. Case 0: Resume  
  39. Case 1: Resume Next  
  40. Case 2: Exit Sub  
  41. Case 3: End  
  42. End Select  
  43. '---ErrPtnr-OnError-END--- DO NOT MODIFY ! ---  
  44. 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 & ">"
-----ここまで