y-matsui::weblog

電子楽器、音楽、コンピュータ、プログラミング、雑感。面倒くさいオヤジの独り言

PDFに貼り付けたリンクからJavascriptを実行する

PDFで地図なんかのイラストを表現して、中のリンク(例えば、施設管理図面の中のポイントとか、図面中の旗揚げとか)からWebのデータベースの検索条件を指定するJavascriptを起動したいと考えた。
子Windowで起動したPDFから、逆に親Windowに検索条件を通知して、検索を実行する・・という仕掛け。
(つまり、PDF内のリンクをクリックするとそのまま、親Windowで検索結果一覧が更新される。)
WebDBからPDFの表示をコントロールするのはURL引数でOKなので、今度はPDFからWebDB側にパラメータを渡してやることで、双方向の連携が可能となる・・・と思いきや。
ありがちというか、やっぱりというか、日本語文字列のエンコード、デコード問題にぶち当たった。
PDF内に作成したURLリンクでJavascript:SendKeyword(encode('日本語の文字'));としたときに、文字化けしてしまうのだぁ。
惜しい!PDFリンクで英単語を引数で渡す場合や、ラップしているHTMLから日本語引数を指定して親Windowの検索実行は問題なしなのだが・・。はて?

■Webアプリ側
・隠しフィールド document.search.rcvkey
UTF-8エンコードされたキーワードが書かれるフィールド
・デコード関数
document.search.rcvkeyが空でない場合に、文字列をデコードして全文検索キーワード変数として代入

var rcvword=document.search.rcvkey;
if(rcvword!=""){
document.search.AllSearch.value=unencode(rcvword);
ExcuteSearch();
document.search.rckey.value="";
}

■PDFをラップするHTMLに仕込んだJavascript
SendKeyword関数
function SendKeyword(keyword){
if(keyword!=""){
window.opener.document.search.rcvkey.value=escape(keyword);
window.opener.ExecuteSearch();
window.opener.focus();
}
}

■PDF中のリンク指定
Javascript:SendKeyword(escape('日本語文字列'))→NG
Javascript:SendKeyword('英語文字列')→OK

■HTMLに文字リンクやテキストボックスで指定した場合
文字リンク
<a href="Javascript:SendKeyword('日本文字列')">日本語文字列</a>
テキストボックス
<input type="text" name="word" id="word">
<input type="button" name="btn" id="btn" onClick="Javascript:SendKeyword(documen.frm.word.value);">

Javascript encodeをgoogleで検索した結果
Javascriptのescape関数で判読を難しくする
URL encode and decode (for Japanese character set)