(VB.Net).NetからのPDFファイル印刷方法
.Netで作ったプログラムからPDFファイルを印刷する方法です。なお、.Net自体はPDFを理解できないので、AcrobatかAdobeReaderプロセスを起動させて印刷させる方法です。(これ以外に方法があったら教えてください。)
ということで、AcrobatかAdobeReaderがインストールされていない環境では使えません。
'====レジストリからAcrobat,AcrobatReaderのパス取得==== Dim strRegPath As String Dim rKey As RegistryKey 'キーを取得(最初にAcrobat,だめならAdobeReader) strRegPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Acrobat.exe" rKey = Registry.LocalMachine.OpenSubKey(strRegPath) If rKey Is Nothing Then strRegPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcroRd32.exe" rKey = Registry.LocalMachine.OpenSubKey(strRegPath) End If '値(exeのパス)を取得(既定の値の場合は空文字指定) Dim location As String Try '値(exeのパス)を取得(既定の値の場合は空文字指定) location = DirectCast(rKey.GetValue(""), String) Catch ex As NullReferenceException Throw New ApplicationException("AcrobatもしくはAdobeReaderがインストールされていないため、PDFファイルの印刷ができません。") Finally '開いたレジストリキーを閉じる rKey.Close() End Try '===Acrobatを起動し印刷=== Dim filepath As String = "D:\print_test.pdf" Dim pro As New Process() '.Net的書き方(C#でも可能な書き方) 'Acrobatのフルパス設定 pro.StartInfo.FileName = location pro.StartInfo.Verb = "open" 'Acrobatのコマンドライン引数設定 pro.StartInfo.Arguments = " /n /t " + filepath pro.StartInfo.WindowStyle = ProcessWindowStyle.Hidden 'プロセスを新しいWindowで起動 pro.StartInfo.CreateNoWindow = True 'プロセス起動 pro.Start() 'プロセス終了 pro.WaitForExit(5000) pro.Kill() 'VB的書き方 'Dim procID As Integer 'procID = Shell(location & " /n /t " & filepath) 'pro = Process.GetProcessById(procID) 'pro.WaitForExit(3000) 'pro.Kill()
このソース(特に.Net的書き方)は@ITで上がってた掲示板を参考にさせてもらってます。
まず、レジストリからAcrobat,AdobeReaderのexeのパスを取得します。レジストリのどこにあるかはAdobeのサポートページに書かれていました。
あとはexeに印刷用引数を渡して起動させるだけです。
/t というのがAdobe Reader を起動し、印刷ダイアログボックスを表示せずにファイルを印刷する引数みたいです。 /n はAdobe Reader のインスタンスが現在開いていても、別のインスタンスを起動するという意味みたいです。
引数については下記のページを参考にさせてもらいました。
AcroRd32.exeのコマンドプロンプトからの引数 Adobe Reader 8.1の起動オプション(その2)
追記:PDFファイルを.Net上で読み込ませるには"】iText.NET"というOSSライブラリが利用できるみたいです。
再追記:この方法だと、終了処理に問題があります。詳しくは(VB.Net)[補足].NetからのPDFファイル印刷方法を参照してください。