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 アドイン

    Excel向けPower BI カスタム ビジュアル機能の紹介

    Power BI ブログの記事「Excel announces new…

  2. Office関連

    [Outlook VBA]最小化起動時にApplication.Startupイベントが発生しない。…

    Outlook起動時、すべてのアドインが読み込まれた後に発生するApp…

  3. Office関連

    Office 365 APIをVBAから呼び出す(1)

    2015年4月に公開されたOffice Teamのブログ記事「Toda…

  4. Office アドイン

    [Office用アプリ]画像を挿入する。

    DocumentオブジェクトのsetSelectedDataAsync…

  5. Office アドイン

    Visio JavaScript APIで遊んでみました。

    前回の記事でプレビュー版がリリースされた「Visio JavaScri…

コメント

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