今回はPython + Seleniumを活用した自動PDF保存プログラム作成中に悩んだので記事にしました。
(調べてもなかなか悩んでいた原因を解決できる記事が出てこなかった...だから需要があるはず!!!)
ちなみに、あるECサイトで買い物をした際の電子領収証を一括で自動保存するというプログラムを作成していました。
PDF保存時のダイアログを非表示にさせたい
今回僕が躓いたポイントは、
PDFを保存する際に「印刷結果を名前を付けて保存」というダイアログが出てしまうことです。
(「邪魔!邪魔!消えろ!」)
このダイアログが出てしまうことによって、プログラムが一時停止してしまうので、どうか非表示にさせたい。
--kiosk-printingオプションで自動PDF保存が可能
僕のこの記事にたどり着いているということは、PDF印刷画面を自動で閉じるというキオスクモードの実装はできているのだと思う。軽く説明しておくとseleniumのoptionに--kiosk-printing
オプションを追加してあげるとPDF印刷画面を一瞬だけ開いて、自動で閉じることができる。
ソースで言うと、このような実装をする
from selenium import webdriver
ChromePath="ChromeドライバーのPath(各自環境に合わせて)"
#オプション追加のときにキオスクモードを追加する
options = Options()
options.add_argument('--kiosk-printing')
#ドライバーの立ち上げ
driver = webdriver.Chrome(executable_path=ChromePath, options=options)
options
に--kiosk-printing
を設定している。
そして、PDF保存したい画面へSeleniumで遷移してwindow.print()
というJavaScriptの実行でPDFをダウンロードする
#保存したいページへ遷移した後、以下を実行
driver.execute_script('window.print();')
どうだろうか。こんな説明で分かるのだろうか。説明が雑になってしまったが...
この説明は今回話したかった本題ではないので、サラッと説明をしておきました。
では、本題に戻ります。
保存パス指定のダイアログを非表示にする方法
「印刷結果を名前を付けて保存」というダイアログを非表示にするためには、追加でChromeの設定を行うオプションを設定しておく必要がある。
上記に加えて以下を追加する
appState = {
"recentDestinations": [
{
"id": "Save as PDF",
"origin": "local",
"account":"",
}
],
"selectedDestinationId": "Save as PDF",
"version": 2
}
prefs = {
'printing.print_preview_sticky_settings.appState': json.dumps(appState)
}
options.add_experimental_option("prefs", prefs)
printing.print_preview_sticky_settings.appState
にappState
で設定したChromeのブラウザ設定を渡します。
そして、add_experimental_option
でドライバーに設定を追加します。
appState
で記述しているのがブラウザに対して行う設定なのですが、あまり深い内容を理解していません...。
ですが、これを設定してあげることで「印刷結果を名前を付けて保存」という鬱陶しいダイアログを非表示にすることができます。
最終的なコード
最終的にはこのようなコードになります。
from selenium import webdriver
ChromePath="ChromeドライバーのPath(各自環境に合わせて)"
options = Options()
appState = {
"recentDestinations": [
{
"id": "Save as PDF",
"origin": "local",
"account":"",
}
],
"selectedDestinationId": "Save as PDF",
"version": 2
}
prefs = {
'printing.print_preview_sticky_settings.appState': json.dumps(appState)
}
options.add_experimental_option("prefs", prefs)
options.add_argument('--kiosk-printing')
#ドライバーの立ち上げ
driver = webdriver.Chrome(executable_path=ChromePath, options=options)
:
: #なんやかんやの処理があって...
:
#保存したいページへ遷移した後、以下を実行
driver.execute_script('window.print();')
同じポイントで躓いている方に参考になればと思います。
ちなみに、余談ですが
Macで同じプログラムを動かした場合、add_experimental_option
を行わなくてもPDF保存時に「印刷結果を名前を付けて保存」のようなダイアログは表示されませんでした。OSによって挙動が異なるのでした。
Macの場合でもadd_experimental_option
を追加してもしっかり動作します。
コメント