VBAで、B5サイズのPDFファイルを横並びにしてB4サイズのPDFファイルにするにはどうすれば良いか?という質問をいただきました。
この手の処理はよくあることで、手作業で行う場合は下記ページのような処理になります。
・【解決事例】Acrobat XI Pro「縦向きのA4サイズのPDFの各ページを横に並べて結合し、A3サイズでプリントしたい」
https://forums.adobe.com/thread/1615335
いわゆるNアップ印刷ですね。
VBA(Acrobatオートメーション、Acrobat JavaScript)からでももちろん処理できますが、事前処理が必要になります。
(下記事前処理の自動化もできないことはないのですが、面倒なので割愛します。)
事前処理
※ 下記設定は縦向きのB5サイズのファイルを横に並べてB4サイズで出力することを想定しています。必要に応じて設定内容を変更してください。
- 「Adobe PDF」プリンターのプロパティ(基本設定)を開きます。
- 「Adobe PDF 設定」タブの各項目を設定します。
- 「レイアウト」タブから「印刷の向き(O)」を「横」に設定します。
- 「OK」ボタンをクリックして設定を反映、画面を閉じます。
・Adobe PDF 保存先フォルダー(F):C:\Test\PDF
・Adobe PDF のページサイズ(Z):B4
・結果の Adobe PDF を表示(V):オフ
・既存の PDF ファイルの上書きを確認(R):オフ
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)になっています。
事前にプリンター設定を行う手間が掛かりますが、PDFファイルのNアップ処理の自動化を考えている方は試してみてください。
この記事へのコメントはありません。