終了

vbaでpdfのしおりとジャンプ先を複数階層の全て取得したいです

New Here ,
Dec 30, 2020 Dec 30, 2020

リンクをクリップボードにコピー

コピー完了

vbaでjsoで、pdfに複数階層のしおりが設定されている場合、

 ルート直下のしおりとジャンプ先を取得する事ができますが、

 さらにその下の階層のしおりとジャンプ先の取得方法がわかりません。

 openとparentの使い方もわかりません。

 宜しくお願い致します。

 (参考にしたサイト:これをcallbynameじゃなく改造してみました。)

  https://www.ka-net.org/blog/?p=7244

 

キーワード
Acrobat SDK と JavaScript

表示

2.3K

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines

correct answers 1 件の正解

Community Beginner , Jan 04, 2021 Jan 04, 2021

今晩は、今日でお休みが終わりだったので、完成(修正)できて良かったです。
他の人の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 + "

...

投票

翻訳

翻訳
Community Expert ,
Dec 31, 2020 Dec 31, 2020

リンクをクリップボードにコピー

コピー完了

bookmarkRootから子要素を辿るならchildren要素を参照します。

詳しくは以下のAPIを確認してください。

http://kb2.adobe.com/jp/cps/511/511727/attachments/511727_js_api_reference.pdf#page173

 

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
New Here ,
Jan 01, 2021 Jan 01, 2021

リンクをクリップボードにコピー

コピー完了

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の表現方法が問題でしょうか?

よろしくお願いします。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Jan 02, 2021 Jan 02, 2021

リンクをクリップボードにコピー

コピー完了

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で加工できればいいなぁ~とおもっています

 

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Jan 02, 2021 Jan 02, 2021

リンクをクリップボードにコピー

コピー完了

わたしはVBAは門外漢なのですが、コードを拝見したところGetJSObjectでドキュメントオブジェクトをVBA側に持って来たあとJavaScriptコードで処理しようとしているように見受けます。

VBA側でGetJSObjectした時点でどの様なオブジェクトが取得できているのか確認した上で、VBAとしてループ処理を書かないとだめです。最初のサイトのコード自体はJavaScriptでの処理はありませんし、2つ目の物に至ってはJavaScriptコードのみでVBAに関する情報はありません。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Jan 03, 2021 Jan 03, 2021

リンクをクリップボードにコピー

コピー完了

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/)
 今のところ、このやり方で出来るかな?と思っています・・・

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Jan 03, 2021 Jan 03, 2021

リンクをクリップボードにコピー

コピー完了

こんにちは、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の違いや注意を教えてもらいたいです。

よろしくお願いします

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Jan 04, 2021 Jan 04, 2021

リンクをクリップボードにコピー

コピー完了

今晩は、今日でお休みが終わりだったので、完成(修正)できて良かったです。
他の人の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さんにも指摘されましたが、質問や投稿のやり方が杜撰だったと思います。
煮詰まって、ボロボロになって、少しでも光が当たったら、喜んでました・・・
もう少し、大人な質問・投稿に注意しますので、また宜しくお願いします。

 

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Jan 04, 2021 Jan 04, 2021

リンクをクリップボードにコピー

コピー完了

最新

直接ドキュメントにJavaScriptを組み込む場合はthisで当該ドキュメントを参照することができますが、件のコードではVBA側で参照したドキュメントをJS側に渡せていない為にドキュメントを参照できていないのだと考えられます。ドキュメント及びアプリケーションの定義から厳密に書いてみるとどうでしょう?

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines