2011年2月21日月曜日

VBAでPDFの印刷

テキストは5台のパソコンにそれぞれ6台のプリンタをぶら下げ、合計30台のプリンタを使って印刷しています。
てなわけで、手作業で印刷していたのでは大変なので1台別のパソコンを用意してそのパソコンでWordのVBAを使って5台のパソコンを制御しています。

印刷はWord2010を使ってWordのデータで印刷していたのですが、Wordの処理が非常に重たくてうまく印刷できないテキストが増えてきました。

PDFなら6台でも同時に印刷できそうなのでWordのデータを印刷するのをやめてPDFに変換してから印刷することにしました。


1.Adobe Reader を使って印刷

Webを探すといろいろ出てきましたが、とりあえず無料のAdobe Reader を使って印刷する方法を試してみました。


Set MyShell = CreateObject("WScript.Shell")
MyShell.Run ("AcroRd32.exe /t " & Chr(34) & FileName & Chr(34) & " " & Chr(34) & PrinterName & Chr(34))
Set MyShell = Nothing

これでAdobe Reader で FileName で指定したファイルを PrinterName で指定したプリンターから印刷できます。

Chr(34)は文字の「"」で、FileName や PrinterNameにスペースがある場合に備えて「"」でくくるようにしています。

これでとりあえずPDFの印刷はできたのですが、問題がありました。
Adobe Readerが終了しないのとページを指定できないのです。



2.Adobe Acrobat を使って印刷


無料のAdobe ReaderでだめでもAdobe Acrobat がインストールしてあればもっといろいろできます。が、
私のパソコンにはインストールされていません。

ということで、とりあえず体験版をダウンロードすることにしました。
体験版には30日の使用期限がありますが、うまくいけば購入することにしましょう。


VBAでAcrobatを操作するための設定。

VBEを起動後、「ツール」-「参照設定」で「Adobe Acrobat 10.0 Type Library」にチェックを入れます。
(最初の表示はAcrobatだけだったように気がしますが・・・)


ページ指定して印刷するためのソースがこれです。

Dim objAcroAVDoc As New Acrobat.AcroAVDoc
Dim lRet As Long

Sub PDFの印刷()
 Dim MaxPage As Integer  '最大ページ数
 Dim FileName As String 'ファイル名
 Dim PrinterName As String 'プリンター名
 Dim ISP As Integer '印刷先頭ページ
 Dim IEP As Integer '印刷最終ページ
      |
      |
 'PDFファイルのオープン
 MaxPage = OpenPDF(FileName)
 If MaxPage > 0 Then
      |
      |
  'PDFファイルの印刷実行
  PDFprint PrinterName, ISP, IEP
  'PDFファイルを閉じる
  ClosePDF
 End If
End Sub


Function OpenPDF(PDF_FILE As String) As Integer
 Dim AcroExchPDDoc As Object
 Dim buf As Long

 If Dir(PDF_FILE) <> "" Then
  lRet = objAcroAVDoc.Open(PDF_FILE, "")
  Set AcroExchPDDoc = objAcroAVDoc.GetPDDoc()
  OpenPDF = AcroExchPDDoc.GetNumPages
  Set AcroExchPDDoc = Nothing
 Else
  MsgBox "ファイルが見つかりません", vbExclamation
  OpenPDF = 0
 End If
End Function

Sub ClosePDF()
 lRet = objAcroAVDoc.Close(0)
 Set objAcroAVDoc = Nothing
End Sub

Sub PDFprint(PrinterName As String, PageS As Integer, PageE As Integer)
 Dim Cprint As String '現在のアクティブプリンタ

 Cprint = ActivePrinter
 ActivePrinter = PrinterName
 lRet = objAcroAVDoc.PrintPages(PageS - 1, PageE - 1, 2, 0, 1)
 ActivePrinter = Cprint
End Sub

テスコパソコン教室 テキスト販売