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キーでステップ実行しながら動作確認出来ます。
  • 事前に参照設定もして下さい。
001 Option Explicit 002 003 Private Declare Function SHGetValue Lib "SHLWAPI.DLL" _ 004 Alias "SHGetValueA" _ 005 (ByVal hkey As Long, _ 006 ByVal pszSubKey As String, _ 007 ByVal pszValue As String, _ 008 pdwType As Long, _ 009 pvData As Any, _ 010 pcbData As Long) As Long 011 Private Declare Function SHSetValue Lib "SHLWAPI.DLL" _ 012 Alias "SHSetValueA" _ 013 (ByVal hkey As Long, _ 014 ByVal pszSubKey As String, _ 015 ByVal pszValue As String, _ 016 ByVal dwType As Long, _ 017 pvData As Any, _ 018 ByVal cbData As Long) As Long 019 Public Enum hKeyConstants 020 HKEY_CLASSES_ROOT = &H80000000 021 HKEY_CURRENT_USER = &H80000001 022 HKEY_LOCAL_MACHINE = &H80000002 023 HKEY_USERS = &H80000003 024 HKEY_PERFORMANCE_DATA = &H80000004 025 HKEY_CURRENT_CONFIG = &H80000005 026 HKEY_DYN_DATA = &H80000006 027 End Enum 028 ' DWORD型のタイプ 029 Public Enum RegTypeConstants 030 ' REG_NONE = (0) 031 REG_SZ = (1) 'NULL で終わる文字列 032 ' REG_EXPAND_SZ = (2) 033 ' REG_BINARY = (3) 034 REG_DWORD = (4) '32 ビット値 035 'リトルエンディアン形式の 32 ビット値 036 REG_DWORD_LITTLE_ENDIAN = (4) 037 ' REG_DWORD_BIG_ENDIAN = (5) 038 ' REG_LINK = (6) 039 ' REG_MULTI_SZ = (7) 040 ' REG_RESOURCE_LIST = (8) 041 End Enum 042 Private Const ERROR_SUCCESS As Long = 0 043 ' 044 ' レジストリの値を取得する。 045 ' 046 Public Function RegGetValue( _ 047 lnghInKey As hKeyConstants, _ 048 ByVal strSubKey As String, _ 049 ByVal strValName As String, _ 050 lngType As RegTypeConstants, _ 051 ByVal varDefault As Variant) As Variant 052 ' lngInKey : キー 053 ' strSubKey : サブキー 054 ' strValName : 値 055 ' lngType : データタイプ 056 ' lngDefault : デフォルトの値 057 ' 戻り値 : 対応する値 058 Dim varRetVal As Variant 059 Dim lnghSubKey As Long 060 Dim lngBuffer As Long 061 Dim strBuffer As String 062 Dim lngResult As Long 063 ' デフォルトの値を代入。 064 varRetVal = varDefault 065 Select Case lngType 066 Case REG_DWORD, REG_DWORD_LITTLE_ENDIAN 067 ' 何か値を入れておく。 068 lngBuffer = 0 069 lngResult = SHGetValue(lnghInKey, _ 070 strSubKey, _ 071 strValName, _ 072 REG_DWORD, _ 073 lngBuffer, _ 074 Len(lngBuffer)) 075 If lngResult = ERROR_SUCCESS Then 076 varRetVal = lngBuffer 077 End If 078 Case REG_SZ 079 ' バッファを確保する。 080 strBuffer = String(256, vbNullChar) 081 lngResult = SHGetValue(lnghInKey, _ 082 strSubKey, _ 083 strValName, _ 084 REG_SZ, _ 085 ByVal strBuffer, _ 086 Len(strBuffer)) 087 If lngResult = ERROR_SUCCESS Then 088 varRetVal = Left$(strBuffer, _ 089 InStr(strBuffer, vbNullChar) - 1) 090 End If 091 End Select 092 RegGetValue = varRetVal 093 End Function 094 ' 095 ' レジストリの値を取得する。 096 ' 097 Public Function RegSetValue( _ 098 lnghInKey As hKeyConstants, _ 099 ByVal strSubKey As String, _ 100 ByVal strValName As String, _ 101 lngType As RegTypeConstants, _ 102 ByVal varValue As Variant) As Boolean 103 ' lngInKey : キー 104 ' strSubKey : サブキー 105 ' strValName : 値 106 ' lngType : データタイプ 107 ' varValue : セットする値 108 ' 戻り値 : 成功すればTrue, 失敗するとFalse 109 Dim lnghSubKey As Long 110 Dim lngValue As Long 111 Dim strValue As String 112 Dim lngResult As Long 113 ' デフォルトの値を代入。 114 RegSetValue = False 115 Select Case lngType 116 Case REG_DWORD, REG_DWORD_LITTLE_ENDIAN 117 ' 値を入れておく。 118 lngValue = CLng(varValue) 119 lngResult = SHSetValue(lnghInKey, _ 120 strSubKey, _ 121 strValName, _ 122 REG_DWORD, _ 123 lngValue, _ 124 Len(lngValue)) 125 RegSetValue = (lngResult = ERROR_SUCCESS) 126 Case REG_SZ 127 ' バッファを確保する。 128 strValue = CStr(varValue) 129 ' 最後の引数は、Shift-JISで最後にNULLを 130 ' 含めたサイズでないと、Windows NTでは 131 ' 正しく書き込めない。 132 lngResult = SHSetValue(lnghInKey, _ 133 strSubKey, _ 134 strValName, _ 135 REG_SZ, _ 136 ByVal strValue, _ 137 CLng(LenB(StrConv(strValue, _ 138 vbFromUnicode)) + 1)) 139 RegSetValue = (lngResult = ERROR_SUCCESS) 140 End Select 141 End Function 142 143 Private Sub CommandButton21_Click() 144 Dim objAcroApp As Acrobat.AcroApp 145 Dim objAcroAVDoc As Acrobat.AcroAVDoc 146 Dim objAcroPDDoc As Acrobat.AcroPDDoc 147 Dim lRet As Long 148 Dim jso As Object 149 Dim old_REG_DWORD As Variant 150 151 Const CON_NO_FOLDER As Long = 1 '画像を別フォルダに保存しない 152 '動作しているAcrobatアプリケーションを 153 ' 一旦強制終了する。 154 Set objAcroApp = CreateObject("AcroExch.App") 155 '表示している全てのPDFファイルを閉じる 156 lRet = objAcroApp.CloseAllDocs 157 'Acrobatアプリケーションを終了する。 158 lRet = objAcroApp.Hide 159 lRet = objAcroApp.Exit 160 Set objAcroApp = Nothing 161 'レジストリの値を取得する。 <Acrobat 8> 162 old_REG_DWORD = RegGetValue(HKEY_CURRENT_USER, _ 163 "Software\Adobe\Adobe Acrobat\8.0" & _ 164 "\AVConversionFromPDF\cSettings\c1\cSettings", _ 165 "bUseCurrentFolder", _ 166 REG_DWORD, _ 167 0) 168 169 'レジストリの値を変更する。 170 '※画像も同じフォルダに保存する様に 171 ' Acrobatの設定を変更する。 172 lRet = RegSetValue(HKEY_CURRENT_USER, _ 173 "Software\Adobe\Adobe Acrobat\8.0" & _ 174 "\AVConversionFromPDF\cSettings\c1\cSettings", _ 175 "bUseCurrentFolder", _ 176 REG_DWORD, _ 177 CON_NO_FOLDER) 178 Set objAcroApp = CreateObject("AcroExch.App") 179 Set objAcroAVDoc = CreateObject("AcroExch.AVDoc") 180 181 '再度Acrobatアプリケーションを起動する。 182 lRet = objAcroApp.Show 183 'PDFファイルを開いて表示する。 184 lRet = objAcroAVDoc.Open("E:¥Test01.pdf", "") 185 'PDDocオブジェクトを取得する 186 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() 187 'JavaScriptオブジェクトを作成する。 188 Set jso = objAcroPDDoc.GetJSObject 189 'PDFファイルを[HTML 4.01]形式に変換して保存する。 190 jso.SaveAs "E:¥test-01.html", "com.adobe.acrobat.html-4-01-css-1-00" 191 192 'PDFファイルを閉じます。 193 lRet = objAcroAVDoc.Close(1) 194 'Acrobatアプリケーションを終了する。 195 lRet = objAcroApp.Hide 196 lRet = objAcroApp.Exit 197 Set objAcroAVDoc = Nothing 198 Set objAcroPDDoc = Nothing 199 Set objAcroApp = Nothing 200 201 'レジストリの値を元に戻す。 202 If old_REG_DWORD <> CON_NO_FOLDER Then 203 lRet = RegSetValue(HKEY_CURRENT_USER, _ 204 "Software\Adobe\Adobe Acrobat\8.0" & _ 205 "\AVConversionFromPDF\cSettings\c1\cSettings", _ 206 "bUseCurrentFolder", _ 207 REG_DWORD, _ 208 old_REG_DWORD) 209 End If 210 211 End Sub


 Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
 

補足

  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等) バージョン
コメントにサンプルコードを入れる時はコードを全て全角文字列にしてください。コチラで半角に戻します。それでもエラーが回避できない時はコメント下さい。個別に対処します。



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

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