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

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


概要

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

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

※当ページでは紹介機能を関数(Get_PDF_Version_nnn2)として紹介します。

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サンプル

 

Option Explicit

Sub Function_Test()

    Dim bRet            As Boolean
    Dim sPDF_Version    As String
    Dim lAcrobat_No     As Long

    Const sFilePath = "D:¥work¥sample.pdf"
    
    bRet = Get_PDF_Version_nnn2( _
        sFilePath, sPDF_Version, lAcrobat_No)
    Debug.Print "PDF Vertion(" & sPDF_Version & _
        ") NO(" & lAcrobat_No & ") Ret(" & bRet & ")"

End Sub

'**************************************************
'
' Get PDF Vertion for PDF file

'
' Create  : 2012/10/14
' Update  : 2012/10/16
' Vertion : 1.1.0
'
' 引数1   : sFilePath As String (IN)
'           PDFファイルのフルパス
' 引数2   : sPDF_Version As String (OUT)
'           %PDF-1.0 : [Acrobat 1 互換]
'           %PDF-1.1 : [Acrobat 2 互換]
'           %PDF-1.2 : [Acrobat 3 互換]
'           %PDF-1.3 : [Acrobat 4 互換]
'           %PDF-1.4 : [Acrobat 5 互換]
'           %PDF-1.5 : [Acrobat 6 互換]
'           %PDF-1.6 : [Acrobat 7 互換]
'           %PDF-1.7 : [Acrobat 8 互換]
'           %PDF-1.7L3 :[Acrobat 9 互換]
'           %PDF-1.7L8 :[Acrobat X 互換]
'           %PDF-1.7L8 :[Acrobat XI 互換]
' 引数3   : lAcrobat_Version As Long (OUT)
'           Acrobat 互換の番号 1~10
'
' 戻り値  : True  正常処理
'           False エラー処理 PDFで無い
'
' 備考    : PDFファイル先頭8バイトにPDFの
'           バージョン情報が入っている。
' URL     : http://pdf-file.nnn2.com/?p=760
' その他  : 著作権等は主張しません。
'           上記URLにコメントを頂けると嬉しいです。
'
'**************************************************

Public Function Get_PDF_Version_nnn2( _
        ByVal sFilePath As String, _
        ByRef sPDF_Version As String, _
        ByRef lAcrobat_Version As Long) As Boolean
        
    Dim lFileNO   As Long
    Dim sLine     As String
    
    Dim bLine()   As Byte
    ReDim bLine(7)
    
    'ファイル番号の取得
    lFileNO = FreeFile
    'ファイルをバイナリーモードで開く
    Open sFilePath For Binary Access Read As #lFileNO
    
    'PDFファイルから先頭8バイトを読み込む
    Get #lFileNO, , bLine
    
    'Unicodeに変換
    sLine = StrConv(bLine, vbUnicode)
    
    'Check "PDF Vertion"
    Select Case sLine
    Case "%PDF-1.0"
        sPDF_Version = sLine
    Case "%PDF-1.1"
        sPDF_Version = sLine
    Case "%PDF-1.2"
        sPDF_Version = sLine
    Case "%PDF-1.3"
        sPDF_Version = sLine
    Case "%PDF-1.4"
        sPDF_Version = sLine
    Case "%PDF-1.5"
        sPDF_Version = sLine
    Case "%PDF-1.6"
        sPDF_Version = sLine
    Case "%PDF-1.7"
        sPDF_Version = sLine
    Case Else
        'PDFファイルで無い
        sPDF_Version = ""
        lAcrobat_Version = 0
        Get_PDF_Version_nnn2 = False
        Exit Function
    End Select
    
    If sPDF_Version = "%PDF-1.7" Then
        'Acrobat 9,X(10),XI(11) 互換をチェック
        
        Dim iCnt        As Long
        Dim sLineA      As String
        Dim sLineWk     As String
        ReDim bLine(1000)
        Const PDF_17L3 = "<</BaseVersion/1.7/ExtensionLevel 3>>"
        Const PDF_17L8 = "<</BaseVersion/1.7/ExtensionLevel 8>>"
        sLineA = ""
        iCnt = 0
        
        'EOFになるまでループ
        Do Until EOF(lFileNO)
            Get #lFileNO, , bLine
            
            'Unicodeに変換
            sLine = StrConv(bLine, vbUnicode)
            sLineWk = sLineA & sLine
            If InStr(sLineWk, PDF_17L3) > 0 Then
                'Acrobat 9 互換と判定
                sPDF_Version = _
                sPDF_Version & "L3"
                Exit Do
            ElseIf InStr(sLineWk, PDF_17L8) > 0 Then
                'Acrobat X(10),XI(11) 互換と判定
                sPDF_Version = _
                sPDF_Version & "L8"
                Exit Do
            End If
            iCnt = iCnt + 1
            If iCnt > 50 Then
                'チェックを抜ける
                '※高速処理する為
                Exit Do
            End If
            sLineA = sLine
        Loop
    End If

    'PDFファイルを閉じる
    Close #lFileNO

    'Acrobat互換の番号を出す
    Select Case sPDF_Version
    Case "%PDF-1.0"
        lAcrobat_Version = 1
    Case "%PDF-1.1"
        lAcrobat_Version = 2
    Case "%PDF-1.2"
        lAcrobat_Version = 3
    Case "%PDF-1.3"
        lAcrobat_Version = 4
    Case "%PDF-1.4"
        lAcrobat_Version = 5
    Case "%PDF-1.5"
        lAcrobat_Version = 6
    Case "%PDF-1.6"
        lAcrobat_Version = 7
    Case "%PDF-1.7"
        lAcrobat_Version = 8
    Case "%PDF-1.7L3"
        lAcrobat_Version = 9
    Case "%PDF-1.7L8"
        lAcrobat_Version = 10
    Case Else
        lAcrobat_Version = 0 
    End Select
    
    '正常終了
    Get_PDF_Version_nnn2 = True
    
End Function

 

 

備考

  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