mirror of
https://github.com/python/cpython.git
synced 2025-12-04 00:30:19 +00:00
Added Just's printing demo code.
This commit is contained in:
parent
4f31694d37
commit
5073b376fb
2 changed files with 99 additions and 1 deletions
93
Mac/Demo/printing/PrintingDemo.py
Normal file
93
Mac/Demo/printing/PrintingDemo.py
Normal file
|
|
@ -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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue