AcroExch.HiliteList: Add メソッド

TOP > AcroExCh.HiliteList > Add      [...]


説明

PDFテキスト上の開始位置と個数の情報を持った引数(オブジェクト)を作成します。

この引数(オブジェクト)を特別にハイライトリストと言います。

「テキストをハイライト表示」とは全く関係ありません。※備考も参照。

このハイライトリストは PDPageオブジェクトの CreatePageHiliteメソッド か CreateWordHiliteメソッド を使用する時だけの引数に使うものです。

 

形式

VARIANT_BOOL Add(short nOffset, short nLength);

 

引数

  1. 第1引数(short nOffset):
    文字、文字列、又は単語単位を位置指定する場所。0を開始位置とする。
  2. 第2引数(short nLength):
    第1引数から数えての個数。

 

戻り値

  • -1 : 成功
  • 0 : 失敗

 

動作するバージョン

Version Adobe
Acrobat
備考
4
OK
Acrobat 4.0    ※Windows 98SE + Excel 2000
5
OK

Acrobat 5.0.5
6
OK

Acrobat 6.0.3 Pro
7
NO
Acrobat 7.1.4 Pro
8
NO
Acrobat 8.1.2 Pro
Acrobat 8.2.3 Pro
9
OK
Acrobat 9.3.3 Extended
10
-
Acrobat X (10.1.8) Extended
11
-
Acrobat XI (11.0.04) Extended
  • OK = 動作する。
  • NO = 動作しない。 戻り値が0を返す。
  • - = 未確認。

 






サンプル:Excel のVBA

 

説明: PDFドキュメントの文字列を抽出する。

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

 

Sub AcroExch_HiliteList_Add()

    'Acrobatオブジェクトの定義&作成
    'Acrobat 4,5,6 の時
'    Dim objAcroApp          As Acrobat.CAcroApp
'    Dim objAcroAVDoc        As Acrobat.CAcroAVDoc
'    Dim objAcroHiliteList   As Acrobat.CAcroHiliteList
'    Dim objAcroPDDoc        As Acrobat.CAcroPDDoc
'    Dim objAcroPDPage       As Acrobat.CAcroPDPage
'    Dim objAcroAVPageView   As Acrobat.CAcroAVPageView
'    Dim objAcroPDTextSelect As Acrobat.CAcroPDTextSelect
'    Set objAcroApp = CreateObject("AcroExch.App")
'    Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")
'    Set objAcroHiliteList = CreateObject("AcroExch.HiliteList")
'    Set objAcroPDDoc = CreateObject("AcroExch.PDDoc")
    
    'Acrobat 7,8,9,10,11 の時
    Dim objAcroApp          As New Acrobat.AcroApp
    Dim objAcroAVDoc        As New Acrobat.AcroAVDoc
    Dim objAcroHiliteList   As New Acrobat.AcroHiliteList
    Dim objAcroPDDoc        As New Acrobat.AcroPDDoc
    Dim objAcroPDPage       As Acrobat.AcroPDPage
    Dim objAcroAVPageView   As Acrobat.AcroAVPageView
    Dim objAcroPDTextSelect As Acrobat.AcroPDTextSelect
    
    '以降はAcrobat全て共通
    Dim lRet                As Long '戻り値
    Dim i                   As Long '添え字
    Dim j                   As Long '添え字
    Dim lPages              As Long 'ページ番号
    Dim lCnt                As Long 'カウント
    Dim strText             As String   '文字列
    Dim lFileNo             As Long 'ファイル番号
    
    Const CON_PDF = "C:¥work¥Test01.pdf"
    Const CON_LOG_FILE = "C:¥work¥LOG01.txt"

    'PDFファイルを開く
    lRet = objAcroPDDoc.Open(CON_PDF)
    Set objAcroAVDoc = objAcroPDDoc.OpenAVDoc(CON_PDF)
    '画面にPDFを表示する
    lRet = objAcroAVDoc.Open(CON_PDF, "")     '(注1)
    Set objAcroAVPageView = objAcroAVDoc.GetAVPageView
    Set objAcroPDDoc = objAcroAVDoc.GetPDDoc()
    'Acrobatを起動表示する
    lRet = objAcroApp.Show  '(注1)
    'ハイライトリストを作成する。※ページ中の単語数
    lRet = objAcroHiliteList.Add(0, 32767)

    '開いたPDFドキョメントの全ページ数を取得する
    lPages = objAcroPDDoc.GetNumPages() - 1
    
    '結果をテキストファイルに書き出す
    lFileNo = FreeFile()
    Open CON_LOG_FILE For Output Access Write As lFileNo
    Print #lFileNo, "(" & CON_PDF & ") file 総Page数=" & _
        lPages + 1 & " Start=" & Now()
    
    For i = 0 To lPages
        'ページ単位のPDPageオブジェクトを作成する
        Set objAcroPDPage = objAcroPDDoc.AcquirePage(i)
        'ハイライトリスト(objAcroHiliteList)からページ単位の
        'テキスト選択のPDTextSelectオブジェクトを作成する
        Set objAcroPDTextSelect = _
            objAcroPDPage.CreatePageHilite(objAcroHiliteList)
        '抽出した文字列の数(Index)を取得する
        lCnt = objAcroPDTextSelect.GetNumText() - 1
        strText = ""
        For j = 0 To lCnt
            '単語単位で抽出する
            strText = strText & _
                        objAcroPDTextSelect.GetText(j)
