summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Mac/Demo/index.html7
-rw-r--r--Mac/Demo/printing/PrintingDemo.py93
2 files changed, 99 insertions, 1 deletions
diff --git a/Mac/Demo/index.html b/Mac/Demo/index.html
index 5d706ce..c122b60 100644
--- a/Mac/Demo/index.html
+++ b/Mac/Demo/index.html
@@ -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
index 0000000..6f7881f
--- /dev/null
+++ b/Mac/Demo/printing/PrintingDemo.py
@@ -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()