VBAでPDFファイルをテキストに変換する[ExcelのTIPS]
VBAでPDFファイルをテキストに変換する方法です。変換処理には個人・法人問わず利用、再配布可能な「PDFDesigner Tools」(無料)を使用します。
エクセル以外にもワード、パワーポイントなどでも使用可能です。
PDFDesigner Toolsのダウンロード
最初に「PDFDesigner Tools」をダウンロードします。
PDFDesigner Tools
http://papy.world.coocan.jp/pdftool/
左上にある「pdftool.zip」をダウンロードして展開すると「pdftool.dll」が作成されます。
PDFファイルのテキストを取得する
エクセルを起動して「マクロ有効ファイル」をデスクトップなどに作成します。そのマクロ有効ファイルと同じフォルダに「pdftool.dll」を移動します。
標準モジュール
次にVBAで「標準モジュール」を追加して「pdftool.dll」のAPIを宣言します。
' PDFDesigner Tools API Public Declare Function GetPDFText Lib "pdftool.dll" (ByVal OpenFileName As String, ByVal SaveFileName As String) As Long
PDFのバージョンを1.4形式に変更するChangePDFVersion()関数とPDFファイルをテキストに変換するvba_GetPDFText()関数を「標準モジュール」に追記します。
' PDFのバージョンを1.4形式にする(コピーしたファイルを編集) Public Sub ChangePDFVersion(ByVal OpenFileName As String, ByVal SaveFileName As String) Dim Stream() As Byte ' ストリーム Dim FileNo As Integer ' ファイルNO ' ファイルを読み込む FileNo = FreeFile ReDim Stream(FileLen(OpenFileName) - 1) Open OpenFileName For Binary As #FileNo Get #FileNo, , Stream Close #FileNo ' PDFの形式を1.4にする Stream(5) = "&H31": Stream(7) = "&H34" ' ファイルの出力 FileNo = FreeFile Open SaveFileName For Binary Access Write As #FileNo Put #FileNo, , Stream Close #FileNo End Sub ' PDFファイルのテキストを取得する ' 戻り値 : 1:成功 -1:失敗 -2:PDFファイルが暗号化されてる Public Function vba_GetPDFText(ByVal PDF As String, ByVal SaveFileName As String) As Long Dim p As Long Dim tmp As String Dim Result As Long ' 拡張子をtmpに変換する tmp = Replace(PDF, ".pdf", ".tmp", compare:=vbTextCompare) ' 元のPDFファイルをコピーしてバージョンを1.4形式に変更する Call ChangePDFVersion(PDF, tmp) ' PDFファイルのテキストを取得する Result = GetPDFText(tmp, SaveFileName) ' テンポラリファイルを削除する Kill (tmp) vba_GetPDFText = Result End Function
イベント
ボタンを押すとPDFファイルの全ページの文字列を取得してテキストファイルに変換します。
Private Sub CommandButton1_Click() ' カレントディレクトリをExcelファイルとpdftool.dllがある場所に変更 ChDir ThisWorkbook.Path ' PDFファイルをテキストに変換する call vba_GetPDFText("C:\対象.pdf","C:\結果.txt") End Sub
注意事項
WindowsやエクセルのバージョンによってはCドライブ直下(c:¥test.pdfなど)のファイルはセキュリティ制限で操作できない場合があります。その場合はC:¥Users¥ユーザー名¥Desktop¥など他のフォルダのファイルを指定してください。
また、pdftool.dllは32bitで作成されていますので、32bitのエクセルを使用してください。64bitのエクセルだとpdftool.dllが読み込めずに「実行時エラー 48 ファイルが見つかりません」とエラーが発生します。
Q & A
Q1: 何故、PDFのバージョンを変更するのですか?
そのバージョンチェックの機能を回避する為にPDFのバージョンを1.4形式に変更しています。これによりMicrosoft Officeなどで作成されたPDFファイルが読み込めるようになります。
Q2: どのようなPDFファイルに対応していますか?
また、PDFファイルが暗号化されている場合は対応できませんのでご了承ください。
メモ
本格的に運用する場合はエラーチェックなどを入れてくださいね。
公式リンク
PDFDesigner Tools
http://papy.world.coocan.jp/pdftool/
PDFDesigner JavaScript version(オープンソース)
http://www.petitmonte.com/pdfdesigner/
両方とも私が作成しています^^;