PDFとたわむれる

PDFとたわむれる感じで飽きるまで不定期更新blog

PDFとJavaScriptについて3

2008-11-18 | Weblog
AdobeReader(Acrobat)のJavaScriptには独自のグローバル変数があります。

グローバル変数を使うと、異なるPDFファイル内(文書レベル(PDFの単位))
のJavaScriptで変数を共有することが出来たり、自分で作ったJavaScriptの
ツール(フォルダレベル)で設定等を保存する事が出来ます。

グローバル変数は、global.XXX のように頭に”global”を
付けた形となります。
V8までの定義方法は単純に「global.XXX = 8;」なんですが
V8以降セキュリティ上の理由からいろいろ変更されていて、
使用用途により定義方法が異なります。
文書レベルの場合、基本的に保存をした文章以外から変数を読み出す事は
制限されるようになりました。もし文章同士でGlobal変数を共用したい場合
下記のように関数内で特権を与えた上で変数定義を行う必要が有ります。

setXXX = app.trustedFunction ( function(value)
{
app.beginPriv();
global.XXX=value;
app.endPriv();
});
setXXX(8);

つまり文章レベルでは、永続化(下で出てくる)を行わない限り
「global.XXX = 8;」の形式で定義する意味はなく(普通の変数と一緒)
文章同士で共用する場合、必ず上記のように行う必要が有ります。
少し不便ですがしょうがないですね。

ただし、フォルダレベルの場合は上記のような表記は不要で
「global.XXX = 8;」の形式でOKです。

global変数を永続化する場合は変数を定義した後に
global.setPersistent("XXX", true);
としたあげましょう。

永続化するとAdobeReader(Acrobat)を終了しても
次回起動時に同じ変数を使用することが出来ます。

どのように永続化しているかは簡単に確認できます。

適当に変数を保存しAdobeReaderを閉じます。(Acrotray.exeも閉じてください)
JavaScriptの保管フォルダと同じ場所
(C:Documents and Settings%USERNAME%Application DataAdobeAcrobat8.0JavaScripts)にある『glob.js』を覗くと

try{eval((new String("global.XXX=(new Number(8))")).valueOf());}catch(e){}

のような感じに定義されたはずです。
シリアライズされてファイルに保存されるわけです。
起動時に『glob.js』が読み込まれevalにて変数が定義されるというわけです。

V5マニュアルには永続化できるは”ブーリアン、数値、文字列型の変数”と記載されていますが、V8では配列や連想配列も使用できました。
文字列には当然日本語も使用できます。(uxxxxの形で保存される)

保存できる変数の大きさはV6以前では制限があるようですが
マニュアルによって書いてある事が違うので(2k-4k又は32k)
よくわかりません。

ちなみにV8では設定元の文書情報は、glob.settings.jsに保存されます。

Global変数については情報が少ないので、各バージョンでの互換性や
v8以降の変更など、ちゃんと使うには自分で試してみるしか無さそうですね。

JavaScript初心者の私が解説するにはやはり無理があるので
次は、実際に作ってみたJavaScriptのツールを公開したいと思います。

では~

最新の画像もっと見る