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の場合、現在のページから検索を始めます。

 

動作するバージョン

Version Adobe
Acrobat
備考
4
NO
Acrobat 4.0    ※Windows 98SE + Excel 2000
5
NO
Acrobat 5.0.5
6
NO
Acrobat 6.0.3 Pro
7
OK
Acrobat 7.0.9 Pro
Acrobat 7.1.4 Pro
8
OK
Acrobat 8.2.2 Pro
9
OK
Acrobat 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キーでステップ実行しながら動作確認する。
  • 事前に参照設定をする。

 

Sub AcroExch_AVDoc_FindText()

    'Acrobatオブジェクトの定義&作成
    'Acrobat 4,5,6 の時
'    Dim objAcroApp   As Acrobat.CAcroApp
'    Dim objAcroAVDoc As Acrobat.CAcroAVDoc
'    Set objAcroApp   = CreateObject("AcroExch.App")
'    Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")
    
    'Acrobat 7,8,9,10,11 の時
    Dim objAcroApp As New Acrobat.AcroApp
    Dim objAcroAVDoc As New Acrobat.AcroAVDoc

    '以降はAcrobat全て共通
    Dim lRet As Long    '戻り値
    
    '①PDFファイルを開く。(メモリ上)
    lRet = objAcroAVDoc.Open("C:¥work¥Test01.pdf", "")
    '②Acrobatアプリケーションを起動し、画面表示する。
    lRet = objAcroApp.Show

    'Test01.pdfから"Acrobat"文字列を検索する。
    lRet = objAcroAVDoc.FindText("Acrobat", 1, 1, 1)

    'PDFファイルを閉じます。
    '※変更は保存されません。
    lRet = objAcroAVDoc.Close(1)

    'Acrobatアプリケーションを終了する。
    lRet = objAcroApp.Hide
    lRet = objAcroApp.Exit

    'オブジェクトを強制解放する
    Set objAcroAVDoc = Nothing
    Set objAcroApp = Nothing

End Sub

 


サンプル②:ExcelのVBA

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

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

 

Sub AcroExch_AVDoc_FindText1()

    'Acrobatオブジェクトの定義&作成
    'Acrobat 4,5,6 の時
