Excel

Acrobatを使ってPDFファイルをNアップするVBAマクロ

VBAで、B5サイズのPDFファイルを横並びにしてB4サイズのPDFファイルにするにはどうすれば良いか?という質問をいただきました。

この手の処理はよくあることで、手作業で行う場合は下記ページのような処理になります。

・【解決事例】Acrobat XI Pro「縦向きのA4サイズのPDFの各ページを横に並べて結合し、A3サイズでプリントしたい」
https://forums.adobe.com/thread/1615335

いわゆるNアップ印刷ですね。

VBA(Acrobatオートメーション、Acrobat JavaScript)からでももちろん処理できますが、事前処理が必要になります。
(下記事前処理の自動化もできないことはないのですが、面倒なので割愛します。)

事前処理

※ 下記設定は縦向きのB5サイズのファイルを横に並べてB4サイズで出力することを想定しています。必要に応じて設定内容を変更してください。

  1. 「Adobe PDF」プリンターのプロパティ(基本設定)を開きます。
  2. 「Adobe PDF 設定」タブの各項目を設定します。
  3. ・Adobe PDF 保存先フォルダー(F):C:\Test\PDF
    ・Adobe PDF のページサイズ(Z):B4
    ・結果の Adobe PDF を表示(V):オフ
    ・既存の PDF ファイルの上書きを確認(R):オフ

    Acrobat_NUp_01

  4. 「レイアウト」タブから「印刷の向き(O)」を「」に設定します。
  5. Acrobat_NUp_02

  6. 「OK」ボタンをクリックして設定を反映、画面を閉じます。

VBAコード

※ 下記コードは「C:\Test\B5x2.pdf」ファイルを「C:\Test\PDF」フォルダーに出力することを想定しています。必要に応じてコードを変更してください。

Option Explicit

Public Sub Sample()
'要[Adobe PDF]プリンターの事前設定
  Const SrcFilePath As String = "C:\Test\" '元ファイルのフォルダーパス
  Const DestFilePath As String = "C:\Test\PDF\" 'Adobe PDF 保存先フォルダー
  Const PdfFileName As String = "B5x2.pdf" '元ファイル名
  
  NUpPdf SrcFilePath & PdfFileName, 2, 1
  If MsgBox("N-up印刷が終了しました。" & vbNewLine & _
            "ページ回転処理を行いますか?", vbYesNo) = vbYes Then
    RotatePdfPage DestFilePath & PdfFileName, 90
  End If
  MsgBox "処理が終了しました。", vbInformation + vbSystemModal
End Sub

Private Sub NUpPdf(ByVal PdfFilePath As String, _
                   ByVal NumPagesH As Integer, _
                   ByVal NumPagesV As Integer)
'1枚あたりのページ数を指定して再PDF化
'([Adobe PDF]プリンターで印刷処理)
  Dim app As Object
  Dim avdoc As Object
  Dim jso As Object
  Dim pp As Object
  
  Set app = CreateObject("AcroExch.App")
  Set avdoc = CreateObject("AcroExch.AVDoc")
  If avdoc.Open(PdfFilePath, "") = True Then
    app.Show 'Acrobat表示
    Set jso = avdoc.GetPDDoc.GetJSObject
    Set pp = jso.getPrintParams
    CallByName pp, "printerName", VbSet, "Adobe PDF" 'プリンター指定
    CallByName pp, "firstPage", VbSet, 0 '印刷するページ:すべて
    CallByName pp, "lastPage", VbSet, avdoc.GetPDDoc.GetNumPages - 1
    CallByName pp, "pageHandling", VbSet, 6 'constants.handling.nUp
    CallByName pp, "nUpAutoRotate", VbSet, True '各シート内でページを自動回転
    CallByName pp, "nUpNumPagesH", VbSet, NumPagesH '1枚あたりのページ数(横)
    CallByName pp, "nUpNumPagesV", VbSet, NumPagesV '1枚あたりのページ数(縦)
    CallByName pp, "nUpPageOrder", VbSet, 0 'constants.nUpPageOrders.Horizontal:ページの順序(横)
    CallByName pp, "nUpPageBorder", VbSet, False 'ページ境界線を印刷(しない)
    CallByName pp, "interactive", VbSet, 2 'constants.interactionLevel.silent
    CallByName jso, "print", VbMethod, pp
    avdoc.Close 1 '文書を保存せずに閉じる
    app.Hide: app.Exit
  End If
End Sub

Private Sub RotatePdfPage(ByVal PdfFilePath As String, _
                          ByVal PageRotate As Integer)
'指定したPDFファイルを回転
  Dim app As Object
  Dim avdoc As Object
  Dim avpv As Object
  Dim i As Long
  Const PDSaveFull = 1
  
  Set app = CreateObject("AcroExch.App")
  Set avdoc = CreateObject("AcroExch.AVDoc")
  app.Show 'Acrobat表示
  If avdoc.Open(PdfFilePath, "") = True Then
    Set avpv = avdoc.GetAVPageView 'AcroAVPageView
    For i = 0 To avdoc.GetPDDoc.GetNumPages - 1
      CallByName avpv, "GoTo", VbMethod, i 'ページ移動
      avpv.GetPage.SetRotate PageRotate
    Next
    avdoc.GetPDDoc.Save PDSaveFull, PdfFilePath '上書き保存
    avdoc.Close 1 '文書を保存せずに閉じる
    app.Hide: app.Exit
  End If
End Sub

JSObject経由でgetPrintParamsメソッドを呼び出すことで、PDFファイルを印刷するプリンター(Adobe PDF)や1枚あたりのページ数を指定しています。

出力されたファイルは、用紙が縦向きになっているため、RotatePdfPageプロシージャーでページの回転を行い、正しい向きに修正しています。

実行結果

結果は下図の通りで、意図した通り縦向きのPDFファイル(B5)が横向きのPDFファイル(B4)になっています。

Acrobat_NUp_03

事前にプリンター設定を行う手間が掛かりますが、PDFファイルのNアップ処理の自動化を考えている方は試してみてください。

OneNote用Office アドインで画像やHTMLを挿入してみる。前のページ

2016年6月の人気記事次のページ

関連記事

  1. Office関連

    Office XP Developer Toolsでリボン対応のCOMアドインを作成する。

    「Visual Basic 6でリボン対応のアドインを作成する」ではV…

  2. Office関連

    「入門レベルでは決して足りない実務に必須のスキルとは ExcelVBA 実戦のための技術」レビュー

    久しぶりにVBA参考書籍のレビューです。今回は沢内晴彦氏が執筆され…

  3. Office関連

    セルの行数をカウントするWordマクロ

    「ソースコードを番号行付きのテーブルに変換するWordマクロ」を実行し…

  4. アイコン一覧

    Office 2013 アイコン一覧(J)

    ・Office 2013 アイコン一覧 NUM…

  5. Office関連

    「いちばんやさしいPowerPoint VBAの教本」レビュー

    「インストラクターのネタ帳」で有名な伊藤さんが執筆された書籍第二弾、「…

  6. Office アドイン

    Office 2016で進化したOffice アドイン

    今日OfficeDevを眺めていて気が付いたのが「OfficeJS S…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP