python - Udskriv en PDF og slet filen, når udskrivningen er færdig

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en Python applikation, der skal udføres gentagne gange. Det gemmer en PDF som en fil og udskriver den derefter. Når enheden udskrives, slettes filen.


Min nuværende løsning (for udskrifts- og sletningsdelen) er dette:


win32api.ShellExecute(0, "print", file\_path, None,  ".",  0)
time.sleep(10)
os.remove(self.options.dest\_name)


time.sleep(10) er et trick for at give udskrivningsprocessen den tid, der skal køre, før filen slettes. Uden det åbnes Acrobat Reader (det åbner alligevel) og advarer om, at det ikke kan finde filen. Dette skyldes, at filfjernelse allerede er opstået.


spørgsmålet er:



  1. Hvordan kan jeg gøre det uden dette upålidelige trick? Det bedste ville være at have en håndterer til udskrivningsprocessen og få en information om udskrivningstilstanden: Jeg venter på, at den rapporterer, at den er færdig, og jeg sletter filen.

  2. Det ville være endnu bedre, hvis Acrobat Reader ikke ville åbne, men det er ikke et stort problem.



EDIT: Jeg forsøgte at skifte til Foxit Reader som standard PDF-læser, og nu åbner den ikke, når jeg ikke vil. ;)


ANDRE MULIGE LØSNINGER :
Kontroller cylisk, om filen er tilgængelig (ikke brugt af en anden proces), og når den er tilgængelig igen, slettet den. Hvordan kunne jeg gøre det i Python?

Bedste reference


Endelig har jeg fundet en god løsning takket være dette svar (og også @Lennart nævnte det på en kommentar):


installer Ghostscript [11]


installer GSview (som inkluderer gsprint.exe) [12]


skriv denne kode:


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


Ingen Acrobat-vinduer åbnes, ingen fil fjernes før udskrivning ... Irriteringen: installation af GS.


Se også: gsprint reference [13]

Andre referencer 1


I stedet for at kodes et filnavn og udskrive det, skal du bruge modulet tempfile til at oprette en midlertidig fil med et unikt navn.


import tempfile
file\_name = tempfile.NamedTemporaryFile(suffix=".pdf", delete=False)


Hvis du vil, kan du køre et almindeligt ryddet script ved hjælp af Window 's planlægningsværktøjer for at slette de oprettede filer.

Andre referencer 2


Adobe acrobat har (eller i det mindste plejede at have) en parameter '/t', som gjorde det åbent, printet og afslutte. Ved at bruge det, kan du ringe til acrobat-læser og vente på, at den skal afslutte, og derefter slette filen.


Ikke testet kode:


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


Noget i den stil.


Hvis du ikke vil have acrobat til at åbne, er der open source software, der vil udskrive pdfs fra kommandolinjen. Du kan inkludere en med din software.

Andre referencer 3


Hvorfor ikke bruge os.system, som vil vente til processen er færdig?