ホーム > カテゴリ > Excel・VBA >

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 CutPDF Lib "pdftool.dll" (ByVal PDF As Long, ByVal StartPos As Long, ByVal EndPos As Long, ByVal SaveFileName As String) As Long

PDFのバージョンを1.4形式に変更するChangePDFVersion()関数とPDFファイルの任意のページを抽出するvba_CutPDF()関数を「標準モジュール」に追記します。

' 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ファイルを抽出する
'  StartPos: 開始ページ
'  EndPos  : 終了ページ
'  戻り値  : 1:成功 -1:失敗
'  備考    : PDFのページ数はGetPDFPageCount()APIで取得可能。詳細は公式サイト参照。
'            ※PDFファイルはChangePDFVersion関数で1.4形式にする必要があります。
Public Function vba_CutPDF(ByVal PDF As String, ByVal StartPos As Long, ByVal EndPos As Long, ByVal SaveFileName As String) As Long
  Dim p As Long
  Dim tmp As String
  Dim Result As Long
  
  ' 拡張子をtmpに変換する
  tmp = Replace(PDF, ".pdf", ".tmp", compare:=vbTextCompare)
  
  ' 元のPDFファイルをコピーしてバージョンを1.4形式に変更する
  Call ChangePDFVersion(PDF, tmp)
  
  ' PDFファイルを読み込んでハンドルを取得する
  p = LoadPDF(tmp)
 
  ' PDFファイルのページを抽出する
  Result = CutPDF(p, StartPos, EndPos, SaveFileName)
 
  ' PDFファイルのハンドルを解放する
  FreePDF (p)
  
  ' テンポラリファイルを削除する
  Kill (tmp)
  
  vba_CutPDF = Result
End Function

イベント

ボタンを押すとPDFファイルの最初のページが抽出されます。

Private Sub CommandButton1_Click()
  ' カレントディレクトリをExcelファイルとpdftool.dllがある場所に変更
  ChDir ThisWorkbook.Path
  ' 最初の1ページを抽出する
  call vba_CutPDF("C:\対象.pdf", 1, 1, "C:\結果.pdf")
End Sub

注意事項

WindowsやエクセルのバージョンによってはCドライブ直下(c:¥test.pdfなど)のファイルはセキュリティ制限で操作できない場合があります。その場合はC:¥Users¥ユーザー名¥Desktop¥など他のフォルダのファイルを指定してください。

また、pdftool.dllは32bitで作成されていますので、32bitのエクセルを使用してください。64bitのエクセルだとpdftool.dllが読み込めずに「実行時エラー 48 ファイルが見つかりません」とエラーが発生します。

Q & A

Q1: 何故、PDFのバージョンを変更するのですか?

「pdftool.dll」は2003年に作成したDelphiのクラスライブラリを元に作成されています。当時は存在しないPDFのバージョンは読み込めないようにしています。

そのバージョンチェックの機能を回避する為にPDFのバージョンを1.4形式に変更しています。これによりMicrosoft Officeなどで作成されたPDFファイルが読み込めるようになります。

Q2: どのようなPDFファイルに対応していますか?

「Microsoft Office、OpenOffice、Chrome」などで作成されたPDFファイルです。形式で言いますとPDF1.4形式(ISO 19005-1など)に準拠しているファイルです。「PDFの純正ツール」で作成したPDF1.5形式以降のファイルは基本的に対応していません。但し、PDF1.5形式以降のファイルでも内部的にPDF1.4形式ならば読み込めます。

また、PDFファイルが暗号化されている場合は対応できませんのでご了承ください。

メモ

本格的に運用する場合はエラーチェックなどを入れてくださいね。

公式リンク

PDFDesigner Tools
http://papy.world.coocan.jp/pdftool/
PDFDesigner JavaScript version(オープンソース)
http://www.petitmonte.com/pdfdesigner/

両方とも私が作成しています^^;

エクセル講座のクイックリンク

ホーム 新機能 基本(初級) 基本(中級) 基本(上級) 関数 マクロ VBA TIPS





関連記事



公開日:2016年01月05日 最終更新日:2016年06月29日
記事NO:01684