TOP > AcroExCh.HiliteList > Add [...]
説明
PDFテキスト上の開始位置と個数の情報を持った引数(オブジェクト)を作成します。
この引数(オブジェクト)を特別にハイライトリストと言います。
「テキストをハイライト表示」とは全く関係ありません。※備考も参照。
このハイライトリストは PDPageオブジェクトの CreatePageHiliteメソッド か CreateWordHiliteメソッド を使用する時だけの引数に使うものです。
形式
VARIANT_BOOL Add(short nOffset, short nLength);
引数
- 第1引数(short nOffset):
文字、文字列、又は単語単位を位置指定する場所。0を開始位置とする。 - 第2引数(short nLength):
第1引数から数えての個数。1以上を指定。
0を指定すると予期しない結果になります。
戻り値
- -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キーでステップ実行しながら動作確認する。
- 事前に参照設定をする。
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 v5.0 の実行結果
Acrobat v4 と同じPDFファイルを読み込んでいます。
「版」は正常に読み込んでいます。
▼ Acrobat v6.0 の実行結果
Acrobat v4 と同じPDFファイルを読み込んでいます。
「版」は正常に読み込んでいます。
Acrobat v5 と結果は同じです。
▼ 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 v4 ,Acrobat v7 と Acrobat v8 では使用しない方がいいです。
- (注1)は特に必要ありません。テスト確認用のロジックです。
- ①はコメントにしても実行結果には影響しません。
- ここで言っている「ハイライトリスト」は「テキストをハイライト表示」する事とは異なる事に注意して下さい。
選択範囲の開始位置と個数の情報を持った引数(オブジェクト)を作るだけ、と思って下さい。
このメソッド実行時にPDFドキュメントに変化も影響も全くありません。
PDPageオブジェクトの CreatePageHiliteメソッド か CreateWordHiliteメソッド を使用した時に、このAddメソッドの意味が理解できます。 - 上記サンプルは以下のURLを参考にしました。
http://homepage3.nifty.com/belie/vba/vba017.htm - Acrobat v7.1.4 , v8.2.3 + Excel 2003 でAddメソッドを実行すると以下のメッセージをVBAが出して異常終了します。
注意事項
- 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 アプリケーション本体の問題と思われます。 - 再度、このAddメソッドを実行する時は一旦
Set objAcroHiliteList = Nothing
Set objAcroHiliteList = CreateObject("AcroExch.HiliteList")
でAcroHiliteListオブジェクトを再作成する必要があります。
そうしないとAddメソッドは有効になりません。Addメソッドは上書きはしません。 - Acrobat v7.1.4 , v8.2.3 + Excel 2003 でAddメソッド使用時にVBAが異常終了します。
しかし、Acrobat v8に関しては旧バージョンでは動作した過去実績が有ります。
それを考えると、アップデートによって使えなくなった可能性があります。これはちょっと変です。 - 実行結果から、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
< 戻る >
はじめまして。
現在仕事でExcel VBAでPDFテキストファイルを読み込み、太字テキストを抜き出すマクロを作ろうとしています。
上記の管理人さんのコードをコピーさせていただき実行したところ、
PDFをAcrobatでOPENするところまではうまくいくのですが、
lRet = objAcroHiliteList.Add(0, 32767)
の行でプログラムが暴走してしまいます(エラーも何も表示されず、プログラムの応答なしの状態になる)。
使用環境はExcel 2000(VB6)とAcrobat7.1.4です。
ネットでいろいろ調べてみましたが、サポートの状況など
よくわかりませんでした。
Excel 2000(VB6)ではAcrobat DDEは使用できないのでしょうか?
もしご存知でしたら教えていただけると助かります。
よろしくお願いします。
Naoさん。初めまして。
まずは最初に要点のみ。
Excel 2000はちょっとヤバいです。
以前に受けた質問で、Excel 2000環境下でのVBA+Acrobat OLE(IAC)のバグらしき動作を確認しています。何度かのコメントでのやり取りで逃げ道を探しました。 今回は大分状況が違うので現在の環境下では逃げ道が無いかもしれません。
Excel 2000以外の環境下でテストは出来ないでしょうか。Excel 2003又はExcel 2007です。
とりあえず、知識+経験ベースでの返答をさせて頂きます。
PS:lRet = objAcroHiliteList.Add(0, 32767)の最大値32767を50ぐらいにして一度テストしたら結果はどうなりますか?
管理人 様
文字列の検索についても、ご教示頂けたらと思います。
InStr関数でstrTextから文字検索をやっていますが、
strTextには改行文字が入っており、以下のようなテキストですと、
"test sample"を検索しようとしても、検索が引っかかりません。
strText = "This is a test" & ChrW(&HD) & "sample"
これについてはここで聞く質問ではないと思いますが、
解決方法が見つからなくて、
もし何か方法をご存知である、教えて頂けたら幸いです。
よろしくお願い致します。
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
管理人 様
ご回答ありがとうございます。
説明が足りないところがあり、申し訳ございません。
スペースに置き換えることも考えましたが、
strTextには英語だったり、日本語だったり、日本語と英語の両方が入ったりします。
(1)strText = “これはテスト” & ChrW(&HD) & “サンプルです。”
この場合は日本語のみで改行をスペースに置き換えない
(2)strText = “これはテストtest” & ChrW(&HD) & “sampleサンプルです。”
この場合は改行をスペースに置き換えられます。
英語のみ、日本語のみでしたら、簡単ですが、
両方が混じっていると、対応方法がわからなくて、
途方にくれているところです。
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
管理人 様
おはようございます。
半角か全角で判断する方法ならいける気がします。
句読点の後で改行した場合はルールを決めてやることも可能ですね。
方法を考えて頂いて、本当にありがとうございます。
早速実行してみます。
shuangさん
はじめまして、よっしーといいます。
以下のような機能を満たすものを作るため、色々と調べているうちにこのサイトにたどりつきました。
・Excelに単語帳データ(1セルに1単語)
・PDFファイル内でそれら全ての単語を検索し、ハイライト表示
・全ての単語がハイライト表示されたPDFを別名で保存
「テキストのハイライト表示」の実現方法が見当たらず、困っています。
そもそも、OLE:IACでハイライト表示は実現可能なのでしょうか…?
よろしくお願いします!
よっしー さん。
初めまして。
「テキストのハイライト表示」については以前にも質問をもらいました。
その時はかなり悪戦苦闘しましたが、出来るまでにはいたりませんでした。
現時点での当サイトの情報では、「出来ない」が結論です。
但し、それ以降の調査でJSOjectと言うオブジェクトの存在が判るようになりました。
このJSOjectはAcrobat JavaScriptと言う操作言語を使ってかなりの部分でPDFをコントロールする事が判ってきています。
だだ、Acrobat JavaScript に関しては当サイトでは解説できる程の情報の取得に達してません。
よって、このJSOjectに関しても未知の状態です。
お急ぎの場合は、Adobe社の日本語「Acrobat アドビフォーラム」 ココ ↓
http://forums.adobe.com/community/international_forums/japanese/acrobat
で、ご相談する事をお勧めします。
shuangさん
早速のご回答、ありがとうございます!
詳細な解説、深く感謝いたします。
比較的簡単に考えていたのですが、PDF加工について調べるほどにどんどん深みに入り込んでいく感じです(笑)
Acrobat JavaScript、及びJSObjectについて調べてみますね。
本当にありがとうございました。