2009/05/31

PDFCreator日本語問題まとめ

いろいろありましたが、まとめ、いきましょう。とりあえずPDFCreatorのverは0.9.8になります。

PDFCreator0.9.8 (日本語対応バイナリ配布)

コンパイル環境のない方の為に、やすさんからいただいたバイナリとソースをUPしておきますね。やすさん、ありがとう!

配布
  1. PDFCreator0.9.8 (日本語対応exeファイル)
    PDFCreator_0516.zip
    (MD5 : 91ae1b27a964be1cfdbd111b286e445f)
  2. 参考 PDFCreator0.9.8(上記ソース)
    Version 0.9.8_090516.zip
    (MD5 : db8944afaa2e672b31d9f66a8a473060)
使い方
  1. 本家からPDFCreator0.9.8をDLしていただき、一旦インストールします。
  2. その後、PDFCreator.exeを上記1.の日本語版exeファイルと差し替えます。
動作環境の報告

当バイナリは、W2K(SP4)/XP(SP3)での動作が確認されています。

Vista(32bit SP2)環境では、"VB6JP.DLL"をインストールする必要があるようです(これはVisual Basic 6.0 SP6あたりのランタイムを入れれば入ると思われ…)。

Ω Ω Ω

以下は上記ソースにいたるまでの解説・経緯のまとめになります。本家でバージョンアップがされたときのために…。

メニュー画面の日本語化について。

  1. PDFCreatorの文字化けをなおす…必須
  2. PDFCreatorの文字化けをなおす2…小手先
  3. PDFCreatorの文字化け問題-修正箇所発見…Vb6.0でコンパイルできるヒト向け(これで完璧に)

PDF情報の日本語入力について(※すべて、VB6.0でコンパイルできるヒト向け)

  1. PDFCreatorの日本語問題-PDF情報編2
  2. PDFCreatorの日本語問題-PDF情報編…(2)EncodeCharsについての部分のみ利用してください

2.の記事にある「(1)ReplaceEncodingCharsについて」は不完全だということがわかりましたので、以下がやすさんの差し替えソースです。