'            Debug.Print strText
        Next j
        
        '一頁分をテキストファイルに出力する
        Print #lFileNo, "**** Page(" & i + 1 & ")=" & _
            " PageWordCnt=" & lCnt & " ****" & vbCrLf & strText
    
    Next i

    Print #lFileNo, "End " & Now()
    'テキストファイルを閉じる
    Close #lFileNo

    'PDFファイルを保存しないで閉じる
    objAcroPDDoc.Close
    'Acrobatを閉じる
    lRet = objAcroApp.Hide      '(注1)
    lRet = objAcroApp.Exit      
    
    'オブジェクトを強制解放する
    Set objAcroPDTextSelect = Nothing
    Set objAcroPDPage = Nothing
    Set objAcroPDDoc = Nothing
    Set objAcroAVDoc = Nothing
    Set objAcroPDTextSelect = Nothing
    Set objAcroAVPageView = Nothing
    Set objAcroApp = Nothing

End Sub 

 

実行結果

PDFファイル(Test01.pdf)のPDFバージョンは「1.3」を使用しました。

 

▼ Acrobat v4.0 の実行結果

上が実行結果のテキストファイルをワードパットで開いた結果。

下が読み込んだPDFファイル。

「版版版版Adobe 」と表示されているが、元のPDFもクリップボードにコピーすると同じ結果「版版版版Adobe 」になる。

これはAcrobat v4 のバグと考えられる。

Acrobat v4 の実行結果

 

▼ Acrobat v5.0 の実行結果

Acrobat v4 と同じPDFファイルを読み込んでいます。

」は正常に読み込んでいます。

Acrobat v5 の実行結果

 

▼ Acrobat v6.0 の実行結果

Acrobat v4 と同じPDFファイルを読み込んでいます。

」は正常に読み込んでいます。

Acrobat v5 と結果は同じです。

Acrobat v6 の実行結果

   

▼ Acrobat v7.1.4 の実行結果

Addメソッドを実行するとVBAが出して異常終了してしまう。

備考の6を参照。

 

▼ Acrobat v8.2.3 の実行結果

Addメソッドを実行するとVBAが出して異常終了してしまう。

備考の6を参照。

(但し、既に環境は無いが、Acrobat v8.1.2 では動作確認が出来ていた。※<- 過去の記録)

 

▼ Acrobat v9.0 の実行結果

Acrobat v4 と同じPDFファイルを読み込んでいます。

」は正常に読み込んでいます。

Acrobat v5 と結果は同じです。

Acrobat v9 の実行結果

 

補足

  1. 実行結果から、Acrobat v4 ,Acrobat v7 と Acrobat v8 では使用しない方がいいです。
  2. (注1)は特に必要ありません。テスト確認用のロジックです。
  3. ①はコメントにしても実行結果には影響しません。
  4. ここで言っている「ハイライトリスト」は「テキストをハイライト表示」する事とは異なる事に注意して下さい。
    選択範囲の開始位置と個数の情報を持った引数(オブジェクト)を作るだけ、と思って下さい。
    このメソッド実行時にPDFドキュメントに変化も影響も全くありません。
    PDPageオブジェクトの CreatePageHiliteメソッド か CreateWordHiliteメソッド を使用した時に、このAddメソッドの意味が理解できます。
  5. 上記サンプルは以下のURLを参考にしました。
    http://homepage3.nifty.com/belie/vba/vba017.htm
  6. Acrobat v7.1.4 , v8.2.3 + Excel 2003 でAddメソッドを実行すると以下のメッセージをVBAが出して異常終了します。
    HiliteList.Addメソッド:Excel 2003 の異常終了

 

