AcroExch.AVDoc: FindText メソッド

TOP > AcroExch.AVDoc > FindText      [...]


説明

指定されたテキスト(文字列)を検索して、それが目に見えるように画面スクロールし、選択状態にします。

※当サイト管理人は使用を推奨しません。<注意>を参照。

形式

VARIANT_BOOL FindText(BSTR szText,
                                     long bCaseSensitive,
                                     long bWholeWordsOnly,
                                     long bReset);

戻り値

  • 戻り値が0の場合は検索成功。
  • 戻り値が0以外の場合は検索出来なかった。

引数

  1. 第1引数(BSTR szText):
    検索する文字列。
  2. 第2引数(long bCaseSensitive):
    正の数の場合は検索では大文字と小文字を区別します。
    0の場合は区別しません。
  3. 第3引数(long bWholeWordsOnly):
    正の数の場合は単語単位で検索します。
    0の場合は部分単位で検索します。
  4. 第4引数(long bReset):
    正の数の場合はドキュメントの最初のページから検索を始めます。
    0の場合、現在のページから検索を始めます。

動作するバージョン

VersionAdobe
Acrobat
備考
4NOAcrobat 4.0    ※Windows 98SE + Excel 2000
5
NO
Acrobat 5.0.5
6
NO
Acrobat 6.0.3 Pro
7OKAcrobat 7.0.9 Pro
Acrobat 7.1.4 Pro
8OKAcrobat 8.2.2 Pro
9OKAcrobat 9.3.2 Extended
10-Acrobat X (10.1.8) Extended
11-Acrobat XI (11.0.04) Extended
  • OK = 動作する。
  • NO = 動作しない。 戻り値が0を返す。 プログラム処理が出来ない。
  • - = 未確認。

Acrobat v4 , v5

FindTextメソッドは実行出来ますが、最後まで検索が終わると以下のダイアログ画面が出てしまうので、「NO」扱いにします。

FindText : Acrobat v4 の実行結果

なお、上記ダイアログ画面で「キャンセル」ボタンをクリックすると、戻り値は「0」が返ります。

Acrobat v6

FindTextメソッドを実行すると、Acrobat画面右側に検索結果ペインが表示されます。

そして次にFindTextメソッドを連続実行するとこの検索結果ペインが邪魔をしてうまく検索が出来なくなります。

※サンプル②は正常に処理されません。

(検索頁番号が取得出来ない。検索結果で該当文字列が選択状態にならない。)

FindText : Acrobat v6 の実行結果

 

 


サンプル①:ExcelのVBA

説明:該当文字列がPDF上に存在するかチェックする。

  • F8キーでステップ実行しながら動作確認する。
  • 事前に参照設定をする。
001 Sub AcroExch_AVDoc_FindText() 002 003 'Acrobatオブジェクトの定義&作成 004 'Acrobat 4,5,6 の時 005 ' Dim objAcroApp As Acrobat.CAcroApp 006 ' Dim objAcroAVDoc As Acrobat.CAcroAVDoc 007 ' Set objAcroApp = CreateObject("AcroExch.App") 008 ' Set objAcroAVDoc = CreateObject("AcroExch.AVDoc") 009 010 'Acrobat 7,8,9,10,11 の時 011 Dim objAcroApp As New Acrobat.AcroApp 012 Dim objAcroAVDoc As New Acrobat.AcroAVDoc 013 014 '以降はAcrobat全て共通 015 Dim lRet As Long '戻り値 016 017 '①PDFファイルを開く。(メモリ上) 018 lRet = objAcroAVDoc.Open("C:\work\Test01.pdf", "") 019 '②Acrobatアプリケーションを起動し、画面表示する。 020 lRet = objAcroApp.Show 021 022 'Test01.pdfから"Acrobat"文字列を検索する。 023 lRet = objAcroAVDoc.FindText("Acrobat", 1, 1, 1) 024 025 'PDFファイルを閉じます。 026 '※変更は保存されません。 027 lRet = objAcroAVDoc.Close(1) 028 029 'Acrobatアプリケーションを終了する。 030 lRet = objAcroApp.Hide 031 lRet = objAcroApp.Exit 032 033 'オブジェクトを強制解放する 034 Set objAcroAVDoc = Nothing 035 Set objAcroApp = Nothing 036 037 End Sub


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


サンプル②:ExcelのVBA

説明:PDF上の該当文字列を頁単位でカウントする。

  • F8キーでステップ実行しながら動作確認する。
  • 事前に参照設定をする。
