AcroExch.PDTextSelect: GetText メソッド

TOP > AcroExch.PDTextSelect > GetText      [...]


説明

テキストが入った配列からインデックス指定でテキストを得ます。

テキストが入った配列はPDTextSelectオブジェクトです。

形式

BSTR GetText(long nTextIndex);

引数

  1. 第1引数(long nTextIndex) :
    テキストが入った配列のインデックスを指定する。
    最初は0。

戻り値

  • テキスト。

動作するバージョン

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

サンプル:ExcelのVBA

説明:PDFファイルの全テキストをテキストファイルに出力する。

  • F8キーでステップ実行しながら動作確認する。
  • 事前に参照設定をする。
  • 以下のサンプルはGetNumTextメソッドのサンプルと同じです。
001 Sub AcroExch_PDTextSelect_GetText() 002 003 Debug.Print "AcroExch_PDTextSelect_GetText:" & Now 004 Dim objAcroApp As New Acrobat.AcroApp 005 Dim objAcroHiliteList As New Acrobat.AcroHiliteList 006 Dim objAcroAVDoc As New Acrobat.AcroAVDoc 007 Dim objAcroPDDoc As Acrobat.AcroPDDoc 008 Dim objAcroPDPage As Acrobat.AcroPDPage 009 Dim objAcroPDTextSelect As Acrobat.AcroPDTextSelect 010 Dim objAcroAVPageView As Acrobat.AcroAVPageView 011 Dim lRet As Long 012 Dim lCnt As Long 013 Dim lPageCnt As Long 014 Dim i As Long 015 Dim j As Long 016 Dim strText As String 017 Dim lFileNo As Long 018 Dim lOutCnt As Long 019 020 'Acrobatを起動表示する 021 lRet = objAcroApp.Show '(TEST用) 022 'PDFドキュメントを開いて表示する。 023 lRet = objAcroAVDoc.Open("E:\Test01.pdf", "") 024 Set objAcroAVPageView = objAcroAVDoc.GetAVPageView() 025 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() 026 lPageCnt = objAcroPDDoc.GetNumPages - 1 027 Debug.Print "全頁数 = " & (lPageCnt + 1) 028 'ハイライトリストを作る。※「テキストのハイライト」では無い 029 lRet = objAcroHiliteList.Add(0, 32767) 030 031 '空きのファイル番号を取得 032 lFileNo = FreeFile 033 'テキストファイルをOPEN 034 Open "C:\List.txt" For Output As #lFileNo 035 lOutCnt = 0 036 037 For i = 0 To lPageCnt 038 lRet = objAcroAVPageView.Goto(i) 039 Set objAcroPDPage = objAcroAVPageView.GetPage() 040 '単語、又は隣接する文字列単位でHiliteListの範囲に従って 041 'PDTextSelectオブジェクトを作成する。 042 Set objAcroPDTextSelect = _ 043 objAcroPDPage.CreateWordHilite(objAcroHiliteList) 044 'AcroPDTextSelectオブジェクトに従って、 045 '該当PDFページを選択状態にする。 046 lRet = objAcroAVDoc.SetTextSelection _ 047 (objAcroPDTextSelect) 048 '選択状態した単語、又は隣接する文字列の数を取得する 049 lCnt = objAcroPDTextSelect.GetNumText() - 1 050 strText = "" 051 For j = 0 To lCnt 052 'Debug.Print objAcroPDTextSelect.GetText(j) 053 '単語、又は隣接する文字列単位で抽出する 054 '※空白文字は前の単語、又は隣接する文字列の最後となる 055 strText = strText & objAcroPDTextSelect.GetText(j) 056 If InStr(strText, vbCrLf) > 0 Then 057 '改行コードを含んだ単語 058 strText = Replace(strText, vbCrLf, "") 059 'ファイルに出力する 060 Print #lFileNo, strText 061 strText = "" 062 lOutCnt = lOutCnt + 1 063 End If 064 Next j 065 Next i 066 067 Debug.Print "出力行数 = " & lOutCnt 068 '出力テキストファイルを閉じる。 069 Close #lFileNo 070 'PDFファイルを保存しないで閉じる 071 lRet = objAcroAVDoc.Close(1) 072 073 'Acrobatを閉じる 074 lRet = objAcroApp.Hide 075 lRet = objAcroApp.Exit 076 077 'オブジェクトを強制解放する 078 Set objAcroHiliteList = Nothing 079 Set objAcroPDTextSelect = Nothing 080 Set objAcroAVPageView = Nothing 081 Set objAcroAVDoc = Nothing 082 Set objAcroPDPage = Nothing 083 Set objAcroPDDoc = Nothing 084 Set objAcroApp = Nothing 085 086 End Sub 087


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

