JSObject とは
外部クライアント(Acrobat 以外のアプリケーション)のVisual Basic 等などから、Acrobat JavaScript にアクセスするメカニズムをJSObject と言います。
このJSObject はOLE(IAC)から行います。
JSObject はAcrobat JavaScript のDoc オブジェクトのみアクセスを許しています。
制限も有り、Acrobat JavaScript の全ての機能が使える訳ではありません。
JSObject (jso) をブログラム内で宣言するとObject になります。
Acrobat.AcroPDDoc などの固有の型は存在しません。
001 Dim objAcroPDDoc As New Acrobat.AcroPDDoc
002 Dim jso As Object
003 lRet = objAcroPDDoc.Open("D:¥Test01.pdf")
004 '.....
005 Set jso = pdDoc.GetJSObject
006 '.....
007 Set annot = jso.AddAnnot
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
JSObject はタイプライブラリ内に存在しないからです。
よって、JSObject に関してのメソッドやプロパティの明確な記述がコーディング時は見えません。
Acrobat JavaScript の説明書を見ながらコーディングし、実行テストでエラーにならず、処理が完了する事を確認しながらの開発となります。
以上より、JSObject のメソッドやプロパティに関するリファレンス等の説明書は存在しません。
Acrobat JavaScript の説明書を見ることになります。
001 Dim objAcroPDDoc As New Acrobat.AcroPDDoc
002 Dim jso As Object
003 lRet = objAcroPDDoc.Open("D:¥Test01.pdf")
004 '.....
005 Set jso = pdDoc.GetJSObject
006 '.....
007 Set annot = jso.AddAnnot
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
JSObject は特定のPDFドキュメントに関連付けられている必要があります。
その為に JSObject の実行前にPDDocでPDFドキュメントを開く必要があります。
addAnnot は JSObject のメソッドでは無く、Doc オブジェクトに関連付けられているメソッドで有る事がJavaScript リファレンスで明記されています。
この時、jso.doc.addAnnot が正しい構文と思われるますが、jso は Doc オブジェクトであるため、jso.addAnnot が正しい構文となります。
Doc オブジェクトのプロパティおよびメソッドは、このようにして使用します。
使用上の注意点
※「Programming Acrobat JavaScript Using Visual Basic / Acrobat 6.0 」 の「JavaScript を JSObject に変換する際のヒント」より
- 生成に new 演算子を必要とする JavaScript オブジェクトは、使用できません。
これには Report オブジェクトが含まれます。
- Annots オブジェクトは、JSObject の getProps および setProps メソッドを使用してプロパティを別個のオブジェクトとして設定したり取得したりする必要があるという点で、特殊なオブジェクトです。
- 変数の宣言で使用すべき型が不明確な場合は、Variant として宣言します。
これにより、Visual Basic の型変換を柔軟に行えるようになり、実行時のエラーを回避できます。
- JSObject は、新しいプロパティ、メソッド、またはオブジェクトを JavaScript に追加できません。
したがって、global.setPersistent プロパティは意味を持ちません。
- JSObject では、大文字と小文字の区別が無いです。
- JSObject は、常に値を Variant として返します。
これには、メソッド呼び出しからの戻り値のほかに、プロパティの取得も含まれます。
ヌルの戻り値が想定されるときは、空の Variant が使用されます。
JSObject が配列を返すときは、配列の各要素が Variant になります。
Variant の実際のデータ型を確認するには、VBA ライブラリの Information モジュールに含まれるIsArray、IsNumeric、IsEmpty、IsObject、および VarType ユーティリティ関数を使用します。
- JSObject は、プロパティの設定やメソッド呼び出しの入力パラメータとして、Visual Basicの基本的な型のほとんど(Variant、Array、Boolean、String、Date、Double、Long、Integer、Byte など)を扱うことができます。
JSObject は、Error 型およびCurrency 型の値は受け取れません。
サイト管理者からのアドバイス
- このJSObject を使う時はAcrobat アプリ本体 がメモリ上に確実に存在する必要があります。
不規則ですが、JSObject オブジェクトを作成しようとしても、戻り値がNothing になることがあります。
原因は不明です。
その時の対策として、全てのOLE(IAC)実行前に「CloseAllDocsメソッド」を実行します。
このメソッドを実行すると確実にAcrobat アプリ本体 をメモリ上で稼働させます。
これは経験上のテスト結果です。
Doc オブジェクトとは
※以下の階層下のオブジェクトは再調査&テスト要!
Acrobat JavaScript にはPDF文書を操作するためのDocオブジェクトが用意されています。
Docオブジェクトを操作することで、その文書に関する一般情報を取得したり、文書内を移動したり、文書内の他のオブジェクトにアクセスしたりすることができます。
オブジェクトの多くは、PDF文書内のアイテム(ブックマーク、フィールド、テンプレート、注釈、サウンドなど)を表します。
Docオブジェクト階層下のオブジェクト
annot , bookmark , field , template , sound , data [ , app , console ]
日本語の解説書
Acrobat JavaScript , JSObject に関しての日本語の解説書がネット公開されてます。
多少バージョンが古いですが、基本部分は同じですので、かなり参考になると思います。
- Programming Acrobat JavaScript Using Visual Basic
Technical Note #5417 バージョン:Acrobat 6.0 2003年5月
(14頁) Acrobat 6.0 提供のJSObject と言うOLE オートメーション機能のプログラミング環境に関しての概念を説明したもの
最初にJSObject に関して読む必読書!
http://kb2.adobe.com/jp/cps/511/511296/attachments/511296_VBJavaScriptJ.pdf
- Developing Acrobat Applications Using JavaScript
Adobe Acrobat SDK バージョン 8.0(220頁)
JavaScript を使用してAdobe Acrobat での開発や拡張したりする方法について
説明したマニュアル。必読!
http://kb2.adobe.com/jp/cps/511/511719/attachments/511719_js_developer_guide.pdf
- JavaScript for Acrobat API Reference
Adobe Acrobat SDK バージョン 8.0(765頁)
Acrobat JavaScript の詳細な解説書/リファレンス
http://kb2.adobe.com/jp/cps/511/511727/attachments/511727_js_api_reference.pdf
サンプルや例題
以下は雰囲気を知る為のちょっとしたサンプル等です。
<サンプル/例>
- PDFをJavaスクリプトで(OLE)操作する基本
- サンプル「画像PDFの確認をする」
- PDFをHTMLに変換する方法(Excel VBAサンプル/3)
[ Method of conversion from PDF to HTML ] - PDFをWORDに変換する方法(Excel VBAサンプル)
[ Method of conversion from PDF to WORD ] - PDFをRTFに変換する方法(Excel VBAサンプル)
[ Method of conversion from PDF to RTF ] - PDFをXMLに変換する方法(Excel VBAサンプル)
[ Method of conversion from PDF to XML ] - PDFをEPSに変換する方法(Excel VBAサンプル)
[ Method of conversion from PDF to EPS ] - PDFをJPEGに変換する方法(Excel VBAサンプル)
[ Method of conversion from PDF to JPEG ] - PDFをHTML 3.2に変換する方法(Excel VBAサンプル)
[ Method of conversion from PDF to HTML 3.2 ] - PDFを PNG に変換する方法(Excel VBAサンプル)
[ Method of conversion from PDF to PNG ] - PDFをHTMLに変換する方法(Excel VBAサンプル/4)
[ Method of conversion from PDF to HTML ] + レジストリ操作 - PDFをテキストファイルに変換する方法(Excel VBAサンプル)
[ Method of conversion from PDF to Text ] - 透かしをファイルで追加する (addWatermarkFromFile)
別ファイルを透かしと使ってPDF文書に追加する - 透かしを追加する (addWatermarkFromText)
テキストで透かしをPDF文書に追加する - しおりを追加する (createChild)
追加した しおりをクリックするとページ移動する。
<その他>
- Acrobat JavaScript における「Safe Path」についての注意事項
- PDF/JavaScript:VisualBasicからJavaScriptを使用する説明書「VBJavaScript.pdf」
- Adobe Acrobat 8.1 SDK のダウンロード ※VB.NETサンプルの入手
- PDFをHTMLへ変換する上でのイメージファイルを扱う注意事項
< TOPへ >
サイト管理者のメモ
サイト管理者の技術メモなので見なくても結構です。
- Acrobat のバージョンにおける Acrobat JavaScript の変更点を明記した物
511727_js_api_reference.pdf 733頁から
Acrobat 5.0での変更点 , Acrobat 6.0での変更点 , Acrobat 7.0での変更点 , Acrobat 7.05での変更点 , Acrobat 8.0での変更点
- jso.app.activeDoc の app.activeDoc はAcrobat X(10) から
セキュリティの扱いの変更でアクセス不可になったらしい。(動作未確認)
- Doc オブジェクト階層下のオブジェクト では
app , console オブジェクトも扱えるみたい。
console はSDK にもacrojs_j.pdf.pdf のサンプルにも有る。
< TOPへ >
今回PDFからテキスト抽出やJPEG保存する際に大変役に立ちました。
それにしてもAcrobatをVBでインスタンスを作ると、処理方法によっては、Acrobatが最後に解放できず、プロセスが残ってしまうのを解決するのが大変でした。
経験が必要ですね!
それにJavaScriptのsaveAsメソッドも不安定でした。
不安定というよりも、保存先のパスに日本語が含まれると保存できないなどの不具合がありました。
仕方ないので、環境変数から一時保存用のディレクトリパスを取得して、一時ディレクトリに保存した後に、目的の保存ディレクトリに移動することにして回避しました。
自分が使っているAcrobatは7ですが、8以降では改善されているのでしょうか。。。
いずれにせよ研究が必要な感じです。
tyoさん。初めまして。
嬉しい情報付きのコメント、ありがとうございます。
プロセスの件は確かに問題が有ります。それは多分テスト中に中断する事をやると発生するか、オブジェクトの開放処理をせずに終了するとその状態になります。中断するときも終了するときも、最後のオブジェトのCloseと開放(Nothing)を必ずすれば解決すると思います。
基本的にVBA(VB)はスコープを出るとオブジェクトを強制開放しますが、昔からそれは何か信用できないです。特に途中で作業を中断する時はなおさらです。
>・・JavaScriptのsaveAsメソッドも・・・
不安定と・・保存先のパスに日本語が含まれると保存できないなどの不具合・・
この情報はスゴイですね。Acrobat JavaScriptはコア(元祖)JavaScriptのAcrobat拡張バージョンですから、その点で何か問題があるのかもしれません。
しかし、使っているバージョンが7ですか。バージョン情報の付加を検討中です。やはり5からかな?
いずれにせよ、少しはお役に立てた事は嬉しいです。
管理人さん、はじめまして。iga50と申します。
先週よりVBからAcrobatを使用する調査のために、こちらのサイトを利用させていただいています。
はじめのとっかかりがよくわかりまして、大変有難いです。
ありがとうございます。
ただ、今1点、どうしても見つけられない情報があり、質問させていただきます。
OLE経由でJavaScriptを操作することについては、
こちらのサイトやAdobeサイトにもあるようなのですが・・・
私がやりたいのは、VBからPDFのページプロパティ内のJavaScriptを追加したいのですが、ご存じでしょうか?
例えば、VBより、とあるPDFのページプロパティ→アクションで、
トリガー「ページを開く」、アクション「JavaScriptを実行」を、
JavaScriptコードも含めて追加したいのです。
何等かの情報をご存じでしたらご教授いただけませんでしょうか?
iga50 さん。はじめまして。
取り急ぎ返事をさせて頂きます。
JSObject オブジェクトに関する部分ですね。
過去にも似たような質問を受けました・・かな?
http://pdf-file.nnn2.com/?p=86&cpage=1#comment-14
↑ これは関係無いですね。(汗
記憶が古くなっているので思い出すのに時間が掛かりますが・・・。
バージョンは古いですが、基本的な部分は変わっていません。
以下がそれに関する日本語版資料です。
http://kb2.adobe.com/jp/cps/511/511296/attachments/511296_VBJavaScriptJ.pdf
・・・・・。(1時間経過)
チョット、風呂に入って考えてきました。
十中八九、無理でしょう。
過去で出来たケースはテキストファイルをPDF化する時に、
同時にJavaScriptコードを埋め込むと言うケースです。
・・・・・。(更に1時間経過)
但し、最終的に何をしたい、何が目的か、を教えていただければ
別の方法でご提案できるかもしれません。
※メモ1: app.alert( "Acrobat Test-Alert", 3);
※メモ2-1: [アドバンス]->[文書処理]->[すべてのJavaScriptを編集]
※メモ2-2: 「JavaScriptエディタ」画面開く。但し、XMLタグ部分は変更できない!
※メモ3-1: ↓ PDFにJavaScriptを埋め込んだ例(裏ワザ)
http://pdf-file.nnn2.com/?p=86&cpage=1#comment-17
※メモ3-2: 上記の考えで事前にJavaScriptを埋め込んだ空のPDFを作成して、・・テスト結果は失敗
※メモ4: ↓ PDFにJavaScriptを埋め込んだ例(裏ワザ)
http://pdf-file.nnn2.com/?p=86&cpage=1#comment-10
管理人さん、お返事ありがとうございます。
(管理人さまと書かせていただきたいほど、感謝です)
結果から言いますと、私のやりたいことが実現できました。
空のPDFを作成してJavaScriptを埋め込む方法です。
サンプルを作成し動作確認することができました。
ありがとうございました。
今回ご質問させていただいた目的は、このようなことでした。
目的:PDFをWebで閲覧&印刷をさせるが(ユーザー制限あり)、
ローカルへコピーしての不正利用を防ぎたい
(PDFはプログラムで都度自動生成される)
そこで、以下のような方法でローカルコピーで閲覧を防ぐ方法を
見つけました。
(1)PDFの各ページをテキストフィールド(白、読取専用)で覆う
(2)PDF自体は権限パスワードを設ける
(3)AcrobatJavaScriptで以下を記述し、該当URL以外では閲覧不可とする
var arr = ["Text1","Text2","Text3","Text4"];//TextNはテキストフィールド名
if(this.URL.indexOf("http://hoeghoge/")==0){//このURL上でないと閲覧不可となる
for(var i=0;i<arr.length;i++){
this.getField(arr[i]).hidden = true;
}
}
else{
app.alert("保存しての閲覧は許可されていません。")
}
PDFはプログラムで都度作成されるため、
上記処理をVB等で行う必要がありました。
(1)はhttp://kb2.adobe.com/jp/cps/510/510690.html
(2)はhttp://kb2.adobe.com/jp/cps/511/511063.html
でなんとかなりそうでしたが、
(3)を埋め込む方法が見つからずにおりました。
管理人さんよりご教授いただいた方法で、
JavaScriptは以下のようなソースにしますと、
自動生成時にダイアログが表示されることもありませんでした。
var arr = ["Text1","Text2","Text3","Text4"];//TextNはテキストフィールド名
if(this.URL.indexOf("http://hoeghoge/")==0){//このURL上でないと閲覧不可となる
for(var i=0;i<arr.length;i++){
this.getField(arr[i]).hidden = true;
}
}
else{
if(this.URL.indexOf("file:///C|/hogehoge/")==0){//PDF自動生成時の実行フォルダ
}
else{
app.alert("保存しての閲覧は許可されていません。")
}
}
今日中に実現性を調査しなくてはいけなかったため、
大変助かりました。
どうもありがとうございました。
(お風呂でも考えてくださり、休まらなかったですね、すみません)
またご質問させていただくこともあるかもしれませんが、
今後ともよろしくお願いします。
iga50 さんへ。
文書への埋め込みでしたか。
特定ページへの埋め込みに特化した処理かと思っていました。
サンプルまでご提示頂きまして感謝しています。
別の形で公開させてもらいます。
※Acrobat.JavaScriptは知らないので(汗
解決に繋がって幸いです。
※メモを残しておいて、良かった~! v(^_^)