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