Office関連

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

    64ビット環境かどうかを判別するVBAマクロ

    2年以上前にMicrosoft Community(当時はMicros…

  2. Office関連

    [Excel Services ECMAScript]jPrintAreaで埋め込んだブック部分のみ…

    jQuery + jPrintAreaを利用して、埋め込んだExcel…

  3. Office関連

    文書が互換モードかどうかを判定するWordマクロ

    古いバージョンのWordで作成された文書を開くと、タイトル バーに「互…

  4. Office関連

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

    Word文書内のソースコードを、他の文書と区別して目立たせたいときに役…

コメント

  • コメント (0)

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

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

Time limit is exhausted. Please reload CAPTCHA.

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

Translate

最近の記事

アーカイブ

PAGE TOP