PDFをJPEGに変換する方法(Excel VBAサンプル)

TOP > サンプル / 関数 > *      [...]


Method of conversion from PDF to JPEG.

 

説明

Acrobat PDF の全ページを JPEG ファイルに変換します。

JPEG ファイル名にはページ番号が自動付加されます。

Acrobat OLE の JSObject とExcel VBA OLE の機能を利用します。

 

サンプル:ExcelのVBA

 

  • 参照設定を事前に行う。
  • F8キーでステップ実行しながら動作確認出来ます。

 

Option Explicit

Private Sub CommandButton9_Click()

    Dim objAcroApp As New Acrobat.AcroApp
    Dim objAcroAVDoc As New Acrobat.AcroAVDoc
    Dim objAcroPDDoc As Acrobat.AcroPDDoc
    Dim lRet As Long
    Dim jso As Object
    
    'Acrobatアプリケーションを起動する。
    lRet = objAcroApp.Show
    'PDFファイルを開いて表示する。
    lRet = objAcroAVDoc.Open("E:¥Test01.pdf", "")
    'PDDocオブジェクトを取得する
    Set objAcroPDDoc = objAcroAVDoc.GetPDDoc()
    'JavaScriptオブジェクトを作成する。
    Set jso = objAcroPDDoc.GetJSObject
    jso.SaveAs "E:¥test-01.jpeg", "com.adobe.acrobat.jpeg"
    
    'PDFファイルを変更無しで閉じます。
    lRet = objAcroAVDoc.Close(1)
    'Acrobatアプリケーションを終了する。
    lRet = objAcroApp.Hide
    lRet = objAcroApp.Exit
    'OLEを行うとAcrobatが不安定になるので、
    '一応オブジェクトを強制開放する。
    Set jso = Nothing
    Set objAcroAVDoc = Nothing
    Set objAcroApp = Nothing
End Sub

 





 

補足

 

  1. Acrobat Readerでは出来ません。
    Acrobat本体がデフォルトでインストールされているパソコン環境だけです。
     
  2. 以下が変換後のファイル名のイメージです。
     
    Method of conversion from PDF to JPEG.
     
  3. 上記サンプルでは objAcroApp.Show でAcrobatアプリ本体を起動表示しています。
    これはjso.SaveAs メソッドを連続で行うときに発生する不可解なエラー回避策です。
    高速化したいのならば objAcroApp.CloseAllDocs に置き換えて下さい。
     
  4. 当サンプルよりも以下の関数を利用してのJPEG 変換をおすすめします。
    関数:PDFを特定のフォーマットに変換する」 
    当ページのサンプルよりも安全にJPEG 変換が可能になります。
     

 

注意

 

  1. Acrobat SDK 8.1 に書かれている第2引数の説明が一部間違っています。
    以下が正解です。

    SDK:com.adobe.Acrobat.jpeg ※間違い
    正解:com.adobe.acrobat.jpeg ※「a」1文字違う
    この情報は、"C:¥Program Files¥Adobe¥Acrobat 8.0¥Acrobat¥ExportTask.xml" ファイルに入っている内容から当サイト管理者が勝手に判断したものです。
    この「ExportTask.xml」ファイルに関する説明はAcrobat SDKにはありません。
     
  2. OSがインストールされているC:ドライブへの保存は出来ません
    詳細は、「Acrobat JavaScript における「Safe Path」についての注意事項」を参照。
     

 

動作確認環境

 

  • WindowsXP Pro + SP3 +
    Acrobat 8.1.6 Pro + Office 2003 + フルMicrosoftUpdate

 

サンプル一覧