注意事項

  1. Acrobat v4 でPDTextSelectオブジェクトに連携する時に2バイト文字(日本語)の抽出(GetTextメソッド)で異常抽出が発生する場合があります。
    結果から見るとAcrobat v4 のバグと判断できます。
    例:
    画面表示例 : Windows 版Adobe Acrobat 4.0 ReadMe
    PDF元 :Windows 版版版版Adobe Acrobat 4.0 ReadMe
    抽出結果 :Windows 版版版版Adobe Acrobat 4.0 ReadMe
    これはAcrobat v4 アプリケーション本体の問題と思われます。
  2. 再度、このAddメソッドを実行する時は一旦
    Set objAcroHiliteList = Nothing
    Set objAcroHiliteList = CreateObject("AcroExch.HiliteList")
    でAcroHiliteListオブジェクトを再作成する必要があります。
    そうしないとAddメソッドは有効になりません。Addメソッドは上書きはしません。
  3. Acrobat v7.1.4 , v8.2.3 + Excel 2003 でAddメソッド使用時にVBAが異常終了します。
    しかし、Acrobat v8に関しては旧バージョンでは動作した過去実績が有ります。
    それを考えると、アップデートによって使えなくなった可能性があります。これはちょっと変です。
  4. 実行結果から、PDFをテキストファイルに落とすと、改行は見た目の位置で改行します。
    しかし、別の(英語)PDFをテキストファイルに落とすと、PDF内部で持っている位置で改行します。つまり見た目とは異なります。
    PDFファイルの作り方により異なるみたいです。(再調査要)

  

動作確認環境

  • 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( + SP3 + WindowsUpdate)
    + Acrobat 7.1.4 Pro + Office 2003( + SP3)
  • WindowsXP Pro( + SP3 + WindowsUpdate)
    + Acrobat 8.1.2 Pro + Office 2003( + SP3)
  • WindowsXP Pro( + SP3 + WindowsUpdate)
    + Acrobat 8.2.3 Pro + Office 2003( + SP3)
  • WindowsXP Pro( + SP3 + WindowsUpdate)
    + Acrobat 9.3.3 Extended + Office 2003( + SP3)

 

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

http://livedocs.adobe.com/acrobat_sdk/9/Acrobat9_HTMLHelp/IAC_API_OLE_Objects.103.75.html

 

戻る

