Rubyで印刷する
RubyではKernelモジュールのお陰でRubyファイル上からでもコマンドプロンプトが叩けるようになっている。
# プロセス完了まで待つコマンド実行
process1 = system "dir"
# プロセス実行が完了したらRubyのプロセスに戻る
process2 = spawn "dir"
印刷する場合はAdobe Acrobat Reader DCのシステムコールを使用して実行すれば良い
"(exeまでのパス)\AcroRd32.exe" /s /l /h /t "(PDFファイルのフルパス)" "(プリンタ名)"
※64bit版はAcrobat.exe
※オプションの意味は本題とずれるのでググってくれ!
本題
上記方法を使用すれば印刷はできるが、system
とspawn
のどちらを使用すべきかと言われたら迷わずspawn
をお勧めする。
印刷の自動化が要求される場面は、昔ながらの書類管理をしている業務の自動化くらいだろう。
そういう現場でよくあるのが、印刷プロセスのスタックである。
ワイがRPA案件で参加していた会社では受発注システムへの注文登録後、注文書を印刷をすることが義務付けられていた。
そこで発生したのは印刷プロセス実行時のネットワークの一時的な断絶、そして大量の印刷プロセスがあることによるRuby側のスタックである。
当時はsystem
を使用していたことにより、印刷が成功したというプロセスが返ってくるまでRuby側がスタックしてしまう現象が発生していた。
spawn
を使用すればRuby側の実行とコマンドプロンプト側の実行を別個にできるので、Rubyのスタックは発生しない。
もし実行完了までのタイムアウト時間が欲しいのであれば、Thread
を使用するか、1秒ごとに印刷プロセスを監視する処理を作成すれば良い。
個人的な感覚としては、system
はサーバ内で完結する処理で使用し、spawn
は外部接続関連の処理で使用するのが良い印象。
まとめ
- Rubyで印刷コマンドを実行する場合は
spawn
を使用する。 - 印刷プロセスはスタックしやすい。
-
system
はサーバ内で完結する処理で使用する。 -
spawn
は外部接続関連の処理で使用する。
保守って辛いよな、兄弟。