「PDFをJPEGに変換する方法(Excel VBAサンプル)」への15件のフィードバック

  1. Win XP環境で作業している者です。
    現在,Acrobat 9.0でPDFファイルを上記のようにJPG変換する作業をしています。
    バージョン9.0では,Acrobatのファイルメニューから,「別名で保存」で連番が降られたJPGファイルが出来ます。
    解像度もppi/cm単位で設定出来ます。
    ただ,デフォルトでは,解像度をプルダウンメニューで,何寿類かの特定の解像度しか選べないので,プルダウンメニューで設定したあとで,解像度の数字の部分だけを,200ppi/pxelの数値でcm単位に変えて変換しています。
    ただこの設定ではカスタム設定保存が出来なくて,新規のPDFを処理するたびにデフォルトに戻ってしまいます。
    それと,解像度を200ppi/pxelに設定した後で,解像度は変えずに,pixelだけをUPして,JPGに書き出すスクリプトはどうやって設定するのでしょうか?
    以上の2点の処理で困ってます。
    ちなみに,最後の解像度はそのままに,pixel数をUPして,ドキュメントサイズを大きくする作業は,残念ながらPhotoshopのバッチで処理しています。
    なんせPDFの数が膨大にあるため,なんとかAcrobatで動くVBあるいはJavascriptdで実行出来ないかと思っています。
    ご教授よろしくお願いいたします。

  2. 内容は確認しました。
    現在、この値をどの様な形でAcrobat 9.0が管理しているか調査しています。
    ・レジストリ
    ・C:ドライブのどこかのファイル(xml?)
    しばらくお時間を下さい。

  3. kimさん。遅れましたが、初めまして。
    これまでの中間報告です。
    <1点目>
    Acrobat Pro Extended 9.0
    Acrobat Pro Extended 9.1
    + Office 2003 + Win XP(フルUP)環境
    で確認しましたが、JPEG変換の解像度はカスタム変更してもデフォルトには戻りません。「別名で保存」に問題は見つかりませんでした。
     そこで一度、試して欲しいのですが。メニューから[編集]->[環境設定]->環境設定ダイアログ画面->[PDFからの変換]->[JPEG]で[解像度]を選択して[設定を編集(E)]ボタンでデフォルトの解像度が変更できる?と予想しています。試して下さい。
    <2点目>
     「別名で保存」の設定パラメータ画面にその値が無いので無理かと・・。これに関してはAcrobat側の問題では無く、VBA(VB)側の処理方法だと思います。
     なお、解像度のリスト値が保存されている箇所は見つけることが出来ませんでした。が、再度調査したいと思っています。
     とりあえず、今日はココまで。(汗

  4. pdf (fillable, 入力可能なpdfファイル)から、通常のpdfファイル(入力欄の機能をなくしたもの)への変換は、どのように記述したらよいか、教えてください。

  5. 鹿の楽園 さん はじめまして。

    ここで言っている「入力可能なpdfファイル」とは「テキストボックス、コンボボックス、リストボックス、チェックボックス、ラジオボタン」等の入力操作可能フィールドを持っているPDFファイルと言う事、 更に「入力欄の機能をなくしたもの」とは「入力出来ない状態のPDF」と判断させて頂きます

    それならば AFormAut オブジェクト での操作で各フィールドを更新不可にすればイイと思います。もしそのフィールドが不要ならば削除しても構いません。

    ココのページのサンプルを御覧ください。
    更新不可の場合は、以下の部分を

    For Each objAFormField In objAFormFields
    lCnt = lCnt + 1
    'フィールドのタイプを表示
    Debug.Print "(" & objAFormField.Type & ")"
    Next objAFormField

    こんな感じに変更します。↓
    For Each objAFormField In objAFormFields
    '入力・変更不可にする
    objAFormField.IsReadOnly = True
    Next objAFormField

    削除は上記のループ内でobjAFormField.Typeからフィールドのタイプ(テキスト[text]、ラジオボタン等)を判断して、objAFormField.Nameからフィールド名を取得します。そして、ココのサンプルを元にそのフィールド名でフィールドの削除を行います。

    サンプルは保存してないので、別名での保存等を行う必要は有ります。

    参考になれば幸いです。

  6. 管理人様

    はじめまして。ご回答をありがとうございます。
    ご指定の箇所を「入力・変更付加にする」のとおり書き換えました。
    F8キーで実行すると、

    objAFormField.IsReadOnly = True
    Next objAFormField

    の部分を素通りしてしまい、別名で保存

    lRet_0 = objAcroPDDoc.Save _
    (PDSaveFull + PDSaveLinearized + _
    PDSaveCollectGarbage, _
    "C:\Users\necuser2\Desktop\76\NFPDF00.pdf")

    の箇所を通っても保存されません。

    どこが間違っているのか、教えていただけますか?
    よろしくお願いします。

    鹿の楽園

  7. 鹿の楽園 さんへ。

    >の部分を素通りしてしまい、別名で保存

    「素通り」すると言う事はフィールドが存在しない、と思えます。PDF内にフィールドは存在しているのでしょうか? ココのサンプルの

    Debug.Print "Fields.Count (" & lFieldsCount & ")"

    のlFieldsCount の結果は1以上になっていますか? 0ならば存在しないので当然「素通り」します。

    それと「保存されない」と有りますが、

    lRet = objAcroAVDoc.Close(1)

    の部分を置き換える必要が有ります。更に、lRet_0 の値(終了コード)が正常終了しているかの確認が当然必要です。サンプルですから、全てのエラー処理は入っていません。

    更に、(タブンですが)

    >lRet_0 = objAcroPDDoc.Save _

    の objAcroPDDoc変数(=オブジェクト) はサンプル上の objAcroAVDoc オブジェクトと連携しているでしょうか? 上記の Save メソッドを実行する直前に連携図に従って、

    Set objAcroPDDoc = objAcroAVDoc.GetPDDoc

    を実行する必要が有ります。これでobjAcroAVDoc オブジェクトとobjAcroPDDocオブジェクトが連携し、objAcroPDDoc.Saveメソッドが正常に動作します。

    「オブジェクトの連携」とは各変数内の「情報の受け渡し」を意味します。
    objAcroAVDocで処理した結果をobjAcroPDDocで処理させたい時は上記の様に連携図に従って、情報の受け渡し用のメソッドを実行する必要があります。しないと何を処理してイイのか各オブジェクト(変数)は判りません。

    ご確認ください。

  8. 管理人様

    ご回答をありがとうございます。
    確認したところ、テキストフィールドは多数(20箇所以上)ありますが、debug.printの表示では、fields.count (0)となります。
    素通りの原因はこれでしょうか?

  9. 鹿の楽園 さんへ。

    ココのサンプルを使っているという事は objAcroAVDoc.Open で正常にPDFファイルをオープン出来ているという事です。
    そして、
    >・・テキストフィールドは多数(20箇所以上)・・
    あるにも関わらず objAFormFields.Count の結果が ゼロ という事は、
    鹿の楽園 さんの言うフィールドとコチラが思っているフィールドの意味が「違う」みたいです。

    ココのページで説明しているテキストフィールドなのでしょうか?
    もしそうならば、ココのサンプルとかなり異なるロジックか、予想も出来ない現象が発生している事になります。
    もう一度、ココのコメントを読み直して、再度トライください。

    >素通りの原因はこれでしょうか?

    ゼロならば当然 VBAの「For Each」文はループしないです。VBAのヘルプでFor Each文をご残照ください。

    問題が無ければ、ソースが見たいです。
    (コメント投入時に403等のエラーが発生する時はソースを全て全角文字に変換して下さい)

  10. 管理人様

    とりいそぎ、使用しているfillable PDFのサンプルです。
    この他にも数点使用しておりますが、

    https://www.*****/sites/default/files/patents/process/file/efs/guidance/updated_IDS.pdf

    が典型例です。
    入力可能な欄と、それを追加するボタンを持つファイルです。
    ソースコードは別途ご連絡します。

    時差の都合(EST)で、変な時間帯に回答してすみません。

  11. 鹿の楽園 さんへ。

    サンプルPDFのご提供、ありがとうございます。
    「謎」は解けました。
    ソースのご提供は不要です。

    <これ以降は長文です>

    ▼ 結論(から):入力無しPDFにする方法
    手作業で行う場合です。該当PDFをAcrobat又はAcrobat Readerで開きます。そこから印刷します。但し印刷時はPDFファイルとして印刷します。そうする事で「入力無しのPDFファイル」に変換できます。
    以下が結果です。ご確認ください。
    updated_IDS-print.pdf

    ▼ 今までの方法で出来なかった原因:
    ご提供頂いたサンプルPDFはAcrobatで作成したファイルではありません。Adobe社の LiveCycle Designer というソフトで作成したものです。拡張子がPDFになっているのはそのファイルを使用して表示、更にフィールドへの入力とボタン操作を行うのはAcrobat又はAcrobat Readerだからと思われます。
    このLiveCycle Designer というソフトはAcrobat 8、9等のPro版ではインストール時に同時インストールされる別物のソフトです。(Acrobat XI Proではインストールされません) 詳細は「Adobe LiveCycle Designer」でネット検索してください。
    実際にサンプルPDFをAcrobat XI で編集しようとしたら「このフォームはAcrobatで編集できません。このフォームを編集するにはAdobe LiveCycle Designer を使用してくたさい。」のエラーで拒否されました。つまり当サイトで紹介しているAcrobat OLE(IAC)では完全に操作できないという事になります。

    ▼ プログラミングでの変換方法
    しかし、プログラミング操作出来ないわけでは無いです。以下は大まかな手順だけです。

    ①.OSのデフォルトプリンターを「Adobe PDF」又は「Microsoft Printer to PDF」等に変更します。
    コマンド:
    rundll32.exe printui.dll,PrintUIEntry /y /n "[プリンタ名]"
    上記コマンドの説明サイト:http://qiita.com/rohinomiya/items/43f92cfcd19daa859425

    ②.ココのサンプルを参考にサイレント印刷を行う。

    ③.PDFファイトへ印刷する為の「保存ダイアログ」が表示されるのでファイル名の入力を行う。このダイアログはAcrobat側が出しているのでは無く、OS側が出していることに注意してください。

    ①と②は問題無いです。③の部分は当サイトへの質問でも過去に何度も有った部分です。この部分をAcrobat OLE+Excel VBAだけで自動入力する事は簡単に出来ません。理由は保存ダイアログが出るきっかけはプログラミングが起こしましたが、ダイアログ画面の表示は制御が離れたWindowsのOS側が要求しているからです。よって、通常のプログラミングからの制御は出来ません。
    そこでWindows APIを駆使してPDFファイル名の自動入力を行います。と言いたいですが、実際はかなり難しいのが現実です。ココは自動化ツールを使ったほうが低コストです。 AutoItは自動化ソフトとしてはかなり有名で、商用利用も含めてフリーでの使用が可能になっています。 しかも、Excel VBAから直でプログラミング操作が出来ます。当サイトにも使用サンプルが有ります。他のネットにもサンプルが有るので参考になると思っています。
    確か、Autoitのランタイムだけの配布も許されていた様な気がするのでExcel (VBA)ファイルと一緒に配布できるかもしれません。但し、動作環境として許されればの話です。
    (※この部分は質問が多い箇所なので、本サイトとは無関係ですが、解決策の1つとしてAutoitのVBAロジックを近日公開します。)

    それとWindowsとAcrobatのバージョンをお知らせください。

    以上、ご検討ください。

    ▽ サイト管理人のメモ ※見なくても結構です。
    ・Adobe LiveCycle Designer にOLE機能を見つけれなかった。よって、Excel VBAからAdobe LiveCycle Designer を操作する事は出来ない。
    ・Windows 10 64bit環境下でのWindows APIの操作に使用制限が掛かっている気配が有る。また動作環境のWindowsとAcrobatのバージョンによりロジックが変わるかもしれない。よってWindows APIによるプログラミングは避けたい。
    ・Adobe LiveCycle Designer 作成のPDFをAcrobat OLEで操作出来ない事はチョット納得できない。同じメーカーで基本的なファイル構造(XML)も同じならば操作出来るようにするのがスジ!(コラコラ
    ・Autoitだけでも全て出来てしまうが、どうしようかな~。

  12. 管理人様

    ありがとうございました。なぜうまくいかないか、やっと分かり始めました。

    環境
    OS: Windows 7 Professional SP1
    System: Dell Optiplex 7010 64-bit, 8GB RAM
    (英語用のwindowsでむりやり日本語を使う)

    Adobe acrobat X 10.1.16.13

  13. 鹿の楽園 さんへ。
    もう、このコメントを見てないかもしれませんが、続きを書かせてもらいます。それと長文です。

    この4日程を掛けて、今回の「PDFへの印刷」に関する方法を最初から見直しました。その結果をお知らせします。

    ▼結論(概略のみ)
    全てをプログラミング操作で「全」自動化するのは今回は見送ります。
    可能と思われる技術的な面をイロイロと調査+検討+テストしましたが、きれいな解決に至らなかったからです。正確には「たどり着けなかった」と思っています。但し問題部分を運用面でカバーして、連続で機械的な作業部分のみをプログラミングとします。

    ▼詳細な手順
    以下の①、②、④は手作業での運用部分です。

    ① コントロールパネルから「プリンターとデバイス」を表示して、「Adobe PDF」を「通常使うプリンター」に設定する。
    ② 「Adobe PDF」の「印刷設定」を開いて、以下の2点を変更します。
    ・「Adobe PDF 保存先フォルダー」の「参照」ボタンで保存先フォルダを指定します。
    これでPDFファイルの保存ダイアログ画面は出なくなります。
    ・「結果の Acrobat PDF を表示」のチェックを外します。
    これで印刷後のPDFが画面表示されなくなります。

    ③ この後で以下のサンプルを実行します。前回紹介したサンプルよりもAcrobatアプリケーションがデスクトップに表示されない分、高速に動作します。

    ④ 処理が全て終わったら、再度、コントロールパネルから「プリンターとデバイス」を表示して、「通常使うプリンター」の設定を元に戻します。更に「Adobe PDF」の「印刷設定」の変更点も元に戻します。

    ▼詳細な理由
    手作業による運用面を導入した理由を書きます。

    1. AutoIT等の自動化ツールを使って、アプリケーションのデスクトップ操作は自動化出来るが、速度面で著しく問題が有りすぎる。また環境面で失敗する事も考えると、自動化の部分のプログラミングが複雑になってしまう。
    2. コントロールパネル「プリンターとデバイス」で「Adobe PDF」の「印刷設定」の変更先になるレジストリの場所は判った。しかし、先にレジストリを変更してもその結果が「印刷設定」画面には反映されない。Windowsを再起動しても駄目。テスト結果から総合的に判断すると「コントロールパネル」>「プリンターとデバイス」>「Adobe PDF」>「印刷設定」の結果はレジストリに書き込まれるが、更に別の場所にも書かれる。「印刷設定」画面の内容はその別の場所から持ってくる。
      ※この判断に3日。たぶん何かを見落としている、かも、・・しれない。
    3. 運用面のカバーでプログラミングの作成と保守コストを2~3割以下に出来る。
    4. プリンターの「通常使うプリンター」設定はプログラミングでもカバー出来る。しかし運用で「印刷設定」画面を開くので、その時についでにマウスのワンクリックで変更できる。よって、これも運用面に入れてします。

    ▼備考

    1. Acrobatのメニューでの印刷から「印刷設定」へのアクセスは自動化ツールでも出来るが、印刷の度に変更しないといけない。その変更結果はレジストリに反映されない。「印刷設定」の変更を一度の操作で終らせる事が出来るのは「コントロールパネル」>「プリンターとデバイス」>「Adobe PDF」>「印刷設定」だけ。
    2. 「プリンターとデバイス」は「ファイル名を指定して実行」で control printers で起動できるが、この後の操作がプログラミングで操作出来ない。
    3. 「Microsoft Print to PDF」は必ずダイアログ画面が表示される。設定は無い。

    ▼「Adobe PDF」>「印刷設定」のレジストリ情報

    1. 「結果の Acrobat PDF を表示」
      「Adobe PDF の保存先を確認」から指定フォルダに変更する。
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\Adobe PDF\PrinterDriverData
      "PromptForFileName"=dword:00000001
      ※「Adobe PDF の保存先を確認」に戻すと0になる。
      更に以下の場所にもその時の保存先フォルダ名が書き込まれる。
      [HKEY_CURRENT_USER\Software\Adobe\Acrobat Distiller\11.0\AdobePDFOutputFolder]
      @=dword:00000002
      "2"="D:\\Temp"
      dwordの00000002は"2"を指してる。
      「11.0」部分はAcrobatのバージョン番号で変わる。
    2. 「結果の Acrobat PDF を表示」
      チェックを外すと1になる。チェック時は0になる。
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\Adobe PDF\PrinterDriverData
      "ViewPrintOutput"=dword:00000001

    ※まだまだ、次回の為に、書き残さないといけない、技術メモ+疑問点+再調査事項+再テスト+まとめ等が山ほどあるが、・・・。後日、時間が出来た時に追加します。 (疲)今日はもう、寝ます。

  14. 管理人様

    どうもありがとうございました。
    教えて頂いたとおりにプリンタを設定し、上記プログラムを動作させたところ、正常にPDFファイルが作成されました。印刷ダイアログボックスも自動で進み、クリックや入力は不要でした。
    これで十分に対応可能です。あとはこちらの環境に合わせて少し変更を加え、他のファイルとマージするコマンドを追加する予定です。

    私にはシステムアドミンの権限が与えられていないため、AutoITの導入は少々躊躇っておりました。後に問題が発生した際に対処しきれない場合があります。
    (前任のマネージャが帰国して依頼、誰もアドミンのアカウントとパスワードを知らないという最悪自体に陥っていますが(汗))

    お時間を使わせてしまい申し訳ありませんでした。なんとお礼を申し上げてよいか分かりませんが、本当に助かりました。
    ありがとうございました。今後ともよろしくお願いします。

    鹿

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


出来るだけ早く返答する様には心がけています。
が、遅くなる時もありますのでご了承ください。


SAMURAI Plugin

コメントをする時は最低でも以下をお願いします。

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン