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関連

    日経ソフトウエア 2014年 10月号 「VBAでExcelを業務アプリ化」

    購読している雑誌、日経ソフトウエア 2014年 10月号に「イベントプ…

  2. Office関連

    Office365APIEditorでMicrosoft Graph APIを手軽に呼び出し!

    下記Tech Communityの記事で、Microsoftのエンジニ…

  3. アイコン一覧

    Office 365アイコン(imageMso)一覧(M)

    Office 365のデスクトップ版Officeアプリケーション(Wo…

  4. Office関連

    「個人用テンプレートの既定の場所」を設定するWordマクロ

    前回の記事で、Word 2013で個人用テンプレート(カスタム テンプ…

  5. Office関連

    SkyDriveの同期フォルダーのパスを取得するWordマクロ

    無料で使える便利なクラウドストレージ「SkyDrive」にはローカルフ…

  6. Office アドイン

    [Office用アプリ]アプリ開発コンテストの案内

    2013/9/9 追記:コンテストの受賞者が発表されました。おかげ…

コメント

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