Skip to main content

Adobe Acrobat / Readerは、拡張子が「.pdf」じゃないpdfファイルを印刷させるとおかしなことがおこるかもしれない

こんなことでハマってしまうとは・・。

いま仕事で作っているアプリに、pdfを編集したり印刷したり機能があります。
開発環境はVB.NET。Visual Studio 2008です。.NET Framework3.5SP1を使ってます。

pdfの編集機能は、もともと存在するpdfにiTextSharpを使っていくつかの情報を付加し、ユニークなファイル名をつけて保存。
ユニークなファイル名はVB.NET標準というか.NET Framework標準のSystem.IO.Path.GetTempFileNameというものを使用。

印刷機能は、上記編集機能で作ったpdfを、Adobe Readerを埋め込んだフォームを使って印刷する・・なんてことをやっています。

ぱっと見た感じ、これで問題なく動きそうだったのですが、一部のファイルの印刷で文字化けすることが確認されました。
調べてみると、化けているのは協力してもらっているデザイナーさんお手製のフォント。
んで何故か印刷じゃなくてAdobe Readerなんかを介して表示させると正常。なにこれ印刷だけおかしいの? ってな具合でした。

まあこういう時は深く考えずpdfにオリジナルフォントを埋め込まずアウトライン化してもらうのが楽なのですが、それはオトナの事情で無理とのこと。
こんなんプログラム側で対処できんのかー? と、一時は途方に暮れてしまた。アデュー俺の夏休み。

と思っていたのですが。
というか、タイトルからしてネタバレなのですが。

不意に、印刷用ワークファイルの拡張子を「.pdf」にして実行させたところ、正常にというか、狙った通りの形で印刷されました。
ユニークなファイル名を取得するSystem.IO.Path.GetTempFileNameというメソッドは、例えばWindows XPでは
C:\Documents And Settings\(ユーザー名)\Local Settings\Temp
ディレクトリにユニークな名前をるんですが、この拡張子が「.tmp」。
これをこのまんま使っていたのですが、そうすると上記のようなことが発生するわけです。

まあ、あんまりこういう処理を書くようなことはないかと思いますが、なにかの参考になればと思います。

それともう一つ。
印刷ではなく、例えばAdobe ReaderのCOMを使ったりして表示した際に同様の事象が発生した場合、環境設定の「表示」にある「ページのキャッシュを使用する」をオフにするといいことがあるかもしれません。
これも同様にハマりました。

Comments