mirror of https://github.com/python/cpython
94 lines
2.7 KiB
Python
94 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()
|