ホーム > カテゴリ > 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


この記事を書いた人

💻 ITスキル・経験
サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。

画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ
プチモンテ代表、アーティスト名:プチモンテ
🎵 音楽制作
BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は叙情詩、叙情的な楽曲が多い。楽曲制作は2023年12月中旬 ~

オリジナル曲を始めました✨

YouTubeで各楽曲を公開しています🌈
https://www.youtube.com/@petitmonte

【男性ボーカル】DA・KA・RA | 新たな明日が風と共に訪れる

【男性、女性ボーカル】時空を超越する先に | 時空と風の交響曲

【女性、男性ボーカル】絆 | 穏やかな心に奏でる旋律