]> granicus.if.org Git - python/commitdiff
Added Just's printing demo code.
authorJack Jansen <jack.jansen@cwi.nl>
Mon, 27 Apr 1998 15:06:50 +0000 (15:06 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Mon, 27 Apr 1998 15:06:50 +0000 (15:06 +0000)
Mac/Demo/index.html
Mac/Demo/printing/PrintingDemo.py [new file with mode: 0644]

index 5d706ce43b1c71fd1ae0f034c6d54802f8084a07..c122b60b4c85a73cc1068ddde3c82ab66625e2c2 100644 (file)
@@ -113,6 +113,11 @@ img modules on the mac.
 on using the respective managers. In the <i>Mac:Lib</i> folder you
 will also find modules that do useful things with the Communications
 Toolbox, the Finder interface, etc.
+
+<LI>
+<I>Printing</I> has an example on using the Printing module to, you guessed
+it, print from Python. The code is somewhat self-documenting. Donated
+by Just van Rossum, who also donated the Printing module itself.
 </UL>
 
 At some point in the (possibly distant) future, I will add chapters on
@@ -131,5 +136,5 @@ documentation. <p>
 
 <HR>
 <A HREF="http://www.cwi.nl/~jack">Jack Jansen</A>,
-<A HREF="mailto:jack@cwi.nl">jack@cwi.nl</A>, 25-Feb-98.
+<A HREF="mailto:jack@cwi.nl">jack@cwi.nl</A>, 27-Apr-98.
 </BODY></HTML>
diff --git a/Mac/Demo/printing/PrintingDemo.py b/Mac/Demo/printing/PrintingDemo.py
new file mode 100644 (file)
index 0000000..6f7881f
--- /dev/null
@@ -0,0 +1,93 @@
+import Printing
+import Qd
+import Fm
+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()