Blue Theme Orange Theme Green Theme Red Theme
 
MindFusion's Components
Home | Forums | Videos | Photos | Downloads | Blogs | Interviews | Jobs | Beginners | Training
 | Consulting  
Submit an Article Submit a Blog 
 Login Close
User Id:
Password:
 
Forgot Password
Forgot Username
Why Register
 Jump to
Skip Navigation Links
TechnologyExpand Technology
WebsiteExpand Website
 Resources  
Close
 Our Network  
Close
Search :       Advanced Search »
Home » Printing » Printing in C#

Printing in C#

This sample shows you how to print a text box contents in C# and .NET.

Author Rank:
Total page views :  171165
Total downloads :  4546
   Print Read/Post comments Post a comment  Similar Articles  
   Email to a friend  Bookmark  Author's other articles  
Download Files:
PrintExample.zip
 
Become a Sponsor


Components, components, components. Using components is the difference between writing an application in one week vs. an application in a few hours. Printing is all carried out through components included in the toolbox. The main component that talks to the printer is the PrintDocument component. To use this component, just call the Print function and intercept the PrintPage event. Below are the routines that do this:

protected void PrintFile_Click (object sender, System.EventArgs e)
{
printDialog1.Document = ThePrintDocument;
string strText = this.richTextBox1.Text;
myReader =
new StringReader(strText);
if (printDialog1.ShowDialog() == DialogResult.OK)
{
this.ThePrintDocument.Print();
}
}
protected void ThePrintDocument_PrintPage (object sender,System.Drawing.Printing.PrintPageEventArgs ev)
{
float linesPerPage = 0;
float yPosition = 0;
int count = 0;
float leftMargin = ev.MarginBounds.Left;
float topMargin = ev.MarginBounds.Top;
string line = null;
Font printFont =
this.richTextBox1.Font;
SolidBrush myBrush =
new SolidBrush(Color.Black);
// Work out the number of lines per page, using the MarginBounds.
linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics);
// Iterate over the string using the StringReader, printing each line.
while(count < linesPerPage && ((line=myReader.ReadLine()) != null))
{
// calculate the next line position based on the height of the font according to the printing device
yPosition = topMargin + (count * printFont.GetHeight(ev.Graphics));
// draw the next line in the rich edit control
ev.Graphics.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat());
count++;
}
// If there are more lines, print another page.
if (line != null)
ev.HasMorePages =
true;
else
ev.HasMorePages = false;
myBrush.Dispose();
}

PrintFile_Click is called from the Print Menu. This routine first assigns the PrintDialog component to the document being printed. The dialog is shown using ShowDialog so the user can set their print settings and to decide whether to print or not. After ThePrintDocument.Print is called, the printing process begins. The PrintPage event is automatically called by the system to print the desired page information. The PrintPageEventArgs ev contains the Device Contexts ev.Graphics to use for drawing to the Printer. In this example we read each line of text from the rich text edit control using a StringReader. The StringReader class gives us the ability to treat a string like a stream and take advantage of the ReadLine function of the StringReader for reading each line out of the text edit control. We can calculate the position of the lines based on margins and the height of the font. It's interesting to note, that in order to predict the font height for the printer, we pass it the Device context of the printer in the GetHeight function (printFont.GetHeight(ev.Graphics())). This is because the font height on the screen pixels is different than the font height in printer pixels. The PrintPageEventArg attribute HasMorePages is continually set so that the PrintPage Event is triggered if their are more lines in the textbox than the current page can hold .

Print Preview

PrintPreview behaves a heck of a lot like Print as seen below:

protected void PreviewFile_Click (object sender, System.EventArgs e)
{
try
{
string strText = this.richTextBox1.Text; // read string from editor window
myReader = new StringReader(strText);
PrintPreviewDialog printPreviewDialog1 =
new PrintPreviewDialog(); // instantiate new print preview dialog
printPreviewDialog1.Document = this.ThePrintDocument ;
printPreviewDialog1.BorderStyle = FormBorderStyle.Fixed3D ;
printPreviewDialog1.ShowDialog();
// Show the print preview dialog, uses print page event to draw preview screen
}
catch(Exception exp)
{
System.Console.WriteLine(exp.Message.ToString());
}
}

The PrintPreview component also triggers the PrintPage event, but instead of outputting to the printer it outputs to the Print Preview Screen.

