一覧
PDFドキュメントの指定されたページに対しての操作等を提供するオブジェクトです。
PDDocオブジェクトからはAcquirePageメソッドで、AVPageViewオブジェクトからはGetPageメソッドで連携します。
<警告>
当PDPageオブジェクトのテキスト注釈に関するメソッド関連で不規則な不具合が多数発生しています。
その為、各メソッドの説明がエラーサンプル付き状態になっています。
いろいろなオブジェクト連携や、扱うPDFファイルを変えたりもしたのですが、不具合の解消には至りませんでした。
今までの中でも相当な時間を掛けましたが、解決方法(逃げ道)がいまだに見つかっていません。
Acrobat( Pro v8.1.2)本体上での手動操作には何ら問題は無いのですが、OLE操作ではうまく出来ません。
注釈機能を使っている会社等は少ないかもしれませんが、Acrobatの注釈機能は非常に優れたものです。
何とか逃げる策を考えたいと思っています。
メソッド | 解説 |
---|---|
AddAnnot | ページに他のテキスト注釈をコピー追加します。 AddNewAnnotメソッドとの違いは同じのPDFドキュメントにある注釈を元にコピーする為に作られたメソッドです。 他のPDFドキュメントからは直接コピー追加は出来ません。 |
AddNewAnnot | ページの指定位置にテキスト注釈を新規追加します。 同時にPDAnnotオブジェクトを作成します。 |
CopyToClipboard | 四方範囲を指定してPDFページ上をクリップボードにコピーする。 このメソッドは32ビットのシステム上だけ利用可能です。 クリップボード上は画像イメージで保存されています。 |
CreatePageHilite | 1文字単位の情報とそのリストをHiliteListオブジェクト情報からの範囲に従って1ページのテキスト選択であるAcroPDTextSelectオブジェクトを作成する。 |
CreateWordHilite | 単語、又は隣接する文字列単位の情報とそのリストをHiliteListオブジェクト情報から範囲に従って1ページのテキスト選択であるAcroPDTextSelectオブジェクトを作成する。 |
CropPage | 該当ページから指定した四隅範囲を残してページから切り取る。(=トリミングする) |
Draw | 頁コンテンツを指定された画面に引き込みます。(推奨しない) |
DrawEx | 頁コンテンツを指定された画面に引き込みます。 ※これをExcel VBA上で使用するのは無理みたいです。 |
GetAnnot | 配列で管理されている注釈オブジェクトからインデックスで指定された1つの注釈(AcroPDAnnot)オブジェクトを得ます。 |
GetAnnotIndex | ページ指定された注釈のインデックス(頁注釈配列の中)を得ます。 |
GetDoc | ページに関連しているAcroExch.PDDocオブジェクトを取得する。 |
GetNumAnnots | ページに存在する注釈数の合計を返す。 注)サンプル動作不良? |
GetNumber | 現在の頁の頁番号を得ます。 ドキュメントにおける最初の頁はゼロ頁です。 |
GetRotate | 現在のページに設定されている回転値を得る。 回転値は0度、90度、180度、270度の4種類のみ。 |
GetSize | 指定されたページのサイズ(幅,高さ)をポイント(Point)オブジェクトで返します。 |
RemoveAnnot | ページ注釈配列からインデックス指定して、該当する注釈を削除する。 |
SetRotate | 現在のページを回転させる。 回転値は0度、90度、180度、270度の4種類のみ。 |
< TOPへ >
はじめまして。
VB2005とacrobat8を使い、あるフォルダにPDFファイルをコピーしたら、天地左右3mmづつトリミングされたPDFファイルが別フォルダに作成されるというプログラムを作ろうとしています。
トリミングはCropPageを使おうと考えているのですが、うまく動作してくれません。
一体どこが悪いのでしょうか?
以下ソース
Dim objAcroApp As New Acrobat.AcroApp
Dim objAcroAVDoc As New Acrobat.AcroAVDoc
Dim objAcroPDDoc As New Acrobat.AcroPDDoc
Dim AVDoc As Acrobat.CAcroAVDoc
Dim PDDoc As Acrobat.CAcroPDDoc
Dim pagesuu As Long
Dim lRet As Long
'アクロバットを起動
lRet = objAcroApp.Show
'PDFファイルを開いて表示する。
lRet = objAcroAVDoc.Open("C:¥test.pdf", "")
'PDDocを取得する
objAcroPDDoc = objAcroAVDoc.GetPDDoc
'ページ数を取得する
PDDoc = objAcroAVDoc.GetPDDoc()
pagesuu = PDDoc.GetNumPages()
'AcroRectを作成する
Dim pdfRect As New Acrobat.AcroRect
pdfRect.Top = 8.504 '←8.504は3mmをポイントに直した数値
pdfRect.Left = 8.504
pdfRect.right = 8.504
pdfRect.bottom = 8.504
'頁のトリミング(天地左右-3mm)
Dim res As Integer
res = PDDoc.CropPages(0, pagesuu-1, 0, pdfRect)
先ほどの書き込みですが自己解決しました。
■変更点
pdfRect.Top = 8.504 '←8.504は3mmをポイントに直した数値
pdfRect.Left = 8.504
pdfRect.right = 8.504
pdfRect.bottom = 8.504
↓
'最初のページのページサイズを取得する
Dim pdfPage As Acrobat.AcroPDPage = objAcroPDDoc.AcquirePage(0)
Dim pdfRectTemp As Object = pdfPage.GetSize
Dim pdfRect As New Acrobat.AcroRect
pdfRect.Top = pdfRectTemp.y - (8.504)
pdfRect.Left = 8.504
pdfRect.right = pdfRectTemp.x - (8.504)
pdfRect.bottom = 8.504
※配列(pdfRect)の並び順と数値を変更しました
ご迷惑をおかけいたしました。
みやさん。初めまして。
貴重な情報、ありがとうございます。
ここのポイントはGetSizeメソッドをうまく使った事ですね。それでpdfRectが生かされた。
pdfRectを使ったサンプルを別途で考えていたので、参考にさせて頂くかもしれません。
こうゆうコメントは大歓迎です。
※実は今日は風邪でお休みしていました。レスが遅れたのはそれが理由です。
管理人さん、はじめまして。
いつも利用させて頂いております。m(__)m
VBAにてPDFファイルのトリミングをおこなおうと下記の記述をしたところ
「実行時エラー'429 ActiveXコンポーネントはオブジェクトを作成できません。」
のエラーが出てしまいます。
該当の箇所は、下記×の箇所になります。
Dim ObJAcroApp As Object
Dim ObjAcroAVDoc As Object
Dim ObjAcroPDDocNEW As Object
Dim ObjAcroPDDocADD As Object
Dim objAcroRect As Object
Dim objAcroPoint As Object
Dim objAcroPDPage As Object
Set ObJAcroApp = CreateObject("AcroExch.App")
Set ObjAcroAVDoc = CreateObject("AcroExch.AVDoc")
Set ObjAcroPDDocNEW = CreateObject("AcroExch.PDDoc")
Set ObjAcroPDDocADD = CreateObject("AcroExch.PDDoc")
Set objAcroRect = CreateObject("AcroExch.Rect")
Set objAcroPoint = CreateObject("AcroExch.Point")
× Set objAcroPDPage = CreateObject("AcroExch.PDPage")
多数のPCにて使用を想定しているため、この記述をしております。
OS:Windows7 SP1 64BIT
Acrobat Ver:Acrobat Pro DC ver2015.006
ツール:Excel2010
お忙しいところ大変お手数ですが、ご教授頂ければ幸いです。
よろしくお願い致します。
kage さん
はじめまして。
objAcroPDPage、つまりPDPageオブジェクトは残念ですが CreateObject によって作成するものでは有りません。
オブジェクト連携図を御覧ください。PDDoc又はAVPageViewオブジェクトを作成し、そこから連携して作成されるオブジェクトです。(分かりにくい・・ですネ
よって
Set objAcroPDPage = CreateObject("AcroExch.PDPage")
は実行エラーになります。実際に当サイトには「CreateObject("AcroExch.PDPage")」という感じのサンプルは存在しません。
正しくは
Set objAcroPDPage = ObjAcroPDDocNEW.AcquirePage
又はDim objAcroAVPageView As Object
みたいな使い方です。・・・
Set objAcroPDPage = objAcroAVPageView.GetPage
他にも似たような感じの箇所は有るはずなので「実行時エラー'429」時は思い出してください。
ご確認の程、よろしくお願いいたします。
管理人さん。
早々にご回答いただきありがとうございました。
おっしゃる通り、おかしなことをしていました。(-_-;)
ご教示いただいたとおりに実行したところ、希望通りの処理になりました。
迅速な対応をしていただき、大変助かりました。
管理人さん
Acrobat Pro 11でツールからテキスト認識をページ単位で行えるかと
思いますが、VBAで座標を指定して、ある特定の位置のテキスト認識が
可能かご教示頂けると幸いです。
お忙しいところお手数をお掛けしますが宜しくお願い致します。
環境は
Windows10
Acrobat Pro 11
Access VBA
たけ さん はじめまして。
取りあえず思い出せる範囲で返答します。
1)CropPageで範囲を指定してトリミングを行う。
2)上記に対して、CreatePageHilite又はCreateWordHiliteでテキストを抽出する
てな感じです。
2のCreatePageHilite又はCreateWordHiliteでも範囲指定が有りますが、かなり面倒だった様な気がします。それならば1でトリミングしたページの全体を抽出した方が楽だと思います。
サンプルをステップ実行しながら、見て頂ければ理解できるかと思います。(タブン
しかし。テキスト認識はコメント投稿者からの要望、問題点、解決、失敗(=絶望)、等。かなりの時間を取った箇所なのですが。
すでにかなりの部分を忘れています。(汗
2日ほどお時間をください。
▼2019/2/4 23:12 追加
2の部分は
lRet = objAcroHiliteList.Add(1, 99999)
てな感じにサンプルを変更したら、トリミングしたテキストを全て抽出できる・・;。
たけ さんへ
サンプルを作ってみました。
指定座標で切りとって、そこから全テキストを取得する様にしました。
動作環境:Win10 64bit + Acrobat XI Pro + Excel 2007
001 Option Explicit
002
003
004 '座標を指定してその場所のテキストを取得する。
005
006 Sub Main_Test()
007 Dim sPdfFile As String
008 Dim iPageNo As Long
009 Dim iTop As Long 'トップ
010 Dim ibottom As Long '底
011 Dim iLeft As Long '左
012 Dim iRight As Long '右
013 Dim sText As String
014
015 'PDFファイルのフルパス
016 sPdfFile = "X:\Text\AcroPDPage\Test1.pdf"
017 'ページ番号
018 iPageNo = 2
019 '切り取る範囲をポイントで指定する
020 iTop = 580
021 ibottom = 450
022 iLeft = 20
023 iRight = 200
024
025 Call AcroExch_PDPage_CreateWordHilite(sPdfFile, iPageNo, iTop, ibottom, iLeft, iRight, sText)
026 End Sub
027
028 Sub AcroExch_PDPage_CreateWordHilite( _
029 ByVal sPdfFile As String, _
030 ByVal iPageNo As Long, _
031 ByVal iTop As Long, _
032 ByVal ibottom As Long, _
033 ByVal iLeft As Long, _
034 ByVal iRight As Long, _
035 ByRef sText As String)
036
037 Dim objAcroApp As New Acrobat.AcroApp
038 Dim objAcroHiliteList As New Acrobat.AcroHiliteList
039 Dim objAcroPDdoc As New Acrobat.AcroPDDoc
040 Dim objAcroAVDoc As New Acrobat.AcroAVDoc
041 Dim objAcroPDPage As Acrobat.AcroPDPage
042 Dim objAcroPDTextSelect As Acrobat.AcroPDTextSelect
043 Dim objAcroRect As New Acrobat.AcroRect
044 Dim objAcroPoint As Acrobat.AcroPoint
045 Dim lRet As Long
046 Dim lCnt As Long
047 Dim j As Long
048
049 Const DEBUG_MODE As Boolean = True
050
051 'PDFを開く
052 lRet = objAcroAVDoc.Open(sPdfFile, "")
053 Set objAcroPDdoc = objAcroAVDoc.GetPDDoc
054
055 '指定ページを取得する
056 Set objAcroPDPage = objAcroPDdoc.AcquirePage(iPageNo - 1)
057
058 If DEBUG_MODE Then
059 'Acrobatを起動表示する ※これを実行しないと高速化できる
060 lRet = objAcroApp.Show
061 '★Acrobatがデスクトップに表示されるので該当ページに移動する
062 Set objAcroPoint = objAcroPDPage.GetSize
063 Debug.Print "ページの幅 =" & objAcroPoint.x & "ポイント"
064 Debug.Print "ページの高さ=" & objAcroPoint.y & "ポイント"
065 End If
066
067 '切り取る範囲をポイントで指定する
068 objAcroRect.Top = iTop 'トップ
069 objAcroRect.bottom = ibottom '底
070 objAcroRect.Left = iLeft '左
071 objAcroRect.Right = iRight '右
072 'ページをトリミング
073 lRet = objAcroPDPage.CropPage(objAcroRect)
074 '★この時点のPDFドキュメント画面を見る。
075
076 'ハイライトリストを作る。※「テキストのハイライト」では無い
077 lRet = objAcroHiliteList.Add(0, 10000)
078
079 '単語、又は隣接する文字列単位でHiliteListの範囲に従って
080 ' PDTextSelectオブジェクトを作成する。
081 Set objAcroPDTextSelect = _
082 objAcroPDPage.CreateWordHilite(objAcroHiliteList)
083
084 'AcroPDTextSelectオブジェクトに従って、
085 ' 該当PDFページを選択状態にする。
086 lRet = objAcroAVDoc.SetTextSelection(objAcroPDTextSelect)
087 '抽出した文字列の数(Index)を取得する
088 lCnt = objAcroPDTextSelect.GetNumText() - 1
089 sText = ""
090 For j = 0 To lCnt
091 If DEBUG_MODE Then _
092 Debug.Print objAcroPDTextSelect.GetText(j)
093 '単語単位で抽出する
094 sText = sText & objAcroPDTextSelect.GetText(j)
095 Next j
096 If DEBUG_MODE Then
097 Debug.Print ""
098 Debug.Print sText
099 Debug.Print ""
100 End If
101 Skip:
102 'PDFファイルを保存しないで閉じる
103 lRet = objAcroAVDoc.Close(1)
104
105 'Acrobatを閉じる
106 lRet = objAcroApp.Hide
107 lRet = objAcroApp.Exit
108
109 'オブジェクトを強制解放する
110 Set objAcroPDTextSelect = Nothing
111 Set objAcroHiliteList = Nothing
112 Set objAcroPoint = Nothing
113 Set objAcroPDPage = Nothing
114 Set objAcroPDdoc = Nothing
115 Set objAcroAVDoc = Nothing
116 Set objAcroRect = Nothing
117 Set objAcroApp = Nothing
118
119 End Sub
上記は単語単位でテキストの取得CreateWordHiliteを行っています。文字単位での取得が最適と考える場合はCreatePageHiliteをご使用下さい。
座標の使い方についてはコチラを参照ください。
DEBUG_MODE = False
にするとAcrobatがデスクトップに表示されずに高速で処理が可能になります。
以上、ご検証ください。
管理人さん
早急にご回答いただきましてありがとうございました。
また、わかりやすいコメント付のサンプルまで作成していただきまして
お手数をお掛けしまして大変申し訳ありませんでした。
なお、私のわかりにくい質問が悪かったのですが、PDFのテキスト読み取りを
行いたかったのではなく、PDFの画像をテキスト化した上で、テキスト読み取ることが可能かがおわかりでしたらご教示頂けると幸いです。
今後、わかりやすく質問しますので度々で申し訳ありませんが
宜しくお願い致します。
たけさんへ
そ、そうですか~w
>Acrobat Pro 11でツールからテキスト認識をページ単位で行える
>かと思いますが、VBAで座標を指定して、ある特定の位置の
>テキスト認識が可能か
「テキスト認識」を起動させるという事ですか。
はっきりと返答できます。
無理です。
1)「テキスト認識」そのものを起動するVBA(OLE)が無い
2)VBAから「テキスト認識」のメニュー起動は出来るが、その次がVBAは出来ない
3)「テキスト認識」つまりOCR機能はOLEそのものがサポートしてない
上記サンプルの CropPage を使って指定座標でトリミングを行い、そのPDFを出力する。その出力ファイルを別の XXX ソフトで一括でOCR「テキスト認識」する。・・ぐらいかな。
たぶん、当サイトでは無理だと思います。
管理人さん
ご回答いただきましてありがとうございます。
できないことがわかってスッキリしました。
いろいろとご教示頂きまして大変お手数をお掛けしました。