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/

関連記事

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

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

関連記事

  1. Office関連

    Office製品の開発チームにユーザーの声を届けよう!

    Office 用アプリやSharePoint 用アプリを開発する際「こ…

  2. Office関連

    Custom UI Editorの最新版がGitHubで公開されました。

    下記記事等で紹介している、リボンUIをカスタマイズするためのツール「C…

  3. Office関連

    「あのコマンドどこだっけ? for Office 2013」の紹介

    Word MVPの新田さんのブログでも紹介していただいている自作フリー…

  4. Office関連

    「Office 2003 のコマンドに対応する Office 2010 のリファレンス ブック」のダ…

    クリックさんのブログ記事「旧メニュー対応表を使いたい: パソコンのツボ…

コメント

    • こたろ~
    • 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