「AcroExch.HiliteList: Add メソッド」への10件のフィードバック

  1. はじめまして。
    現在仕事でExcel VBAでPDFテキストファイルを読み込み、太字テキストを抜き出すマクロを作ろうとしています。
    上記の管理人さんのコードをコピーさせていただき実行したところ、
    PDFをAcrobatでOPENするところまではうまくいくのですが、

    lRet = objAcroHiliteList.Add(0, 32767)

    の行でプログラムが暴走してしまいます(エラーも何も表示されず、プログラムの応答なしの状態になる)。
    使用環境はExcel 2000(VB6)とAcrobat7.1.4です。
    ネットでいろいろ調べてみましたが、サポートの状況など
    よくわかりませんでした。
    Excel 2000(VB6)ではAcrobat DDEは使用できないのでしょうか?
    もしご存知でしたら教えていただけると助かります。
    よろしくお願いします。

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

    まずは最初に要点のみ。

    Excel 2000はちょっとヤバいです。
    以前に受けた質問で、Excel 2000環境下でのVBA+Acrobat OLE(IAC)のバグらしき動作を確認しています。何度かのコメントでのやり取りで逃げ道を探しました。 今回は大分状況が違うので現在の環境下では逃げ道が無いかもしれません。
    Excel 2000以外の環境下でテストは出来ないでしょうか。Excel 2003又はExcel 2007です。

    とりあえず、知識+経験ベースでの返答をさせて頂きます。

    PS:lRet = objAcroHiliteList.Add(0, 32767)の最大値32767を50ぐらいにして一度テストしたら結果はどうなりますか?

  3. 管理人 様

    文字列の検索についても、ご教示頂けたらと思います。

    InStr関数でstrTextから文字検索をやっていますが、
    strTextには改行文字が入っており、以下のようなテキストですと、
    "test sample"を検索しようとしても、検索が引っかかりません。

    strText = "This is a test" & ChrW(&HD) & "sample"

    これについてはここで聞く質問ではないと思いますが、
    解決方法が見つからなくて、
    もし何か方法をご存知である、教えて頂けたら幸いです。
    よろしくお願い致します。

  4. shuangさんへ。

    こんな感じですかね?

    Sub testA()
    Dim strText As String
    Dim strText2 As String
    Dim aa() As String
    Dim i As Long

    strText = "This is a test" & ChrW(&HD) & "sample"
    aa = Split(strText, ChrW(&HD))
    Debug.Print "1=(" & aa(0) & ")"
    Debug.Print "2=(" & aa(1) & ")"

    strText2 = aa(0)
    For i = 1 To UBound(aa)
    strText2 = strText2 & " " & aa(i)
    Next i
    End Sub

  5. 管理人 様

    ご回答ありがとうございます。
    説明が足りないところがあり、申し訳ございません。

    スペースに置き換えることも考えましたが、
    strTextには英語だったり、日本語だったり、日本語と英語の両方が入ったりします。

    (1)strText = “これはテスト” & ChrW(&HD) & “サンプルです。”
     この場合は日本語のみで改行をスペースに置き換えない
    (2)strText = “これはテストtest” & ChrW(&HD) & “sampleサンプルです。”
    この場合は改行をスペースに置き換えられます。

    英語のみ、日本語のみでしたら、簡単ですが、
    両方が混じっていると、対応方法がわからなくて、
    途方にくれているところです。

  6. shuangさんへ。

    イメージが分かりました。
    FindTextメソッドを使ったときに同じような事で悩んだ気がします。
    結局、100%の結論には達しませんでした。
    理由は
    (2-2)strText = “test.” & ChrW(&HD) & “sample”
    上記の場合はどうするか?です。
    英文の終了で改行している場合です。
    スペースに置き換えるのが正解か?
    そのままに改行だけを取るのが正解か? ※本来はコレか?

    shuangさんの話に戻します。
    以下のサンプルを見てください。
    lLen = StrConv(Left$(str1(0), 1), vbFromUnicode)
    で1文字をUnicodeからバイトコードに変換しています。
    この時、半角文字は1バイトに、全角文字は2バイトになります。
    そのバイト数が1か2かで半角か全角かが判断できます。

    つまり文字列内に改行文字が合ったときにその改行文字の前後の1文字を抽出して、全角文字か、半角文字か、でスペースに置き換えるか否かを判断します。

    どうでしょうか?
    ※かなり手抜きのサンプルですが。(汗

    Sub testB()
    Dim str1(2) As String
    Dim lLen As Variant

    str1(0) = "ABC" '半角文字
    str1(1) = "ABC" '全角文字

    lLen = StrConv(str1(0), vbFromUnicode)
    Debug.Print "str1(0) = " & LenB(lLen)
    lLen = StrConv(Left$(str1(0), 1), vbFromUnicode)
    Debug.Print "str1(0) = " & LenB(lLen)

    lLen = StrConv(str1(1), vbUnicode)
    Debug.Print "str1(1) = " & LenB(lLen)
    lLen = StrConv(Left$(str1(1), 1), vbFromUnicode)
    Debug.Print "str1(1) = " & LenB(lLen)
    End Sub

  7. 管理人 様

    おはようございます。

    半角か全角で判断する方法ならいける気がします。
    句読点の後で改行した場合はルールを決めてやることも可能ですね。

    方法を考えて頂いて、本当にありがとうございます。
    早速実行してみます。

  8. shuangさん

    はじめまして、よっしーといいます。

    以下のような機能を満たすものを作るため、色々と調べているうちにこのサイトにたどりつきました。

    ・Excelに単語帳データ(1セルに1単語)
    ・PDFファイル内でそれら全ての単語を検索し、ハイライト表示
    ・全ての単語がハイライト表示されたPDFを別名で保存

    「テキストのハイライト表示」の実現方法が見当たらず、困っています。
    そもそも、OLE:IACでハイライト表示は実現可能なのでしょうか…?

    よろしくお願いします!

  9. よっしー さん。
    初めまして。

    「テキストのハイライト表示」については以前にも質問をもらいました。
    その時はかなり悪戦苦闘しましたが、出来るまでにはいたりませんでした。
    現時点での当サイトの情報では、「出来ない」が結論です。

    但し、それ以降の調査でJSOjectと言うオブジェクトの存在が判るようになりました。
    このJSOjectはAcrobat JavaScriptと言う操作言語を使ってかなりの部分でPDFをコントロールする事が判ってきています。
    だだ、Acrobat JavaScript に関しては当サイトでは解説できる程の情報の取得に達してません。
    よって、このJSOjectに関しても未知の状態です。

    お急ぎの場合は、Adobe社の日本語「Acrobat アドビフォーラム」 ココ ↓
    http://forums.adobe.com/community/international_forums/japanese/acrobat
    で、ご相談する事をお勧めします。

  10. shuangさん

    早速のご回答、ありがとうございます!

    詳細な解説、深く感謝いたします。

    比較的簡単に考えていたのですが、PDF加工について調べるほどにどんどん深みに入り込んでいく感じです(笑)

    Acrobat JavaScript、及びJSObjectについて調べてみますね。

    本当にありがとうございました。

コメントを残す

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

CAPTCHA


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


SAMURAI Plugin

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

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