'    Dim objAcroApp   As Acrobat.CAcroApp
'    Dim objAcroAVDoc As Acrobat.CAcroAVDoc
'    Dim objAcroPDDoc As Acrobat.CAcroPDDoc
'    Dim objAcroAVPageView As Acrobat.CAcroAVPageView
'    Set objAcroApp   = CreateObject("AcroExch.App")
'    Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")
'    Set objAcroPDDoc = CreateObject("AcroExch.PDDoc")
    
    'Acrobat 7,8,9,10,11 の時
    Dim objAcroApp      As New Acrobat.AcroApp
    Dim objAcroAVDoc    As New Acrobat.AcroAVDoc
    Dim objAcroPDDoc    As New Acrobat.AcroPDDoc
    Dim objAcroAVPageView As Acrobat.AcroAVPageView

    '以降はAcrobat全て共通
    Dim lRet            As Long     '戻り値
    
    Dim i               As Long     '添え字
    Dim lAllPageCnt     As Long     '開いたPDFの全頁数
    Dim lGetPageNum     As Long     '現在処理中が頁番号
    Dim lPageFindCnt()  As Long     '各頁番号に含まれている検索キーの合計
    Dim lCnt            As Long     '各種処理件数:ワーク
    
    Dim strText         As String   '1ページ単位の抽出テキスト
    Dim lFileNo         As Long     'ファイル番号
    
    '最大処理件数
    Const COM_MAX_LOOP_CNT = 9999  'デバッグ用
    'PDFファイル
    Const CON_PDF_FILE = "C:¥work¥test4.pdf"
    'ログファイル:Test用
    Const CON_OUT_FILE = "C:¥work¥test7.txt"
    '検索キー
    Const CON_SELTEXT = "JavaScript"
    
    '①PDFファイルを開く(メモリ上)
    lRet = objAcroAVDoc.Open(CON_PDF_FILE, "")
    '②Acrobatアプリケーションを起動し、画面表示する
    lRet = objAcroApp.Show
    
    Set objAcroPDDoc = objAcroAVDoc.GetPDDoc()
    '開いたPDFドキョメントの全ページ数を取得する
    lAllPageCnt = objAcroPDDoc.GetNumPages()
    '事前チェック
    If lAllPageCnt = 1 Then
        MsgBox "1頁しかないPDFファイルは処理出来ません。" _
            & vbCrLf & "処理は中断しました。", vbOKOnly, "実行エラー"
        GoTo AcroExch_AVDoc_FindText1_Exit:
    End If
    
    '配列の動的再作成
    ReDim lPageFindCnt(lAllPageCnt + 1)
    
    Set objAcroAVPageView = objAcroAVDoc.GetAVPageView()
    '最初のページに移動
    lRet = objAcroAVPageView.Goto(0)
    
    '初期化
    For i = LBound(lPageFindCnt) To UBound(lPageFindCnt) - 1
        lPageFindCnt(i) = 0
    Next i
    lGetPageNum = 0
    lCnt = 0
    
    '各頁の検索件数をlPageFindCnt配列に格納する
    For i = 0 To COM_MAX_LOOP_CNT
        
        '画面の最前列に表示します。
        lRet = objAcroAVDoc.BringToFront()
        'テキスト検索をする
        If i = 0 Then
            '先頭ページから検索
            lRet = objAcroAVDoc.FindText(CON_SELTEXT, 0, 0, 1)
        Else
            '先頭ページ以外を検索
            lRet = objAcroAVDoc.FindText(CON_SELTEXT, 0, 0, 0)
        End If

        If lRet = 0 Then
            'EOFになった。
            Exit For
        End If
        
        Set objAcroAVPageView = objAcroAVDoc.GetAVPageView()
        '③検索できたPDF上の頁番号を取得する
        lRet = objAcroAVPageView.GetPageNum
        If lGetPageNum > lRet Then
            '先頭ページの戻ったので検索終了
            Exit For
        End If
        '現在処理中のページ番号を保存
        lGetPageNum = lRet
        
        '検索したカウントを集計する
        lPageFindCnt(lGetPageNum) = lPageFindCnt(lGetPageNum) + 1
        lCnt = lCnt + 1
    
    Next i
    
    '処理の制限チェック
    If i >= COM_MAX_LOOP_CNT Then
        MsgBox "当処理は制限処理件数(" & COM_MAX_LOOP_CNT & ") を越えました。" _
            & "処理は中断しました。", vbOKOnly, "実行エラー"
        GoTo AcroExch_AVDoc_FindText1_Exit:
    End If
    
    '結果をテキストファイルに書き出す:Test用
    lFileNo = FreeFile()
    Open CON_OUT_FILE For Output Access Write As lFileNo
    Print #lFileNo, "PDF-File=(" & CON_PDF_FILE & ")"
    For i = LBound(lPageFindCnt) To lAllPageCnt - 1
        Print #lFileNo, "Page(" & i + 1 & ")=" & lPageFindCnt(i)
    Next i
    Print #lFileNo, "合計(" & lCnt & ")件 "
    Close #lFileNo
    
AcroExch_AVDoc_FindText1_Exit:
    
    'PDFファイルを閉じます。
    lRet = objAcroAVDoc.Close(1)

    'Acrobatアプリケーションを終了する。
    lRet = objAcroApp.Hide
    lRet = objAcroApp.Exit

    'オブジェクトを強制解放する
    Set objAcroAVPageView = Nothing
    Set objAcroPDDoc = Nothing
    Set objAcroAVDoc = Nothing
    Set objAcroApp = Nothing

End Sub

 


補足

  • 連続して次の文字列を検索したい時は
    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等) バージョン