source: trunk/factory/src/backends/msosun.py @ 335

Last change on this file since 335 was 247, checked in by sander, 11 years ago

Added a MS-Office backend using pythoncom and the Sun plugin

File size: 4.6 KB
Line 
1# Officeshots.org - Test your office documents in different applications
2# Copyright (C) 2009 Stichting Lone Wolves
3# Written by Sander Marechal <s.marechal@jejik.com>
4
5"""
6This module is a back-end for the Microsoft Office 2000, 2003 and 2007
7using COM and the Sun plugin on Windows.
8"""
9
10import os
11import time
12import logging
13import subprocess
14import win32com.client
15import pythoncom
16
17from backends import Backend, BackendException
18
19class MSOSunException(BackendException):
20        def __str__(self):
21                return 'MSOSunException: ' + BackendException.__str__(self)
22
23class MSOWord:
24        """
25        Save or print a document with MS-Word
26        """
27
28        Word = None
29        Document = None
30
31        def open(self, file):
32                pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED)
33                self.Word = win32com.client.DispatchEx('Word.Application')
34                self.Document = self.Word.Documents.Open(file, False, False, False)
35       
36        def saveAs(self, file):
37                self.Document.SaveAs(file)
38                self.quit()
39       
40        def printOut(self, printer, file):
41                self.Document.Saved = 1
42                self.Word.Application.NormalTemplate.Saved = 1
43                self.Word.Application.ActivePrinter = printer
44               
45                self.Word.PrintOut(True, False, 0, file)
46                while self.Word.BackgroundPrintingStatus > 0:
47                        time.sleep(0.1)
48
49                self.quit()
50       
51        def quit(self):
52                self.Document.Close()
53                self.Word.Quit()
54                del self.Document
55                del self.Word
56                pythoncom.CoUninitialize()
57
58class MSOExcel:
59        """
60        Save or print a document with MS-Excel
61        """
62
63        Excel = None
64        Document = None
65
66        def open(self, file):
67                pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED)
68                self.Excel = win32com.client.DispatchEx('Excel.Application')
69                self.Excel.AskToUpdateLinks = 0
70                self.Document = self.Excel.Workbooks.Open(file, 0, False, 2)
71       
72        def saveAs(self, file):
73                self.Document.SaveAs(file)
74                self.quit()
75       
76        def printOut(self, printer, file):
77                self.Document.Saved = 1
78                self.Excel.PrintOut(1, 5000, 1, False, printer, True, False, file)
79                self.quit()
80       
81        def quit(self):
82                self.Document.Close()
83                self.Excel.Quit()
84                del self.Document
85                del self.Excel
86                pythoncom.CoUninitialize()
87
88class MSOPowerpoint:
89        """
90        Save or print a document with MS-Powerpoint
91        """
92
93        Powerpoint = None
94        Document = None
95
96        def open(self, file):
97                pythoncom.CoInitializeEx(pythoncom.COINIT_APARTMENTTHREADED)
98                self.Powerpoint = win32com.client.DispatchEx('Powerpoint.Application')
99                self.Document = self.Powerpoint.Presentations.Open(file, False, False, False)
100       
101        def saveAs(self, file):
102                self.Document.SaveAs(file)
103                self.quit()
104       
105        def printOut(self, printer, file):
106                self.Document.PrintOptions.PrintInBackground = 0
107                self.Document.PrintOptions.ActivePrinter = printer
108                self.Document.Saved = 1
109                self.Excel.PrintOut(1, 5000, file, 0, False)
110                self.quit()
111       
112        def quit(self):
113                self.Document.Close()
114                self.Powerpoint.Quit()
115                del self.Document
116                del self.Powerpoint
117                pythoncom.CoUninitialize()
118
119APP_BY_DOCTYPE = {
120        "odt": MSOWord,
121        "ods": MSOExcel,
122        "odp": MSOPowerpoint
123}
124
125class MSOSun(Backend):
126        printer = None
127
128        def initialize(self):
129                if self.config.has_option(self.section, 'printer'):
130                        self.printer = self.config.get(self.section, 'printer')
131
132        def process(self, job):
133                if (job['format'] == ''):
134                        job['format'] = 'odf'
135
136                src_file = self.save_document(job)
137                (root, ext) = os.path.splitext(src_file)
138
139                if job['format'] == 'pdf':
140                        ext = '.ps'
141
142                dst_file = root + '_result' + ext
143
144                try:
145                        App = APP_BY_DOCTYPE[job['doctype']]()
146                except KeyError:
147                        raise MSOSunException("Unknown input doctype: '%s'" % doctype, True)
148
149                App.open(src_file)
150                if job['format'] == 'odf':
151                        App.saveAs(dst_file)
152                else:
153                        if not self.printer:
154                                raise MSOSunException("No PDF printer specified", True)
155                        App.printOut(self.printer, dst_file)
156                        dst_file = self.ps2pdf(dst_file)
157
158                logging.info('MSOSun converted %s to %s' % (src_file, dst_file))
159                contents = self.load_document(dst_file)
160                os.unlink(src_file)
161                os.unlink(dst_file)
162
163                return (job['format'], contents)
164
165        def ps2pdf(self, ps_file):
166                (root, ext) = os.path.splitext(ps_file)
167                pdf_file = root + '.pdf'
168
169                command = 'ps2pdf.bat' + ' "' + ps_file + '" "' + pdf_file + '"'
170                try:
171                        p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
172                        stdout, stderr = p.communicate()
173                except OSError, ex:
174                        raise MSOSunException('The command `%s` generated an OSError (%s).' % (command, str(ex)), True)
175
176                if p.returncode > 0:
177                        raise MSOSunException('The command `%s` returned with a non-zero exit status (%s, %s).' % (command, stdout, stderr), True)
178                os.unlink(ps_file)
179                return pdf_file
180       
181               
Note: See TracBrowser for help on using the repository browser.