このページにもあるように、AcrobatはOLEオートメーション機能によってVBAマクロから操作することが可能です。
今回はWordの差し込み印刷機能のように、指定したPDFファイルの指定したフォームフィールドに値を差し込む処理を考えてみます。
対象となるPDFファイルには下図のように氏名(フィールド名:fldName)、年齢(フィールド名:fldAge)、住所(フィールド名:fldAddress)の3つのフィールドがあり、
下図のようなセルA2 – C6までの値を差し込むことを想定しています。
早速考えたコードが下記になります。
※ 動作確認はWindows 7 + Acrobat XI環境で行いました。
Option Explicit Public Sub Sample() Dim app As Object Dim avdoc As Object Dim i As Long Const PdfFilePath As String = "C:\Files\template.pdf" 'PDFファイルのパス Set app = CreateObject("AcroExch.App") Set avdoc = CreateObject("AcroExch.AVDoc") If avdoc.Open(PdfFilePath, "") = True Then app.Show 'Acrobat表示 With avdoc.GetPDDoc.GetJSObject For i = 2 To ActiveSheet.Range("A1").End(xlDown).Row .getField("fldName").Value = CStr(ActiveSheet.Cells(i, 1).Value) .getField("fldAge").Value = CStr(ActiveSheet.Cells(i, 2).Value) .getField("fldAddress").Value = CStr(ActiveSheet.Cells(i, 3).Value) avdoc.PrintPages 0, 0, 3, 0, 0 '1ページ目だけを通常使うプリンターで印刷 Next End With avdoc.Close 1 '文書を保存せずに閉じる app.Hide: app.Exit End If End Sub
上記コードは、
- CAcroAVDocオブジェクトのOpenメソッドで「C:\Files\template.pdf」ファイルを開きます。
- GetPDDocメソッドで取得したCAcroPDDocオブジェクトのGetJSObjectメソッドによってJSObjectを取得します。
- JSObject経由でDocオブジェクト(Acrobat)のgetFieldメソッドを呼び出して各フィールドを取得、値を設定します。
- CAcroAVDocオブジェクトのPrintPagesメソッドで1ページ目だけ通常使うプリンターで印刷します。
- ファイルを保存せずに閉じ、Acrobatを終了します。
といった処理を行っています。
印刷せず、別名でPDFファイルを保存する場合は下記のようなコードになります。
Public Sub Sample2() Dim app As Object Dim avdoc As Object Dim pddoc As Object Dim i As Long Const PDSaveFull = 1 Const PdfFilePath As String = "C:\Files\template.pdf" 'PDFファイルのパス Set app = CreateObject("AcroExch.App") Set avdoc = CreateObject("AcroExch.AVDoc") If avdoc.Open(PdfFilePath, "") = True Then app.Show 'Acrobat表示 Set pddoc = avdoc.GetPDDoc With pddoc.GetJSObject For i = 2 To ActiveSheet.Range("A1").End(xlDown).Row .getField("fldName").Value = CStr(ActiveSheet.Cells(i, 1).Value) .getField("fldAge").Value = CStr(ActiveSheet.Cells(i, 2).Value) .getField("fldAddress").Value = CStr(ActiveSheet.Cells(i, 3).Value) pddoc.Save PDSaveFull, "C:\Files\MyPDF_" & i - 1 & ".pdf" 'PDFファイルを別名保存 Next End With avdoc.Close 1 '文書を保存せずに閉じる app.Hide: app.Exit End If End Sub
上記コードで使っているAcrobatの各オブジェクトのプロパティやメソッドに関する説明は、公式サイトのリファレンスを参考にしても良いと思いますが、日本語の情報源としては下記サイトを参照することをお薦めします。
VBAからのAcrobatオートメーションに関しては、下記サイトが最も充実しています。
・PDF
http://pdf-file.nnn2.com/
はじめまして。とても参考になる記事をありがとうございます。
ところで,教えていただけないでしょうか。
.getField(“fldName”).Value = で文字列を挿入するのはうまくいったのですが,既存のチェックボックスにチェックを入れる時には,どのように記述すればよいのでしょうか。
上記の記述で値にTrueや-1を入れてみましたが,うまくいきませんでした。あれこれと調べても,これという情報に行き当たらず,ご厚情に甘えて,お尋ねする次第です。
恐縮ですが,よろしくお願いいたします。m(_ _)m
> こたろ~様
当ブログ管理者のきぬあさです。
ご質問いただきましたチェックボックスの件につきまして、別途記事を書きましたので、ご参考になれば幸いです。
・PDFファイル上のフィールドの値を操作するVBAマクロ
http://www.ka-net.org/blog/?p=6637