はじめに
仕事でPDFファイルを扱うことは多々あります。
ですが、AcrobatReaderのみの環境でVBAから参照可能なAcroPDFではPDFファイルのページ数は取得できません。
目的
VBAでPDFのページ数を調べたい。
処理フロー
1、PDFファイルをADODB.Streamからテキストファイルとして読み込み
2、読み込んだソースコードから「/Count n」を探す
3、nを数値に変換(=総ページ数)
**サンプルコード**
Function getPDFPageCount(ByVal path As String) As Long
On Error GoTo Error1
Dim PDFSourceText As String
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile path
PDFSourceText = .ReadText
.Close
End With
Dim RegExpMatchCollection As Object
Dim RegExpMatch As Object
With CreateObject("VBScript.RegExp")
.Pattern = "(/Count )\d*"
.MultiLine = True
Set RegExpMatchCollection = .Execute(PDFSourceText)
Set RegExpMatch = RegExpMatchCollection.Item(0)
getPDFPageCount = CLng(Val(Mid(RegExpMatch.value, 8)))
End With
Exit Function
Error1:
getPDFPageCount = CLng(-1)
End Function
解説
PDFファイルの構造上、「/Count 」はソーステキストに1回しか出現しないこと、通常表示される文字列はStreamオブジェクト内に圧縮されているため正規表現にマッチしないことからページ数の抜き出しが可能となっています。
補足
「/Count 」の他にも構文解析で読み取れる情報はありそう。
「/Mediabox 」で用紙サイズとか。
最後に
ファイルのページ数は結構使い道があるだけにAcroPDFで参照できない(させない)のも納得。