すべてのカテゴリ » インターネット・パソコン » 技術・プログラミング

質問

終了

AppleScriptで、フォルダ中にある50個以上のHTMLファイルをSafariで開き印刷するというプログラムを作成しています。
すべてのファイルではないですが、いくつかはファイルのロードが完了状態になっているが(document.readyStateで判断)、実際にSafariでは空白ページの表示となって、空白ページが印刷されてしまう現象が起きてます。
空白ページが出る原因がわからなくて、どなたか教えていただけませんか?
(空白ページであるかどうかを判断する処理を入れたほうがいいでしょうか?)

Macバージョン:Mac OS X 10.4.6
Safariバージョン:2.0.3

処理順序として、
フォルダからHTMLファイルをすべて取得
 ↓
ファイルをOpen   ← ここからは繰り返し処理
 ↓
ロード完了まで待つ
 ↓
ロード完了で印刷画面を表示させる
 ↓
印刷画面が出るまで待つ
 ↓
印刷画面が表示されたら、印刷をクリック  ← ここまでは繰り返し処理
 ↓
開いたSafariのWindowを全部閉じる

  • 質問者:キョウ
  • 質問日時:2009-07-15 11:24:27
  • 0

おそらくdocument.readyStateが「complete」かどうかでチェックしていると思います。
ですが、Safariのdocument.readyStateはちょっと特殊なため、これだと上手くいきません。

普通のブラウザの場合、document.readyStateは以下の4パターンを持ってます。
 1.uninitialized
 2.loading
 3.interactive
 4.complete
ところがSafariは、「loading」と「complete」の2パターンしか持ってません。
しかも本来なら「uninitialized」となるべき所を、「complete」で返してきます。
簡単に言えば、
 1.complete
 2.loading
 3.complete
という順番で返してくるわけです。

本当は「uninitialized」なのに「complete」で返ってくる。
読み込みが完了したと勘違いし、「uninitialized」状態で印刷をはじめる。
結果、白紙が出力される。
といった流れになっているのではないかと思います。


対策としては、document.readyStateのチェック前に、表示されているURLが設定したURLになっているかをチェックする処理を入れます。
具体的にはこんな感じです。

set theURL = "file://test.html"
tell application "Safari"
repeat
if (URL of front document = theURL) then
exit repeat
end if
end repeat
end tell

これを「ロード完了まで待つ」の前に入れてみてください。
上記の処理が終了した時点で、「uninitialized」の状態は過ぎています。
あとはdocument.readyStateが「complete」になるのを待つだけです。


---質問者コメント---
ご回答して頂き、ありがとうございました。
教えて頂いた内容でやってみましたが、
URLのところで問題が出ています。

theURLをURL of test.htmlでセットしましたが、
形はfile://localhost/Users/.../test.htmlとなっているのに対して、
SafariのURLは、file:///Users/..../testfolder/test.htmlのような形となっています。

MacもAppleScriptも初心者、よくわかっていなくて、すみませんが、
パスの変換みたいなことをやらなければならないんでしょうか?

またのご回答をよろしくお願いします。


--追記--
パスの変換は当然必要です。
Applescriptでは、POSIX path of htmlFileでUNIX形式のパスが取得できます。
("/Users/..../testfolder/test.html"が得られる。)
ですから、
set theURL to "file://" & POSIX path of htmlFile
とするのが一般的です。

「フォルダからHTMLファイルをすべて取得」を具体的にどのように行っているか分からないので、このやり方が一番良いかは分かりません。
上手く行かない場合は、どのようにHTMLファイルを取得し、どのようにSafariで開いているかを教えてください。

(更なる追記ができる様に、回答を再投稿しました。)

この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

またのご回答をして頂き、ありがとうございました。
空白ページがなくなり、スクリプトは動きました。

大変助かりました。
ありがとうございました。

並び替え:

Javascript等の処理が入っているページなのかも。
対処療法ですが、ロード完了を確認した後に、
数秒間待ってから印刷するとどうでしょう?

もうやってるかもしれませんが、
印刷時に出力先をPDFにしておくと、
紙に印刷する前に確認できるので、
紙の節約になりますよ(^-^)

  • 回答者:Maku (質問から5分後)
  • 2
この回答の満足度
  
参考になりました。回答ありがとうございました。
お礼コメント

早速ご回答して頂き、
ありがとうございました。

関連する質問・相談

Sooda!からのお知らせ

一覧を見る