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を指定すると予期しない結果になります。

戻り値

  • -1 : 成功
  • 0 : 失敗

動作するバージョン

VersionAdobe
Acrobat
備考
4OKAcrobat 4.0    ※Windows 98SE + Excel 2000
5
OK
Acrobat 5.0.5
6
OK
Acrobat 6.0.3 Pro
7NOAcrobat 7.1.4 Pro
8NOAcrobat 8.1.2 Pro
Acrobat 8.2.3 Pro
9OKAcrobat 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キーでステップ実行しながら動作確認する。
  • 事前に参照設定をする。
001 Sub AcroExch_HiliteList_Add() 002 003 'Acrobatオブジェクトの定義&作成 004 'Acrobat 4,5,6 の時 005 ' Dim objAcroApp As Acrobat.CAcroApp 006 ' Dim objAcroAVDoc As Acrobat.CAcroAVDoc 007 ' Dim objAcroHiliteList As Acrobat.CAcroHiliteList 008 ' Dim objAcroPDDoc As Acrobat.CAcroPDDoc 009 ' Dim objAcroPDPage As Acrobat.CAcroPDPage 010 ' Dim objAcroAVPageView As Acrobat.CAcroAVPageView 011 ' Dim objAcroPDTextSelect As Acrobat.CAcroPDTextSelect 012 ' Set objAcroApp = CreateObject("AcroExch.App") 013 ' Set objAcroAVDoc = CreateObject("AcroExch.AVDoc") 014 ' Set objAcroHiliteList = CreateObject("AcroExch.HiliteList") 015 ' Set objAcroPDDoc = CreateObject("AcroExch.PDDoc") 016 017 'Acrobat 7,8,9,10,11 の時 018 Dim objAcroApp As New Acrobat.AcroApp 019 Dim objAcroAVDoc As New Acrobat.AcroAVDoc 020 Dim objAcroHiliteList As New Acrobat.AcroHiliteList 021 Dim objAcroPDDoc As New Acrobat.AcroPDDoc 022 Dim objAcroPDPage As Acrobat.AcroPDPage 023 Dim objAcroAVPageView As Acrobat.AcroAVPageView 024 Dim objAcroPDTextSelect As Acrobat.AcroPDTextSelect 025 026 '以降はAcrobat全て共通 027 Dim lRet As Long '戻り値 028 Dim i As Long '添え字 029 Dim j As Long '添え字 030 Dim lPages As Long 'ページ番号 031 Dim lCnt As Long 'カウント 032 Dim strText As String '文字列 033 Dim lFileNo As Long 'ファイル番号 034 035 Const CON_PDF = "C:\work\Test01.pdf" 036 Const CON_LOG_FILE = "C:\work\LOG01.txt" 037 038 'PDFファイルを開く 039 lRet = objAcroPDDoc.Open(CON_PDF) 040 Set objAcroAVDoc = objAcroPDDoc.OpenAVDoc(CON_PDF) 041 '画面にPDFを表示する 042 lRet = objAcroAVDoc.Open(CON_PDF, "") '(注1) 043 Set objAcroAVPageView = objAcroAVDoc.GetAVPageView 044 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() 045 'Acrobatを起動表示する 046 lRet = objAcroApp.Show '(注1) 047 'ハイライトリストを作成する。※ページ中の単語数 048 lRet = objAcroHiliteList.Add(0, 32767) 049 050 '開いたPDFドキョメントの全ページ数を取得する 051 lPages = objAcroPDDoc.GetNumPages() - 1 052 053 '結果をテキストファイルに書き出す 054 lFileNo = FreeFile() 055 Open CON_LOG_FILE For Output Access Write As lFileNo 056 Print #lFileNo, "(" & CON_PDF & ") file 総Page数=" & _ 057 lPages + 1 & " Start=" & Now() 058 059 For i = 0 To lPages 060 'ページ単位のPDPageオブジェクトを作成する 061 Set objAcroPDPage = objAcroPDDoc.AcquirePage(i) 062 'ハイライトリスト(objAcroHiliteList)からページ単位の 063 'テキスト選択のPDTextSelectオブジェクトを作成する 064 Set objAcroPDTextSelect = _ 065 objAcroPDPage.CreatePageHilite(objAcroHiliteList) 066 '抽出した文字列の数(Index)を取得する 067 lCnt = objAcroPDTextSelect.GetNumText() - 1 068 strText = "" 069 For j = 0 To lCnt 070 '単語単位で抽出する 071 strText = strText & _ 072 objAcroPDTextSelect.GetText(j) 073 ' Debug.Print strText 074 Next j 075 076 '一頁分をテキストファイルに出力する 077 Print #lFileNo, "**** Page(" & i + 1 & ")=" & _ 078 " PageWordCnt=" & lCnt & " ****" & vbCrLf & strText 079 080 Next i 081 082 Print #lFileNo, "End " & Now() 083 'テキストファイルを閉じる 084 Close #lFileNo 085 086 'PDFファイルを保存しないで閉じる 087 objAcroPDDoc.Close 088 'Acrobatを閉じる 089 lRet = objAcroApp.Hide '(注1) 090 lRet = objAcroApp.Exit 091 092 'オブジェクトを強制解放する 093 Set objAcroPDTextSelect = Nothing 094 Set objAcroPDPage = Nothing 095 Set objAcroPDDoc = Nothing 096 Set objAcroAVDoc = Nothing 097 Set objAcroPDTextSelect = Nothing 098 Set objAcroAVPageView = Nothing 099 Set objAcroApp = Nothing 100 101 End Sub


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

実行結果

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等) バージョン
コメントにサンプルコードを入れる時はコードを全て全角文字列にしてください。コチラで半角に戻します。それでもエラーが回避できない時はコメント下さい。個別に対処します。



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

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