Excel

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/

関連記事

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

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

関連記事

  1. Office関連

    Word 2013では右クリックからBing検索できるようになりました。

    ※ この情報はOffice 2013 カスタマー プレビュー版を元にし…

  2. Office関連

    Word 2013では文書にオンライン ビデオを挿入できるようになりました。

    ※ この情報はOffice 2013 カスタマー プレビュー版を元にし…

  3. Office アドイン

    Office 用アプリの開発資料(日本語)が公開されました。

    Office 用アプリの開発資料(日本語)が公開されました。・…

  4. Office関連

    VBE用のCOMアドインをメモ帳で作ってみる。

    “Officeアプリケーション用のCOMアドインをVisual Stu…

コメント

    • こたろ~
    • 2016年 2月 02日 9:08pm

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

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

    .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.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP