Excel to PDF Converter as a Windows NT/2000 Service

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)

Leave a Reply

Your email address will not be published. Required fields are marked *