AcroPDFLib.AxAcroPDF: Excel VBAサンプル(A)

TOP > AcroPDFLib.AxAcroPDF > Excel VBAサンプル(A)


AcroPDFLib.AxAcroPDFオブジェクトの一部を使ったExcel VBAサンプルです。

Acrobat Readerと同じ動作をします。

当ページ最下部の注意も参照してください。

 

Excelファイルのダウンロード

AxAcroPDF005.zip

 

動作確認環境

  • WindowsXP Pro + SP3 + フルWindowsUpdate + Acrobat Pro 8.1.2
    ※Acrobat Readerのみの環境では動作しません。 

 

サンプル実行画面

サンプル(A)画像

 


Excel VBA ソースコード

 

 

001 Option Explicit 002 003 Private Sub UserForm_Initialize() 004 '画面初期サイズを変更する 005 Me.Width = 750 006 Me.Height = 550 007 AcroPDF1.Width = Me.Width - 10 008 AcroPDF1.Height = Me.Height - AcroPDF1.Top - 40 009 010 'Tipsをセットする 011 cmdOpenPDFFile.ControlTipText = _ 012 "ローカルなPDFファイルを選択&表示する" 013 cmdReadPDF.ControlTipText = _ 014 "URL.PDFなどのPDFファイルを表示する" 015 chbDisplayToolBar.ControlTipText = _ 016 "ToolBarを表示する" 017 018 cmdPrintWithDialog.ControlTipText = _ 019 "PrintWithDialogメソッドを実行" 020 cmdPrintAll.ControlTipText = _ 021 "PrintAllメソッドを実行" 022 cmdPrintPages.ControlTipText = _ 023 "PrintPagesメソッドを実行" 024 txtFromPage.ControlTipText = _ 025 "印刷開始ページをセット" 026 txtToPage.ControlTipText = _ 027 "印刷終了ページをセット" 028 029 cmdGoBackwardStack.ControlTipText = _ 030 "GoBackwardStackメソッドの実行" 031 cmdGoFirstPage.ControlTipText = _ 032 "GoFirstPageメソッドの実行" 033 cmdGoPreviousPage.ControlTipText = _ 034 "GoPreviousPageメソッドの実行" 035 txtPageNumber.ControlTipText = _ 036 "PageNumberメソッドの実行" 037 cmdGoNextPage.ControlTipText = _ 038 "GoNextPageメソッドの実行" 039 cmdGoLastPage.ControlTipText = _ 040 "GoLastPageメソッドの実行" 041 cmdGoForwardStack.ControlTipText = _ 042 "GoForwardStackメソッドの実行" 043 044 cmbsetPageMode.ControlTipText = _ 045 "setPageModeメソッドを実行" 046 cmbsetLayoutMode.ControlTipText = _ 047 "setLayoutModeメソッドを実行" 048 cmdsetZoom.ControlTipText = _ 049 "setZoomメソッドを実行" 050 cmbsetPageMode2.ControlTipText = _ 051 "setPageModeメソッドを実行" 052 cmbsetLayoutMode2.ControlTipText = _ 053 "setLayoutModeメソッドを実行" 054 txtsetZoom2.ControlTipText = _ 055 "ズーム%をセット" 056 cmdsetZoom2.ControlTipText = _ 057 "setZoomメソッドを実行" 058 059 AcroPDF1.ControlTipText = _ 060 "PDFファイルをココに表示する" 061 cmdEnd.ControlTipText = "画面を閉じる" 062 063 'コントロールの初期値を設定する 064 AcroPDF1.setShowToolbar False 065 With cmbsetPageMode2 066 .Clear 067 .AddItem "None" 068 .AddItem "Bookmarks" 069 .AddItem "Thumbs" 070 End With 071 With cmbsetLayoutMode2 072 .Clear 073 .AddItem "Don't Care" 074 .AddItem "Single Page" 075 .AddItem "One Column" 076 .AddItem "Two Column Left" 077 .AddItem "Two Column Right" 078 End With 079 txtsetZoom2.Text = 60 'ズ-ム 100% 080 'PDFコントロール上のツールバーを設定(非表示)にする 081 chbDisplayToolBar.Value = False 082 End Sub 083 084 Private Sub cmdOpenPDFFile_Click() 085 Dim vntFileName As Variant 086 'ファイルを開くダイアログを開きます 087 vntFileName = _ 088 Application.GetOpenFilename( _ 089 FileFilter:="PDFファイル(*.PDF),*.PDF", _ 090 FilterIndex:=1, _ 091 Title:="PDFファイルを開く", _ 092 MultiSelect:=False) 093 '選択されたファイルを開きます 094 If vntFileName <> False Then 095 txtURL.Text = vntFileName 096 Call cmdReadPDF_Click 097 End If 098 End Sub 099 100 101 102 Private Sub cmdReadPDF_Click() 103 On Error GoTo Err_cmdReadPDF_Click 104 '入力チェック 105 If Trim(txtURL.Text) = "" Then Exit Sub 106 'PDFを表示する 107 AcroPDF1.src = txtURL.Text 108 'PDFコントロール上のツールバーを設定(非表示)にする 109 AcroPDF1.setShowToolbar chbDisplayToolBar.Value 110 Exit Sub 111 Err_cmdReadPDF_Click: 112 MsgBox Err.Number & " : " & vbCrLf & Err.Description, _ 113 vbOKOnly + vbCritical, _ 114 "実行エラー : cmdReadPDF_Click" 115 End Sub 116 117 Private Sub chbDisplayToolBar_Click() 118 'PDFコントロール上のツールバーを設定(表示/非表示)にする 119 AcroPDF1.setShowToolbar chbDisplayToolBar.Value 120 End Sub 121 122 Private Sub cmdGoBackwardStack_Click() 123 '2つ目のビュースタックがあれば2つ前のページ表示をし、 124 'なければ1つ目の表示したページを移動表示します。 125 AcroPDF1.goBackwardStack 126 End Sub 127 128 129 130 Private Sub cmdGoFirstPage_Click() 131 '最初のページに移動表示する。 132 AcroPDF1.gotoFirstPage 133 End Sub 134 135 Private Sub cmdGoPreviousPage_Click() 136 '1ページ前に移動表示する。 137 AcroPDF1.gotoPreviousPage 138 End Sub 139 140 Private Sub txtPageNumber_Change() 141 On Error GoTo Err_txtPageNumber_Change 142 If Trim$(txtPageNumber.Text) = "" Then Exit Sub 143 If Not IsNumeric(txtPageNumber.Text) Then 144 MsgBox "数字のみ入力です", vbOKOnly + _ 145 vbExclamation, "入力エラー" 146 subSetFocusSelect txtPageNumber 147 Exit Sub 148 End If 149 AcroPDF1.setCurrentPage txtPageNumber.Text 150 Exit Sub 151 Err_txtPageNumber_Change: 152 MsgBox Err.Number & " : " & vbCrLf & Err.Description, _ 153 vbOKOnly + vbCritical, _ 154 "実行エラー : txtPageNumber_Change" 155 End Sub 156 157 Private Sub cmdGoNextPage_Click() 158 '次ページへ移動表示する。 159 AcroPDF1.gotoNextPage 160 End Sub 161 162 Private Sub cmdGoLastPage_Click() 163 '最終ページに移動表示する。 164 AcroPDF1.gotoLastPage 165 End Sub 166 167 Private Sub cmdGoForwardStack_Click() 168 'GoBackwardStackメソッドを実行して移動表示した 169 'ページの1つ前に移動表示したページを表示します。 170 'GoBackwardStackメソッドを実行した時のみ動作します。 171 AcroPDF1.goForwardStack 172 End Sub 173 174 175 176 Private Sub cmdPrintWithDialog_Click() 177 '印刷ダイアログを表示します。ページの選択状態があれば、 178 '範囲印刷設定が印刷ダイアログに設定されます。 179 '注)PDFドキュメントのセキュリティ設定で印刷不可の場合は 180 ' 当メソッドは無視されます。 181 AcroPDF1.printWithDialog 182 End Sub 183 184 Private Sub cmdPrintAll_Click() 185 '印刷ダイアログボックスを表示しないで、 186 'PDFドキュメント全体を印刷します。 187 AcroPDF1.printAll 188 End Sub 189 190 Private Sub cmdPrintPages_Click() 191 On Error GoTo Err_cmdPrintPages_Click 192 '入力チェック 193 If Not IsNumeric(txtFromPage.Text) Then 194 MsgBox "数字のみ入力です", vbOKOnly + _ 195 vbExclamation, "入力エラー" 196 subSetFocusSelect txtFromPage 197 Exit Sub 198 End If 199 If Not IsNumeric(txtToPage.Text) Then 200 MsgBox "数字のみ入力です", vbOKOnly + _ 201 vbExclamation, "入力エラー" 202 subSetFocusSelect txtToPage 203 Exit Sub 204 End If 205 If Not (txtFromPage.Text <= txtToPage.Text) Then 206 MsgBox "印刷範囲の入力ミスです", vbOKOnly + _ 207 vbExclamation, "入力エラー" 208 subSetFocusSelect txtFromPage 209 Exit Sub 210 End If 211 '範囲指定で印刷をする。開始ページは0からです。 212 AcroPDF1.PrintPages _ 213 (txtFromPage.Text - 1), (txtToPage.Text - 1) 214 Exit Sub 215 Err_cmdPrintPages_Click: 216 MsgBox Err.Number & " : " & vbCrLf & Err.Description, _ 217 vbOKOnly + vbCritical, _ 218 "実行エラー : cmdPrintPages_Click" 219 End Sub 220 221 222 223 Private Sub cmbsetPageMode2_Change() 224 'PDFドキュメントのページ表示モードを設定。 225 '※小文字化してセットする 226 AcroPDF1.SetPageMode _ 227 StrConv(cmbsetPageMode2.Value, vbLowerCase) 228 End Sub 229 230 Private Sub cmbsetLayoutMode2_Change() 231 Dim strlayout As String 232 Select Case cmbsetLayoutMode2 233 Case "Single Page" 234 strlayout = "singlepage" 235 Case "One Column" 236 strlayout = "onecolumn" 237 Case "Two Column Left" 238 strlayout = "twocolumnleft" 239 Case "Two Column Right" 240 strlayout = "twocolumnright" 241 Case Else 242 strlayout = "dontcare" 243 End Select 244 'PDFドキュメント表示のページ・ビューに 245 'レイアウトモードを設定変更する 246 AcroPDF1.setLayoutMode strlayout 247 End Sub 248 249 Private Sub cmdsetZoom2_Click() 250 '入力チェック 251 If Not IsNumeric(txtsetZoom2.Text) Then 252 MsgBox "数字のみ入力です", vbOKOnly + _ 253 vbExclamation, "入力エラー" 254 subSetFocusSelect txtsetZoom2 255 Exit Sub 256 End If 257 'PDFドキュメントの表示倍率を設定 258 AcroPDF1.setZoom (txtsetZoom2.Text) 259 End Sub 260 261 Private Sub cmdEnd_Click() 262 '画面を閉じる 263 Unload Me 264 End Sub 265 266 Private Sub subSetFocusSelect(obj As Control) 267 '入力ミスしたコントロールにフォーカスを 268 '移動して、文字列を選択状態にする。 269 With obj 270 .SetFocus 271 .SelStart = 0 272 .SelLength = Len(obj.Text) 273 End With 274 End Sub 275


 Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
 

