PDFをHTMLに変換する方法(Excel VBAサンプル/4)

TOP > サンプル / 関数 > *      [...]


Method of conversion from PDF to HTML.

 

説明

Acrobat PDF を HTML(4.01) に変換します。

ここのサンプルは「PDFをHTMLに変換する方法(Excel VBAサンプル/3)」と基本的には同じです。

それに「Acrobatへのレジストリ操作」コードを追加して、HTMLと同じフォルダに画像ファイルも保存する様にしたものです。

 

サンプル:ExcelのVBA

 

  • F8キーでステップ実行しながら動作確認出来ます。
  • 事前に参照設定もして下さい。

 

Option Explicit

Private Declare Function SHGetValue Lib "SHLWAPI.DLL" _
                    Alias "SHGetValueA" _
                        (ByVal hkey As Long, _
                         ByVal pszSubKey As String, _
                         ByVal pszValue As String, _
                         pdwType As Long, _
                         pvData As Any, _
                         pcbData As Long) As Long
Private Declare Function SHSetValue Lib "SHLWAPI.DLL" _
                    Alias "SHSetValueA" _
                        (ByVal hkey As Long, _
                         ByVal pszSubKey As String, _
                         ByVal pszValue As String, _
                         ByVal dwType As Long, _
                         pvData As Any, _
                         ByVal cbData As Long) As Long
Public Enum hKeyConstants
    HKEY_CLASSES_ROOT = &H80000000
    HKEY_CURRENT_USER = &H80000001
    HKEY_LOCAL_MACHINE = &H80000002
    HKEY_USERS = &H80000003
    HKEY_PERFORMANCE_DATA = &H80000004
    HKEY_CURRENT_CONFIG = &H80000005
    HKEY_DYN_DATA = &H80000006
End Enum
' DWORD型のタイプ
Public Enum RegTypeConstants
'    REG_NONE = (0)
    REG_SZ = (1)    'NULL で終わる文字列
'    REG_EXPAND_SZ = (2)
'    REG_BINARY = (3)
    REG_DWORD = (4) '32 ビット値
    'リトルエンディアン形式の 32 ビット値
    REG_DWORD_LITTLE_ENDIAN = (4)
'    REG_DWORD_BIG_ENDIAN = (5)
'    REG_LINK = (6)
'    REG_MULTI_SZ = (7)
'    REG_RESOURCE_LIST = (8)
End Enum
Private Const ERROR_SUCCESS     As Long = 0
'
' レジストリの値を取得する。
'
Public Function RegGetValue( _
                    lnghInKey As hKeyConstants, _
                    ByVal strSubKey As String, _
                    ByVal strValName As String, _
                    lngType As RegTypeConstants, _
                    ByVal varDefault As Variant) As Variant
    ' lngInKey   : キー
    ' strSubKey  : サブキー
    ' strValName : 値
    ' lngType    : データタイプ
    ' lngDefault : デフォルトの値
    ' 戻り値     : 対応する値
    Dim varRetVal           As Variant
    Dim lnghSubKey          As Long
    Dim lngBuffer           As Long
    Dim strBuffer           As String
    Dim lngResult           As Long
    ' デフォルトの値を代入。
    varRetVal = varDefault
    Select Case lngType
        Case REG_DWORD, REG_DWORD_LITTLE_ENDIAN
            ' 何か値を入れておく。
            lngBuffer = 0
            lngResult = SHGetValue(lnghInKey, _
                                   strSubKey, _
                                   strValName, _
                                   REG_DWORD, _
                                   lngBuffer, _
                                   Len(lngBuffer))
            If lngResult = ERROR_SUCCESS Then
                varRetVal = lngBuffer
            End If
        Case REG_SZ
            ' バッファを確保する。
            strBuffer = String(256, vbNullChar)
            lngResult = SHGetValue(lnghInKey, _
                                   strSubKey, _
                                   strValName, _
                                   REG_SZ, _
                                   ByVal strBuffer, _
                                   Len(strBuffer))
            If lngResult = ERROR_SUCCESS Then
                varRetVal = Left$(strBuffer, _
                    InStr(strBuffer, vbNullChar) - 1)
            End If
    End Select
    RegGetValue = varRetVal
