mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 02:15:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			93 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import Printing
 | |
| from Carbon import Qd
 | |
| from Carbon import Fm
 | |
| from Carbon import Res
 | |
| 
 | |
| # some constants
 | |
| PostScriptBegin = 190	# Set driver state to PostScript	
 | |
| PostScriptEnd = 191	# Restore QuickDraw state	
 | |
| PostScriptHandle = 192	# PostScript data referenced in handle
 | |
| 
 | |
| CHUNK_SIZE = 0x8000 # max size of PicComment
 | |
| 
 | |
| def PostScript(text):
 | |
| 	"""embed text as plain PostScript in print job."""
 | |
| 	handle = Res.Resource('')
 | |
| 	Qd.PicComment(PostScriptBegin, 0, handle)
 | |
| 	while text:
 | |
| 		chunk = text[:CHUNK_SIZE]
 | |
| 		text = text[CHUNK_SIZE:]
 | |
| 		handle.data = chunk
 | |
| 		Qd.PicComment(PostScriptHandle, len(chunk), handle)
 | |
| 	handle.data = ''
 | |
| 	Qd.PicComment(PostScriptEnd, 0, handle)
 | |
| 
 | |
| # create a new print record
 | |
| printrecord = Printing.NewTPrintRecord()
 | |
| 
 | |
| # open the printer
 | |
| Printing.PrOpen()
 | |
| try:
 | |
| 	# initialize print record with default values
 | |
| 	Printing.PrintDefault(printrecord)
 | |
| 	
 | |
| 	# page setup, ok is 0 when user cancelled
 | |
| 	ok = Printing.PrStlDialog(printrecord)
 | |
| 	if not ok:
 | |
| 		raise KeyboardInterrupt
 | |
| 	# at this stage, you should save the print record in your document for later
 | |
| 	# reference. 
 | |
| 	
 | |
| 	# print job dialog, ok is 0 when user cancelled
 | |
| 	ok = Printing.PrJobDialog(printrecord)
 | |
| 	if not ok:
 | |
| 		raise KeyboardInterrupt
 | |
| 	
 | |
| 	# once per document
 | |
| 	port = Printing.PrOpenDoc(printrecord)
 | |
| 	# port is the Printer's GrafPort, it is also the current port, so no need to Qd.SetPort(port)
 | |
| 	try:
 | |
| 		# start printing a page
 | |
| 		# XXX should really look up what pages to print by
 | |
| 		# inspecting the print record.
 | |
| 		Printing.PrOpenPage(port, None)
 | |
| 		try:
 | |
| 			# use QuickDraw like in any other GrafPort
 | |
| 			Qd.FrameRect((10, 250, 100, 500))
 | |
| 			Qd.FrameRect((10, 510, 100, 600))
 | |
| 			Qd.MoveTo(10, 100)
 | |
| 			Qd.TextSize(50)
 | |
| 			Qd.TextFont(Fm.GetFNum("Helvetica"))
 | |
| 			Qd.DrawString("It rreally works!")
 | |
| 			Qd.MoveTo(10, 150)
 | |
| 			Qd.TextSize(20)
 | |
| 			Qd.DrawString("(and now for a little PostScript...)")
 | |
| 			
 | |
| 			# example PostScript code
 | |
| 			ps = """
 | |
| 				% the coordinate system is the quickdraw one, which is flipped
 | |
| 				% compared to the default PS one. That means text will appear
 | |
| 				% flipped when used directly from PostScript. 
 | |
| 				% As an example we start by defining a custom scalefont operator 
 | |
| 				% that corrects this. 
 | |
| 				/myscalefont{[exch 0 0 2 index neg 0 0]makefont}def
 | |
| 				0.75 setgray
 | |
| 				0 0 moveto
 | |
| 				0 30 lineto 10000 30 lineto
 | |
| 				10000 0 lineto closepath fill
 | |
| 				0 setgray
 | |
| 				5 25 moveto /Courier findfont 20 myscalefont setfont
 | |
| 				(Printed with PostScript!) show
 | |
| 				2 setlinewidth [10 10 5 10] 0 setdash 5 5 moveto 400 0 rlineto stroke
 | |
| 				"""
 | |
| 			# embed the PostScript code in the print job
 | |
| 			PostScript(ps)
 | |
| 		finally:
 | |
| 			# when done with the page
 | |
| 			Printing.PrClosePage(port)
 | |
| 	finally:
 | |
| 		# when done with the document
 | |
| 		Printing.PrCloseDoc(port)
 | |
| finally:
 | |
| 	# when done printing
 | |
| 	Printing.PrClose()
 | 
