リンクをクリップボードにコピー
コピー完了
vbaでjsoで、pdfに複数階層のしおりが設定されている場合、
ルート直下のしおりとジャンプ先を取得する事ができますが、
さらにその下の階層のしおりとジャンプ先の取得方法がわかりません。
openとparentの使い方もわかりません。
宜しくお願い致します。
(参考にしたサイト:これをcallbynameじゃなく改造してみました。)
https://www.ka-net.org/blog/?p=7244
今晩は、今日でお休みが終わりだったので、完成(修正)できて良かったです。
他の人のVBAの参考になれば良いです。
前回のconfig.jsとVBAの両方とも少し修正して動くようになりました。
CONFIG.JS
var co = "";
function Dbook(doc)
{
//AcrobatDC_js_api_reference p667
//In a function defined in one of the folder-level JavaScripts files, it is undefined.
//Calling functions should pass the Doc to any function at this level that needs it.
//
co="";
DumpBookmark(doc,doc.bookmarkRoot, 0);
return co;
}
function DumpBookmark(doc,bkm, nLevel)
{
for (var i = 0; i < nLevel; i++) ;
bkm.execute()
co = co + nLevel + "
リンクをクリップボードにコピー
コピー完了
bookmarkRootから子要素を辿るならchildren要素を参照します。
詳しくは以下のAPIを確認してください。
http://kb2.adobe.com/jp/cps/511/511727/attachments/511727_js_api_reference.pdf#page173
リンクをクリップボードにコピー
コピー完了
Ten Aさん、年末年始にお返事ありがとうございます!
APIの例と
https://www.ka-net.org/blog/?p=7244の例と
https://ameblo.jp/amiza-ret/entry-10292418481.htmlを参考に、
function DumpBookmark(bkm, nLevel)
{
var s = "";
for (var i = 0; i < nLevel; i++) s += " ";
console.println(nLevel + "+-" + bkm.name);
bkm.execute()
console.println(this.pageNum + 1)
if (bkm.children != null)
for (var i = 0; i < bkm.children.length; i++)
DumpBookmark(bkm.children[i], nLevel + 1);
}
console.clear(); console.show();
//console.println("Dumping all bookmarks in the document.");
DumpBookmark(this.bookmarkRoot, 0);
を作って(改造して)みたのですが、ROOTの表示以外は、表示できるようで、
これをVBAでうまく動かす方法が知りたいです。
javascript の != nullの所のvbaの表現方法が問題でしょうか?
よろしくお願いします。
リンクをクリップボードにコピー
コピー完了
vbaで孫childrenの取得で行き詰ってます。
https://ameblo.jp/amiza-ret/entry-10292418481.html を参考にテキスト出力してみました。
var co ="" ;
function DumpBookmark(bkm, nLevel)
{
var s = "";
for (var i = 0; i < nLevel; i++) s += " ";
co = co + nLevel + "|" + bkm.name + "|" + (this.pageNum + 1) + "\n";
bkm.execute()
if (bkm.children != null)
for (var i = 0; i < bkm.children.length; i++)
DumpBookmark(bkm.children[i], nLevel + 1);
}
console.clear(); console.show();
//console.println("Dumping all bookmarks in the document.");
DumpBookmark(this.bookmarkRoot, 0);
// set up output text
var TEMP_FIELD_NAME = "bookmark"
// add a temporary text field
var f = this.addField(TEMP_FIELD_NAME, "text", 0, [30,30,100,20]);
f.multiline = true; // Make it multiline
f.value = co;
// export field name and value to defined file
this.exportAsText({aFields: TEMP_FIELD_NAME, cPath: "test-text-multi.txt"});
// remove text field
this.removeField(TEMP_FIELD_NAME);
http://pharma-sas.com/how-to-add-multiple-levels-of-bookmark-into-pdf-via-vba/
と一体でvbaで加工できればいいなぁ~とおもっています
リンクをクリップボードにコピー
コピー完了
わたしはVBAは門外漢なのですが、コードを拝見したところGetJSObjectでドキュメントオブジェクトをVBA側に持って来たあとJavaScriptコードで処理しようとしているように見受けます。
VBA側でGetJSObjectした時点でどの様なオブジェクトが取得できているのか確認した上で、VBAとしてループ処理を書かないとだめです。最初のサイトのコード自体はJavaScriptでの処理はありませんし、2つ目の物に至ってはJavaScriptコードのみでVBAに関する情報はありません。
リンクをクリップボードにコピー
コピー完了
Ten Aさんへお返事した返信は、何度UPしてもUPになりませんでした・・・
acrobat11のuser folderは、私の場合は、
C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Javascripts
でした。
そこに、config.js(関数)を置いて、VBA側のjso.関数()で、javascriptの値を取得できました。
(http://khkonsulting.com/2009/03/acrobat-javascript-and-vb-walk-into-a-bar/)
今のところ、このやり方で出来るかな?と思っています・・・
リンクをクリップボードにコピー
コピー完了
こんにちは、config.jsに
///////////////////////////////////////////
var co = "";
function Dbook()
{
co="";
DumpBookmark(this.bookmarkRoot, 0);
return co;
}
function DumpBookmark(bkm, nLevel)
{
for (var i = 0; i < nLevel; i++) ;
bkm.execute()
co = co + nLevel + "|" + bkm.name + "|" + this.pageNum + "\n";
if (bkm.children != null)
for (var i = 0; i < bkm.children.length; i++)
{
DumpBookmark(bkm.children[i], nLevel + 1);
}
}
///////////////////////////////////////////
と記載し、VBAで、
Sub Button1_Click()
'http://khkonsulting.com/2009/03/acrobat-javascript-and-vb-walk-into-a-bar/
Dim r As String
Dim r2 As String
Set gApp = CreateObject("AcroExch.App")
Set avdoc = CreateObject("AcroExch.AVDoc")
iret = avdoc.Open("C:\Users\Y2\Desktop\VBA\BMtest.pdf", "")
gApp.Show 'アプリケーション表示
Set avpv = avdoc.GetAVPageView
Set jso = avdoc.GetPDDoc.GetJSObject
r = jso.Dbook()
Debug.Print (r)
End Sub
で、値を取得できるようになりましたが、
ページNO(this.pagenum)のところが、「undefined」になってしまいます。
pdfの直接のjavascriptと、user folderのjavascriptの違いや注意を教えてもらいたいです。
よろしくお願いします
リンクをクリップボードにコピー
コピー完了
今晩は、今日でお休みが終わりだったので、完成(修正)できて良かったです。
他の人のVBAの参考になれば良いです。
前回のconfig.jsとVBAの両方とも少し修正して動くようになりました。
CONFIG.JS
var co = "";
function Dbook(doc)
{
//AcrobatDC_js_api_reference p667
//In a function defined in one of the folder-level JavaScripts files, it is undefined.
//Calling functions should pass the Doc to any function at this level that needs it.
//
co="";
DumpBookmark(doc,doc.bookmarkRoot, 0);
return co;
}
function DumpBookmark(doc,bkm, nLevel)
{
for (var i = 0; i < nLevel; i++) ;
bkm.execute()
co = co + nLevel + "|" + bkm.name + "|" + doc.pageNum + "\n";
if (bkm.children != null)
for (var i = 0; i < bkm.children.length; i++)
{
DumpBookmark(doc,bkm.children[i], nLevel + 1);
}
}
VBAが
Sub Button1_Click()
'http://khkonsulting.com/2009/03/acrobat-javascript-and-vb-walk-into-a-bar/
Dim r As String
Dim r2 As String
Set gApp = CreateObject("AcroExch.App")
Set avdoc = CreateObject("AcroExch.AVDoc")
iret = avdoc.Open("C:\Users\Y2\Desktop\VBA\BMtest.pdf", "")
gApp.Show 'アプリケーション表示
Set avpv = avdoc.GetAVPageView
Set jso = avdoc.GetPDDoc.GetJSObject
r = jso.Dbook(jso)
'https://community.adobe.com/t5/acrobat-sdk/how-to-check-if-a-pdf-page-has-no-annotations-like-commen...
Debug.Print (r)
End Sub
です。
JSのfolder-levelのthisの扱いと、そのVBAからの与え方が、ハマって、ずっと修正してました・・・
Ten Aさんにも指摘されましたが、質問や投稿のやり方が杜撰だったと思います。
煮詰まって、ボロボロになって、少しでも光が当たったら、喜んでました・・・
もう少し、大人な質問・投稿に注意しますので、また宜しくお願いします。
リンクをクリップボードにコピー
コピー完了
直接ドキュメントにJavaScriptを組み込む場合はthisで当該ドキュメントを参照することができますが、件のコードではVBA側で参照したドキュメントをJS側に渡せていない為にドキュメントを参照できていないのだと考えられます。ドキュメント及びアプリケーションの定義から厳密に書いてみるとどうでしょう?