Office関連

PDFファイルに差し込み印刷するVBAマクロ

このページにもあるように、AcrobatはOLEオートメーション機能によってVBAマクロから操作することが可能です。

今回はWordの差し込み印刷機能のように、指定したPDFファイルの指定したフォームフィールドに値を差し込む処理を考えてみます。

対象となるPDFファイルには下図のように氏名(フィールド名:fldName)、年齢(フィールド名:fldAge)、住所(フィールド名:fldAddress)の3つのフィールドがあり、

AcrobatAutomation_01_01

下図のようなセルA2 – C6までの値を差し込むことを想定しています。

AcrobatAutomation_01_02

早速考えたコードが下記になります。

※ 動作確認は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

上記コードは、

  1. CAcroAVDocオブジェクトのOpenメソッドで「C:\Files\template.pdf」ファイルを開きます。
  2. GetPDDocメソッドで取得したCAcroPDDocオブジェクトのGetJSObjectメソッドによってJSObjectを取得します。
  3. JSObject経由でDocオブジェクト(Acrobat)のgetFieldメソッドを呼び出して各フィールドを取得、値を設定します。
  4. CAcroAVDocオブジェクトのPrintPagesメソッドで1ページ目だけ通常使うプリンターで印刷します。
  5. ファイルを保存せずに閉じ、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/


2016/2/3 追記:
チェックボックスやラジオボタンの値を変更するマクロについても記事を書きました。

・PDFファイル上のフィールドの値を操作するVBAマクロ
//www.ka-net.org/blog/?p=6637

文字列を指定した文字数で分割するVBA関数前のページ

Microsoft Office 2013 Service Pack 1が公開されました。次のページ

関連記事

  1. Office関連

    テキストボックスの中にある表を操作するWordマクロ

    Yahoo!知恵袋で、「Wordマクロでテキストボックスの中にある表の…

  2. アイコン一覧

    Office 2013 アイコン一覧(G)

    ・Office 2013 アイコン一覧 NUM…

  3. Office関連

    「DQNネーム辞書」を更新しました。

    前のブログで公開していたIME 2010用の「DQNネーム辞書」を更新…

  4. アイコン一覧

    Office 365アイコン(imageMso)一覧を作成するにあたって

    Office 2013のアイコン一覧を公開してから4年ほど経ち、その間…

  5. Office アドイン

    [Officeアドイン]図形挿入アドイン

    最近まほうのルミティアとかプリキュア、オトカドールの記事ばかり書くこと…

  6. Office関連

    jQuery UIのDatepickerをVBAから使用するサンプル

    2014/1/31 追記:Internet Explorerのオー…

コメント

    • こたろ~
    • 2016年 2月 02日

    はじめまして。とても参考になる記事をありがとうございます。

    ところで,教えていただけないでしょうか。

    .getField(“fldName”).Value = で文字列を挿入するのはうまくいったのですが,既存のチェックボックスにチェックを入れる時には,どのように記述すればよいのでしょうか。

    上記の記述で値にTrueや-1を入れてみましたが,うまくいきませんでした。あれこれと調べても,これという情報に行き当たらず,ご厚情に甘えて,お尋ねする次第です。

    恐縮ですが,よろしくお願いいたします。m(_ _)m

    • > こたろ~様

      当ブログ管理者のきぬあさです。
      ご質問いただきましたチェックボックスの件につきまして、別途記事を書きましたので、ご参考になれば幸いです。

      ・PDFファイル上のフィールドの値を操作するVBAマクロ
      http://www.ka-net.org/blog/?p=6637

  1. この記事へのトラックバックはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

PAGE TOP