windows - Udskrivning af PDF'er ved hjælp af Python, win32api og Acrobat Reader 9

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har rapporter, som jeg sender til et system, der kræver, at rapporterne er i et læsbart PDF-format. Jeg prøvede alle de gratis biblioteker og applikationer, og den eneste, jeg fandt fungerede, var Adobe's acrobat-familie.


Jeg skrev et hurtigt script i python, der bruger win32api til at udskrive en pdf til min printer med standard registreret applikation (Acrobat Reader 9) og dræbe opgaven efter færdiggørelsen, da acrobat kan lide at lade vinduet være åbent, når det kaldes fra kommandolinjen.


Jeg kompilerede det i en eksekverbar og videregive værdierne gennem kommandolinjen
(for eksempel printer.exe\% OUTFILE\%\% PRINTER\%) dette kaldes så inden for en batchfil


import os,sys,win32api,win32print,time

# Command Line Arguments.  
pdf = sys.argv[1]
tempprinter = sys.argv[2]

# Get Current Default Printer.  
currentprinter = win32print.GetDefaultPrinter()
# Set Default printer to printer passed through command line.  
win32print.SetDefaultPrinter(tempprinter)
# Print PDF using default application, AcroRd32.exe
win32api.ShellExecute(0, "print", pdf, None, ".", 0)
# Reset Default Printer to saved value
win32print.SetDefaultPrinter(currentprinter)
# Timer for application close
time.sleep(2)
# Kill application and exit scipt
os.system("taskkill /im AcroRd32.exe /f")


Dette syntes at fungere godt for et stort volumen, ~ 2000 rapporter om 3-4 timer, men jeg har nogle, der falder af og jeg er ikke sikker på om scriptet bliver overvældet, eller hvis jeg skal se på multithreading eller noget andet.


Det faktum, at det håndterer en så stor mængde uden frafald, får mig til at tro, at problemet ikke er med scriptet, men jeg er ikke sikker på om det er et problem med værtssystemet eller Adobe Reader eller noget andet.


Eventuelle forslag eller meninger ville blive meget værdsat.

Bedste reference


Baseret på din feedback (win32api.ShellExecute() er det sandsynligvis ikke synkroniseret). Dit problem er timeout: Hvis din computer eller udskriftskøen er optaget, kan kommandoen Kill komme for tidligt.


Hvis dit script kører samtidigt (dvs. du udskriver alle dokumenter på en gang i stedet for den ene efter den anden), kan kommandoen Kill muligvis dræbe den forkerte proces (dvs. en akrobatproces, der startes af en anden påkaldelse af scriptet).


Så hvad har du brug for det bedre synkronisering. Der er et par ting, du kan prøve:



  1. Konverter dette til et server script, der starter Akrobat en gang, så sender mange udskrivningskommandoer til den samme proces og afslutter derefter.

  2. Brug en global lås for at sikre, at kun et enkelt script kører. Jeg foreslår at oprette en mappe et eller andet sted; Dette er en atomoperation på hvert filsystem. Hvis mappen findes, er scriptet aktivt et sted.



Derudover skal du vide, hvornår jobbet er færdigt. Brug win32print.EnumJobs() til dette.


Hvis det fejler, kan en anden løsning være at installere en Linux-server et eller andet sted. Du kan køre en Python-server i denne boks, som accepterer udskriftsjob, som du sender ved hjælp af et lille Python-script på din klientmaskin. Serveren kan derefter udskrive PDF-filerne for dig i baggrunden.


Denne tilgang giver dig mulighed for at tilføje enhver form for overvågning du kan lide (sende mails, hvis noget fejler eller send en statuspost, når alle job er færdige).