Changeset 3436 for pkpgcounter/trunk/pkpgpdls/pcl345.py
- Timestamp:
- 10/06/08 00:22:07 (16 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
pkpgcounter/trunk/pkpgpdls/pcl345.py
r3410 r3436 8 8 # the Free Software Foundation, either version 3 of the License, or 9 9 # (at your option) any later version. 10 # 10 # 11 11 # This program is distributed in the hope that it will be useful, 12 12 # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 14 # GNU General Public License for more details. 15 # 15 # 16 16 # You should have received a copy of the GNU General Public License 17 17 # along with this program. If not, see <http://www.gnu.org/licenses/>. … … 38 38 class Parser(pdlparser.PDLParser) : 39 39 """A parser for PCL3, PCL4, PCL5 documents.""" 40 totiffcommands = [ 'pcl6 -sDEVICE=pdfwrite -r"%(dpi)i" -dPARANOIDSAFER -dNOPAUSE -dBATCH -dQUIET -sOutputFile=- "%(infname)s" | gs -sDEVICE=tiff24nc -dPARANOIDSAFER -dNOPAUSE -dBATCH -dQUIET -r%(dpi)i -sOutputFile="%(outfname)s" -', 40 totiffcommands = [ 'pcl6 -sDEVICE=pdfwrite -r"%(dpi)i" -dPARANOIDSAFER -dNOPAUSE -dBATCH -dQUIET -sOutputFile=- "%(infname)s" | gs -sDEVICE=tiff24nc -dPARANOIDSAFER -dNOPAUSE -dBATCH -dQUIET -r%(dpi)i -sOutputFile="%(outfname)s" -', 41 41 'pcl6 -sDEVICE=pswrite -r"%(dpi)i" -dPARANOIDSAFER -dNOPAUSE -dBATCH -dQUIET -sOutputFile=- "%(infname)s" | gs -sDEVICE=tiff24nc -dPARANOIDSAFER -dNOPAUSE -dBATCH -dQUIET -r%(dpi)i -sOutputFile="%(outfname)s" -', 42 42 ] … … 48 48 2 : "Letter", 49 49 3 : "Legal", 50 6 : "Ledger", 50 6 : "Ledger", 51 51 25 : "A5", 52 52 26 : "A4", … … 62 62 100 : "B5Envelope", 63 63 101 : "Custom", 64 } 65 64 } 65 66 66 mediasources = { # ESC&l####H 67 67 0 : "Default", … … 75 75 8 : "Tray1", 76 76 } 77 77 78 78 orientations = { # ESC&l####O 79 79 0 : "Portrait", … … 82 82 3 : "ReverseLandscape", 83 83 } 84 84 85 85 mediatypes = { # ESC&l####M 86 86 0 : "Plain", … … 90 90 4 : "Transparent", 91 91 } 92 93 def isValid(self) : 92 93 def isValid(self) : 94 94 """Returns True if data is PCL3/4/5, else False.""" 95 95 try : … … 97 97 while self.firstblock[pos] == chr(0) : 98 98 pos += 1 99 except IndexError : 99 except IndexError : 100 100 return False 101 else : 101 else : 102 102 firstblock = self.firstblock[pos:] 103 103 if firstblock.startswith("\033E\033") or \ … … 111 111 (firstblock.startswith(chr(0xcd)+chr(0xca)) and (firstblock.find("\033E\033") != -1)) : 112 112 return True 113 else : 113 else : 114 114 return False 115 115 116 116 def setPageDict(self, attribute, value) : 117 117 """Initializes a page dictionnary.""" 118 118 dic = self.pages.setdefault(self.pagecount, { "linescount" : 1, 119 "copies" : 1, 120 "mediasource" : "Main", 121 "mediasize" : "Default", 122 "mediatype" : "Plain", 123 "orientation" : "Portrait", 124 "escaped" : "", 119 "copies" : 1, 120 "mediasource" : "Main", 121 "mediasize" : "Default", 122 "mediatype" : "Plain", 123 "orientation" : "Portrait", 124 "escaped" : "", 125 125 "duplex": 0 }) 126 126 dic[attribute] = value 127 128 def readByte(self) : 127 128 def readByte(self) : 129 129 """Reads a byte from the input stream.""" 130 130 tag = ord(self.minfile[self.pos]) 131 131 self.pos += 1 132 132 return tag 133 134 def endPage(self) : 133 134 def endPage(self) : 135 135 """Handle the FF marker.""" 136 136 #self.logdebug("FORMFEED %i at %08x" % (self.pagecount, self.pos-1)) … … 138 138 # Increments page count only if we are not inside an HPGL2 block 139 139 self.pagecount += 1 140 141 def escPercent(self) : 140 141 def escPercent(self) : 142 142 """Handles the ESC% sequence.""" 143 143 if self.minfile[self.pos : self.pos+7] == r"-12345X" : … … 147 147 quotes = 0 148 148 char = chr(self.readByte()) 149 while ((char < ASCIILIMIT) or (quotes % 2)) and (char not in (FORMFEED, ESCAPE, NUL)) : 149 while ((char < ASCIILIMIT) or (quotes % 2)) and (char not in (FORMFEED, ESCAPE, NUL)) : 150 150 buffer.append(char) 151 151 if char == '"' : … … 155 155 #self.logdebug("ESCAPED : %s" % "".join(buffer)) 156 156 self.pos -= 1 # Adjust position 157 else : 157 else : 158 158 while 1 : 159 159 (value, end) = self.getInteger() … … 162 162 while self.minfile[self.pos] != ESCAPE : 163 163 self.pos += 1 164 self.pos -= 1 165 return 166 elif end == 'A' : 164 self.pos -= 1 165 return 166 elif end == 'A' : 167 167 self.exitHPGL2() 168 168 return 169 elif end is None : 169 elif end is None : 170 170 return 171 172 def enterHPGL2(self) : 171 172 def enterHPGL2(self) : 173 173 """Enters HPGL2 mode.""" 174 174 #self.logdebug("ENTERHPGL2 %08x" % self.pos) 175 175 self.hpgl2 = True 176 177 def exitHPGL2(self) : 176 177 def exitHPGL2(self) : 178 178 """Exits HPGL2 mode.""" 179 179 #self.logdebug("EXITHPGL2 %08x" % self.pos) 180 180 self.hpgl2 = False 181 182 def handleTag(self, tagtable) : 181 182 def handleTag(self, tagtable) : 183 183 """Handles tags.""" 184 184 tagtable[self.readByte()]() 185 186 def escape(self) : 185 186 def escape(self) : 187 187 """Handles the ESC character.""" 188 188 #self.logdebug("ESCAPE") 189 189 self.handleTag(self.esctags) 190 191 def escAmp(self) : 190 191 def escAmp(self) : 192 192 """Handles the ESC& sequence.""" 193 193 #self.logdebug("AMP") 194 194 self.handleTag(self.escamptags) 195 196 def escStar(self) : 195 196 def escStar(self) : 197 197 """Handles the ESC* sequence.""" 198 198 #self.logdebug("STAR") 199 199 self.handleTag(self.escstartags) 200 201 def escLeftPar(self) : 200 201 def escLeftPar(self) : 202 202 """Handles the ESC( sequence.""" 203 203 #self.logdebug("LEFTPAR") 204 204 self.handleTag(self.escleftpartags) 205 206 def escRightPar(self) : 205 206 def escRightPar(self) : 207 207 """Handles the ESC( sequence.""" 208 208 #self.logdebug("RIGHTPAR") 209 209 self.handleTag(self.escrightpartags) 210 211 def escE(self) : 210 211 def escE(self) : 212 212 """Handles the ESCE sequence.""" 213 213 #self.logdebug("RESET") 214 214 self.resets += 1 215 216 def escAmpl(self) : 215 216 def escAmpl(self) : 217 217 """Handles the ESC&l sequence.""" 218 218 while 1 : … … 244 244 self.setPageDict("copies", value) 245 245 #self.logdebug("COPIES %i" % value) 246 elif end == 'F' : 246 elif end == 'F' : 247 247 self.linesperpagevalues.append(value) 248 248 self.linesperpage = value … … 250 250 #else : 251 251 # self.logdebug("Unexpected end <%s> and value <%s>" % (end, value)) 252 253 def escAmpa(self) : 252 253 def escAmpa(self) : 254 254 """Handles the ESC&a sequence.""" 255 255 while 1 : … … 257 257 if value is None : 258 258 return 259 if end == 'G' : 259 if end == 'G' : 260 260 #self.logdebug("BACKSIDES %i" % value) 261 261 self.backsides.append(value) 262 262 self.setPageDict("duplex", value) 263 264 def escAmpp(self) : 263 264 def escAmpp(self) : 265 265 """Handles the ESC&p sequence.""" 266 266 while 1 : … … 268 268 if value is None : 269 269 return 270 if end == 'X' : 270 if end == 'X' : 271 271 self.pos += value 272 272 #self.logdebug("SKIPTO %08x" % self.pos) 273 274 def escStarb(self) : 273 274 def escStarb(self) : 275 275 """Handles the ESC*b sequence.""" 276 276 while 1 : … … 278 278 if (end is None) and (value is None) : 279 279 return 280 if end in ('V', 'W', 'v', 'w') : 280 if end in ('V', 'W', 'v', 'w') : 281 281 self.pos += (value or 0) 282 282 #self.logdebug("SKIPTO %08x" % self.pos) 283 284 def escStarr(self) : 283 284 def escStarr(self) : 285 285 """Handles the ESC*r sequence.""" 286 286 while 1 : … … 289 289 if end is None : 290 290 return 291 elif end in ('B', 'C') : 291 elif end in ('B', 'C') : 292 292 #self.logdebug("EndGFX") 293 293 if self.startgfx : 294 294 self.endgfx.append(1) 295 else : 295 else : 296 296 #self.logdebug("EndGFX found before StartGFX, ignored.") 297 297 pass … … 299 299 #self.logdebug("StartGFX %i" % value) 300 300 self.startgfx.append(value) 301 302 def escStaroptAmpu(self) : 301 302 def escStaroptAmpu(self) : 303 303 """Handles the ESC*o ESC*p ESC*t and ESC&u sequences.""" 304 304 while 1 : … … 306 306 if value is None : 307 307 return 308 309 def escSkipSomethingW(self) : 308 309 def escSkipSomethingW(self) : 310 310 """Handles the ESC???###W sequences.""" 311 311 while 1 : … … 313 313 if value is None : 314 314 return 315 if end == 'W' : 315 if end == 'W' : 316 316 self.pos += value 317 317 #self.logdebug("SKIPTO %08x" % self.pos) 318 319 def newLine(self) : 318 319 def newLine(self) : 320 320 """Handles new lines markers.""" 321 321 if not self.hpgl2 : 322 322 dic = self.pages.get(self.pagecount, None) 323 323 if dic is None : 324 self.setPageDict("linescount", 1) 324 self.setPageDict("linescount", 1) 325 325 dic = self.pages.get(self.pagecount) 326 nblines = dic["linescount"] 327 self.setPageDict("linescount", nblines + 1) 326 nblines = dic["linescount"] 327 self.setPageDict("linescount", nblines + 1) 328 328 if (self.linesperpage is not None) \ 329 329 and (dic["linescount"] > self.linesperpage) : 330 330 self.pagecount += 1 331 332 def getInteger(self) : 331 332 def getInteger(self) : 333 333 """Returns an integer value and the end character.""" 334 334 sign = 1 … … 346 346 else : 347 347 return (value, char) 348 else : 349 value = ((value or 0) * 10) + int(char) 350 351 def skipByte(self) : 348 else : 349 value = ((value or 0) * 10) + int(char) 350 351 def skipByte(self) : 352 352 """Skips a byte.""" 353 353 #self.logdebug("SKIPBYTE %08x ===> %02x" % (self.pos, ord(self.minfile[self.pos]))) 354 354 self.pos += 1 355 356 def handleImageRunner(self) : 355 356 def handleImageRunner(self) : 357 357 """Handles Canon ImageRunner tags.""" 358 358 tag = self.readByte() … … 367 367 else : 368 368 self.pos -= 1 # Adjust position 369 370 def getJobSize(self) : 369 370 def getJobSize(self) : 371 371 """Count pages in a PCL5 document. 372 372 373 373 Should also work for PCL3 and PCL4 documents. 374 374 375 375 Algorithm from pclcount 376 (c) 2003, by Eduardo Gielamo Oliveira & Rodolfo Broco Manin 376 (c) 2003, by Eduardo Gielamo Oliveira & Rodolfo Broco Manin 377 377 published under the terms of the GNU General Public Licence v2. 378 378 379 379 Backported from C to Python by Jerome Alet, then enhanced 380 380 with more PCL tags detected. I think all the necessary PCL tags 381 381 are recognized to correctly handle PCL5 files wrt their number 382 382 of pages. The documentation used for this was : 383 383 384 384 HP PCL/PJL Reference Set 385 385 PCL5 Printer Language Technical Quick Reference Guide 386 http://h20000.www2.hp.com/bc/docs/support/SupportManual/bpl13205/bpl13205.pdf 386 http://h20000.www2.hp.com/bc/docs/support/SupportManual/bpl13205/bpl13205.pdf 387 387 """ 388 388 infileno = self.infile.fileno() … … 405 405 self.imagerunnermarker2 = chr(0x10) + chr(0x02) 406 406 self.isimagerunner = (minfile[:2] == self.imagerunnermarker1) 407 407 408 408 tags = [ lambda : None] * 256 409 409 tags[ord(LINEFEED)] = self.newLine … … 412 412 tags[ord(ASCIILIMIT)] = self.skipByte 413 413 tags[ord(self.imagerunnermarker1[0])] = self.handleImageRunner 414 414 415 415 self.esctags = [ lambda : None ] * 256 416 416 self.esctags[ord('%')] = self.escPercent … … 420 420 self.esctags[ord(')')] = self.escRightPar 421 421 self.esctags[ord('E')] = self.escE 422 422 423 423 self.escamptags = [lambda : None ] * 256 424 424 self.escamptags[ord('a')] = self.escAmpa … … 428 428 self.escamptags[ord('n')] = self.escSkipSomethingW 429 429 self.escamptags[ord('u')] = self.escStaroptAmpu 430 430 431 431 self.escstartags = [ lambda : None ] * 256 432 432 self.escstartags[ord('b')] = self.escStarb … … 441 441 self.escstartags[ord('m')] = self.escSkipSomethingW 442 442 self.escstartags[ord('v')] = self.escSkipSomethingW 443 443 444 444 self.escleftpartags = [ lambda : None ] * 256 445 445 self.escleftpartags[ord('s')] = self.escSkipSomethingW 446 446 self.escleftpartags[ord('f')] = self.escSkipSomethingW 447 447 448 448 self.escrightpartags = [ lambda : None ] * 256 449 449 self.escrightpartags[ord('s')] = self.escSkipSomethingW 450 450 451 451 self.pos = 0 452 452 try : … … 454 454 while 1 : 455 455 tags[self.readByte()]() 456 except IndexError : # EOF ? 456 except IndexError : # EOF ? 457 457 pass 458 458 finally : 459 459 self.minfile.close() 460 460 461 461 self.logdebug("Pagecount : \t\t\t%i" % self.pagecount) 462 462 self.logdebug("Resets : \t\t\t%i" % self.resets) … … 482 482 self.logdebug("NbBackSides : \t\t\t%i" % nbbacksides) 483 483 self.logdebug("IsImageRunner : \t\t\t%s" % self.isimagerunner) 484 484 485 485 if self.isimagerunner : 486 486 self.logdebug("Adjusting PageCount : +1") 487 487 self.pagecount += 1 # ImageRunner adjustment 488 elif self.linesperpage is not None : 488 elif self.linesperpage is not None : 489 489 self.logdebug("Adjusting PageCount : +1") 490 490 self.pagecount += 1 # Adjusts for incomplete last page … … 507 507 self.logdebug("Adjusting PageCount : -1") 508 508 self.pagecount -= 1 509 509 510 510 self.pagecount = self.pagecount or nbmediasourcesdefault or nbmediasizes or nborientations or self.resets 511 511 512 512 if not self.pagecount : 513 513 if self.resets == len(self.startgfx) : 514 self.pagecount = self.resets 515 516 defaultpjlcopies = 1 514 self.pagecount = self.resets 515 516 defaultpjlcopies = 1 517 517 defaultduplexmode = "Simplex" 518 518 defaultpapersize = "" … … 539 539 pjlcopies = nbqty 540 540 else : 541 if oldpjlcopies == -1 : 541 if oldpjlcopies == -1 : 542 542 pjlcopies = defaultpjlcopies 543 else : 544 pjlcopies = oldpjlcopies 545 if page["duplex"] : 543 else : 544 pjlcopies = oldpjlcopies 545 if page["duplex"] : 546 546 duplexmode = "Duplex" 547 else : 547 else : 548 548 defaultdm = pjlparser.default_variables.get("DUPLEX", "") 549 549 if defaultdm : 550 550 if defaultdm.upper() == "ON" : 551 551 defaultduplexmode = "Duplex" 552 else : 552 else : 553 553 defaultduplexmode = "Simplex" 554 554 envdm = pjlparser.environment_variables.get("DUPLEX", "") … … 556 556 if envdm.upper() == "ON" : 557 557 duplexmode = "Duplex" 558 else : 558 else : 559 559 duplexmode = "Simplex" 560 else : 560 else : 561 561 duplexmode = oldduplexmode or defaultduplexmode 562 562 defaultps = pjlparser.default_variables.get("PAPER", "") … … 566 566 if envps : 567 567 papersize = envps 568 else : 568 else : 569 569 if not oldpapersize : 570 570 papersize = defaultpapersize 571 else : 571 else : 572 572 papersize = oldpapersize 573 else : 573 else : 574 574 if oldpjlcopies == -1 : 575 575 pjlcopies = defaultpjlcopies 576 else : 576 else : 577 577 pjlcopies = oldpjlcopies 578 578 579 579 duplexmode = (page["duplex"] and "Duplex") or oldduplexmode or defaultduplexmode 580 if not oldpapersize : 580 if not oldpapersize : 581 581 papersize = defaultpapersize 582 else : 582 else : 583 583 papersize = oldpapersize 584 584 papersize = oldpapersize or page["mediasize"] 585 585 if page["mediasize"] != "Default" : 586 586 papersize = page["mediasize"] 587 if not duplexmode : 587 if not duplexmode : 588 588 duplexmode = oldduplexmode or defaultduplexmode 589 oldpjlcopies = pjlcopies 589 oldpjlcopies = pjlcopies 590 590 oldduplexmode = duplexmode 591 591 oldpapersize = papersize … … 598 598 page["mediasource"], \ 599 599 duplexmode)) 600 600 601 601 return self.pagecount