This script is designed as a Windows 2000/NT Service and converts incoming Excel Workbooks in a directory to PDF. After installing this script with python scriptname.py install you will find a Service called “Excel2PDF” in the Service Control Manager (Services). To remove the Service do a python scriptname.py remove.
One Problem exists: The Service runs only when a user is logged in. If someone knows the problem please mail it via the contact webform.
To get the usage information start this script with the python interpreter as usually.
import win32serviceutil
import win32service
import win32event
import win32gui
import time
import win32com.client
import pythoncom
import os
class XLS2PDFService(win32serviceutil.ServiceFramework):
_svc_name_ = "xls2pdf Service"
_svc_display_name_ = "Excel2PDF"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
win32gui.MessageBox(0, "XLS2PDF Service has been stopped" , "XLS2PDF Status" , 0 )
def SvcDoRun(self):
gscommand = 'c:\\gs\\gs8.15\\bin\\gswin32c.exe -sDEVICE=pdfwrite -r300 \
-dNOPAUSE -dBATCH -dSAFER -sPAPERSIZE=a4 \
-sOutputFile="'+path_to_watch+filename+'.pdf" "'+tmpfile+'"'
path_to_watch = 'd:\\share\\'
tmpdir = tempfile.mkdtemp()
before = dict ([(f, None) for f in os.listdir (path_to_watch)])
win32gui.MessageBox(0, "XLS2PDF has been started" , "XLS2PDF Status" , 0 )
while 1 :
time.sleep (0.1)
after = dict ([(f, None) for f in os.listdir (path_to_watch)])
added = [f for f in after if not f in before]
if added and added[0][-3:]=='xls':
print os.tmpfile()
filename = added[0]
tmpfile = tmpdir + '\\'+filename+'.ps'
if filename[-3:]=='xls':
pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED)
myExcel = win32com.client.DispatchEx('Excel.Application')
Excel = myExcel.Workbooks.Open(path_to_watch + filename, 0, False, 2)
Excel.PrintOut(1, 5000, 1, False, 'ServPDF', True, False, tmpfile)
Excel.Saved = 1
Excel.Close()
myExcel.Quit()
del Excel
del myExcel
os.popen(gscommand)
#os.remove(path_to_watch+filename)
os.remove(tmpfile)
pythoncom.CoUninitialize()
before = after
if __name__=='__main__':
win32serviceutil.HandleCommandLine(XLS2PDFService)