需要帮助从列表中打印多个页面

时间:2011-08-27 03:14:54

标签: c# winforms printing

我很难找到c#打印多个页面。我的应用程序创建一个包含1到10个元素的对象类型列表。每个对象包含2个字符串属性:docTypeNumber和docTypeDescription。名为flightnumber的变量也会传递给类构造函数。每个实例都是一种文档类型,必须打印为单独的条形码表,其中包含文档类型编号,说明和航班号。大多数多页打印示例都是一个文档"溢出"在多个页面而不是由多个单独页面组成的组合。我的问题是如何实现这一目标。

我是否需要创建一个溢出到多个页面的大型文档? 我是否必须创建PrintDocument类的多个实例?

非常感谢任何帮助。

这是我的代码:

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

1 个答案:

答案 0 :(得分:2)

我明白了。我需要在打印页面处理程序中遍历我的列表。我通过保持每页的计数来做到这一点。我知道列表中的项目数量是多少页面。这是我的工作代码:

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