End Function
'
' レジストリの値を取得する。
'
Public Function RegSetValue( _
                    lnghInKey As hKeyConstants, _
                    ByVal strSubKey As String, _
                    ByVal strValName As String, _
                    lngType As RegTypeConstants, _
                    ByVal varValue As Variant) As Boolean
    ' lngInKey   : キー
    ' strSubKey  : サブキー
    ' strValName : 値
    ' lngType    : データタイプ
    ' varValue   : セットする値
    ' 戻り値     : 成功すればTrue, 失敗するとFalse
    Dim lnghSubKey          As Long
    Dim lngValue            As Long
    Dim strValue            As String
    Dim lngResult           As Long
    ' デフォルトの値を代入。
    RegSetValue = False
    Select Case lngType
        Case REG_DWORD, REG_DWORD_LITTLE_ENDIAN
            ' 値を入れておく。
            lngValue = CLng(varValue)
            lngResult = SHSetValue(lnghInKey, _
                                   strSubKey, _
                                   strValName, _
                                   REG_DWORD, _
                                   lngValue, _
                                   Len(lngValue))
            RegSetValue = (lngResult = ERROR_SUCCESS)
        Case REG_SZ
            ' バッファを確保する。
            strValue = CStr(varValue)
            ' 最後の引数は、Shift-JISで最後にNULLを
            ' 含めたサイズでないと、Windows NTでは
            ' 正しく書き込めない。
            lngResult = SHSetValue(lnghInKey, _
                                   strSubKey, _
                                   strValName, _
                                   REG_SZ, _
                                   ByVal strValue, _
                                   CLng(LenB(StrConv(strValue, _
                                        vbFromUnicode)) + 1))
            RegSetValue = (lngResult = ERROR_SUCCESS)
    End Select
End Function

Private Sub CommandButton21_Click()
    Dim objAcroApp      As Acrobat.AcroApp
    Dim objAcroAVDoc    As Acrobat.AcroAVDoc
    Dim objAcroPDDoc    As Acrobat.AcroPDDoc
    Dim lRet            As Long
    Dim jso             As Object
    Dim old_REG_DWORD   As Variant
     
    Const CON_NO_FOLDER As Long = 1 '画像を別フォルダに保存しない
    '動作しているAcrobatアプリケーションを
    ' 一旦強制終了する。
    Set objAcroApp = CreateObject("AcroExch.App")
    '表示している全てのPDFファイルを閉じる
    lRet = objAcroApp.CloseAllDocs
    'Acrobatアプリケーションを終了する。
    lRet = objAcroApp.Hide
    lRet = objAcroApp.Exit
    Set objAcroApp = Nothing
    'レジストリの値を取得する。 <Acrobat 8>
    old_REG_DWORD = RegGetValue(HKEY_CURRENT_USER, _
           "Software\Adobe\Adobe Acrobat\8.0" & _
           "\AVConversionFromPDF\cSettings\c1\cSettings", _
           "bUseCurrentFolder", _
           REG_DWORD, _
           0)
     
    'レジストリの値を変更する。
    '※画像も同じフォルダに保存する様に
    '  Acrobatの設定を変更する。
    lRet = RegSetValue(HKEY_CURRENT_USER, _
           "Software\Adobe\Adobe Acrobat\8.0" & _
           "\AVConversionFromPDF\cSettings\c1\cSettings", _
           "bUseCurrentFolder", _
           REG_DWORD, _
           CON_NO_FOLDER)
    Set objAcroApp = CreateObject("AcroExch.App")
    Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")
     
    '再度Acrobatアプリケーションを起動する。
    lRet = objAcroApp.Show
    'PDFファイルを開いて表示する。
    lRet = objAcroAVDoc.Open("E:¥Test01.pdf", "")
    'PDDocオブジェクトを取得する
    Set objAcroPDDoc = objAcroAVDoc.GetPDDoc()
    'JavaScriptオブジェクトを作成する。
    Set jso = objAcroPDDoc.GetJSObject
    'PDFファイルを[HTML 4.01]形式に変換して保存する。
    jso.SaveAs "E:¥test-01.html", "com.adobe.acrobat.html-4-01-css-1-00"

    'PDFファイルを閉じます。
    lRet = objAcroAVDoc.Close(1)
    'Acrobatアプリケーションを終了する。
    lRet = objAcroApp.Hide
    lRet = objAcroApp.Exit
    Set objAcroAVDoc = Nothing
    Set objAcroPDDoc = Nothing
    Set objAcroApp = Nothing
     
    'レジストリの値を元に戻す。
    If old_REG_DWORD <> CON_NO_FOLDER Then
        lRet = RegSetValue(HKEY_CURRENT_USER, _
               "Software\Adobe\Adobe Acrobat\8.0" & _
               "\AVConversionFromPDF\cSettings\c1\cSettings", _
               "bUseCurrentFolder", _
               REG_DWORD, _
               old_REG_DWORD)
    End If
     
