VBAでPDFファイルのページを回転する[ExcelのTIPS]
VBAでPDFファイルのページを回転(右90度/左90度/180度)する方法です。変換処理には個人・法人問わず利用、再配布可能な「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 LoadPDF Lib "pdftool.dll" (ByVal OpenFileName As String) As Long Public Declare Sub FreePDF Lib "pdftool.dll" (ByVal PDF As Long) Public Declare Function RotatePDF Lib "pdftool.dll" (ByVal PDF As Long, ByVal StartPos As Long, ByVal EndPos As Long, ByVal SaveFileName As String, ByVal Rotate As Long) As Long
PDFのバージョンを1.4形式に変更するChangePDFVersion()関数とPDFファイルのページを回転するvba_RotatePDF()関数を「標準モジュール」に追記します。
' 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ファイルを回転する ' StartPos: 開始ページ ' EndPos : 終了ページ ' Rotate : 1:右90度 2:左90度 3:180度 ' 戻り値 : 1:成功 -1:失敗 ' 備考 : PDFのページ数はGetPDFPageCount()APIで取得可能。詳細は公式サイト参照。 ' ※PDFファイルはChangePDFVersion関数で1.4形式にする必要があります Public Function vba_RotatePDF(ByVal PDF As String, ByVal StartPos As Long, ByVal EndPos As Long, ByVal Rotate As Long, 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ファイルを読み込んでハンドルを取得する p = LoadPDF(tmp) ' PDFファイルを回転する Result = RotatePDF(p, StartPos, EndPos, SaveFileName, Rotate) ' PDFファイルのハンドルを解放する FreePDF (p) ' テンポラリファイルを削除する Kill (tmp) vba_RotatePDF = Result End Function
イベント
ボタンを押すとPDFファイルの最初のページが右90度回転します。
Private Sub CommandButton1_Click() ' カレントディレクトリをExcelファイルとpdftool.dllがある場所に変更 ChDir ThisWorkbook.Path ' 最初の1ページを右90度回転する call vba_RotatePDF("C:\対象.pdf", 1, 1, 1, "C:\結果.pdf") 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/
両方とも私が作成しています^^;