Use C# GDI to customize printing

Asked

Viewed 229 times

1

First of all I posted a question with the same code but the question was different. Anyway, I have this code for printing files (it’s a class derived from the class PrintDocument of C#) it takes a parameter which is the name of the file that contains the data to be printed and performs the printing.

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Printing;
using System.IO;

namespace WindowsApplication1
{
class CPrint : PrintDocument
{
    private Font printFont;
    private TextReader printStream;
    private string fileToPrint;
    private Bitmap imgWatermark;

    public bool Watermark = false;

    public CPrint()
    {        
        imgWatermark = null;     
    }

    public CPrint(string fileName) : this()
    {
        this.FileToPrint = fileName;
    }

    public string FileToPrint
    {
        get
        {
            return fileToPrint;
        }
        set
        {
            if (File.Exists(value))
            {
                CPrint p = new CPrint();
                fileToPrint = value;
                this.DocumentName = value;
            }
            else
                throw (new Exception("File not found."));
        }
    }

    public Font Font
    {
        get { return printFont; }
        set { printFont = value; }
    }

    protected override void OnBeginPrint(PrintEventArgs e)
    {
        base.OnBeginPrint(e);
        printFont = new Font("C39HrP36DlTt", 26);            
        printStream = new StreamReader(FileToPrint);
    }

    protected override void OnEndPrint(PrintEventArgs e)
    {
        base.OnEndPrint(e);
        printFont.Dispose();
        printStream.Close();
    }

    protected override void OnPrintPage(PrintPageEventArgs e)
    {
        base.OnPrintPage(e);

        // Slow down printing for demo.
        System.Threading.Thread.Sleep(200);

        Graphics gdiPage = e.Graphics;
        float leftMargin = e.MarginBounds.Left;
        float topMargin = e.MarginBounds.Top;
        float lineHeight = printFont.GetHeight(gdiPage);
        float linesPerPage = e.MarginBounds.Height / lineHeight;
        int lineCount = 0;
        string lineText = null;

        // Watermark?
        if (this.Watermark)
        {
            int top = Math.Max(0,
                     (e.PageBounds.Height - imgWatermark.Height) / 2);
            int left = Math.Max(0,
                     (e.PageBounds.Width - imgWatermark.Width) / 2);
            gdiPage.DrawImage(imgWatermark, left, top,
                     imgWatermark.Width, imgWatermark.Height);
        }

        // Print each line of the file.
        while (lineCount < linesPerPage &&
              ((lineText = printStream.ReadLine()) != null))
        {
            gdiPage.DrawString(lineText, printFont, Brushes.Black,
            leftMargin, (topMargin + (lineCount++ * lineHeight)));
        }

        // If more lines exist, print another page.
        if (lineText != null)
            e.HasMorePages = true;
        else
            e.HasMorePages = false;
    }
}

}

What I want is to print a file and that print comes out on the Pimaco 6287 label sheet (the sheet contains four columns each with 20 rows totaling 80 labels per sheet) and that’s how I want the data in that read file to be printed. I never messed with GDI, In fact, I’ve been working with programming for a while now and I can say I’m the real beginner. What I noticed in this code are the margin values, lines per page, etc. The parameters sent when drawing the print. What happens is that he draws only one column and I wanted to be able to put 4 columns of 20 lines each, as the layout of the label sheet.

Could someone help me with this? If you can in detail to learn it is also a good idea. Thanks in advance!

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.