2010-12-17 102 views
3

私はPythonアプリケーションを繰り返し実行します。 PDFをファイルとして保存してから印刷します。印刷が終了すると、ファイルが削除されます。PDFを印刷し、印刷が終了したらファイルを削除します

マイ現在のソリューション(一部印刷用および削除)はこれです:

win32api.ShellExecute(0, "print", file_path, None, ".", 0) 
time.sleep(10) 
os.remove(self.options.dest_name) 

time.sleep(10)は、印刷プロセスにファイル削除前に実行する時間を与えるためにトリックです。それがなければ、Acrobat Readerが開き(とにかく開きます)、ファイルが見つからないことを警告します。これは、ファイルの削除が既に発生しているためです。

質問は次のとおりです。

  1. 私はこの信頼性のないトリックなしでそれを行うことができますか?最も良いことは、印刷プロセスのハンドラを用意し、印刷状態に関する情報を取得することです。完了したことを報告するまで待ってファイルを削除します。

  2. Acrobat Readerを開くことができない方が良いでしょうが、これは大きな問題ではありません。

編集:私は、デフォルトのPDFリーダーとしてのFoxit Readerのに切り替えてみました、私はしたくないとき、今では開きません。 ;)

他の可能な解決方法:ファイルが利用可能(別のプロセスによって使用されていない)とするとき、それはそれを削除し再利用できるの場合 Cylically確認してください。どのように私はPythonでそれを行うことができますか?

+2

正直なところ、何かが*実際に*印刷しているかどうかを知るためには実際の方法はありません。プリントキューには100種類の問題があり、決してあなたに報告されることはありません。 –

+0

@ニックMhm、私は、ドキュメントがプリンタに送られたときを知る必要があるとしましょう。だから私はそれを捨てることができます。 – bluish

答えて

4

私は、this answerのおかげで良い解決策を見つけた(とも@Lennartコメントでそれを言及した):

install Ghostscript

install GSviewgsprint.exeを含む)

がこれを書きますコード:

file_path = "C:\\temp\\test.pdf" 
p = subprocess.Popen(["C:\\Ghostgum\\gsview\\gsprint.exe", "-printer", printer_name, "-colour", file_path], 
     stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout, stderr = p.communicate() # waits for the gs process to end 
os.remove(file_path) # now the file can be removed 

いいえAcrobatウィンドウを開く、印刷前にファイルを削除しないing ...迷惑行為:GSをインストールする。

も参照してください:gsprint reference

2

ファイル名をハードコードして印刷するのではなく、tempfileモジュールを使用して一意の名前を持つ一時ファイルを作成する必要があります。

import tempfile 
file_name = tempfile.NamedTemporaryFile(suffix=".pdf", delete=False) 

したい場合は、あなたが作成したファイルを削除するには、ウィンドウのスケジューリングツールを使用して定期的にきちんとアップスクリプトを実行することができます。

+0

あなたはそうですが、私の場合、コマンドラインパラメータを選択すると、ユーザーはドキュメントの印刷や保存を選択できます。だから私はファイルとして保存することをお勧めします。ユーザーが印刷して削除することに決めた場合は、この操作を行います。 – bluish

1

Adob​​e acrobatには、「/ t」というパラメータがあり、これを開いて印刷して終了させました。これを使用すると、Acrobat Readerを呼び出して終了するまで待ってからファイルを削除できます。

未テストコード:

>>> import subprocess 
# You will have to figure out where your Acrobate reader is located, can be found in the registry: 
>>> acrobatexe = "C:\Program Files\Adobe\Acrobat 4.0\Reader\AcroRd32.exe" 
>>> subprocess.call([acrobatexe, "/t", tempfilename, "My Windows Printer Name"]) 
>>> os.unlink(tempfilename) 

そのような何か。

acrobatを開くことを望まない場合は、コマンドラインからpdfsを印刷するオープンソースソフトウェアがあります。ソフトウェアに1つを含めることができます。

+0

ありがとう!あなたが言うオープンソースのswは、私がPythonプログラムでインポートできるものですか?あなたはそのうちの1つを提案できますか? – bluish

+1

インポートしていないかもしれませんが、少なくとも呼び出してください。あなたはGhostscriptで確かにそれを行うことができますが、それはかなり大きなプログラムです。より良いプログラムを見つけるかもしれません。私はその話題の専門家ではない。別の質問をすることも、Googleに相談することもできます。 :) –

0

os.systemを使用しないでください。処理が完了するまで待機しますか?最後に

+0

@Jasonどのようにですか? win32api.ShellExecute(...)で始まった特定のプロセスをどのように示すことができますか? – bluish

+0

つまり、os.system(command)を使用して、win32api.ShellExecuteを使用する代わりに印刷を行うプロセスを開始します。プロセスが完了するまで待機し、終了コードを返します。 – JasonFruit

+0

(私はwin32api.ShellExecuteを誤解しています)たとえば、os.systemを使用してLennartの/ tスイッチでAdobe Readerを起動できます。 – JasonFruit

関連する問題