注意

  • 当機能はAcrobatアプリ本体の AcroPDF.dll を使用して動作します。
    つまりAcrobatアプリ本体が環境にインストールされてないと動作しません。

< 戻る >

「AcroPDFLib.AxAcroPDF: Excel VBAサンプル(A)」への27件のフィードバック

  1. お世話になっております。いつも参考にさせて頂いております。
    AcroPDFコントロールに表示させたPDFの現在ページを取得することは可能でしょうか?
    ページを変更したら動的に、現在ページを取得したいのですが。
    何かよい方法がありましたらアドバイスをお願い致します。

  2. 道さん。初めまして。
    >・・ページを変更したら動的に、現在ページを取得・・
    上記の件は確認させて頂きました。
    現時点での返答は「取得不可」です。
    しかし、もう少しお時間(二日程)を下さい。
    視点を変えながらも検討&調査してみます。

  3. 道さん。遅くなりました。
    いろいろと検討&調査しましたが、OLEでは出来ない事が確かです。
    但し、AcroPDFコントロール上に表示されるPDFツールバーにカレント・ページ番号が表示されます。これをWindowsAPIを利用して取得出来るのは確かだと思います。しかし、WindowsAPIは管理人もそれ程詳しくなく、試行錯誤しましたが、VBAコード化出来ませんでした。
    [AxAcroPDFLib.AxAcroPDFをSP++した結果]
    /wp-content/uploads/20090729_541614.jpg
    申し訳有りませんが、一旦これを返答とさせて頂きます。
    ※悔しいので、継続チャレンジはするつもりです。

  4. 管理人 様
     お世話になっております。
     お忙しい中、貴重なお時間を割いて頂きありがとうございました。
     今後ともよろしくお願い致します。

  5. 始めまして、林と申します
    いつも参考にさせて頂いています

    一つ教えてください

    AcroPDF1.setZoom (txtsetZoom2.Text) で拡大縮小は出来ますが
    PDFドキュメントの回転は出来ますでしょうか?

    宜しく、お願いします

  6. 林 さん。はじめまして。

    AxAcroPDFLib.AxAcroPDFコントロールを使ったメソッド&プロパティに回転機能は残念ですがありません。

    しかし以下のメソッドで現在扱っているページの回転が出来ます。
    AcroExch.PDPage:SetRotate メソッド
    http://pdf-file.nnn2.com/?p=167
    詳細は上記URLを参照してください。

    事前に回転度数が分かっていればPDFを上記のメソッドで回転させます。
    それをAxAcroPDFLib.AxAcroPDFコントロールで画面表示する、という逃げ手はあります。
    プログラム仕様が許せばの話ですが。

    ※現在、メイン・パソコン本体の新旧入れ替え作業中に付き、返答が遅くなります。

    少しでも解決につながれば幸いです。

  7. 早速のお返事ありがとう御座います

    もう少し教えてください

    AcroExch.PDPage:SetRotate メソッド のマクロを動かしたところ
    Dim objAcroApp As New Acrobat.AcroApp
    で「コンパイルエラー」で止まってしまいます

    参照設定ですが、Adobe が無いからだと思います
    (バージョン Adobe Reader X )
    無償のAdobeでは無理なのでしょうか?

    素人で大変申し訳ありません

  8. 林 さんへ。

    Adobe Reader環境のみではAcroExchオブジェクトは扱えません。
    Adobe Acrobat本体が必要です。

    もう少し何がしたいのをお伝えして頂ければご相談も可能かもしれません。
    環境面もお願いします。

    なお、回転のみでしたらフリーソフトでも見かけます。
    探すこともご提案します。

  9. 管理人さん

    ありがとう御座いました
    また、心使いありがとう御座います

    一度、回転させて保存すればすむ事ですので、今ある図面をすべて変えます
    Adobe Acrobat本体を買う事は辞めるようにします

    また、宜しくお願いします

  10. はじめまして木村といいます

    [環境]
    VB.net 2010
    Adobe Reader XI

    [質問]
    上記の環境でPDFドキュメントを表示しています
    印刷はReaderに表示されるボタンを押して印刷をしています
    そこで相談ですが表示するドキュメントは A4 ですが
    常に縮小して B5 に印刷したいと思います
    ダイアログで毎回、縮小の指定をするのは大変なので縮小の指定を
    事前にプロパティ等に設定できないかと考えています
    ですが、ネット等で調べてみましたがわかりません

    わかりましたらお教えていただけませんでしょうか

    よろしくお願いいたします

  11. 木村です

    先ほどの質問で追記です
    現在は VB.net に AxAcroPDFを組み込んで PDFドキュメントを表示しています

  12. 木村さん
    はじめまして

    先にお詫びをします。
    記事内容とサンプルの一部に修正漏れが有りましたので、それを先にご連絡します。
    当ページの機能はAdobe Acrobatアプリ本体のAcroPDF.dllを使用して、Acrobat Readerに近い機能を別のアプリケーションに提供します。
    つまり、PC環境にAdobe Acrobat本体が無いとAxAcroPDFオブジェクトは使用できません。
    ※サイトとサンプルは既に修正済みです。

    木村さんの場合は多分ですが、PC環境にAdobe AcrobatとAdobe Readerが混在した環境なのでしょう。
    PDFファイルを開くとAdobe Readerが起動されると思います。
    これはAdobe Readerを後でインストールしたので、ファイルの関連付けでAcrobatでは無く、Adobe Readerが起動されます。
    しかしサンプルのExcelファイルはAdobe Acrobatの方を利用して動作します。
    VB.NETで参照しているAcroPDF.dllはAdobe Acrobatのインストール・フォルダを参照しているはずです。

    以上から木村さんの「AxAcroPDFを組み込んで PDFドキュメントを表示」部分は考えなおす必要があるかもしれません。
    そのVB.NETアプリを動かすにはAcrobatがインストールされている必要が有るからです。

    ただし、PDFの縮小印刷だけに関する質問には分かる範囲で返答させて頂きます。
    ※完全なテスト環境が無いので推測です。

    Adobe Reader XI の印刷ダイアログを表示すると
    ① プリンターのプロパティ
    ② 「ページ設定(S)...」ボタン
    でB5指定が出来るはずです。

    ①の場合ですが、(コレは経験上の話ですが)ココの設定は一度変更すると次回も引き継がれる場合が多いです。つまりレジストリで値を持っている可能性が高いです。レジストリの変化を追跡して操作することで可能になると予測しています。問題はドラーバーにより、内容が変わることです。

    ②の場合ですが。こちらのWindowsXP環境での動作結果では、Readerが終了するとココの値は元のA4に戻ります。つまり、この部分は使えません。

    当サイトの情報で上記の①と②を変更する命令等は存在しません。
    但し、(最近扱い始めた)AutoITという自動化ソフトを使うと②の部分のアプリケーション操作が可能になります。
    参照:Acrobat のアクション、バッチ処理を実行する (Acrobat 6~10)

    余談ですが、AcrobatとReaderの設定内容はアプリケーションの終了時に[HKEY_CURRENT_USER\Software\Adobe\」レジストリ下に保存されます。

    御検討下さい。

  13. 管理人様

    レスをありがとうございます

    まず当方の環境ですが

    Adobe Acrobatはインストールされておらず
    Adobe Reader XIのみで開発しています
    運用しているPC は XP です

    プログラムは VB.NET のフォームに
    Adobe PDF Reader の COMコンポーネントを貼り付けて
    見た目にはフォームの中に埋め込んだ状態で PDFがプレビュー表示されている形になっています
    ですのでフォーム上から別ウィンドーとして Acrobat Reader が起動してくる
    わけではありません

    尚、表示している部分のロジックは

    If StrConv(strExt, vbUpperCase) = ".PDF" Then
    bOk = AxAcroPDF1.LoadFile(SetPDFName(strFiles(i)))
    End If

    にて表示しています

    参照設定は
     AxAcroPDFLib です

    PDFをプレビューした際に画面には READER のボタン等がマウスを動かす事により
    浮かび上がり、印刷ダイアログを表示できるのですが
    B5 で印刷できるのであれば
    フォームに任意のボタンを配置し
    このボタンを押す事によりダイアログを表示しデフォルト値として最初からA4→B5 の
    設定をしてあげれれば使用者にとって使いやすくなるのではと思っています

    これから一度、AutoIT というソフトを見てみます

    他にプロパティ等で設定できるようであれば
    教えていただければと思います

  14. 木村さんへ

    >・・Adobe PDF Reader の COMコンポーネントを貼り付けて・・

    これに関する検証は4年前の内容なのであまり覚えてはいないのですが・・。
    確かReaderのCOMコンポーネントだと不安定で動作確認が出来なかった記憶が有ります。
    仮のテスト環境(WindowsXP + ReaderXI + Excel 2007)で動作確認をしようとしたところ、Readerのコントロールをフォームに貼り付ける時にExcel本体が異常終了します。
    ※今も再確認をしましたが、結果は同じでした。但し、OSがWindows 7 64bitだと正常に出来ます。

    当方の(全く使いこなして無い)Visual Studio 2013でAdobe PDF Reader の COMコンポーネントを貼り付けての動作確認はできました、が。
    Acrobat + Reader の混在環境なので、はたしてどちらでインストールしたコンポーネントかは不明です。
    ただ、コントロール上に表示される印刷ボタンをクリックするとAcrobatの方の印刷ダイヤログが表示されるので、多分Acrobat側のAdobe PDF ReaderのCOMコンポーネントと思われます。

    Readerのみの確認環境が無いので、木村さんの結果が正解となります。

    と言うことで本題のAxAcroPDFオブジェクトの話に戻ります。
    当サイトで知る限りの情報ではAxAcroPDFオブジェクトの「A4→B5 の設定」が出来るプロパティ等は存在しません。
    正確には「当サイト上では無い」と言う事になります。

    AutoIT を使えば自動クリック等が出来るので逃げれることにはなりますが、今一度別の手がないかを検討してみます。
    開発している木村さんには時間が無いとは思いますが、3日ください。
    それで返事が無い時は今までのコメントが返答の全てと思って下さい。

    フォームの上部に「デフォはA4です!」とデカデカと表示するってのは、ダメですよね(汗

  15. Adobe Readerの印刷でデフォルトの用紙サイズを動的に変更する方法の技術調査結果メモ

    ▼検証1:結果は☓
    ・レジストリの変更で可能かテスト
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers\****\DsDriver]
    printMediaReady A4 -> JIS B5
    ・結果はAcrobat Readerの印刷ダイアログに反映されない

    ▼検証2:結果は☓
    ・デフォルトプリンターの印刷設定をA4からB5(JIS B5)に変更する
    ・Acrobat Reader起動 -> 印刷 -> ダイアログにサイズ確認 -> JIS B5
    ・結果は Acrobat Readerの印刷ダイアログに反映された
    ・レジストリの変化を調査するが、検証1ぼ場所は無変化
     [HKEY_CURRENT_USER\Printers]下が変化するがバイナリー箇所なので
     到底出来ない。

    ▼検証3:結果は△
    ・「VB.NETからWinAPIを使って部数指定してPDFファイルを印刷」
    http://qa.atmarkit.co.jp/q/3300
    ・Vistal Studio 2008 for VB
    http://wisdom.sakura.ne.jp/system/winapi/win32/win154.html
    >dmPaperSize には、用紙のサイズを指定します
    >このメンバには、次の定数のいずれかを指定します
    >用紙の幅と高さを dmPaperLength と dmpaperWidth で指定する場合は 0 を指定できます
    定数:DMPAPER_A4 サイズ:A4 シート、210 × 297 mm
    定数:DMPAPER_B5 サイズ:B5 シート、182 × 257 mm

    検証3のWindowsAPI経由でデフォルトプリンターの用紙サイズを変更すれば出来る、
    かもしれない。※未検証

  16. 管理人様

    早速の調査とご回答をありがとうございます

    いただきました情報をもとに実装を試みてみたいと思います
    また結果をご報告させていただきます

    ありがとうございました

  17. 初めまして、上記ページが大変勉強になりました。ありがとうございました。

    仕事上で、
    ①ACCESS VBAであるフォルダ複数PDFファイルを特定キーワードを検索し、ヒットされたファイル名をサブフォムに格納。(TXT経由実現)
    ② ①のあるファイルをクリックするとヒットされたページをフォーム上表示したいです。

    [質問]
    上記フォーム上の検索方法

    わかりましたらお教えていただけませんでしょうか

    よろしくお願いいたします

    [環境]
    Windows7 64bit
    ACCESS 2010
    Adobe Acrobat X

  18. 呉 さん
    はじめまして。

    呉さんの仕様にそった内容でしたら以下のコメント(URL)を御覧ください。
    http://pdf-file.nnn2.com/?p=203&cpage=1#comment-930
    上記のコメントにサンプルが書かれています。
    その中にOpenしたPDFの各ページ単位のテキストが集計されています。
    それを検索すれば、該当PDFとページ番号の取得ができるはずです。
    なお、上記サンプルの再検証を当サイトではしていません。

    次にPDFのページ単位での表示ですが
    当サイト・サンプルの最上部にURLやファイルパスをセットするテキストボックスrが有ります。
    そこに以下の様に拡張子「.pdf」の後に「#page=20」の様にページ番号を付けてやるとそのページを最初に開いてくれます。
    I:\Adobe PDF\Upgrading.pdf#page=20
    これはWebブラウザ内でPDFを表示する時に使えるパラメータと同じです。
    以下にその説明文が公開されていますので御覧ください。
    http://kb2.adobe.com/jp/cps/511/511759/attachments/511759_pdf_open_parameters.pdf#page=5

    と、返事をしようかと思ったのですが・・・、待てよ?


    以下からはサイト管理人が返答時に調査した技術メモのツブヤキです。

    ▼① AcroExch.AVDoc:FindText メソッド
    Acrobat OLEを使ってのテキスト検索するメソッドは上記の「FindTextメソッド」だけ。
    このメソッドの最大の欠点は注意書きにも書いてるが、
    1. 画面表示で実行される
    2. 1. の理由でCPUと時間が掛かる
    記事も古く、最新バージョンでは動作未確認。

    ▼② AFormAut : ExecuteThisJavascript メソッド
    上記でAcrobat JavaScriptが実行できるし、その結果も取得(event.value)できる。
    しかし、知識が無いAcrobat JavaScriptをどこで見つける?

    ▼③ Acrobat JavaScript
    JavaScript™ for Acrobat® API Reference
    Adobe® Acrobat® SDK バージョン 8.0
    511727_js_api_reference_c.pdf

    P.266 文字列検索のサンプル 例2
    P.609 searchメソッド

    ■現時点での調査結果
    ③のP.266の例2のサンプルから 変数 i が検索出来たページ番号になる。
    それを event.value で②のサンプルで返した方が超高速で検索結果をまとめることが出来る。しかし、この②のサンプルは英語の単語単位(1バイト文字列)の検索。Acrobatは日本語文字(2バイト文字)の単語検索に未対応だったはず(最新バージョンは未確認)。
    よってページ単位でテキストを結合・集計して、その中を検索する。そして該当ページを割り出す。 それが出来たら上記②の方法でOLE経由の・・・

    for (var p = 0; p < this.numPages; p++) { var pData = ""; var hit = -1; var numWords = this.getPageNumWords(p); for (var i=0; i= 0) {
    hit = i;
    break;
    }
    }
    event.value = iif(hit=-1 , hit , i);

    ダメだ~!
    時間切れ。
    明日以降にまた続きを書かせて頂きます。(・・疲 + 眠

  19. 呉 さんへ。
    結論から先に。

    AcroExch.PDTextSelect:GetText メソッド
    上記のサンプルを参考にしてください。

    1.以下のShowステートメントは削除して構いません。2~3秒早くなるかも。
    lRet = objAcroApp.Show ‘(TEST用)

    2.サンプルはテキストファイルへ出力しています。そこを修正でページ単位にテキスト結合し、それをAccess MDBに出力する事をオススメします。
    検索はそのAccessレコードから行う。
    次回の検索はAccess MDBを使えば何割か高速化、及び将来的な拡張性も容易になるかと予想しています。

    ページ指定でPDFを表示するのは前のコメントの内容を見てください。

    Acrobat JavaScript を使えば2割ほどの高速化が出来るみたいですが、以下の問題点が有ります。

    1) Acrobat JavaScript と言う公開情報が乏しい新しい言語を覚える必要が有る。
    2) Acrobat JavaScript には単語検索と言う機能が有る。しかしこれは1バイト文字列、つまり英文しか対抗していない。2バイト文字列の日本語は無視されて処理できない。 <- テストで確認済み
    3) ネット検索「Acrobat JavaScript 日本語の検索」「Acrobat JavaScript 日本語の文字列の検索」等でネット検索したが、技術情報が見つけられなかった。

    これにより「AcroExch.PDTextSelect:GetText メソッド」のサンプルの使用がベストかと思われます。

    解決につながれば幸いです。


    以下はサイト管理人の返答にいたった経緯の技術メモです。
    見なくても結構です。

    1つ前のコメントの
    ① ② ③ は同様。

    ④ 作成した検証用のAcrobat JavaScript

    var ckKey = "Acrobat"; // 検索キーワード
    var pText; // ページの全テキスト
    var pHitCnt; // ページでヒットした件数
    var cntCsv = ""; // 処理結果csv
    for (var p = 0; p < this.numPages; p++){
    //ページ単位で文字列の結合
    pText = "";
    var numWords = this.getPageNumWords(p);
    for (var i=0; i < numWords; i++){
    var ckWord = this.getPageNthWord(p, i, true);
    pText = pText + ckWord;
    }
    //ページ単位で文字列の検索
    pHitCnt = 0;
    var result = pText.indexOf(ckKey);
    while (result != -1){
    pHitCnt++;
    result = pText.indexOf(ckKey,result + 1);
    }
    //app.alert(p + "=" + i + ":" + pHitCnt + " ");
    //検索結果をCSV形式の文字列に編集
    if (p==0) {
    cntCsv = pHitCnt;
    }else{
    cntCsv = cntCsv + "," + pHitCnt;
    }
    }
    app.alert(cntCsv);

    OLEよりも2割ほど高速処理が出来たが、2バイト文字の日本語は無理された。

    ⑤ Acrobat JavaScriptの作成、及び検証のテストは以下を参考にして行った。
    Acrobat JavaScript デバッガー・コンソールでJavaScriptを実行する

    以上。

  20. 管理人さんへ
    遅く返事すみません。早速のご回答をありがとうございます

    いただきました情報をもとに試みてみたいと思います。
    IT専門ではないため、VBAしかわかりませんので、
    試行錯誤の結果をご報告させていただきます。

    どうもありがとうございました。

  21. 管理人さんへ
    遅く返事すみません。この何日間、ご教示されていただいたことを基にいろいろ試しました。
    AcroExch.AVDoc:FindText メソッドについて、AcrobatXで作動しないようです。
    Acrobat JavaScriptについて、レジスト書き込み権限は当方が持ちません。現在また試している最中です。
    AcroExch.PDTextSelect:GetText メソッドについて、いただいたプログラムで無修正で、ACCESS2010とAcrobatXで実行できました。

    まず上記のことをご報告させていただきます。

    どうぞよろしくお願いします。

  22. 呉さんへ

    呉さんが作ろうとしているのは場合によってはAcrobat本体が持っている複数ファイルの検索よりは使い勝手のイイ物ができような気がします。
    頑張ってください。

  23. 管理人へ
    今週ちょっと仕事が忙しくて、時間はなかった。今日仕事終了、やっと教えていただいたことをも一回考えました。やっと教えていただいた内容を完全理解しました:AcroExch.PDTextSelect:GetText メソッドサンプルを使い、できたテキストをpageごとACCESS tableに保存し、あと検索時、talbeを検索し、得たページをAcroPDFLib.AxAcroPDF:Excel VBAサンプルにで目的PAGEを表示させます。
    Javascriptがなくでもいいですね。

    素人のため、ほぼプログラムの基礎知識が乏しいです。

    来週、あらかじめ、ご報告させていただきます。

    どうぞよろしくお願いします。

    --------------------------------------------------------------------------------

    ▼ トップ (TOP) 画面 ▼
    管理人
    .

    PDF

    VBA(Excel)からAcrobat経由でPDFをプログラミング操作(OLE:IAC)する

    AcroPDFLib.AxAcroPDF:Excel VBAサンプル

  24. 呉さんへ

    そんなに急がなくても。
    こちらも試行錯誤で作っている物があるので、
    報告は年が明けたころでイイですよ。(真顔

  25. 管理人へ
    こんばんは。おかげさまで、基本部分ができました。ご報告いたします。
    ①教えていただいた通り、ページことテキストをACCESS Tableに入れる
    ②ACCESS Tableで検索、得た結果のページ番号をPDFページ番号に
    ③I:\Adobe PDF\Upgrading.pdf#page=20のようなことができませんでした。ネットに調べたら、Acrobat 7.05以後ダメみたいでした。代わりに、いただいたサンプル「cmdReadPDF_Click」を使い、無事に目的ページを開きました。

    また残った課題
    ①自分のソースPDFはA4縦とA4横両方があります。フォーム左は検索キーおよび検索ヒットしたPDFタートルとページが表さたサブフォームで、右はAcroPDF1、約スクリーンの2/3、ランしたら、PDFはこの2/3の中央じゃなく、右い寄って表示されます。いろいろ調べでも、直す方法はわかりませんでした。ご教示いただけませんでしょうか。(スクリーンショットを送りたいですが、方法はわかりません)
    ②検索キーをPDFハイライドしたいですが、今思うできることば、Sendkeyぐらいですが、別方法があるでしょうか。

    どうぞよろしくお願いします。


    フォムが下記のようなイメージです。
    --------------------------------------------------------------------* 検索キー  *                              ++++++++++++++++++++                               *                  *                               +                               *         +*                  *                               +                               *    +*                  *                               +                               *         +*                  *                               +                               *         +*                  *                               +                               *         +    *                  *                               +                               *         +*                  *                               +                               *         +*                  *                               +                               *         +*                  *                               +                               *         +*                  *                               +                               *         +*                  *                               +                               *         +*                  *                               ++++++++++++++++++++---------------------------------------------------------------------          ↑表示されたPDF右
    ↑フォーム左 ↑デザインPDF左  ↑表示されたPDF左 ↑フォーム右
     

コメントを残す

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

CAPTCHA


★ 文章での質問は難しいですよネ。でも、早く解決して、家に帰りたい。


SAMURAI Plugin

コメントをする時は出来れば以下もお願いします。

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン
コメントにサンプルコードを入れる時はコードを全て全角文字列にしてください。コチラで半角に戻します。それでもエラーが回避できない時はコメント下さい。個別に対処します。



お仕事で当サイトを見ている方へ
考え込んだら、ご質問下さい。
一緒に解決策を考えましょう。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください