しおりを追加する (createChild)

TOP > サンプル / 関数 > createChild      [...]


説明

PDF にしおりを追加します。

しおりには該当ページへ移動する設定 (JavaScript) もします。

JSObject しおりを追加する (createChild)

しおりの追加はAcrobat OLE の JSObject 経由で

  • Doc オブジェクト/ bookmarkRoot プロパティ
  • Bookmark オブジェクト/ createChild メソッド
  • Bookmark オブジェクト/ Children プロパティ
  • Bookmark オブジェクト/ insertChild メソッド

を使います。


Doc オブジェクト/ bookmarkRoot プロパティ

説明

しおりツリーのルートしおりを示します。

このしおりは画面に表示されません。プログラムでツリーや子しおりにアクセスする際に基準として使用されます。


Bookmark オブジェクト/ createChild メソッド

説明

指定位置に新しいしおりを追加します。

すでに指定位置にしおりが存在するとその上に追加します。  

形式

JSObject.createChild cName , [cExpr] , [nIndex]

引数

  1. 第1引数 (cName) :
    しおりタブに表示するしおりの文字列。      
  2. 第2引数 (cExpr) : (オプション)
    ユーザがしおりをクリックするたびに評価する式。
    ここに Acrobat JavaScript を設定する事もできます。
    省略すると、アクション無しのしおりになります。   
  3. 第3引数 (nIndex) : (オプション) 
    しおりを追加する位置を指定します。
    通常は0をスタートにして1,2,3と指定します。
    0または無指定時にはトップに追加されます。
    デフォルトは 0 です。   

Bookmark オブジェクト/ Children プロパティ

説明

しおりツリー内の Bookmark オブジェクトの配列を返します


Bookmark オブジェクト/ insertChild メソッド

説明

指定のしおりを子として挿入します。

指定のしおりが既にツリーに存在する場合は、一度ツリーから切り離して挿入し直します。また、挿入の循環が確認され、循環している場合は挿入されません。これにより、しおりがそれ自体の子または孫として挿入されるのを防ぐことができます。

形式

JSObject.insertChild oBookmark , [nIndex]

引数

  1. 第1引数 (oBookmark) :
    子として追加する bookmark オブジェクト(しおり)。      
  2. 第2引数 (nIndex) : (オプション)
    新しい子を挿入する位置を指定します。
    通常は0をスタートにして1,2,3と指定します。
    デフォルトは 0 です。        

 

 

サンプル:Excel のVBA

しおりを追加します。

しおりを上からクリックするとページ1,ページ2,・・・、ページ6を表示します。また、しおり「1.Test1」を操作すると同時に「ビープ音が鳴る」Acrobat JavaScript  [ app.beep(0); ] を追加します。

JSObject しおりを追加する (createChild)
  • F8キーでステップ実行しながら動作確認出来ます。
  • 参照設定を事前にします。

Downloadsample-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編)
 


補足

  1. Bookmark オブジェクト/ setAction メソッドでしおりにAcrobat JavaScriptを設定出来ます。しかし、そのしおりで既に定義されているアクションが上書きされます。  
  2. Acrobat Reader では動作しません。
    Acrobat Pro 本体がデフォルトでインストールされているパソコン環境だけです。   