001 Sub AcroExch_AVDoc_FindText1() 002 003 'Acrobatオブジェクトの定義&作成 004 'Acrobat 4,5,6 の時 005 ' Dim objAcroApp As Acrobat.CAcroApp 006 ' Dim objAcroAVDoc As Acrobat.CAcroAVDoc 007 ' Dim objAcroPDDoc As Acrobat.CAcroPDDoc 008 ' Dim objAcroAVPageView As Acrobat.CAcroAVPageView 009 ' Set objAcroApp = CreateObject("AcroExch.App") 010 ' Set objAcroAVDoc = CreateObject("AcroExch.AVDoc") 011 ' Set objAcroPDDoc = CreateObject("AcroExch.PDDoc") 012 013 'Acrobat 7,8,9,10,11 の時 014 Dim objAcroApp As New Acrobat.AcroApp 015 Dim objAcroAVDoc As New Acrobat.AcroAVDoc 016 Dim objAcroPDDoc As New Acrobat.AcroPDDoc 017 Dim objAcroAVPageView As Acrobat.AcroAVPageView 018 019 '以降はAcrobat全て共通 020 Dim lRet As Long '戻り値 021 022 Dim i As Long '添え字 023 Dim lAllPageCnt As Long '開いたPDFの全頁数 024 Dim lGetPageNum As Long '現在処理中が頁番号 025 Dim lPageFindCnt() As Long '各頁番号に含まれている検索キーの合計 026 Dim lCnt As Long '各種処理件数:ワーク 027 028 Dim strText As String '1ページ単位の抽出テキスト 029 Dim lFileNo As Long 'ファイル番号 030 031 '最大処理件数 032 Const COM_MAX_LOOP_CNT = 9999 'デバッグ用 033 'PDFファイル 034 Const CON_PDF_FILE = "C:\work\test4.pdf" 035 'ログファイル:Test用 036 Const CON_OUT_FILE = "C:\work\test7.txt" 037 '検索キー 038 Const CON_SELTEXT = "JavaScript" 039 040 '①PDFファイルを開く(メモリ上) 041 lRet = objAcroAVDoc.Open(CON_PDF_FILE, "") 042 '②Acrobatアプリケーションを起動し、画面表示する 043 lRet = objAcroApp.Show 044 045 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() 046 '開いたPDFドキョメントの全ページ数を取得する 047 lAllPageCnt = objAcroPDDoc.GetNumPages() 048 '事前チェック 049 If lAllPageCnt = 1 Then 050 MsgBox "1頁しかないPDFファイルは処理出来ません。" _ 051 & vbCrLf & "処理は中断しました。", vbOKOnly, "実行エラー" 052 GoTo AcroExch_AVDoc_FindText1_Exit: 053 End If 054 055 '配列の動的再作成 056 ReDim lPageFindCnt(lAllPageCnt + 1) 057 058 Set objAcroAVPageView = objAcroAVDoc.GetAVPageView() 059 '最初のページに移動 060 lRet = objAcroAVPageView.Goto(0) 061 062 '初期化 063 For i = LBound(lPageFindCnt) To UBound(lPageFindCnt) - 1 064 lPageFindCnt(i) = 0 065 Next i 066 lGetPageNum = 0 067 lCnt = 0 068 069 '各頁の検索件数をlPageFindCnt配列に格納する 070 For i = 0 To COM_MAX_LOOP_CNT 071 072 '画面の最前列に表示します。 073 lRet = objAcroAVDoc.BringToFront() 074 'テキスト検索をする 075 If i = 0 Then 076 '先頭ページから検索 077 lRet = objAcroAVDoc.FindText(CON_SELTEXT, 0, 0, 1) 078 Else 079 '先頭ページ以外を検索 080 lRet = objAcroAVDoc.FindText(CON_SELTEXT, 0, 0, 0) 081 End If 082 083 If lRet = 0 Then 084 'EOFになった。 085 Exit For 086 End If 087 088 Set objAcroAVPageView = objAcroAVDoc.GetAVPageView() 089 '③検索できたPDF上の頁番号を取得する 090 lRet = objAcroAVPageView.GetPageNum 091 If lGetPageNum > lRet Then 092 '先頭ページの戻ったので検索終了 093 Exit For 094 End If 095 '現在処理中のページ番号を保存 096 lGetPageNum = lRet 097 098 '検索したカウントを集計する 099 lPageFindCnt(lGetPageNum) = lPageFindCnt(lGetPageNum) + 1 100 lCnt = lCnt + 1 101 102 Next i 103 104 '処理の制限チェック 105 If i >= COM_MAX_LOOP_CNT Then 106 MsgBox "当処理は制限処理件数(" & COM_MAX_LOOP_CNT & ") を越えました。" _ 107 & "処理は中断しました。", vbOKOnly, "実行エラー" 108 GoTo AcroExch_AVDoc_FindText1_Exit: 109 End If 110 111 '結果をテキストファイルに書き出す:Test用 112 lFileNo = FreeFile() 113 Open CON_OUT_FILE For Output Access Write As lFileNo 114 Print #lFileNo, "PDF-File=(" & CON_PDF_FILE & ")" 115 For i = LBound(lPageFindCnt) To lAllPageCnt - 1 116 Print #lFileNo, "Page(" & i + 1 & ")=" & lPageFindCnt(i) 117 Next i 118 Print #lFileNo, "合計(" & lCnt & ")件 " 119 Close #lFileNo 120 121 AcroExch_AVDoc_FindText1_Exit: 122 123 'PDFファイルを閉じます。 124 lRet = objAcroAVDoc.Close(1) 125 126 'Acrobatアプリケーションを終了する。 127 lRet = objAcroApp.Hide 128 lRet = objAcroApp.Exit 129 130 'オブジェクトを強制解放する 131 Set objAcroAVPageView = Nothing 132 Set objAcroPDDoc = Nothing 133 Set objAcroAVDoc = Nothing 134 Set objAcroApp = Nothing 135 136 End Sub


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


