TOP > サンプル / 関数 > createChild [...]
説明
PDF にしおりを追加します。
しおりには該当ページへ移動する設定 (JavaScript) もします。
しおりの追加はAcrobat OLE の JSObject 経由で
- Doc オブジェクト/ bookmarkRoot プロパティ
- Bookmark オブジェクト/ createChild メソッド
- Bookmark オブジェクト/ Children プロパティ
- Bookmark オブジェクト/ insertChild メソッド
を使います。
Doc オブジェクト/ bookmarkRoot プロパティ
説明
しおりツリーのルートしおりを示します。
このしおりは画面に表示されません。プログラムでツリーや子しおりにアクセスする際に基準として使用されます。
Bookmark オブジェクト/ createChild メソッド
説明
指定位置に新しいしおりを追加します。
すでに指定位置にしおりが存在するとその上に追加します。
形式
JSObject.createChild cName , [cExpr] , [nIndex]
引数
- 第1引数 (cName) :
しおりタブに表示するしおりの文字列。 - 第2引数 (cExpr) : (オプション)
ユーザがしおりをクリックするたびに評価する式。
ここにAcrobat JavaScript を指定します。
省略すると、アクション無しのしおりになります。 - 第3引数 (nIndex) : (オプション)
しおりを追加する位置を指定します。
通常は0をスタートにして1,2,3と指定します。
0または無指定時にはトップに追加されます。
デフォルトは 0 です。
Bookmark オブジェクト/ Children プロパティ
説明
しおりツリー内の Bookmark オブジェクトの配列を返します
Bookmark オブジェクト/ insertChild メソッド
説明
指定のしおりを子として挿入します。
指定のしおりが既にツリーに存在する場合は、一度ツリーから切り離して挿入し直します。また、挿入の循環が確認され、循環している場合は挿入されません。これにより、しおりがそれ自体の子または孫として挿入されるのを防ぐことができます。
形式
JSObject.insertChild oBookmark , [nIndex]
引数
- 第1引数 (oBookmark) :
子として追加する bookmark オブジェクト(しおり)。 - 第2引数 (nIndex) : (オプション)
新しい子を挿入する位置を指定します。
通常は0をスタートにして1,2,3と指定します。
デフォルトは 0 です。
サンプル:Excel のVBA
しおりを追加します。
しおりを上からクリックするとページ1,ページ2,・・・、ページ6を表示します。また、しおり「1.Test1」を操作すると同時に「ビープ音が鳴る」Acrobat JavaScript [ app.beep(0); ] を追加します。
- F8キーでステップ実行しながら動作確認出来ます。
- 参照設定を事前にします。
Download:sample-JSObject_createChild.xls
001 Option Explicit
002
003 Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
004
005 'write changes only
006 Public Const PDSaveIncremental = &H0
007 'write entire file
008 Public Const PDSaveFull = &H1
009 'write copy w’o affecting current state
010 Public Const PDSaveCopy = &H2
011 'writes the file linearized for page-served
012 'remote (net) access.
013 Public Const PDSaveLinearized = &H4
014 '/* OK to store binary in file */
015 Public Const PDSaveBinaryOK = &H10
016 'perform garbage collection on unreferenced objects ”
017 Public Const PDSaveCollectGarbage = &H20
018
019 Sub JSObject_createChild()
020 Dim objAcroApp As New Acrobat.AcroApp
021 Dim objAcroPDDoc As New Acrobat.AcroPDDoc
022 Dim objAcroAVDoc As New Acrobat.AcroAVDoc
023 Dim jso As Object
024 Dim lRet As Long
025 Dim objRootBM As Object
026 Dim objBookMark(5) As Object
027 Dim result As Variant
028 Dim i As Long
029
030 Const CON_FILE = "I:\Adobe PDF\execMenuItem1.pdf"
031
032 'JSObjectオブジェクト作成時のNothingの回避策
033 'Acrobatアプリを強制的にメモリにロードする
034 lRet = objAcroApp.CloseAllDocs
035
036 'F8で見ながらテストする時
037 lRet = objAcroAVDoc.Open(CON_FILE, "")
038 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc
039 objAcroApp.Show
040
041 '本番時だけの開始処理
042 ' lRet = objAcroPDDoc.Open(CON_FILE)
043
044 Set jso = objAcroPDDoc.GetJSObject
045
046 If Not jso Is Nothing Then
047
048 'しおりのルート設定
049 Set objRootBM = jso.bookmarkRoot
050
051 'しおりを追加
052 With objRootBM
053 .createChild "1.Test1", "this.pageNum=0; app.beep(0);", 0
054 .createChild "1.1 Test1-1", "this.pageNum=1", 1
055 .createChild "1.2 Test1-2", "this.pageNum=2", 2
056 .createChild "2.Test2", "this.pageNum=3", 3
057 .createChild "2.1 Test2-1", "this.pageNum=4", 4
058 .createChild "2.1.1 Test2-1-1", "this.pageNum=5", 5
059 End With
060
061 'ルートしおり直下のchildを取得、それぞれを参照する
062
063 'オブジェクトを設定
064 result = objRootBM.Children 'コレを実行するとAcrobatプロセスが残る
065 For i = 0 To UBound(objBookMark)
066 Set objBookMark(i) = result(i)
067 Next i
068
069 '階層構造を作成
070 objBookMark(0).insertChild objBookMark(1), 0
071 objBookMark(0).insertChild objBookMark(2), 1
072 objBookMark(3).insertChild objBookMark(4), 0
073 objBookMark(4).insertChild objBookMark(5), 0
074
075 '終了処理
076 For i = 0 To UBound(objBookMark)
077 Set objBookMark(i) = Nothing
078 Next i
079 Set objRootBM = Nothing
080 Set result = Nothing
081
082 End If
083
084 'PDFファイルを保存して閉じます
085 lRet = objAcroPDDoc.Save(PDSaveIncremental, CON_FILE)
086
087 'Acrobatプロセスを終了
088 objAcroApp.CloseAllDocs
089 objAcroApp.Hide
090 objAcroApp.Exit
091
092 'オブジェクトを強制開放する
093 Set jso = Nothing
094 Set objAcroPDDoc = Nothing
095 Set objAcroAVDoc = Nothing
096 Set objAcroApp = Nothing
097
098 '6秒停止してAcrobatプロセスに後処理をさせる
099 DoEvents
100 Sleep 6000
101
102 'プロセスが残った場合強制終了
103 Call TerminateAcrobat
104 End Sub
105
106 ' 引用先URL:
107 ' https://www.ka-net.org/blog/?p=7244
108
109 Private Sub TerminateAcrobat()
110 'Acrobatのプロセス強制終了
111 Dim items As Object
112 Dim item As Object
113
114 Set items = CreateObject("WbemScripting.SWbemLocator") _
115 .ConnectServer.ExecQuery("Select * From Win32_Process Where Name = 'Acrobat.exe'")
116 If items.Count > 0 Then
117 For Each item In items
118 item.Terminate
119 Next
120 End If
121 End Sub
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
補足
- Bookmark オブジェクト/ setAction メソッドでしおりにAcrobat JavaScriptを設定出来ます。しかし、そのしおりで既に定義されているアクションが上書きされます。
- Acrobat Reader では動作しません。
Acrobat Pro 本体がデフォルトでインストールされているパソコン環境だけです。
注意
- ここのサンプルはしおりの操作後のページ移動に Acrobat JavaScript を使っています。通常は「この文書内のページを表示」と言うしおり標準のアクションを使います。それにしたい場合は以下を御覧ください。
CPDF:メッチャ多機能なPDFのコマンドライン・ツール
上記の「しおりの抽出、削除、登録」を参考にしてください。しおりでの移動先ページ番号は指定できますが「G5.557309」の様な移動先は指定できません。
- コメントから、Acrobat プロセスが終了しないご指摘が有りました。試行錯誤の結果、強制的にAcrobat プロセスを終了させるロジックを追加しました。なお、6秒という数値は経験則から出したものです。(勘
- 当ページで解説している引数の説明に関してはAcrobat JavaScriptのマニュアルを御覧ください。 当サイトに質問をされても返事は出来ません。
理由:質問に返答出来るまで Acrobat JavaScript を理解してないからです。
動作確認環境
- Windows 10 Pro 64bit +
Acrobat XI Pro + Office 2007 + MicrosoftUpdate - Windows 7 64bit Home + SP1 +
Acrobat 8.3.1 Pro + Office 2007 + MicrosoftUpdate
Adobe Web 解説 & その他
- Visual BasicとJavaScriptを併用した、しおりの作成方法
- Doc オブジェクト/ bookmarkRoot プロパティ
- Bookmark オブジェクト/ createChild メソッド
- Bookmark オブジェクト/ Children プロパティ
- Bookmark オブジェクト/ insertChild メソッド
- JavaScript™ for Acrobat® API Reference Adobe® Acrobat® SDK バージョン 8.0
BookMark オブジェクトの日本語解説 JavaScript for Acrobat API Reference (Acrobat v10)
BookMark オブジェクトの英語解説- PDFのしおり数を取得するVBAマクロ
VBAから指定プロセスを強制終了させるサンプル有り
< サンプル一覧 >
『Acrobat7Pro』と『Win7-32bit』の環境下で、実行は出来ているが、日本語のしおりを挿入しようとすると、文字化けが生じています!
『Win7-64bit』なら日本語のしおり挿入OKと言うことで、違いが生じるのですね・・・?
Ochan さんへ。
Ochanさんの実行内容が、Ochanさんの結果です。
ご確認が欲しいのでしたら、Adobe社に直接で問い合わせるか、Acrobat コミュニティフォーラム等でお願いします。
管理人さん
他のページでは大変お世話になりました。
今度はこちらのページで失礼いたします。
こちらのプログラムを参考にしてしおりを作成しています。
私のプログラムではプロセスが残る為、
こちらのプログラムをそのまま実行したところ、やはり残るようです。
しおり作成部分を飛ばせばプロセスは消えます。
(Set jso = objAcroPDDoc.GetJSObject~
lRet = objAcroPDDoc.Save(PDSaveIncremental, CON_FILE) の
前まで飛ばす)
私の環境だけでしょうか?
お時間のある時にご返信いただけると幸いです。
tmk さんへ。
「'オブジェクトを強制開放する 」の部分に以下を追加してみて下さい。(汗:漏れていました
Set jso = Nothing
VBA本体は基本的に「変数がスコープ領域を出るとその変数(やオブジェクト)を自動的に開放する」と言う機能が付いています。しかし、それが正しく機能しない場合が有ります。それで「オブジェクトを強制開放する 」と言うロジックをあえて追加しています。
バージョン Office 2007 系は、その点はまだ完全でないみたいです。
「Dim ・・・ As New.・・・」
「Dim ・・・ As Object」
「Set ・・」
等で使っている変数は最後に強制的に
「Set ・・・ = Nothing 」
しないと駄目みたいです。
ご検証ください。
管理人さん
ご返信ありがとうございます。
Nothingは私も考えたので追記しましたが、それでも残ってしまいました。
どうやら下記の部分を通ると残ってしまうようです。
result = objRootBM.Children
resultの初期化等、色々試してみましたが消えませんでしたので、
下記のページを参考に、プロセスを強制終了する事にしました。
https://www.ka-net.org/blog/?p=7244
宜しくお願い致します。
tmk さんへ
確かにご指摘の箇所以降はプロセスが終わりません。
これでもか!、なんのそこ!、これならど~だ!(汗)とあの手この手でやってみましたが、終わりません。
教えていただいたロジックを追加させて頂きました。
※タブン、3日ほどしたら思い出した様にまた挑戦すると思います。
それと・・。
ここのサンプルはしおりの操作後のページ移動にAcrobat JavaScriptを使っています。
通常は「この文書内のページを表示」と言うしおり標準のアクションを使います。
それにしたい場合は以下を御覧ください。
CPDF:メッチャ多機能なPDFのコマンドライン・ツール
上記の「しおりの抽出、削除、登録 / 3.サンプル:しおりの登録」を参考にしてください。
しおりでの移動先ページ番号は指定できますが「G5.557309」の様な移動先は指定できません。(タブン
但し倍率の指定は無いので、解っていると思いますが、プラグイン操作が後で必要になります。
最近追加した部分で、テスト済みです。
ライセンスが少しヤヤコシイ感じがしますが。
プロセスの件は解決策も含めて、ありがとうございました。
管理人さん
しおりの件、ありがとうございます。
実は管理人さんのページを参考に、CPDFでしおりを作成しております。
とても勉強になりました。
プロセスの件は、やはり残ってしまうようですね・・・。
強制終了はやはりあまりしたくないので、いつか解決できる事を祈っています。
tmk さんへ
プロセスの強制終了は後々の事を考えると確かにやりたくない、しかし現状は仕方が無い、ですね。
あとコチラの話ですが、以下はご報告まで。
プラグインが機能しない件が判りました。
しおりが以下の状態の時はプラグインは変更対象にしません。
「移動先を使用」の場合は無視します。
プラグインが変更対象に出来るしおりは以下のモノです。
「ページ番号を使用」の場合は更新対象にします。
CPDFでのしおり作成は下の「ページ番号を使用」なのでプラグインの使用は当然問題無いです。
私が動作確認したPDFは全て「移動先を使用」のしおりを使用したPDFでした。それでプラグインが機能しなかったみたいです。
最初にプラグインの機能を拝見した時に変な違和感を感じました。その違和感が上記の違いだったんです。
?、って事はこのプラグインを使う時はPDFのしおりがどっちの状態かを判断しないといけないという事です、ネ。 ・・・まあ、それは要望が有った時にでも考えます。(汗)
以上、ご連絡させて頂きます。
管理人さん
ご報告ありがとうございます。
とても参考になりました。
また何かありましたら、宜しくお願い致します。
管理人さん
CreateChildメソッドの第2引数で、特定のページに飛ぶ場合の評価式は具体的にはどのようなコードになるのでしょうか。
検索しましたが、知識不足のため発見できませんでした、、
iyk さん はじめまして。
サンプルの行番号 053、054 で説明します。
先に行番号:054 から
>.createChild "1.1 Test1-1", "this.pageNum=1", 1
上記の「this.pageNum=1」はこのPDF文書(this)のページ番号(.pageNum)の2頁目「=1」に移動します、と言う意味になります。ページ番号はゼロからがスタートなので1は2頁目の意味になります。公式の日本語の説明はコチラです。
次に行番号:053 から
>.createChild "1.Test1", "this.pageNum=0; app.beep(0);", 0
上記の「this.pageNum=0; app.beep(0);」はこのPDF文書(this)のページ番号(.pageNum)の1頁目「=0」に移動します。つまり表紙に移動です。更に後ろに「;」が有るので続けてAcrobat JavaScript命令が追加できます。「app.beep(0)」は音を鳴らすです。公式の日本語の説明はコチラです。
「;」をドンドン追加すればループ処理のコードも実行できます。
ご不明な箇所が有れば質問して下さい。
管理人様
ご返信ありがとうございます。
ご案内頂いた内容理解しました。
上記の方法でページ番号を指定したところ、うまくしおりが作成できました。
一方で、adobe以外のPDFリーダーで開くと、しおりをクリックしてもページ遷移がされません。
おそらくCreatechildメソッドで作成した場合、しおりのアクションがacrobatのJavaScriptを使用したページ遷移となっているためかと思われます。
他のリーダーで開いた際もページ遷移が可能となるアクションを指定する方法はご存知でしょうか?
もし、知っておりましたらご教示いただけますと幸いです。
iyk さんへ
>他のリーダーで開いた際もページ遷移が可能となる
>アクションを指定する方法はご存知でしょうか?
私が知る限りではプログラミング・コードを使ってしおりに設定できるアクションは上記のAcrobat JavaScriptしか認識してません。理由は不明ですが、ココ以外のかなりの部分の機能をコードでも設定&操作できないのが現実です。
ご検討下さい。
※すいません。「第2引数 (cExpr) : (オプション)」の説明が良くないです。現状ではAcrobat JavaScriptしか設定できません。修正しました。公式のcreateChildの説明はココです。
管理人様
やはり現状はAcrobatJavaScriptを使うしか方法がなさそうですね。。
ご確認ありがとうございました。
iyk さんへ。
コチラを見て下さい。
※出来るかも・・。詳細部分は未確認。(汗
※10/17追加:ライセンスの確認必要