関数:「PDFのバージョン」を取得する

TOP > サンプル/関数 > 関数:「PDFのバージョン」を取得する      [...]


概要

Acrobat OLE (IAC) には「PDF のバージョン」を取得する機能が見つかりません。

そこで「PDF のバージョン」を取得する当サイト作成のVBA ロジックを以下に紹介します。

PDFのプロパティ画面
お知らせ
以下のコマンドラインツールからでもPDFバージョンは取得できます。
ライセンス上の問題が無ければ、そちらの方をオススメします。 理由:機能的に上記の方が優れていますし、将来的な事を考えると色々な面で有利になると考えています。
ライセンスが難しい時は当ページの関数をお使いください。

 

機能

  1. PDF ファイルをテキスト扱いで読み込む。
    VBA ロジック上ではバイナリーファイル扱いで読み込む。
  2. 先頭7バイトから「PDF のバージョン」に相当する文字列を取得する。
  3. 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 )

 

引数

  1. 第一引数 ( string sFilePath ) :
    PDF ファイルのフルパス
  2. 第二引数 ( 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仕様の為
  3. 第三引数 ( long lAcrobat_Version ) :
    取得したPDF のバージョンのAcrobat 互換の番号
    1 ~ 10
    但し、Acrobat XI (11) に関しては 10 を返します。

 

戻り値

  1. True : 正常処理
  2. 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サンプル

Downloadsample-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 : http://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編)
 

備考

  1. Acrobat Preference : avpPrefsVersion」でPDFバージョンを取得出来そうな気がするが、うまく動作しない。
  2. iCnt でループチェックしているのは、処理の高速化を狙いました。
  3. VBAからPDFファイルをテキスト読み込みするとEOFコードに相当する部分も読み込んで、最後までPDFファイルをテキスト読み込み出来ない。よってバイナリーモードで読み込んで、内部ロジックでテキストに変換した後に処理する様にした。
  4. <</AcroForm 22 0 R/Extensions<</ADBE<</BaseVersion/1.7/ExtensionLevel 3>>>>
    <</AcroForm 22 0 R/Extensions<</ADBE<</BaseVersion/1.7/ExtensionLevel 8>>>>
    Level のチェックは上記がベストと考えるが、PDF仕様でのチェックに時間が掛かるので、最小限度とする。
  5. Acrobat 9 互換の時は「PDF のバージョン」は
    「1.7,Adobe Extension Level 3 (Acrobat 9.x) 」となる。
  6. Acrobat X 互換の時は「PDF のバージョン」は
    「1.7,Adobe Extension Level 8 (Acrobat X) 」となる。
  7. Acrobat XI (11) [2012年10月15日 version 11.0 試用DL版] で作成したPDFは、
    Acrobat X (10) と同様のPDFバージョン
    「1.7,Adobe Extension Level 8 (Acrobat X) 」です。 ※テスト結果
  8. Open ステートメントはファイルが存在しない時はエラーにならず、
    GET ステートメントで0バイトのEOFが返される。
  9. PDFバージョンを取得する Acrobat API としては、PDDocGetVersion() が用意されています。
    OLE (IAC) からは当API は呼び出せません。
  10. PDF のバージョンとは」も参照。
  11. 厳密に
    「1.7,Adobe Extension Level 3 (Acrobat 9.x):Acrobat 9 互換」 又は
    「1.7,Adobe Extension Level 3 (Acrobat 10.x):Acrobat X,XI 互換」
    の判断が出来るまでは検証していません。
  12. PDF のバージョン」が 「1.0」、「1.1」、「1.2」 のPDF ファイルの入手が出来なかったので、そのバージョンに関しては未テストです。
  13. 手書き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)

サンプル一覧

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


★ 文章での質問は難しいですよネ。でも、早く解決して、家に帰りたい。


SAMURAI Plugin

コメントをする時は出来れば以下もお願いします。

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン
コメントにサンプルコードを入れる時はコードを全て全角文字列にしてください。コチラで半角に戻します。それでもエラーが回避できない時はコメント下さい。個別に対処します。



お仕事で当サイトを見ている方へ
考え込んだら、ご質問下さい。
一緒に解決策を考えましょう。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください