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]

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に変換する、という流れ。

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

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のランタイムを入れれば
そこに含まれていますよ。