Reputation: 61
I am having a difficult time trying to figure out c# printing multiple pages. My application creates an Object type List that contains 1 to 10 elements. Each object contains 2 string Attributes: docTypeNumber and docTypeDescription. A variable called flightnumber is also passed into the class constructor. Each instance is a document type that must be printed as a separate bar code sheet that contains the doc type number, decription and the flight number. Most of the multi-page printing examples are of one document "spilling" onto multiple pages rather than a doument made up of multiple individual pages. My question is how to achieve this.
Do I need to create one large document that spills onto multiple pages? Do I have to create multiple instances of the PrintDocument class?
Any help would be greatly appreciated.
Here is my code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
namespace BarcodeTest
{
class BarcodePrinter
{
public BarcodePrinter(List<DocumentType> type, string flightnumber)
{
docType = type;
flightNumber = flightnumber;
}
//Attributes
private List<DocumentType> docType = new List<DocumentType>();
private string flightNumber;
//helper variables
string docTypeNumber;
string docTypeDescription;
int pageNumber = 1;
int numberOfPages;
private static Font barcodeFont = new Font("3 of 9 Barcode", 24);
private static Font printFont = new Font("Arial", 24);
public void Print()
{
numberOfPages = docType.Count;
PrintDocument pd = new PrintDocument();
foreach (DocumentType type in docType)
{
docTypeNumber = type.DocumentTypeNumber;
docTypeDescription = type.DocumentDescription;
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
}//end foreach
#if DEBUG
PrintPreviewDialog printPreview = new PrintPreviewDialog();
printPreview.Document = pd;
printPreview.Show();
#else
pd.Print();
#endif
}// end Print() method
public void pd_PrintPage(Object sender, PrintPageEventArgs e)
{
Graphics g = e.Graphics;
//e.Graphics.PageUnit = GraphicsUnit.Point;
e.Graphics.PageUnit = GraphicsUnit.Inch;
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
Brush br = new SolidBrush(Color.Black);
RectangleF rec1 = new RectangleF(1.9375f, 0f, 4, 1);
RectangleF rec2 = new RectangleF(1.9375f, .5f, 4, 1);
RectangleF rec3 = new RectangleF(1.9375f, 1f, 4, 1);
RectangleF rec4 = new RectangleF(1.9375f, 2, 4, 1);
RectangleF rec5 = new RectangleF(1.9375f, 2.5f, 4, 1);
g.DrawString("Air - " + docTypeDescription, printFont, br, rec1, stringFormat);
g.DrawString("*" + docTypeNumber + "*", barcodeFont, br, rec2, stringFormat);
g.DrawString(docTypeNumber, printFont, br, rec3, stringFormat);
g.DrawString("*" + flightNumber + "*", barcodeFont, br, rec4, stringFormat);
g.DrawString(flightNumber, printFont, br, rec5, stringFormat);
if (pageNumber < numberOfPages)
{
e.HasMorePages = true;
}
else
e.HasMorePages = false;
pageNumber++;
}//end pd_PrintPage Method
}//end BarcodePrinter Class
}//end namespace
Upvotes: 3
Views: 3419
Reputation: 61
I figured it out. I needed to iterate through my list within the print page handler. I did this by keeping a count of each page. I knew how many pages by the number of items in my list. Here is my working code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
namespace BarcodeTest
{
class BarcodePrinter
{
public BarcodePrinter(List<DocumentType> type, string number)
{
docType = type;
flightNumber = number;
}
//Attributes
private List<DocumentType> docType = new List<DocumentType>();
private string flightNumber;
//helper variables
string docTypeNumber;
string docTypeDescription;
int pageNumber = 1;
int numberOfPages;
Font barcodeFont = new Font("3 of 9 Barcode", 36);
Font printFont = new Font("Arial", 24);
int i = 0;
public void Print()
{
numberOfPages = docType.Count; //# of List elements = # of pages
PrintDocument pd = new PrintDocument();
pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
#if DEBUG
PrintPreviewDialog printPreview = new PrintPreviewDialog();
printPreview.Document = pd;
printPreview.Show();
#else
pd.Print();
#endif
}// end Print() method
public void pd_PrintPage(Object sender, PrintPageEventArgs e)
{
docTypeNumber = docType[i].DocumentTypeNumber; // This is a get/set Property
docTypeDescription = docType[i].DocumentDescription; // This is a get/set Property
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
Graphics g = e.Graphics;
e.Graphics.PageUnit = GraphicsUnit.Inch;
Brush br = new SolidBrush(Color.Black);
RectangleF rec1 = new RectangleF(.9375f, 0, 6, 1);
RectangleF rec2 = new RectangleF(1.9375f, .5f, 4, 1);
RectangleF rec3 = new RectangleF(1.9375f, 1f, 4, 1);
RectangleF rec4 = new RectangleF(.9375f, 2, 6, 1);
RectangleF rec5 = new RectangleF(1.9375f, 2.5f, 4, 1);
g.DrawString("Air - " + docTypeDescription, printFont, br, rec1, stringFormat);
// '*' Must Preceed and Follow Information for a bar code to be scannable
g.DrawString("*" + docTypeNumber + "*", barcodeFont, br, rec2, stringFormat);
g.DrawString(docTypeNumber, printFont, br, rec3, stringFormat);
// '*' Must Preceed and Follow Information for a bar code to be scannable
g.DrawString("*" + flightNumber + "*", barcodeFont, br, rec4, stringFormat);
g.DrawString(flightNumber, printFont, br, rec5, stringFormat);
if (pageNumber < numberOfPages)
{
e.HasMorePages = true;
i++;
pageNumber++;
}
else
{
e.HasMorePages = false;
}
}//end pd_PrintPage Method
}//end BarcodePrinter Class
}//end namespace
Upvotes: 2