Other Editor Functions

The Open and Save menu items use streams to read and write the files. The persistence of files is discussed in other articles on this site. See Using ListView in C#.  In future articles we will add find/replace functionality to this text editor to make it a bit more powerful.


Login to add your contents and source code to this article
 About the author
 
Mike Gold
Michael Gold is President of Microgold Software Inc., makers of the WithClass UML Tool. His company is a Microsoft VBA Partner and Borland Partner. Mike is a Microsoft MVP and founding member of C# Corner. He has a BSEE and MEng EE from Cornell University and has consulted for Chase Manhattan Bank, JP Morgan, Merrill Lynch, and Charles Schwab. Currently he is a senior developer at Finisar Corp. He has been involved in several .NET book projects, and is currently working on a book for using .NET with embedded systems. He can be reached at mike@c-sharpcorner.com
Looking for C# Consulting?
C# Consulting is founded in 2002 by the founders of C# Corner. Unlike a traditional consulting company, our consultants are well-known experts in .NET and many of them are MVPs, authors, and trainers. We specialize in Microsoft .NET development and utilize Agile Development and Extreme Programming practices to provide fast pace quick turnaround results. Our software development model is a mix of Agile Development, traditional SDLC, and Waterfall models.
Click here to learn more about C# Consulting.
 
Introducing MaxV - one click. infinite control. Hyper-V Hosting from MaximumASP.
Finally – a virtual platform that delivers next-generation Windows Server 2008 Hyper-V virtualization technology from a managed hosting partner you can truly depend on. Visit www.maximumasp.com/max for a FREE 30 day trial. Hurry offer ends soon. Climb aboard the MaxV platform and take advantage of High Availability, Intelligent Monitoring, Recurrent Backups, and Scalability – with no hassle or hidden fees. As a managed hosting partner focused solely on Microsoft technologies since 2000, MaximumASP is uniquely qualified to provide the superior support that our business is built on. Unparalleled expertise with Microsoft technologies lead to working directly with Microsoft as first to offer IIS 7 and SQL 2008 betas in a hosted environment; partnering in the Go Live Program for Hyper-V; and product co-launches built on WS 2008 with Hyper-V technology.
Dynamic PDF
ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications.
Go.NET
Build custom interactive diagrams, network, workflow editors, flowcharts, or software design tools. Includes many predefined kinds of nodes, links, and basic shapes. Supports layers, scrolling, zooming, selection, drag-and-drop, clipboard, in-place editing, tooltips, grids, printing, overview window, palette. 100% implemented in C# as a managed .NET Control. Document/View/Tool architecture with many properties&events. Optional automatic layout.
Dundas Software
Dundas Chart for .NET is the most advanced .NET charting package available today.  With an extremely complete feature set, elegant architecture and easy implementation, Dundas Chart can quickly add advanced Charting functionality to enhance and transform ASP.NET and Windows Forms applications.  Whether you are implementing charting into internal projects, or building applications for clients, Dundas Chart offers advanced technology and advanced results to get the most out of data.
Clickatell's SMS Gateway
Clickatell's Developer Solutions allow you to SMS enable any website or application via a range of API's. Learn More about our API connections.
Free access to .NET Memory Management video
Everything you need to know about Garbage Collection, Temporary Objects, Fragmentation, Finalization and common causes of memory leaks in .NET. Watch the video here.
Microsoft Visual Studio 2010 Professional
Microsoft Visual Studio 2010 Professional will launch on April 12, but you can beat the rush and secure your copy today by pre-ordering at the affordable estimated retail price of $549 (US). Pre-order now.
Nevron Chart for .NET 2010.1 Now Available
The leading .NET charting control now features PDF, Flash and Silverlight export, visualization of large datasets and more. Deliver true charting functionality to your BI, Scorecard, Presentation or Scientific apps. Download evaluation now.
Developer-Ready ASP.NET 2.0 Web Hosting with 3 MONTHS FREE
Now supporting .NET 3.0 Framework with Windows Workflow Foundation, Windows Communication Foundation (WCF), Windows Presentation Foundation (WPF), windows CardSpace (WCS)! Providing more flexibility for Developers with Web Services Support and a User/Permission Manger. Also supporting MS SQL 2005/2000 with Real-Time Backups, FREE Automated Attach .MDF Tool, FREE SQL Restore and Shrink SQL DB Tools, and SQL
 
   Print Read/Post comments Post a comment  Similar Articles  
   Email to a friend  Bookmark  Author's other articles  
