I've been using the PrintDocument and PrintPreview objects. That use the the Graphics class. When print is called you get an "PrintEventArgs e" object. Then you can use e.Graphics to have access to things like e.Graphics.DrawString, .DrawImage etc.
I built a whole print objects class that overrides print. So I have a detail box that has different fonts, or a logo, a header, leagal jargon etc. Each one of these has it's own class. I put them all in a big list and I call printThis(List); and it will take each print function and the coordinates and make me a form.
Inherited object
class formHdr : printObject
{
private string headerText;
public formHdr(string hText)
: base()
{
headerText = hText;
}
public override void printThis(System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics g = e.Graphics;
g.DrawString(headerText, FRHEADER, Brushes.Black, BaseX, BaseY);
}
}
Base class
abstract class printObject
{
protected Font FTHEADER;
protected Font NRML;
protected Font DETAIL;
protected Font FRHEADER;
protected Font DETHEADER;
protected Font LEGAL;
protected Font LEGAL2;
public int baseX, baseY;
public int boxSX, boxSY;
public printObject()
{
baseX = 0;
baseY = 0;
boxSX = 0;
boxSY = 0;
FTHEADER = new Font("Arial", 12, FontStyle.Bold);
NRML = new Font("Calibri", 10);
DETAIL = new Font("Consolas", 8);
FRHEADER = new Font("Arial", 16, FontStyle.Bold);
DETHEADER = new Font("Calibri", 10, FontStyle.Bold);
LEGAL = new Font("Arial", 8);
LEGAL2 = new Font("Arial", 10);
}
public virtual void printThis(PrintPageEventArgs e) { }
Object creation
mainHead = new formHdr("Bill of Lading/Weigh slip Original");
mainHead.BaseX = 225;
mainHead.BaseY = 20;
bol.Add(mainHead);
Maybe this can get you started? I'm still tweaking it and will be interested in other responses.