補足

  • 連続して次の文字列を検索したい時は
    lRet = objAcroAVDoc.FindText("Acrobat", 1, 1, 0)
    と第4引数を 0 にして使う。 ※サンプル②参照
  • 文字列の検索は以下のサンプルを見本にして下さい。
    AcroExch.HiliteList:Add メソッド
    http://pdf-file.nnn2.com/?p=175
    strText変数にPDF上の1ページ分の文字列が全て入っています。
    (PDFを見た感じとは異なり、フッダー、ヘッダー、本文の順と入っている場合有り)
    その文字列からVBAならInStr関数で検索します。

注意

  • FindTextメソッド間にSendKeysステートメントなどの命令を入れるとFindTextメソッドは正常に検索してくれません。
  • Showメソッドの位置に注意が必要です。
    Openメソッドの後にShowメソッドを使用しないと何もPDFドキュメントを開いていない画面が表示されたり、Test01.PDFが画面表示されない不具合が発生します。(Acrobat v8 v9 の場合)
  • 当サイトではFindTextメソッドの使用は推奨しません。
    理由① : EOFが戻り値に無いので、PDFページが1頁しか無い時に検索の終了判定が出来ない。
    理由② : FindTextメソッドが成功しても、その該当PDFページ番号を得れるとは限らない。
    理由③ : CPUに非常に負荷が掛かっている時に動作させると、検索をスキップしてしまう場合がマレに有る。
    ※テスト結果より。
  • FindTextメソッドを使用するには以下の条件が必要です。
    ① 2頁以上の頁を持つ
    ②CPUに負荷が掛かっていない
    ③ページ単位の関数カウントを行わない。※PDF全体の件数カウントはOK
  • Acrobat v6で検索対象文字列が無くても、lRet=-1(True)が返る。不具合みたいです。
    ※ゼロ件テスト要!

動作確認環境

  • Windows98SE( + WindowsUpdate)
    + Acrobat 4.0 + Office 2000
  • WindowsXP Pro( + SP3 + WindowsUpdate)
    + Acrobat 5.0.5 + Office 2003( + SP3)
  • WindowsXP Pro( + SP3 + WindowsUpdate)
    + Acrobat 6.0.3 Pro + Office 2003( + SP3)
  • WindowsXP Pro( + SP2 + WindowsUpdate)
    + Acrobat 7.0.9 Pro + Office 2003
  • WindowsXP Pro( + SP3 + WindowsUpdate)
    + Acrobat 7.1.4 Pro + Office 2003( + SP3)
  • WindowsXP Pro( + SP3 + WindowsUpdate)
    + Acrobat 8.2.2 Pro + Office 2003( + SP3)
  • WindowsXP Pro( + SP3 + WindowsUpdate)
    + Acrobat 9.3.2 Extended + Office 2003( + SP3)

Adobe Web 解説 URL(英語) v9.1

http://livedocs.adobe.com/acrobat_sdk/9.1/Acrobat9_1_HTMLHelp/IAC_API_OLE_Objects.103.37.html

戻る


キーボード

ブラウザ画面の文字サイズを変更するショートカットキー

  1. [ CTRL ] + [ + ]  :  文字を大きく

  2. [ CTRL ] + [ - ]  :  文字を小さく
Shortcut Keys

  1. [ CTRL ] + [ + ]  :  Up the font size

  2. [ CTRL ] + [ - ]  :  Down the font size

