3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(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ファイル印刷方法を参照してください。