Changeset 3319
- Timestamp:
- 02/02/08 15:35:16 (16 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
pykota/trunk/bin/pkbanner
r3305 r3319 28 28 import time 29 29 import cStringIO 30 import popen230 import subprocess 31 31 32 32 try : 33 33 from reportlab.pdfgen import canvas 34 from reportlab.lib import pagesizes34 import reportlab.lib 35 35 from reportlab.lib.units import cm 36 36 except ImportError : … … 48 48 import pykota.appinit 49 49 from pykota.utils import * 50 from pykota .commandline import parser51 52 from pykota.errors import PyKotaToolError , PyKotaCommandLineError50 from pykota import commandline 51 52 from pykota.errors import PyKotaToolError 53 53 from pykota.tool import Tool 54 54 from pykota import version 55 55 56 def getPageSize(pgsize) : 57 """Returns the correct page size or None if not found.""" 58 try : 59 try : 60 return getattr(reportlab.lib.pagesizes, pgsize.upper()) 61 except AttributeError : 62 try : 63 return getattr(reportlab.lib.pagesizes, pgsize.lower()) 64 except AttributeError : 65 pass 66 except UnicodeError : 67 pass 68 return None 69 56 70 class PyKotaBanner(Tool) : 57 71 """A class for pkbanner.""" 58 def getPageSize(self, pgsize) :59 """Returns the correct page size or None if not found."""60 try :61 return getattr(pagesizes, pgsize.upper())62 except AttributeError :63 try :64 return getattr(pagesizes, pgsize.lower())65 except AttributeError :66 pass67 68 72 def getVar(self, varname) : 69 73 """Extracts a variable from the environment and returns its value or 'Unknown' in the current locale.""" … … 136 140 137 141 # Current date (TODO : at the time the banner was printed ! Change this to job's submission date) 138 datetime = time.strftime("%c", time.localtime()) 142 datetime = time.strftime("%c", time.localtime()).decode(self.charset, "replace") 139 143 ypos -= self.printVar(c, xcenter, ypos, _("Date"), datetime, 14, savetoner) 140 144 … … 209 213 raise PyKotaToolError, "The Python Imaging Library is missing. Download it from http://www.pythonware.com/downloads" 210 214 211 try :212 if (options.savetoner < 0) or (options.savetoner > 99) :213 raise ValueError, _("Allowed range is (0..99)")214 except ValueError, msg :215 self.printInfo(_("Invalid 'savetoner' option %s : %s") % (options.savetoner, msg), "warn")216 savetoner = 0.0217 else :218 savetoner = options.savetoner / 100.0219 220 pagesize = self.getPageSize(options.pagesize)221 if pagesize is None :222 pagesize = self.getPageSize("a4")223 self.printInfo(_("Invalid 'pagesize' option %s, defaulting to A4.") % options.pagesize, "warn")224 225 215 self.logdebug("Generating the banner in PDF format...") 226 doc = self.genPDF( pagesize,216 doc = self.genPDF(getPageSize(options.pagesize), 227 217 options.logo.strip().encode(sys.getfilesystemencoding(), "replace"), 228 218 options.url.strip(), 229 219 " ".join(arguments).strip(), 230 savetoner)220 options.savetoner) 231 221 232 222 self.logdebug("Converting the banner to PostScript...") 233 os.environ["PATH"] = "%s:/bin:/usr/bin:/usr/local/bin:/opt/bin:/sbin:/usr/sbin" % os.environ.get("PATH", "")234 child = popen2.Popen3("gs -q -dNOPAUSE -dBATCH -dPARANOIDSAFER -sDEVICE=pswrite -sOutputFile=- -")235 try :236 child.tochild.write(doc)237 child.tochild.close()238 sys.stdout.write(child.fromchild.read())239 sys.stdout.flush()240 child.fromchild.close()241 except IOError, msg :242 self.printInfo("I/O Error %s" % msg, "error")243 status = child.wait()223 command = "gs -q -dNOPAUSE -dBATCH -dPARANOIDSAFER -sDEVICE=pswrite -sOutputFile=- -" 224 subpr = subprocess.Popen(command, 225 shell=True, 226 stdin=subprocess.PIPE, 227 stdout=subprocess.PIPE, 228 stderr=subprocess.PIPE) 229 try : 230 (out, err) = subpr.communicate(doc) 231 except OSError, msg : 232 raise PyKotaToolError, _("Impossible to execute '%(command)s'") % locals() 233 status = subpr.wait() 244 234 if os.WIFEXITED(status) : 245 235 status = os.WEXITSTATUS(status) 246 236 self.logdebug("PDF to PostScript converter exit code is %s" % str(status)) 237 sys.stdout.write(out) 238 sys.stdout.flush() 247 239 self.logdebug("Banner completed.") 248 240 return status 249 241 250 242 if __name__ == "__main__" : 243 def checkandset_pagesize(option, opt, value, parser) : 244 """Checks and sets the page size.""" 245 if getPageSize(value) is None : 246 loginvalidparam(opt, value, option.default) 247 setattr(parser.values, option.dest, option.default) 248 else : 249 setattr(parser.values, option.dest, value) 250 251 def checkandset_savetoner(option, opt, value, parser) : 252 """Checks and sets the save toner value.""" 253 if (value < 0.0) or (value > 99.0) : 254 loginvalidparam(opt, value, option.default, \ 255 _("Allowed range is (0..99)")) 256 setattr(parser.values, option.dest, option.default) 257 else : 258 setattr(parser.values, option.dest, value / 100.0) 259 251 260 # TODO : --papertray : to print banners on a different paper (colored for example) 252 parser = parser.PyKotaOptionParser(description=_("Banner generator for PyKota"))261 parser = commandline.PyKotaOptionParser(description=_("Banner generator for PyKota")) 253 262 parser.add_option("-l", "--logo", 254 263 dest="logo", … … 256 265 help=_("The image to use as the banner's logo. The logo will be drawn at the center top of the page. The default logo is %default")) 257 266 parser.add_option("-p", "--pagesize", 267 type="string", 268 action="callback", 269 callback=checkandset_pagesize, 258 270 dest="pagesize", 259 271 default=u"A4", 260 272 help=_("Sets the size of the page. Most well known page sizes are recognized, like 'A4' or 'Letter' to name a few. The default page size is %default")) 261 273 parser.add_option("-s", "--savetoner", 274 type="float", 275 action="callback", 276 callback=checkandset_savetoner, 262 277 dest="savetoner", 263 type="int", 264 default=0, 278 default=0.0, 265 279 help=_("Sets the text luminosity to this percent. This can be used to save toner. The default value is %default, which means that no toner saving will be done.")) 266 280 parser.add_option("-u", "--url", … … 269 283 help=_("Sets the url to write at the bottom of the banner page. The default url is %default")) 270 284 parser.add_example('--logo="" --savetoner=75', 271 _("This would generate an A4 banner with no logo, and text luminosity would be increased by 75%%.")) 272 (options, arguments) = parser.parse_args() 273 if options.version : 274 from pykota import version 275 sys.stdout.write("%s\n" % version.__version__) 276 sys.exit(0) 277 278 retcode = 0 279 try : 280 # Initializes the command line tool 281 banner = PyKotaBanner() 282 banner.deferredInit() 283 retcode = banner.main(arguments, options) 284 except KeyboardInterrupt : 285 logerr("\nInterrupted with Ctrl+C !\n") 286 retcode = -3 287 except PyKotaCommandLineError, msg : 288 logerr("%s : %s\n" % (sys.argv[0], msg)) 289 retcode = -2 290 except SystemExit : 291 pass 292 except : 293 try : 294 banner.crashed("pkbanner failed") 295 except : 296 crashed("pkbanner failed") 297 retcode = -1 298 299 sys.exit(retcode) 285 _("This would generate a banner in the default page size, with no logo, and text luminosity would be increased by 75%.")) 286 287 run(parser, PyKotaBanner)