「AcroExch.AVDoc: FindText メソッド」への7件のフィードバック

  1. こちらのサイトはPDFプログラムに関する資料が豊富でとても助かっております。

    さっそくですが、FindTextメソッドの戻り値について質問ですが、
    文字列が検索できなくてもTrueが返ってきます。

    具体的には、下記のvbsスクリプトで試していますが、
    「あああ」のないPDFで試しても
    Trueが返ってきます。

    よろしければご教授願います。

    'ファイル名を取得
    FileName = WScript.Arguments(0)

    'ドキュメントを開く
    Set AVDoc1 = CreateObject("AcroExch.AVDoc")
    Ret = AVDoc1.Open(FileName,"")

    'Acrobatを起動
    Set objAcroApp = CreateObject("AcroExch.App")
    Ret = objAcroApp.Show

    '文字の検索
    'PDFドキュメントの先頭ページから文字列検索する
    KensakuText = "あああ"

    Ret = AVDoc1.FindText(KensakuText, False, False, True)

      '戻り値を確認
    MsgBox TextKensaku & "--- return = " & Ret

    AVDoc1.Close 1
    Set AVDoc1 = Nothing
    objAcroApp.Hide
    objAcroApp.Exit

    [環境]
    WindowsXP Pro SP3
    Acrobat 6.0 Professional
    バージョン 6.0.3.2004113000
    Acrobat Reader
    バージョン 9.3.3.177

  2. Hideoさん。初めまして。

    Acrobat v6 では確かにTrueが返ってきます。
    Acrobat v8 ではFalseが返ってきます。
    ゼロ検索テストは上記では確認していませんでした。(恥

    困りましたね。
    と言うか、このFindTextメソッド関連で他の人から質問を受けていて、回答保留中です。
    結局は使うのを諦めました。
    非常に癖があり、FindText出来たからといって、その結果が思わしくないからです。
    結論から言うと「使うのは推奨できません」と出しました。

    それで逃げ手ですが以下のURLのサンプルを見てください。

    AcroExch.HiliteList:Add メソッド
    http://pdf-file.nnn2.com/?p=175

    Acrobat v6環境での動作確認済みです。
    このサンプルのstrText変数にPDF上の1ページ分の文字列が全て入っています。
    (PDFを見た感じとは異なり、フッダー、ヘッダー、本文の順と入っている場合有り)
    その文字列からVBAならInStr関数で検索します。

    回答になっているでしょうか。

  3. ありがとうございました!
    ご教授の通りでバッチリです。

    サンプルのURLを参考に
    HiliteList:Add メソッドとInstr関数の
    組み合わせで上手くできました。

  4. こちらのサイトにはVBAでPDFのコーディングするのに非常に勉強になります。
    FindTextについて、どうしてもわからず質問させていただきます。
    開発はwin7,office2007,DC proを使用しています。
    やりたいことは、FindTextのサンプル2の内容そのままで、数百ページあるPDFから指定した文字列が、何ページにあるか調べるプログラムです。
    サンプル2をそのままで見事にやりたいことができたのですが、検索文字列にPDFファイルにない文字列で検索をすると「別のアプリケーションが OLE の操作を完了するのには待機しています。」が出て検索ができなくなります。
    on error gotoでもエラーにならず、また、FindTextの次の行にMsgBoxを記載しても何も表示されないので、FindTextが戻ってこないのかと考えています。
    何か原因をご存知であれば御教授していただけないでしょうか。
    宜しくお願い致します

  5. PDF初心者プログラマー さん
    はじめまして
    取り急ぎ、思い出せる範囲で返答させて頂きます。

    Acrobat DC 環境が無く、その他の確認環境も今は起動できないので・・すが。

    そのメッセージはOLEから制御が長く帰ってこない時にOSが出しているメッセージです。基本的に待つしか手がないです。このメッセージが出る時はプログラムの不具合、又はAcrobat上でのバグの場合も有ります。今回はDCのバグっぽいです、が。

    対処1) プログラムのバグの場合
    objAcroApp.CloseAllDocs
    上記の命令をどのOLEを実行する前に実行して下さい。
    例えばサンプル②の場合は
    lRet = objAcroAVDoc.Open(CON_PDF_FILE, "")
    の前にです。
    何らかの不具合でPDFファイルがオープン済みになってると次の実行時に変なエラーが出ます。CloseAllDocs メソッドで強制的に開いているPDFを閉じてしまいます。開いてなくてもエラーにもならないので邪魔にはなりません。オマジナイ的な命令です。

    対処2) 対処1でもダメな時は。
    逃げ手ですが、以下のサンプルを御覧ください。
    AcroExch.HiliteList:Add メソッド
    上記でページ上のテキストが取得できるはずです。
    それで事前にチャックスする。
    ただ、日本語文字列も取得できたかが、・・思い出せない。(恥
    ひょっとしたらコッチのサンプルの方が処理速度が早いかもしれません。
    ご確認ください。

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

  6. 対処1では無理でした。
    なので、対処2で何とか対応ができました。
    検索文字があれば上手くいくのに、バグなんですかね?
    何かモヤモヤしますが。
    結果できたので、ありがとうございました。

コメントを残す

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

CAPTCHA


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


SAMURAI Plugin

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

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン
コメントにサンプルコードを入れるとエラーになる場合が有ります。その時はコードの前後に <code> ・・・</code> タグを入れてください。

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