注意

  1. ここのサンプルはしおりの操作後のページ移動に Acrobat JavaScript を使っています。通常は「この文書内のページを表示」と言うしおり標準のアクションを使います。それにしたい場合は以下を御覧ください。
    CPDF:メッチャ多機能なPDFのコマンドライン・ツール
    上記の「しおりの抽出、削除、登録」を参考にしてください。しおりでの移動先ページ番号は指定できますが「G5.557309」の様な移動先は指定できません。
     
  2. コメントから、Acrobat プロセスが終了しないご指摘が有りました。試行錯誤の結果、強制的にAcrobat プロセスを終了させるロジックを追加しました。なお、6秒という数値は経験則から出したものです。(勘  
  3. 当ページで解説している引数の説明に関しては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 解説 & その他

  1. Visual BasicとJavaScriptを併用した、しおりの作成方法  
  2. Doc オブジェクト/ bookmarkRoot プロパティ   
  3. Bookmark オブジェクト/ createChild メソッド  
  4. Bookmark オブジェクト/ Children プロパティ   
  5. Bookmark オブジェクト/ insertChild メソッド  
  6. JavaScript™ for Acrobat® API Reference Adobe® Acrobat® SDK バージョン 8.0
    BookMark オブジェクトの日本語解説   
  7. JavaScript for Acrobat API Reference (Acrobat v10)
    BookMark オブジェクトの英語解説    
  8. PDFのしおり数を取得するVBAマクロ
    VBAから指定プロセスを強制終了させるサンプル有り

サンプル一覧

「しおりを追加する (createChild)」への11件のフィードバック

  1. 『Acrobat7Pro』と『Win7-32bit』の環境下で、実行は出来ているが、日本語のしおりを挿入しようとすると、文字化けが生じています!
    『Win7-64bit』なら日本語のしおり挿入OKと言うことで、違いが生じるのですね・・・?

  2. 管理人さん

    他のページでは大変お世話になりました。
    今度はこちらのページで失礼いたします。

    こちらのプログラムを参考にしてしおりを作成しています。
    私のプログラムではプロセスが残る為、
    こちらのプログラムをそのまま実行したところ、やはり残るようです。

    しおり作成部分を飛ばせばプロセスは消えます。
    (Set jso = objAcroPDDoc.GetJSObject~
    lRet = objAcroPDDoc.Save(PDSaveIncremental, CON_FILE) の
    前まで飛ばす)

    私の環境だけでしょうか?
    お時間のある時にご返信いただけると幸いです。

  3. tmk さんへ。

    「'オブジェクトを強制開放する 」の部分に以下を追加してみて下さい。(汗:漏れていました

    Set jso = Nothing

    VBA本体は基本的に「変数がスコープ領域を出るとその変数(やオブジェクト)を自動的に開放する」と言う機能が付いています。しかし、それが正しく機能しない場合が有ります。それで「オブジェクトを強制開放する 」と言うロジックをあえて追加しています。
    バージョン Office 2007 系は、その点はまだ完全でないみたいです。

    「Dim ・・・ As New.・・・」
    「Dim ・・・ As Object」
    「Set ・・」
    等で使っている変数は最後に強制的に
    「Set ・・・ = Nothing 」
    しないと駄目みたいです。

    ご検証ください。

  4. 管理人さん

    ご返信ありがとうございます。

    Nothingは私も考えたので追記しましたが、それでも残ってしまいました。

    どうやら下記の部分を通ると残ってしまうようです。
    result = objRootBM.Children

    resultの初期化等、色々試してみましたが消えませんでしたので、
    下記のページを参考に、プロセスを強制終了する事にしました。
    https://www.ka-net.org/blog/?p=7244

    宜しくお願い致します。

  5. tmk さんへ

    確かにご指摘の箇所以降はプロセスが終わりません。
    これでもか!、なんのそこ!、これならど~だ!(汗)とあの手この手でやってみましたが、終わりません。
    教えていただいたロジックを追加させて頂きました。
    ※タブン、3日ほどしたら思い出した様にまた挑戦すると思います。

    それと・・。
    ここのサンプルはしおりの操作後のページ移動にAcrobat JavaScriptを使っています。
    通常は「この文書内のページを表示」と言うしおり標準のアクションを使います。
    それにしたい場合は以下を御覧ください。
    CPDF:メッチャ多機能なPDFのコマンドライン・ツール
    上記の「しおりの抽出、削除、登録 / 3.サンプル:しおりの登録」を参考にしてください。
    しおりでの移動先ページ番号は指定できますが「G5.557309」の様な移動先は指定できません。(タブン
    但し倍率の指定は無いので、解っていると思いますが、プラグイン操作が後で必要になります。
    最近追加した部分で、テスト済みです。
    ライセンスが少しヤヤコシイ感じがしますが。

    プロセスの件は解決策も含めて、ありがとうございました。

  6. 管理人さん

    しおりの件、ありがとうございます。
    実は管理人さんのページを参考に、CPDFでしおりを作成しております。
    とても勉強になりました。

    プロセスの件は、やはり残ってしまうようですね・・・。
    強制終了はやはりあまりしたくないので、いつか解決できる事を祈っています。

  7. tmk さんへ

    プロセスの強制終了は後々の事を考えると確かにやりたくない、しかし現状は仕方が無い、ですね。

    あとコチラの話ですが、以下はご報告まで。

    プラグインが機能しない件が判りました。
    しおりが以下の状態の時はプラグインは変更対象にしません。
    移動先を使用」の場合は無視します。
    「この文書内のページを表示」 / 「移動先を使用」

    プラグインが変更対象に出来るしおりは以下のモノです。
    ページ番号を使用」の場合は更新対象にします。

    「この文書内のページを表示」 / 「ページ番号を使用」

    CPDFでのしおり作成は下の「ページ番号を使用」なのでプラグインの使用は当然問題無いです。
    私が動作確認したPDFは全て「移動先を使用」のしおりを使用したPDFでした。それでプラグインが機能しなかったみたいです。
    最初にプラグインの機能を拝見した時に変な違和感を感じました。その違和感が上記の違いだったんです。

    ?、って事はこのプラグインを使う時はPDFのしおりがどっちの状態かを判断しないといけないという事です、ネ。 ・・・まあ、それは要望が有った時にでも考えます。(汗)

    以上、ご連絡させて頂きます。

  8. 管理人さん

    ご報告ありがとうございます。
    とても参考になりました。

    また何かありましたら、宜しくお願い致します。

  9. 管理人さん

    CreateChildメソッドの第2引数で、特定のページに飛ぶ場合の評価式は具体的にはどのようなコードになるのでしょうか。
    検索しましたが、知識不足のため発見できませんでした、、

  10. 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)」は音を鳴らすです。公式の日本語の説明はコチラです。
    「;」をドンドン追加すればループ処理のコードも実行できます。

    ご不明な箇所が有れば質問して下さい。

コメントを残す

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

CAPTCHA



SAMURAI Plugin

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

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



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

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