End Sub

 





 

補足

  1. Acrobat Readerでは出来ません。
    Acrobat本体がデフォルトでインストールされているパソコン環境だけです。
     
  2. Acrobatオブジェクトを NEW を使わないで宣言しています。
    Acrobat本体のプロセスをメモリ上から完全に消す為に、CreateObject でオブジェクトを生成するようにしています。
    AcrobatプロセスはPDFが全て閉じられて、そして「Set objAcroApp = Nothing」ステートメントを実行した時にメモリ上から無くなります。
     
  3. Acrobatが起動している時にレジストリに変更を加えても意味が無いので、仮にAcrobatが起動されていると想定して、CloseAllDocsメソッドを使って全てのPDFファイルを閉じます。
    そしてAcrobatを強制終了させます。
    PDFファイルを閉じないでAcrobatを強制終了してもプロセスが残るのでレジストリを変更してもAcrobatがレジストリの内容を見てくれません。
    必ず、開いているPDFファイルがあれば全て閉じてAcrobatを終了させる必要があります。
     
  4. レジストリ操作ロジックは、以下のサイトのコードを使用させて頂きました。
    「新山(へろば)のホームページ」の「Visual Basic Tips」より。
    http://www31.ocn.ne.jp/~heropa/
    この場を借りて感謝します。m(_ _)m
     
  5. 上記サンプルでは objAcroApp.Show でAcrobatアプリ本体を起動表示しています。
    これはjso.SaveAs メソッドを連続で行うときに発生する不可解なエラー回避策です。
    高速化したいのならば objAcroApp.CloseAllDocs に置き換えて下さい。
     
  6. 当サンプルよりも以下の関数を利用してのHTML変換も検討ください。
    関数:PDFを特定のフォーマットに変換する」 
    当ページのサンプルよりも安全にHTML変換が可能になります。
     
  7. PDFをHTMLへ変換する上でのイメージファイルを扱う注意事項」も参照
     

 

注意

 

  1. Acrobat SDK 8.1 に書かれているSaveAsメソッドの第2引数の説明が一部間違っています。
    以下が正解です。
    SDK:com.adobe.Acrobat.html-4-01-css-1-00 ※間違い
    正解:com.adobe.acrobat.html-4-01-css-1-00 ※「a」1文字違う
    この情報は、"C:¥Program Files¥Adobe¥Acrobat 8.0¥Acrobat¥ExportTask.xml"ファイルに入っている内容から当サイト管理者が勝手に判断したものです。
    この「ExportTask.xml」ファイルに関する説明はAcrobat SDKにはありません。
     
  2. 当サイト作成「Acrobat SDK:正誤表」も参考にして下さい。
     
  3. OSがインストールされているC:ドライブへの保存は出来ません
    詳細は、「Acrobat JavaScript における「Safe Path」についての注意事項」を参照。
     

 

動作確認環境

  • WindowsXP Pro + SP3 +
    Acrobat 8.1.6 Pro + Office 2003 + フルMicrosoftUpdate

 

サンプル一覧

コメントを残す

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

CAPTCHA


出来るだけ早く返答する様には心がけています。
が、遅くなる時もありますのでご了承ください。


SAMURAI Plugin

コメントをする時は最低でも以下をお願いします。

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン