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
補足
- 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
< サンプル一覧 >