VBAでPDFファイルを結合する[ExcelのTIPS]
VBAでPDFファイルを結合する方法です。変換処理には個人・法人問わず利用、再配布可能な「PDFDesigner Tools」(無料)を使用します。
エクセル以外にもワード、パワーポイントなどでも使用可能です。
PDFDesigner Toolsのダウンロード
最初に「PDFDesigner Tools」をダウンロードします。
PDFDesigner Tools
http://papy.world.coocan.jp/pdftool/
左上にある「pdftool.zip」をダウンロードして展開すると「pdftool.dll」が作成されます。
PDFファイルを結合する
エクセルを起動して「マクロ有効ファイル」をデスクトップなどに作成します。そのマクロ有効ファイルと同じフォルダに「pdftool.dll」を移動します。
標準モジュール
次にVBAで「標準モジュール」を追加して「pdftool.dll」のAPIを宣言します。
' PDFDesigner Tools API Public Declare Function LoadPDF Lib "pdftool.dll" (ByVal OpenFileName As String) As Long Public Declare Sub FreePDF Lib "pdftool.dll" (ByVal PDF As Long) Public Declare Function CombinePDF Lib "pdftool.dll" (ByVal PDF1 As Long, ByVal PDF2 As Long, ByVal SaveFileName As String) As Long
PDFのバージョンを1.4形式に変更するChangePDFVersion()関数とPDFファイルを結合するvba_CombinePDF()関数を「標準モジュール」に追記します。
' PDFのバージョンを1.4形式にする(コピーしたファイルを編集) Public Sub ChangePDFVersion(ByVal OpenFileName As String, ByVal SaveFileName As String) Dim Stream() As Byte ' ストリーム Dim FileNo As Integer ' ファイルNO ' ファイルを読み込む FileNo = FreeFile ReDim Stream(FileLen(OpenFileName) - 1) Open OpenFileName For Binary As #FileNo Get #FileNo, , Stream Close #FileNo ' PDFの形式を1.4にする Stream(5) = "&H31": Stream(7) = "&H34" ' ファイルの出力 FileNo = FreeFile Open SaveFileName For Binary Access Write As #FileNo Put #FileNo, , Stream Close #FileNo End Sub ' PDFファイルを結合する ' 戻り値: 1:成功 -1:失敗 Public Function vba_CombinePDF(ByVal PDF1 As String, ByVal PDF2 As String, ByVal SaveFileName As String) As Long Dim p1, p2 As Long Dim tmp1, tmp2 As String Dim Result As Long ' 拡張子をtmpに変換する tmp1 = Replace(PDF1, ".pdf", ".tmp", compare:=vbTextCompare) tmp2 = Replace(PDF2, ".pdf", ".tmp", compare:=vbTextCompare) ' 元のPDFファイルをコピーしてバージョンを1.4形式に変更する Call ChangePDFVersion(PDF1, tmp1) Call ChangePDFVersion(PDF2, tmp2) ' PDFファイルを読み込んでハンドルを取得する p1 = LoadPDF(tmp1) p2 = LoadPDF(tmp2) ' PDFファイルを結合する Result = CombinePDF(p1, p2, SaveFileName) ' PDFファイルのハンドルを解放する FreePDF (p1) FreePDF (p2) ' テンポラリファイルを削除する Kill (tmp1) Kill (tmp2) vba_CombinePDF = Result End Function
イベント
ボタンを押すとPDFファイルが結合されます。
Private Sub CommandButton1_Click() ' カレントディレクトリをExcelファイルとpdftool.dllがある場所に変更 ChDir ThisWorkbook.Path ' PDFファイルを結合する call vba_CombinePDF("C:\結合元1.pdf","C:\結合元2.pdf","C:\結果.pdf") End Sub
注意事項
WindowsやエクセルのバージョンによってはCドライブ直下(c:¥test.pdfなど)のファイルはセキュリティ制限で操作できない場合があります。その場合はC:¥Users¥ユーザー名¥Desktop¥など他のフォルダのファイルを指定してください。
また、pdftool.dllは32bitで作成されていますので、32bitのエクセルを使用してください。64bitのエクセルだとpdftool.dllが読み込めずに「実行時エラー 48 ファイルが見つかりません」とエラーが発生します。
Q & A
Q1: 何故、PDFのバージョンを変更するのですか?
そのバージョンチェックの機能を回避する為にPDFのバージョンを1.4形式に変更しています。これによりMicrosoft Officeなどで作成されたPDFファイルが読み込めるようになります。
Q2: どのようなPDFファイルに対応していますか?
また、PDFファイルが暗号化されている場合は対応できませんのでご了承ください。
メモ
本格的に運用する場合はエラーチェックなどを入れてくださいね。
公式リンク
PDFDesigner Tools
http://papy.world.coocan.jp/pdftool/
PDFDesigner JavaScript version(オープンソース)
http://www.petitmonte.com/pdfdesigner/
両方とも私が作成しています^^;