[Common]-[modPDF.bas]

  1. Public Function ReplaceEncodingChars(Str1 As StringAs String  
  2. '---ErrPtnr-OnError-START--- DO NOT MODIFY ! ---  
  3. On Error GoTo ErrPtnr_OnError  
  4. '---ErrPtnr-OnError-END--- DO NOT MODIFY ! ---  
  5. 50010  Dim i As Integer, tStr As String  
  6. '---2009/05/16-START--- by yasu  
  7.        Dim bStr() As Byte  
  8.        Dim j, k As Integer  
  9. '---2009/05/16-End--- by yasu  
  10. 50020  tStr = ""  
  11. 50030  ' First we look for oct encoding chars  
  12. '---2009/05/16-START--- by yasu  
  13. '50040  For i = 127 To 255  
  14. '50050   Str1 = Replace$(Str1, "\" & Oct$(i), Chr$(i))  
  15. '50060  Next i  
  16. 50070  ReplaceEncodingChars = Str1  
  17.   
  18.         j = 0  
  19.         ReDim bStr(Len(Str1))  
  20.         For i = 1 To Len(Str1)  
  21.         Do  
  22.             If Mid$(Str1, i, 1) <> "\" Then  
  23.                 bStr(j) = AscB(Mid$(Str1, i, 1)): j = j + 1  
  24.             Else  
  25.                 If i <> Len(Str1) Then  
  26.                     If Mid$(Str1, i + 1, 1) Like "[\{}()]" Then  
  27.                         bStr(j) = AscB(Mid$(Str1, i + 1, 1)): j = j + 1: i = i + 1  
  28.                         Exit Do  
  29.                     End If  
  30.                 End If  
  31.                 If Len(Str1) - i > 3 Then  
  32.                     For k = 1 To 3  
  33.                         If Not Mid$(Mid$(Str1, i + 1, 3), k, 1) Like "[0-9]" Then  
  34.                             Exit For  
  35.                         End If  
  36.                     Next  
  37.                     If k = 4 Then  
  38.                         bStr(j) = CByte("&O" & Mid$(Str1, i + 1, 3)): j = j + 1: i = i + 3  
  39.                     Else  
  40.                         bStr(j) = AscB(Mid$(Str1, i, 1)): j = j + 1  
  41.                     End If  
  42.                 Else  
  43.                     bStr(j) = AscB(Mid$(Str1, i, 1)): j = j + 1  
  44.                 End If  
  45.             End If  
  46.         Loop Until 1  
  47.         Next  
  48.         tStr = StrConv(bStr, vbUnicode)  
  49. '---2009/05/16-End--- by yasu  
  50. 50080  ' Second we look for hex encoding chars  
  51. 50090  If Len(Str1) >= 4 Then  
  52. 50100   If Mid$(Str1, 1, 1) = "<" And Mid$(Str1, Len(Str1), 1) = ">" Then  
  53. 50110    If Len(Str1) Mod 2 = 0 Then  
  54. '---2009/05/16-START--- by yasu  
  55.           ReDim bStr((Len(Str1) - 2) / 2)  
  56. '---2009/05/16-END---  
  57. 50120     For i = 2 To Len(Str1) - 1 Step 2  
  58. 50130      If IsNumeric("&H" & Mid$(Str1, i, 2)) = True Then  
  59. 50140        If CByte("&H" & Mid$(Str1, i, 2)) > 255 Then  
  60. 50150          Exit Function  
  61. 50160         Else  
  62. '---2009/05/09-START--- by yasu  
  63.                bStr((i - 2) / 2) = CByte("&H" & Mid$(Str1, i, 2))  
  64. '50170          tStr = tStr & Chr$(CByte("&H" & Mid$(Str1, i, 2)))  
  65. '---2009/05/09-END--- by yasu  
  66. 50180        End If  
  67. 50190       Else  
  68. 50200        Exit Function  
  69. 50210      End If  
  70. 50220     Next i  
  71. '---2009/05/09-START--- by yasu  
  72.           tStr = StrConv(bStr, vbUnicode)  
  73. '---2009/05/09-END--- by yasu  
  74. 50230    End If  
  75. 50240   End If  
  76. 50250  End If  
  77. 50260  If Len(tStr) > 0 Then  
  78. 50270   ReplaceEncodingChars = tStr  
  79. 50280  End If  
  80. '---ErrPtnr-OnError-START--- DO NOT MODIFY ! ---  
  81. Exit Function  
  82. ErrPtnr_OnError:  
  83. Select Case ErrPtnr.OnError("modPDF""ReplaceEncodingChars")  
  84. Case 0: Resume  
  85. Case 1: Resume Next  
  86. Case 2: Exit Function  
  87. Case 3: End  
  88. End Select  
  89. '---ErrPtnr-OnError-END--- DO NOT MODIFY ! ---  
  90. 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に変換する、という流れ。

引数で受け取る値を見ても、一見「!?」という感じですし、暗号でも見ている気分でしたよ。やすさんスゴイ!!ヽ(´ー`)ノ

16 件のコメント:

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

こんばんわ、じょに さん。
一昨日に事故で車を廃車にしてしまったやすです。
きちんとまとめて頂いて感謝します。
物忘れがひどい(既に"modCDlg.bas"の修正の件で実証済)ので、新しいバージョンが出たときに参考にさせて頂きます。
あと8進数変換もどきのロジックですが、確認のために一時的に組んだロジックなので、もっと綺麗な(速い)ロジックがあれば修正してください。

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

やすさん、こんばんわ。
廃車までの事故とは……。大変でしたね。お体の方は大丈夫ですか。

当初まとめ記事は、ログが流れて後から読みづらくなっていくブログではなく、フツーのサイトにしようと考えていたのですが、「Google サイト」が使いづらくて諦めました。(-_-;)
Google サイトのサービスだと、ソースコードをハイライトするjavascriptのファイルがアップロードできないんですよね。
ソースコードが主役予定なのに!! ヽ(`Д´)ノ──と思ってテンションがさがり、とりあえず"鉄は熱いうちにうて"とばかりにまとめておくことを先決した次第です。

ReplaceEncodingCharsのロジックの修正案は…。引数のパターンの全容が私のアタマの中ではぼやーっとしているので、手強いですね。(^^;
新たなる猛者が現れたりしたら面白いと思いますけど(←他力本願気味)。

b-wind さんのコメント...

初めまして。

クレクレ君で申し訳ないんですが、日本語対応された PDFCreator のバイナリ、配布していただけませんか?
ライセンス上はGPLなので問題ないと思います。

もしくは Souceforge.JP の方でもプロジェクトがあるようなので、そちらで活動していただけるとありがたいな~、とか。
http://sourceforge.jp/projects/pdfcreator/

勝手ばかり言ってすいませんが検討いただけるとうれしいです。

Unknown さんのコメント...

はじめまして。
こちらで掲載されているコードに修正してコンパイルしてみたらほとんどの場合うまくいくようになりました!ありがとうございます!
ただ、ファイル名にカレンダーなど「カレ」という文字列が入っていると保存できませんでした。残念ながら、自分では解析できませんでしたので、報告のみです。。。

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

初めまして、b-wingさん、pongarさん。

>b-wingさん
バイナリですね…。
私個人のマシンにVB6.0が入っているわけではないので、
配布となると、ちと微妙なのすよ。(^^;

やすさんが作成されたexeをもっていますが、
これ、UPしても良いでしょうかね?<やすさん (見ているかしらー)


>pongarさん
ファイル名に「カレ」を含んでいると、
ファイル名に「カレ」が入らないということでしょうか?
こちらでは「カレンダー」や「200906カレンダー」でも保存はできて、
不具合を確認することはできませんでしたが…。
ちなみにこちらの動作環境は、XPproSP3.0ですね。


P.S.
当方、明日から1週間ほど旅にでます。
非モバイラーなので、音信不通になるかも…。(-_-;)

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

こんにちは、じょにさん。
私にはUpする環境がないので、Upして頂ければ非常に嬉しいのですが、まだ汎用性には問題がありそうです。
私のW2K(SP4)/XP(SP3)では動作しましたが、Vista(32bit SP2)環境では正しく動作しませんでした。ただしVista上にVB6(SP6)をインストールして再作成すると正しく動作しました。
環境依存なのかプログラム中にOS切り分けが必要なのかがまだわかっていません。

P.S.
旅ですか、気を付けて行ってきてください。
因みに私は九州への旅の2日目で廃車する羽目になりました(笑)。

pongar さんのコメント...

>じょにさん
すみません、こちらの書き方が間違っていました。
ファイル名ではなくタイトル名でした。。「コメ」もダメでした。
こちらの環境はXPSP3です。
コードの修正方法が悪いだけかもしれないです。

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

こんにちは、じょにさん。
先程のVistaの件は誤りでした。
VB6の既定フォントが"MS Sans Serif"なので文字化けが発生しているようです。
"VB6JP.DLL"を登録することで回避できます。Vistaの他にWindows 7 RCでも確認できました。

はじめまして、pongarさん。
コンパイル環境があるようなので、じょにさんの「PDFCreatorの日本語問題-PDF情報編2」にあるofnオブジェクトの設定値を確認してみてはいかがでしょう。
.sFile がファイル名(タイトル名)になりますので、正しく設定されているでしょうか。
あとは、記事にもあるように長さが正しければ"GetSaveFileName(ofn)"が成功するはずです。

Unknown さんのコメント...

>じょにさん
はじめまして、コメントありがとうございます。
おかげで解決しました!
「PDFCreatorの日本語問題-PDF情報編2」での修正箇所を私が間違っていました。SaveFileDialogではなくOpenFileDialogを修正してしまっていました。WinMergeで確認していたんですが、どうもSaveFileDialogとOpenFileDialogの該当コード部分はまったく同じコードだったので気付きませんでした。
一応ファイルをアップしてみました。
http://firestorage.jp/download/f34736f208593d8c694406ab8eb75cab6c1d0150

Unknown さんのコメント...

>やすさん
まちがえてじょにさん宛にしてしまいました、ごめんなさい。。。

固定のファイルパスに保存できるPDFを探してたんですが、Bullzipがフリーだと会社利用では10人までしか使用できなかったので、困っていたとこなんです。じょにさん、やすさん、ありがとうございました。

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

こんにちは、じょにです。旅から無事、帰ってきました。

というわけで、早速バイナリUP!
新たに記事をたてることも考えましたが、
まとめている方がわかりやすいので、
バイナリはやっぱりこの記事にUPすることにしました。
そしてたぶんより多くのヒトが欲しいのはやっぱり"コレでしょ"ということで、
記事の最初に挿入。
Vista情報ともども、やすさん、本当にありがとうございました。

pongarさんも解決できてよかったですね!
[SaveFileDialog]は私も翻弄されましたが、
保存するところなので、大切なんですよね。

匿名 さんのコメント...

こんにちは。
バイナリのアップロードに失敗していませんでしょうか?いくらやってもうまくいかないようです。

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

こんばんわ、いまひとつ、ツメの甘いじょにです。
匿名さん、ご指摘ありがとうございました。
バイナリのzipはFireFox(3.5)でUPすると、
何度やってもちゃんとUPできないというまさかの事態。
何故かIEであげたら一発でうまくいきました…。
えぇっ、なんで?! Σ(゚Д゚;≡;゚д゚) (←MSっ子のわりに…)

今回はこちらでもDLしてハッシュを確認しましたので、無事かと思われます。
お騒がせしましたー。

匿名 さんのコメント...

こんにちは。上記の匿名で書き込みしたものですが、無事ダウンロードでき、解凍できました。
ただ、当方の環境はXP pro OEM版でSP3環境、インストールの際にSP+メーカーなるツールを使ってサービスパック適用済みインストーラを使っており、挿げ替えた状態でも文字化けが出ていることからVB6JP.DLLの問題に該当する可能性があるようです。

splash さんのコメント...

XP pro SP2です。
バイナリ(exe)を入れ替えましたが、うまく日本語化できません(>_<)

日本語化OK:タイトルバー、ツールバー、ボタン、ドロップダウンリスト、チェックボックスの説明

他の部分はすべて文字化けします。

アドバイスを頂けると助かります。

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

匿名さん、splashさん、こんばんわ。

匿名さんのおっしゃるソフトはこれですね。
http://www.forest.impress.co.jp/lib/sys/instmng/instsupt/spmaker.html
このようなソフトがWinにもあるのですね。
情報システム部門が重宝していそうなソフトですね。


splashさんの
日本語化OK:タイトルバー、ツールバー、ボタン、ドロップダウンリスト、チェックボックスの説明

この組み合わせのみOKというのは、
[japanese.ini]をあてたときの差し替えてない状態と一緒ですよねー…。うーむ。

疑う部分は、匿名さんのご指摘どおり、vb6jp.dllかなぁ?という気がしますね。
▼vb6jp.dllの薀蓄はこの辺。
http://support.microsoft.com/kb/813131/ja


WINDOWS\system32にVB6JP.DLLはあるでしょうか?
これが入っていないと、splashさんの挙げていらっしゃる組み合わせで
文字化けをおこします。
なお、VB6JP.DLLは、ベクター等で配布されているVB6のランタイムを入れれば
そこに含まれていますよ。