実行結果

TEST_PDTextSelect_GetText:2008/07/31 21:47:23
全頁数 = 34
出力行数 = 956

※下記は実行途中のPDFビュアーの画面の一部です。透明テキストがページ全体選択状態になっています。

PDTextSelect:GetNumText メソッド実行途中

補足

  • 「隣接する文字列」の意味が分からなければ、
    空白又は改行を区切りとする連続する文字列と考えて下さい。
  • CreateWordHiliteメソッド、CreatePageHiliteメソッド、
    CreateTextSelectionメソッドも参考にして下さい。
  • ファイル出力しないで、Excel上に出力してもいいです。

動作確認環境

  • WindowsXP Pro(+ SP3) +
    Acrobat 8.1.2 Pro + Office 2003 + MicrosoftUpdate

戻る

「AcroExch.PDTextSelect: GetText メソッド」への6件のフィードバック

  1. 管理人さん

    参考にさせて頂いております。

    このサンプルにて、PDF内の全テキストを取得できることが出来ました。
    テキストを取得する際、その座標値(Rect?)も一緒に取得したいのですが、そのやり方が分からずに困っております。

    GetTextにて取得したテキストにつき、ページ番号をGetPageで取得、
    RectをGetBoundingRectで取得、と考えましたが、期待したRectが取れてないようです。
    (PDFの左下を起点としたRectが取れると期待していました。)

    もしよろしければ、解決のお手伝いをお願いいたします。

    OS : Windows 7 Ent
    Acrobat : Adobe Acrobat 10.0 Type Library
    Tool : Excel 2013

  2. なっかむさん はじめまして。

    GetBoundingRectの結果を元に座標の計算等が出来ないとなると、他に有効と思われる方法は当サイトには無いと思われます。

    指定した座標(範囲)からテキストを抽出する方法はいくつか存在しますが、期待する結果が得られるかは不明です。

    1)「Poppler:pdftotext 」を利用して、指定座標内の文字列を取得
    2)「Xpdf:pdftotext」を利用して、指定座標内の文字列を取得
    3)「サンプル:指定範囲(座標)でページを切り取り(トリミング)し、そこからテキストを抽出

    Acrobatの「環境設定」の内容を変更して、GetBoundingRectの値を希望する内容に変更等は出来ないかと見てみましたが、それらしき設定は無いみたいです。

    残念ですが、ご希望には添えないみたいです。

  3. 管理人さん

    返信ありがとうございます。
    Acrobat SDKだと、テキストとその座標の取得は難しそうですね。
    その他のライブラリも調べておりますが、なかなか解決に至っておりません。

    以上、ありがとうございました。

  4. はじめまして、とても有益な情報をまとめて頂いており、仕事の効率化のために参考にさせてもらっております。本当にありがとうございます。
    さて、PDFファイルを一括チェックするために、総ページ数や更新日付、しおりを抽出して一覧表として印刷することまではできたのですが、フッターがうまく抽出できません。
    お手数をおかけしますが、アドバイスをいただきたく、どうぞよろしくお願いいたします。

  5. ND さん はじめまして。 以下、長文です。

    「この抽出したテキスト部分がフッターです」と、正確に言える方法は残念ですが現在のところ見つかってはいません。
    過去の調査結果も含め、詳細を説明すると長くなるので省略しますが、どうも「PDF内のヘッダーとフッターに関する仕様(仕組み、決まり事)が決まってない」又は「ドコカのメーカーが公開してない」みたいです(勘)。Acrobatアプリが「Acrobatで追加したものではないため、更新または削除することはできません。」と言うメッセージを表示するのが、一番の理由です。

    それでは判断できないのか? とは思っていません。手間のかかる方法ですが、PDFの状態によってはある程度は判断できるのではないかと勝手に思っています。その前に・・。

    基本的にヘッダー、フッターはページ内の最上部、最下部に画面「表示」されます。ページが異なっても、同じテキストでしかも各ページ内の最上部、最下部の位置ならば、ヘッダーとフッターと判断できます。
    但し注意点が有ります。PDFファイルからVBA等のプログラムで順次テキストを抽出すると、ヘッダー、本文、フッターの順で抽出されるとは限りません。PDFファイル内の各テキストはページ内の表示位置の座標を持っています。よって、テキストの順番が変でも、その表示座標を持っているので画面「表示」では問題が出ません。これはPDFの作成方法が影響しているみたいです。PDFファイルにテキストを後から追加すると、PDFファイルの後方に順次追加されます(タブン)。
    更に同じ行でもテキストの順が前後するケースも稀ですが存在します。これも座標を持っているので画面「表示」では問題が出ません。

    実際のやり方です。抽出したテキストの座標で判断します。PDFファイル内のテキスト座標については、コチラを御覧ください。「Quads:テキストの座標」を同Webページのサンプルに従って扱えば判断できます。技術的には問題無いのですが、いざ、これをVBAで作るとなると大変です。

    <VBAロジック:1ページ単位での処理>

    1. 抽出したテキストを座標に従って行単位に並び替える
      同じ行かの判断基準は、行の先頭のテキストの上下中心座標(=TOPとBottomの中心)を含んでいるテキストを同じ行のテキストとする。
    2. 最上位の行をヘッダー、最下位の行をフッターとする

    基本部分は上記でイイと思っています。でも、実際は、

    1. 同じ行のテキストを座標に従って並び替える。
      これは非常に稀ですが、テキストの位置が前後するケースが有るためです。
    2. 前後するページで同じ位置(最上位、最下位、更に座標)にあるテキストのみをヘッダーとフッターと判断する。1ページしか無いPDFの場合は判断できない。また、稀だが1ページしか存在しないヘッダー、フッターも判断できない。
    3. ヘッダーとフッターのテキストから、ページ番号とみられる部分を削除する。これをしないと上記4で同じテキストとは判断できない。ベージ番号は「数値、前後にある記号」の部分とする。

    と言う判断も必要になるのではないかと思っています。判断出来なかった時のメッセージも必要です。

    1年以上も前の質問で、ヘッダーとフッター部分のテキストが邪魔をして、うまく対応できなかった事が有りました。特に、3、4と5の部分で時間的に挫折しました。

    現時点での返答は以上です。
    ヘッダー、フッターの話は当サイトが経験上から出した結果です。勘違いも有るかもしれません。ひょっとしたら、簡単に出せる方法がどこかのサイト上に存在するかもしれません。不明な部分は当然有ると思っています。遠慮無く、ご質問ください。

    ココのサンプルを流用して、テキストとその座標を抽出するサンプルを以下に公開します。流用できるかは不明ですが、参考にはなると思っています。

    ★★<2023年3月4日 サンプルの公開を中止します。>
    理由:VBAの配列の制限事項の問題が有ることが判明しました。別のサンプル公開を準備中です。★★
    ★★<2023年3月5日 修正したサンプルを公開します。
    関数:全頁を行単位のテキスト、ヘッダー、フッターで返す
    ★★

    少しだけテストしました。

  6. 管理人さま

    丁寧に説明いただき、ありがとうございます。
    今まで調査された内容やPDF内の構造について、
    説明していただき、勉強になりました。
    こまかな部分の注意点も教えていただいたので、
    今後の作業で活かせるのではないかと思います。

    掲載いただいたコードを参考にテストしてみたいと思います。
    あわせて、フッターが定型ですので、特定の文字をキーにして
    フッター検索する方法も試したいと思っております。

    質問の回答にはお時間をいただいたと思います。
    重ねて感謝申し上げます。

コメントを残す

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

CAPTCHA


★ 文章での質問は難しいですよネ。でも、早く解決して、家に帰りたい。


SAMURAI Plugin

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

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン
コメントにサンプルコードを入れる時はコードを全て全角文字列にしてください。コチラで半角に戻します。それでもエラーが回避できない時はコメント下さい。個別に対処します。



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

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