Printing examples?

Chipp Walters chipp at chipp.com
Thu Mar 31 21:08:56 EST 2005


Hi Graham,

Recently, I bit the bullet and created my own print routines which print 
a field of htmlText of any size. It also has a nifty feature in that it 
creates preview imgs on the fly.

Basically, it's pretty simple. Here's how I did it.

I create two separate stacks: Print and OffScreenPrint
The Print stack has a substack called "Preview"

The reason for the 2 stacks, is that you need to be able to 'save' the 
offscreen stack after you set the "formatForPrinting" property (Windows 
only).

Forgetting for a moment the print preview mode, the guts look like this:

Call the PageSetup function (answer printer) and from this you get the 
printPaperSize (tPageHeight and tPageWidth). You can use these to setup 
your offscreen imaging stack. You also get the printMargins as well. Use 
these also to setup your offscreen print stack.

Before calling the print routine, you'll want to 'render' all your text 
to the offscreen stack. Basically, you copy it to the main field of the 
offscreen stack (or set the htmlText of the field) then check to see if 
the formattedheight is too great for the field. Remove words (or 
paragraphs, your choice) from the end until the field fits on the card 
w/out overflowing. Then create a new card and continue. Do this until 
all your text/htmltext is gone. Now you have a bunch of cards in your 
offscreen stack to print from.

You can easily use shared groups (backgrounds) for adding headers and 
footers.

Before printing, set the formatForPrinting prop to true and save (you 
don't want to copy/paste stuff while it's set to true because it may 
cause problems). Now close the stack (delete stack will remove it from 
memory, which is what you want to do) and open it back up offscreen.

Oh, btw, you want to set the margins of your fields on the offscreen 
stack to something high (I use 10) to keep it from 'cutting off letters.'

Now, the guts of the printing goes something like this:

open printing with dialog
put item 1 of printPaperSize into tW
put item 2 of printPaperSize into tH

--> DO PAGE CREATION STUFF HERE
--> COPY THE TEXT TO STACK "offscreenPrint"
--> CREATING A NEW CARD FOR OVERFLOW UNTIL NO MORE OVERFLOW
--> SET formatForPrinting to True AND SAVE STACK THEN CLOSE/OPEN

put the number of cds in stack "offscreenPrint" into tNumPages

set the defaultStack to "offscreenPrint"

repeat with x = 1 to tNumPages
     go cd x
     print card into 0,0,tW,tH
     if x <> tNumPages then print break
end repeat

close printing

That's pretty much all there is to it. If you want, you can even create 
bitmaps from the offScreen stack which act as *very accurate* print 
previews. I dump them into the Preview stack and set the preview img to 
1/2 the size with resizeQuality set to best. Works beautifully, both on 
Mac and PC.

HTH,

Chipp


More information about the use-livecode mailing list