Question

I am trying to print some pages through Virtual PDF Printer drivers (FoxitPDF Writer, doPDF, NovaPDF, etc.).

It seldom prints. Most of the time the pages are blank. This is not the case when I try to print a document from within MS Word.

Why? What should I look for to solve the problem?

This is my code:

void printDoc_PrintPage(object sender, PrintPageEventArgs e)
        {
            if (_studentsList != null)
            {
                Graphics g = e.Graphics;
                PointF point = new PointF(0, yStudentTopMargin);

                int count = 2;

                while (true)
                {
                    if ((count == 0) || (_listItemCount > _studentsList.Count - 1))
                    {
                        break;
                    }

                    StudentDrawer.DrawStudent(g, point, _studentsList[_listItemCount], xStudentBoxDistance, yStudentBoxDistance, xLineDistance, yLineDistance);

                    point.Y += (yStudentBoxDistance * 10);

                    count--;
                    _listItemCount++;
                }

                if (_listItemCount < _studentsList.Count)
                {
                    e.HasMorePages = true;
                }
                else
                {
                    e.HasMorePages = false;
                }
            }
            else
            {
                return;
            }
        }

public static void DrawStudent(Graphics g, PointF point, Student std, int xBoxDistance, int yBoxDistance, int xLineDistance, int yLineDistance)
        {
            SolidBrush brush = new SolidBrush(Color.Black);
            Font boldFont = new Font("Times New Roman", yLineDistance * 2 / 3, FontStyle.Bold);
            Font normalFont = new Font("Arial", yLineDistance * 2/3);
            Pen pen = new Pen(brush);

            const int fontSize = 10;

            float x = point.X;
            float y = point.Y;

            float leftMargin = xBoxDistance;//175;
            //const float rightMargin = 100;
            float topMargin = yBoxDistance;//60;
            //const float bottomMargin = 100;

            StringDrawer.DrawRoll(g, "Roll No. :", std.RollNo.ToString(), fontSize + 2, x + leftMargin, y + topMargin , xLineDistance, yLineDistance);
            StringDrawer.DrawHeading(g, "SUBJECT", "MARKS", "L. GRADE", "GP", fontSize, x + leftMargin, y + topMargin + (1 * yLineDistance), xLineDistance, yLineDistance);
                ......   ... ... ...
        ......   ... ... ...
            StringDrawer.DrawSubject(g, "Total", std.Bangla1stPaper_Marks.ToString(), std.Bangla1stPaper_GradeLetter, std.Bangla1stPaper_GradePoint.ToString(), fontSize, x + leftMargin, y + topMargin + (15 * yLineDistance), xLineDistance, yLineDistance);
        }

public static void DrawHeading(Graphics g, string subject, string marks, string letterGrade, string gp, int fontSize, float x, float y, int xDistance, int yDistance)
        {
            SolidBrush brush = new SolidBrush(Color.Black);
            Font boldFont = new Font("Times New Roman", fontSize, FontStyle.Bold);
            Pen pen = new Pen(brush);

            g.DrawRectangle(pen, x, y, xDistance, fontSize + 8);
            g.DrawString(subject, boldFont, brush, x + (0 * xDistance * 1.2f), y);

            g.DrawRectangle(pen, x + (1 * xDistance), y, xDistance, fontSize + 8);
            g.DrawString(marks, boldFont, brush, x + (1 * xDistance * 1.3f), y);

            g.DrawRectangle(pen, x + (2 * xDistance), y, xDistance, fontSize + 8);
            g.DrawString(letterGrade, boldFont, brush, x + (2 * xDistance * 1.1f), y);

            g.DrawRectangle(pen, x + (3 * xDistance), y, xDistance, fontSize + 8);
            g.DrawString(gp, boldFont, brush, x + (3 * xDistance * 1.14f), y);
        }
Was it helpful?

Solution

The code looks okay. However, the BeginPrint event handler is missing. It is required to set the _listItemCount variable back to zero. Without it, only the first printout will work, any subsequent attempt to print will only produce an empty page since _listItemCount is already incremented beyond _studentsList.Count

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top