TOP > サンプル/関数 > 関数:「PDFのバージョン」を取得する [...]
概要
Acrobat OLE (IAC) には「PDF のバージョン」を取得する機能が見つかりません。
そこで「PDF のバージョン」を取得する当サイト作成のVBA ロジックを以下に紹介します。
お知らせ 以下のコマンドラインツールからでもPDFバージョンは取得できます。 ライセンス上の問題が無ければ、そちらの方をオススメします。 理由:機能的に上記の方が優れていますし、将来的な事を考えると色々な面で有利になると考えています。 ライセンスが難しい時は当ページの関数をお使いください。 |
機能
- PDF ファイルをテキスト扱いで読み込む。
VBA ロジック上ではバイナリーファイル扱いで読み込む。 - 先頭7バイトから「PDF のバージョン」に相当する文字列を取得する。
- 「PDF のバージョン」が「1.7(Acrobat 8.x):Acrobat 8 互換」以上の時は、
「Adobe Extension Level」が含まれているかも確認する。これで
「1.8 (Acrobat 9.x):Acrobat 9 互換」 又は
「1.9 (Acrobat 10.x):Acrobat X 互換」
の判断をする。
形式
[boolean] = Get_PDF_Version_nnn2(
string full file path ,
string sPDF_Version ,
long lAcrobat_Version )
引数
- 第一引数 ( string sFilePath ) :
PDF ファイルのフルパス - 第二引数 ( string sFilePath ) :
取得したPDF のバージョン
第一引数のPDF ファイルパスから、 以下の戻り値を返します。
戻り値 内容(PDFのバージョン) 戻り値が””の時はPDF ファイルでない %PDF-1.0 1.0 (Acrobat 1.x) : Acrobat 1 互換 %PDF-1.1 1.1 (Acrobat 2.x) : Acrobat 2 互換 %PDF-1.2 1.2 (Acrobat 3.x) : Acrobat 3 互換 %PDF-1.3 1.3 (Acrobat 4.x) : Acrobat 4 互換 %PDF-1.4 1.4 (Acrobat 5.x) : Acrobat 5 互換 %PDF-1.5 1.5 (Acrobat 6.x) : Acrobat 6 互換 %PDF-1.6 1.6 (Acrobat 7.x) : Acrobat 7 互換 %PDF-1.7 1.7 (Acrobat 8.x) : Acrobat 8 互換 %PDF-1.7L3 1.7,Adobe Extension Level 3 (Acrobat 9.x) :
Acrobat 9 互換%PDF-1.7L8 1.7,Adobe Extension Level 8 (Acrobat X) :
Acrobat X 互換
注意:Acrobat XI (11) も同様のPDF仕様の為 - 第三引数 ( long lAcrobat_Version ) :
取得したPDF のバージョンのAcrobat 互換の番号
1 ~ 10
但し、Acrobat XI (11) に関しては 10 を返します。
戻り値
- True : 正常処理
- False : 異常処理。第一引数のファイルがPDFで無い。
動作するバージョン
Microsoft Excel |
結果
|
備考
|
---|---|---|
2000
|
NO
| ※OS : Windows 98SE |
XP
|
OK
| ※Office XP [=2002] |
2003
|
OK
| Windows XP Pro (SP3 + WindowsUpdate) |
2007
|
OK
| Windows 7 64bit Home (SP1) |
2010
|
-
|
- OK : 正常処理する。
- NO : 正常に処理できない。
- - : 未確認。
VBAサンプル
Download:sample-GetPDFVersion.xls
001 Option Explicit
002
003 Sub Function_Test()
004
005 Dim bRet As Boolean
006 Dim sPDF_Version As String
007 Dim lAcrobat_No As Long
008
009 Const sFilePath = "D:¥work¥sample.pdf"
010
011 bRet = Get_PDF_Version_nnn2( _
012 sFilePath, sPDF_Version, lAcrobat_No)
013 Debug.Print "PDF Vertion(" & sPDF_Version & _
014 ") NO(" & lAcrobat_No & ") Ret(" & bRet & ")"
015
016 End Sub
017
018 '**************************************************
019 '
020 ' Get PDF Vertion for PDF file
021 '
022 ' Create : 2012/10/14
023 ' Update : 2012/10/16
024 ' Vertion : 1.1.0
025 '
026 ' 引数1 : sFilePath As String (IN)
027 ' PDFファイルのフルパス
028 ' 引数2 : sPDF_Version As String (OUT)
029 ' %PDF-1.0 : [Acrobat 1 互換]
030 ' %PDF-1.1 : [Acrobat 2 互換]
031 ' %PDF-1.2 : [Acrobat 3 互換]
032 ' %PDF-1.3 : [Acrobat 4 互換]
033 ' %PDF-1.4 : [Acrobat 5 互換]
034 ' %PDF-1.5 : [Acrobat 6 互換]
035 ' %PDF-1.6 : [Acrobat 7 互換]
036 ' %PDF-1.7 : [Acrobat 8 互換]
037 ' %PDF-1.7L3 :[Acrobat 9 互換]
038 ' %PDF-1.7L8 :[Acrobat X 互換]
039 ' %PDF-1.7L8 :[Acrobat XI 互換]
040 ' 引数3 : lAcrobat_Version As Long (OUT)
041 ' Acrobat 互換の番号 1~10
042 '
043 ' 戻り値 : True 正常処理
044 ' False エラー処理 PDFで無い
045 '
046 ' 備考 : PDFファイル先頭8バイトにPDFの
047 ' バージョン情報が入っている。
048 ' URL : https://pdf-file.nnn2.com/?p=760
049 ' その他 : 著作権等は主張しません。
050 ' 上記URLにコメントを頂けると嬉しいです。
051 '
052 '**************************************************
053
054 Public Function Get_PDF_Version_nnn2( _
055 ByVal sFilePath As String, _
056 ByRef sPDF_Version As String, _
057 ByRef lAcrobat_Version As Long) As Boolean
058
059 Dim lFileNO As Long
060 Dim sLine As String
061
062 Dim bLine() As Byte
063 ReDim bLine(7)
064
065 'ファイル番号の取得
066 lFileNO = FreeFile
067 'ファイルをバイナリーモードで開く
068 Open sFilePath For Binary Access Read As #lFileNO
069
070 'PDFファイルから先頭8バイトを読み込む
071 Get #lFileNO, , bLine
072
073 'Unicodeに変換
074 sLine = StrConv(bLine, vbUnicode)
075
076 'Check "PDF Vertion"
077 Select Case sLine
078 Case "%PDF-1.0"
079 sPDF_Version = sLine
080 Case "%PDF-1.1"
081 sPDF_Version = sLine
082 Case "%PDF-1.2"
083 sPDF_Version = sLine
084 Case "%PDF-1.3"
085 sPDF_Version = sLine
086 Case "%PDF-1.4"
087 sPDF_Version = sLine
088 Case "%PDF-1.5"
089 sPDF_Version = sLine
090 Case "%PDF-1.6"
091 sPDF_Version = sLine
092 Case "%PDF-1.7"
093 sPDF_Version = sLine
094 Case Else
095 'PDFファイルで無い
096 sPDF_Version = ""
097 lAcrobat_Version = 0
098 Get_PDF_Version_nnn2 = False
099 Exit Function
100 End Select
101
102 If sPDF_Version = "%PDF-1.7" Then
103 'Acrobat 9,X(10),XI(11) 互換をチェック
104
105 Dim iCnt As Long
106 Dim sLineA As String
107 Dim sLineWk As String
108 ReDim bLine(1000)
109 Const PDF_17L3 = "<</BaseVersion/1.7/ExtensionLevel 3>>"
110 Const PDF_17L8 = "<</BaseVersion/1.7/ExtensionLevel 8>>"
111 sLineA = ""
112 iCnt = 0
113
114 'EOFになるまでループ
115 Do Until EOF(lFileNO)
116 Get #lFileNO, , bLine
117
118 'Unicodeに変換
119 sLine = StrConv(bLine, vbUnicode)
120 sLineWk = sLineA & sLine
121 If InStr(sLineWk, PDF_17L3) > 0 Then
122 'Acrobat 9 互換と判定
123 sPDF_Version = _
124 sPDF_Version & "L3"
125 Exit Do
126 ElseIf InStr(sLineWk, PDF_17L8) > 0 Then
127 'Acrobat X(10),XI(11) 互換と判定
128 sPDF_Version = _
129 sPDF_Version & "L8"
130 Exit Do
131 End If
132 iCnt = iCnt + 1
133 If iCnt > 50 Then
134 'チェックを抜ける
135 '※高速処理する為
136 Exit Do
137 End If
138 sLineA = sLine
139 Loop
140 End If
141
142 'PDFファイルを閉じる
143 Close #lFileNO
144
145 'Acrobat互換の番号を出す
146 Select Case sPDF_Version
147 Case "%PDF-1.0"
148 lAcrobat_Version = 1
149 Case "%PDF-1.1"
150 lAcrobat_Version = 2
151 Case "%PDF-1.2"
152 lAcrobat_Version = 3
153 Case "%PDF-1.3"
154 lAcrobat_Version = 4
155 Case "%PDF-1.4"
156 lAcrobat_Version = 5
157 Case "%PDF-1.5"
158 lAcrobat_Version = 6
159 Case "%PDF-1.6"
160 lAcrobat_Version = 7
161 Case "%PDF-1.7"
162 lAcrobat_Version = 8
163 Case "%PDF-1.7L3"
164 lAcrobat_Version = 9
165 Case "%PDF-1.7L8"
166 lAcrobat_Version = 10
167 Case Else
168 lAcrobat_Version = 0
169 End Select
170
171 '正常終了
172 Get_PDF_Version_nnn2 = True
173
174 End Function
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
備考
- 「Acrobat Preference : avpPrefsVersion」でPDFバージョンを取得出来そうな気がするが、うまく動作しない。
- iCnt でループチェックしているのは、処理の高速化を狙いました。
- VBAからPDFファイルをテキスト読み込みするとEOFコードに相当する部分も読み込んで、最後までPDFファイルをテキスト読み込み出来ない。よってバイナリーモードで読み込んで、内部ロジックでテキストに変換した後に処理する様にした。
- <</AcroForm 22 0 R/Extensions<</ADBE<</BaseVersion/1.7/ExtensionLevel 3>>>>
<</AcroForm 22 0 R/Extensions<</ADBE<</BaseVersion/1.7/ExtensionLevel 8>>>>
Level のチェックは上記がベストと考えるが、PDF仕様でのチェックに時間が掛かるので、最小限度とする。 - Acrobat 9 互換の時は「PDF のバージョン」は
「1.7,Adobe Extension Level 3 (Acrobat 9.x) 」となる。 - Acrobat X 互換の時は「PDF のバージョン」は
「1.7,Adobe Extension Level 8 (Acrobat X) 」となる。 - Acrobat XI (11) [2012年10月15日 version 11.0 試用DL版] で作成したPDFは、
Acrobat X (10) と同様のPDFバージョン
「1.7,Adobe Extension Level 8 (Acrobat X) 」です。 ※テスト結果 - Open ステートメントはファイルが存在しない時はエラーにならず、
GET ステートメントで0バイトのEOFが返される。 - PDFバージョンを取得する Acrobat API としては、PDDocGetVersion() が用意されています。
OLE (IAC) からは当API は呼び出せません。 - 「PDF のバージョンとは」も参照。
- 厳密に
「1.7,Adobe Extension Level 3 (Acrobat 9.x):Acrobat 9 互換」 又は
「1.7,Adobe Extension Level 3 (Acrobat 10.x):Acrobat X,XI 互換」
の判断が出来るまでは検証していません。 - 「PDF のバージョン」が 「1.0」、「1.1」、「1.2」 のPDF ファイルの入手が出来なかったので、そのバージョンに関しては未テストです。
- 「手書きPDF入門」 を ヒント にさせて頂きました。 m(_._)m
動作確認環境
- Windows 98SE (WindowsUpdate) + Excel 2000 (SP3)
- Windows XP Pro (SP3 + WindowsUpdate) + Excel XP (SP3)
- Windows XP Pro (SP3 + WindowsUpdate) + Excel 2003 (SP3)
- Windows 7 64bit Home (SP1 + MicrosoftUpdate) + Excel 2007 (SP3)
< サンプル一覧 >