一覧
PDFドキュメント全体を現すオブジェクトです。
サイレント(Acrobatを表示しない)で実行されるオブジェクトです。
メソッド | 解説 |
---|---|
AcquirePage | 指定されたページを取得し、PDPageオブジェクトを返します。 |
ClearFlags | PDFドキュメントの文書フラグをクリアする。 |
Close | 1つのPDFドキュメントを閉じる。 変更等は反映されません。 |
Create | 空のPDFドキュメント(AcroExch.PDDocインスタンス)を作成します。 |
CreateTextSelect | 指定ページのAcroRectオブジェクトで指定された四角のテキスト範囲をPDTextSelectオブジェクトとして取得する。この後は選択されたテキストをAVDoc.SetTextSelectionメソッドとAVDoc.ShowTextSelectメソッドを使って表示します。 |
CreateThumbs | サムネイル画像をドキュメントの指定された頁範囲に作成します。 |
CropPages | PDFドキュメント内の指定されたページをトリミング(範囲指定で切り取り)します。 トリミング結果が72ポイント(1インチ)未満ならば要求が無視されます。 |
DeletePages | 1つのPDFドキュメントから指定ページを削除する。 |
DeleteThumbs | ドキュメントで指定された頁からサムネイル画像を削除します。 |
GetFileName | このAcroExch.PDDocに関連しているファイルの名前を得ます。 |
GetFlags | 文書フラグを取得します。 文書フラグは合計された状態で返されます。 |
GetInfo | PDFドキュメントのInfo情報の指定されたキーの値を得ます。 最大512バイトは返されます。 ここから文書プロパティの概要タブのタイトル等の値も取得できます。 |
GetInstanceID | ドキュメントのトレーラのID配列からのGetInstanceID GetsインスタンスID(2番目の要素)。 |
GetJSObject | Acrobat アプリ環境内で使用できるAcrobat JavaScript にアクセスするメカニズムのJSObject オブジェクトを提供します。 PDDoc に関連付けられたJSObject オブジェクトを通して Acrobat JavaScript のDoc オブジェクトのメソッドやプロパティを使うことが出来ます。 |
GetNumPages | PDFファイルの頁数を得ます。 |
GetPageMode | PDFドキュメントの初期ページ表示モードを得ます。 注意事項有り。 |
GetPermanentID | ドキュメントのトレーラでID配列から永久的なID(最初の要素)を得ます。 |
InsertPages | 現在のPDFドキュメント内で指定された頁の後に、 別のPDFドキュメントを指定ページ数分だけ挿入する。 |
MovePage | 同じPDFドキュメントの1ページを別ページへ移動させます。 |
Open | 1つのPDFドキュメントをサイレント(画面に表示しない)で開く。 |
OpenAVDoc | Acrobatアプリケーションを起動して、PDFドキュメントを表示する。 同時にこのPDFドキュメントのAVDocオブジェクトも作成する。 |
ReplacePages | 現在のPDFドキュメントをソースPDFドキュメントから指定されたページ数で入れ替える。 リンクもしおりもコピーされないが、テキスト注釈は引数指定でコピー出来ます。 |
Save | PDFドキュメントを保存します。 保存方法の指定が出来ます。 最適化や別名での保存も出来ます。 |
SetFlags | 文書フラグをOLEで使用中のPDFドキュメントにセットします。 |
SetInfo | PDFドキュメントのInfo情報にキーとその値をセットする。 キーが無ければ追加される。 ここから文書プロパティの概要タブのタイトル等の変更ができます。 |
SetPageMode | PDFドキュメントを開いて表示する時の表示方法のモードをセットします。 注意事項有り。 |
< TOPへ >
このHPを参考に、PDF文章の結合ができました。大変役にたち、ありがとうございました。それで、その結合した文章で最新のものつまり、最終ページで開きたいのです。
SetPageModeで、表示方法がセットできますが、開くページを設定するメソッドもしくはプロパティがわかりません。
よろしくお願いいたします。
kevinさん。初めまして。
未完成なサイトで申し訳ない状態ですが、少しはお役に立っている事は嬉しいです。
質問の件ですが、解答は少しお時間を下さい。kevinさんのご指摘の通りOLE(IAC)にはそれに該当するプロパティとメソッドが見当たりません。
・AppオブジェクトのSetPreferenceExメソッド
・PDDocオブジェクトのGetJsobjectメソッド
※Acrobat Java ScriptへのOLE連携
・レジストリ? ※論外?
・Java Script ※セキュリティ上使いたく無い
上記4点を中心に調査します。場合によっては別の逃げ手?も考えています。
しばし、お時間を・・。
早速のご返事ありがとうございます。
また、お手数をおかけいたします。
逃げてとしては、文章を結合するときに、必ず先頭に挿入していくでできそうです。
(今まで作成した文章を入れ替える必要はありますが・・・)
ファイル結合例ですが、文章をどんどんスキャナで取り込んでPDFにし、それにIDを振り(個人別)、そのID毎に組み込んでいくというものですが、数十枚の文章が数秒で結合終了します。
これにはクライアントさんもビックリしています。
kevinさん。返事が遅くなりました。
お急ぎと思いますので現時点での結論から先に。
「OLEだけでは出来ません」。(汗
>文章を結合するときに、必ず先頭に挿入
その考え方で試してみましたがうまく出来ません。以下参照。
Sub Test05_ketugo()
Dim AcroPDDocNew As New Acrobat.AcroPDDoc
Dim AcroPDDocAdd As New Acrobat.AcroPDDoc
Dim lRet As Long
Dim lGetNumPages As Long
Dim lPages As Long
Dim i As Long
lPages = 0
'空のPDFファイルを作成する
lRet = AcroPDDocNew.Create()
'空のPDFファイルに追加する
lRet = AcroPDDocAdd.Open("E:¥Test01_1.pdf")
lGetNumPages = AcroPDDocAdd.GetNumPages()
For i = lGetNumPages To 0 Step -1
lRet = AcroPDDocNew.InsertPages( _
PDBeforeFirstPage, AcroPDDocAdd, _
i - 1, 0, True)
Next
lRet = AcroPDDocAdd.Close()
lPages = lPages + lGetNumPages
'更にPDFファイルを追加する
lRet = AcroPDDocAdd.Open("E:¥Test01_2.pdf")
lGetNumPages = AcroPDDocAdd.GetNumPages()
For i = lGetNumPages To 0 Step -1
lRet = AcroPDDocNew.InsertPages( _
PDBeforeFirstPage, AcroPDDocAdd, _
i - 1, 0, True)
Next
lRet = AcroPDDocAdd.Close()
'結合したPDFファイルを最後に保存する
lRet = AcroPDDocNew.Save(1, "E:¥Test01_NEW.pdf")
lRet = AcroPDDocNew.Close()
'オブジェクトを強制開放する
Set AcroPDDocAdd = Nothing
Set AcroPDDocNew = Nothing
Debug.Print "完了:" & Now
End Sub
逃げ手としては
lRet = objAcroApp.MenuItemExecute("GeneralInfo")
で、文書のプロパティ画面を表示してSendKeyで
・[Ctrl]+[Home]
・[Ctrl]+[Tab] x 3回
・[tab] x 4回
・最終ページ数をセット
・[Enter]
キーをエミュレートする。※格好悪い!
もちろん上記ロジックが動作中はパソコンを触れないし、他のアプリも動作させないようにする。
kevinさんが言う「文章を結合するときに、必ず先頭に挿入」するやり方のロジックを問題が無い範囲で結構ですので一部を見せていただけないでしょうか。結合メソッドは不安定な動作をするモノが一部あるので確認をしたいと思っております。
最後に追加、先頭に挿入の関数を作成しました。結果は確認しました。
Kevin
'-----------------------------------------------------------
' BindPDF by Kevin
' sNew:組み込まれるPDF(蓄積されるPDF)
' sAdd:組み込もうとするPDF
' insMode False:最後に結合 True:先頭に結合
'-------------------------------------------------------------
Function BindPDF(ByVal sNew As String, ByVal sAdd As String, ByVal insMode As Boolean) As Boolean
Dim AcroPDDocNew As Object
Dim AcroPDDocAdd As Object
Dim lret As Long
Dim lPageNew As Long
Dim lPageAdd As Long
BindPDF = False
If Not AcroPDDocNew Is Nothing Then 'エラー時に開きっぱなしになる場合がある?
Set AcroPDDocNew = Nothing
End If
On Error GoTo er_proc
'①sNewの準備:インスタンスの作成
Set AcroPDDocNew = CreateObject("AcroExch.PDDoc")
If Dir(sNew) = "" Then 'PDFが存在しない
'新規作成------------------------------------------------------
lret = AcroPDDocNew.Create()
If lret = 0 Then
MsgBox "Fail to Create!"
Exit Function
End If
Else
lret = AcroPDDocNew.Open(sNew)
End If
'sNnewのページ数を取得
lPageNew = AcroPDDocNew.GetNumPages()
If lPageNew < 0 Then
MsgBox "Fail to GetPageNew!"
Exit Function
End If
'②sAddの準備:インスタンスの作成
Set AcroPDDocAdd = CreateObject("AcroExch.PDDoc")
lret = AcroPDDocAdd.Open(sAdd)
If lret = 0 Then
MsgBox "Fail to Open!"
Exit Function
End If
'sAddのページ数を取得
lPageAdd = AcroPDDocAdd.GetNumPages()
If lPageAdd < 0 Then
MsgBox "Fail to GetPageAdd!"
Exit Function
End If
'次のコメントに続く
'前のコメントより続く
'-------------------------------------------------
'③sNewにsAddを追加する→InsertPages(引数)を利用する
'-------------------------------------------------
'insMode = True ’実験用
If insMode = False Then '最後に追加
'引数: 追加される側のページ-1, 追加するオブジェクト,開始ページ, 追加するページ数 ,しおりを使用しない)
lret = AcroPDDocNew.InsertPages(lPageNew - 1, AcroPDDocAdd, 0, lPageAdd, False)
Else '先頭に挿入
'引数: 先頭情報=-1, 追加するオブジェクト,開始ページ, 追加するページ数 ,しおりを使用しない)
lret = AcroPDDocNew.InsertPages(-1, AcroPDDocAdd, 0, lPageAdd, False)
End If
If lret = 0 Then
MsgBox "Fail to InsertPages!"
Exit Function
End If
lret = AcroPDDocAdd.Close()
If lret = 0 Then
MsgBox "Fail to Close!"
Exit Function
End If
Set AcroPDDocAdd = Nothing
'------------------------------------------------------------------------------------------------
'④登録して実際にPDFを作成する
lret = AcroPDDocNew.Save(1, sNew)
If lret = 0 Then
MsgBox "Fail to Save!"
Exit Function
End If
If lPageNew > 0 Then
lret = AcroPDDocNew.Close() '新規作成では必要がないらしい?
End If
Set AcroPDDocNew = Nothing
BindPDF = True
' MsgBox "追加しました。", vbExclamation, app.title
Exit Function
er_proc:
MsgBox "BindPDF:" & Err.Description, vbCritical, App.Title
Exit Function
End Function
Kevinさん。
ありがとうございます。
解析させて頂きます。
Kevinさん。
ありがとうございます。
こちらでのテスト結果をお伝えします。
この関数の使い方のポイントは1点。
① 追加PDFの頁数は1頁のみ。
この条件が変わると「開始ページ」が変わってしまいます。
条件を変えてテストして別に判った事は、後で追加したPDFの最初の頁が「開始ページ」になっていることです。上記に関す情報をSDKに見た記憶はありません。よって、たまたまそうなった可能性があります。
・関数に上記条件①を守るロジックの追加。
・Acrobatのバージョンアップ時には再テストが必要な事。
の2点が今後の課題だと思われます。
なお、余談ですがAcrbat v7,v8,v9はOLEのメソッドとプロパティの数の変更は無いみたいです。引数内容の追加はありましたが。また、今回の調査結果でJavaScript APIでもAcrobatを完全に制御する事は出来ないみたい(=憶測)と判断しました。
NORITO様
追試験ありがとうございました。
複数ページの挿入は想定していませんでした。目的は最後に挿入したページが開始ページになることなので、汎用性はありませんが、目的は達成できました。
ご指摘の通り、挿入位置および、挿入順序は③をもう少し改造すれば、もっと汎用性のある関数に出来ると思います。
今後PDF関連でお教えいただくことが出てくると思いますので宜しくお願いいたします。
kevinさんの様な事をしたいメソッドの提供がされてないのが、現在のAcrobat OLE(IAC)の現状です。Acrobatの機能は上がっても、OLE機能はv7から見直しがされてないように感じられます。v9はまだ簡単な調査しかしてませんが、OLEの機能アップは感じられませんでした。国際標準化(ISO)の動きによってはv10が早期に出るかもしれません。その時に期待したいと思っています。
kevinさん。頑張って下さい。
初めまして。
こちらのサイトではいろいろと
PDFオブジェクトを操作するのに勉強になる情報が多く
とても重宝させていただいております。
つきましては
まだ勉強をし始めたばかりの初心者で
お門違いな質問でしたら大変申し訳ありませんが
下記3点ご質問させてください。
①Acrobat.AcroPDDocとAcroExch.PDDocの違い
サンプルコードでは
Acrobat.AcroPDDocで宣言などしておりますが
サイトの説明では
AcroExch.PDDocのメソッド説明などと記載しておりますが
そもそもこの違いはありますでしょうか。
②VBAではなくVB.net
サンプルなどではエクセルのVBAでのコードが
よく記載されておりますが
現在vb.netでのシステム構築に
このPDFの操作を組み込もうと考えておりますが
実際のところ考え方は同じでしょうか。
例)Acrobat Proをライセンス購入の上
インストールし
参照設定した後プログラムにて
AcrobatのOLE操作を行う流れ
③Acrobat SDKについて
Acrobat SDKは
VBAなどでPDFのOLE操作をするプログラムを
作成する場合には
Acrobat Proのインストールだけではなく
Acrobat SDKも導入しないといけないのでしょうか。
(開発機だけでなく実際稼働する端末にも必要?)
◆OS
Windows10
◆Acrobat
現在検討中ですが
最新のAcrobatProを導入予定
◆やりたいこと
対象フォルダに置いている
PDFファイルをページ単位で分割し
あらかじめ準備していた
PDFファイルと複合して
別ファイルとして保管する
(自動でこの動作を行う)
以上なにとぞよろしくお願いいたします。
Kazukiさん はじめまして。
>①Acrobat.AcroPDDocとAcroExch.PDDocの違い
同じです。
「AcroExch.PDDoc」はSDKドキュメン内でよく使われている表現です。当初、当サイトでは「PDDoc」だけにしょうかとも考えましたが、SDK文書での表現を優先しました。
でも、確かに迷いますネ。スイマセン。(汗
>②VBAではなくVB.net
>・・・
>実際のところ考え方は同じでしょうか。
「考え方」は同じと思っています。
VB.Netの開発経験は無いですが、一応、勉強だけは昔しました。移行ウイザードを使う必要も無いと思っています。参照設定は変わるのかな?
>③Acrobat SDKについて
>・・・
>(開発機だけでなく実際稼働する端末にも必要?)
「実際稼働する端末」にはSDKは不要です。Acrobat Proのインストールだけで結構です。
SDKには13種のVB.Netのサンプルが入ってます。その部分は開発PCでも使えるはずです。他の(英語の)ドキュメントは、あまりメンテナンスがされている様には見えないので、オススメはできません。でも、時間に余裕が有るのでした参考にはなります。
>◆やりたいこと
InsertPagesが参考になります。
>管理人様
とても丁寧かつ迅速なご回答ありがとうございます。
とても参考になります。
今後も
色々と参考にさせていただきますので
なにとぞよろしくお願いいたします。
以前にもお世話になり、大変に助かっています。
pdf上で選択した部分のデータをワードにペーストしたいのですが、できるでしょうか?
word2019
acrobat pro
word VBA的に書くと次のようになります。
---------
Set App = CreateObject("AcroExch.App")
Set AVDoc = App.GetActiveDocSet PDDoc = AVDoc.GetPDDoc
PDDoc.Active
Selection.Copy
ActiveDocument.Range.Paste
---------
よろしくお願いいたします
天野さんへ
質問内容を再確認します。間違っている部分が有ればご指摘ください。
1)PDFを人がマウス又はキーボードを使ってAcrobat上に表示する。
2)表示されたPDF上のデータを人がマウス又はキーボードで選択する。※選択した内容のクリップボードへのコピー操作は無い。
3)MS-Wordを起動し、Word内のVBAを動かして「PDF上の選択した内容」を取得し、Word内のVBAを使用して貼り付ける。
Acrobat OLE(IAC)はVBAを使ってオープンしたPDFファイルに対して操作が可能です。しかし、Acrobat OLE(IAC)以外で既に起動して表示されているPDFファイルに対しての操作等の命令は存在しなかったはずです。よって、上記の「PDF上の選択した内容」の判断も操作も出来ません。
PDF上で選択したと同時にクリップボードへコピーしてくれれば、「ActiveDocument.Range.Paste」が活かせるのですが、多分違うのでしょう。
管理人さん
ありがとうございます。
PDF上の文章を選択した後の
「Ctrl+C」
を省略したかったのです。
>Acrobat OLE(IAC)はVBAを使ってオープンしたPDFファイルに対して操作が可能
頁単位ならできるかもと考えてもいたのですが、
PDFは予めオープンしておく必要がある操作ですので、あきらめます。
大変に勉強になりました。
ありがとうございます。