Download Files:
PrintExample.zip
 
 Post a Feedback, Comment, or Question about this article
Subject:  
Comment:  
Become a Sponsor
 Comments
Print from textboz by Ahsan On June 18, 2007
Very helpful for me. Hope that he provides more useful feature for C# developer.
Reply | Email | Delete | Modify | 
printing by jessie On June 28, 2007
i tried this example, 1 thing i notice is that when i type on the textbox 3 to 4 lines without using return key, the lines were printed off bounds. its like being printed on just one line instead of 3 or 4.
Reply | Email | Delete | Modify | 
peint word documents by Pierse On August 22, 2007
can you help me about preview a word document and print it by addressing the file name
Reply | Email | Delete | Modify | 
Printing in C# and .NET by ehx On January 6, 2008
Hi Mike, I read your above article and wonder if I can instead of printing to a printer, I create a text file . Is there a component that print a content of a document to a text file. Thanks Al ehx5@yahoo.com
Reply | Email | Delete | Modify | 
Re: Printing in C# and .NET by Mike On January 7, 2008
It would probably just be easier to stream the data to a text file using the FileStream or StreamWriter classes.
Reply | Email | Delete | Modify | 
print document by Osama On January 28, 2008
how can i define a print document to print preview in console application cause it returns nothing
Reply | Email | Delete | Modify | 
Re: print document by Mike On January 29, 2008
you would need to serialize your console to a file and open the file in a windows form.  then you can take advantage of the printdocument, print preview and other great printing facilities in .NET.
Reply | Email | Delete | Modify | 
Word wrapping by Jamie On February 12, 2008

Edit: I figured out how to do this in an MDI setup.  but my question to you is how do we account for lines of text that are to long for the page, how do we make it so that it will wrap to the next line.

Reply | Email | Delete | Modify | 
Thank you!!!! by Peter On October 21, 2008
Finally an article that made me understand how the blasted thing works! MSDN is junk, I have been reading it for a day and a half and haven't been able to produce a single printed page. After reading this, thou, I am printing (after 5 minutes of adopting this code to my needs). Thank you very much!
Reply | Email | Delete | Modify | 
error by Francesc On November 16, 2008
I have a problem with "StringReader(strText);" The complation don't fount de class. Some idea? Thanks
Reply | Email | Delete | Modify | 
Re: error by Albertto On February 20, 2009

using System.IO;

Reply | Email | Delete | Modify | 
Printing by Nikhil On March 18, 2009
Please tell me how can i print a form which is containing textboxes,buttons and more controls and i want to print this as it is... help me.... thnks
Reply | Email | Delete | Modify | 
Thanks by Alex On April 4, 2009
Hey , Thanks, This was very useful. Regards, Alex
Reply | Email | Delete | Modify | 
Is it possible to change the MArgin Bounds by nandan On May 23, 2009
Nice article. Can we change the default MarginBounds height for Left and Top margins, because I need it in my project
Reply | Email | Delete | Modify | 
doesn't work by Ken On August 14, 2009
Nice article, but it doesn't work... for multiple pages.  Just prints the first page and quits.
Reply | Email | Delete | Modify | 
Re: doesn't work by Mike On February 28, 2010
for multiple pages, you'll need to set the HasMultiplePages flag in the app to true, and set it to false when you've printed all the pages in your PrintPage event handler.
Reply | Email | Delete | Modify | 
Printing the output of a program by Marinus On February 10, 2010
Howzit ive written a program in C++ and now id like to print the output which the program gives me. Currently the last line shown on the window is "Press any key to continue..." so whenever i try to print screen the window vanishes. How can i print the output without losing the information??
Reply | Email | Delete | Modify | 
Re: Printing the output of a program by Mike On February 28, 2010
it's a different story if you are printing output from a console app.  You'll need to use pinvoke to make direct calls to the printer SDK in order to print text in a console app.
Reply | Email | Delete | Modify | 

 Hosted by MaximumASP  |  Found a broken link?  |  Contact Us  |  Terms & conditions  |  Privacy Policy  |  Site Map  |  Suggest an Idea  |  Media Kit
Current Version: 5.2009.6.2
 © 2010  contents copyright of their authors. Rest everything copyright Mindcracker. All rights reserved.