Click here to Skip to main content
15,898,134 members
Articles / Programming Languages / C#

DaReport PrintDocument - A Printing Utility for .NET

Rate me:
Please Sign up or sign in to vote.
4.80/5 (65 votes)
7 Jun 2018CPOL2 min read 453.7K   6K   168   155
A printing utility for .NET

Screenshot

Introduction

This component helps you generate simple but useful reports for printing in .NET. The idea is to generate XML-based templates, and then to call them from your program, and eventually to fill them with the data required. This is appropriate for generating small and simple printing documents.

Background

The basic class of this project is DaPrintDocument. It inherits from the standard .NET class PrintDocument. Therefore, you can use it pretty much the same way as the PrintDocument class.

This class simply paints attached drawing objects within its PrintPage() method. For simplicity, there are only four types of drawing objects supported: TextField (simple formatted text), PictureBox (images), ChartBox (simple charts), and StyledTable (table with static or dynamically loaded data).

Template File Overview

DaPrintDocument makes use of template files written in XML syntax. Those provide all static information relevant for printing a page.

You can write template files in any text editor, or alternatively, use the DaReport Designer (beta) provided in the distribution (it's a separate application: DaReportDesigner.exe).

The brief overview of the XML structure:

XML
<daReport>

<parameters>
   <parameter name="parameter1_name" />
   <parameter name="parameter2_name" />
</parameters>

<content>

<!-- Static objects are evaluated once per report -->
<staticContent>

      <!-- The list of static objects goes here. 
         Check in reportStatic.xml (in download package). -->
     
</staticContent>

<!-- Dynamic objects are evaluated once per page of report 
      (like data table segment or page number) -->
<dynamicContent>

      <!-- The list of dynamic objects goes here. 
        Check in reportDynamic.xml (in download package). -->

</dynamicContent>

</content>
</daReport>

Once again, the preferred way for XML template file generation is by using the DaReport Designer (beta) provided in the distribution.

Using the Code

First, add a reference to the daReport.dll file (provided in the distribution) to your project. If you feel like it, you can also put this component in your controls toolbar.

Second, add an instance of DaPrintDocument to your module (form); if you have previously attached it in your controls toolbar, simply drag it to your form:

C#
private daReport.DaPrintDocument daPrintDocument = 
                         new daReport.DaPrintDocument();

At the point where you wish to print some report, set the template file and fill in the parameters (if any):

C#
// set .xml file for printing
daPrintDocument.setXML("reportStatic.xml");

// fill in declared parameters (if any)
// (parameter names are case sensitive)
Hashtable parameters = new Hashtable();
parameters.Add("author","Predrag Dukanac");
daPrintDocument.SetParameters(parameters);

Using Tables

  • Static tables: Static tables have data defined in an XML template file (DATA tag). The DataSource property for these tables is not set. No specific action is required in code for these tables to print correctly (everything is done in the .xml file).
  • Dynamic tables: Dynamic tables present data calculated in your program (like database reports). The DataSource property is set, and must correspond to the DataTable.Name property in your code. Do it like this:
    C#
    // myTable is DataTable previously filled from database
    // (using DataAdapter.Fill method, for instance)
    
    DataTable printTable = myTable.Copy();
    printTable.Name = "printTable";
    // this is the DataSource attribute of my table in XML file
    
    // attach DataTable to printing document
    daPrintDocument.AddData(printTable);
    
    // now you're ready for print

Take a look at reportStatic.xml, reportDynamic.xml, reportCharts.xml, and the ReportTest project (all in the download package) for a deeper insight.

Latest Update

The DaReport print engine has turned into a commercial product - Stampa Reports System®. A Stampa Reports demo is available for download here. Stampa designer features backward compatibility with daReport in design mode. The Stampa printing engine can be used free of charge.

The DaReport project at this address is still an open-source project by all means.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
Serbia Serbia
Working at Mihajlo Pupin Institute, Belgrade, Serbia.

Comments and Discussions

 
GeneralXSL Pin
Kastellanos Nikos19-Jul-05 23:47
Kastellanos Nikos19-Jul-05 23:47 
GeneralLocation of margins(?) changes during print Pin
BarCode14-Jul-05 8:35
BarCode14-Jul-05 8:35 
GeneralRe: Location of margins(?) changes during print Pin
Predrag Dukanac14-Jul-05 21:15
Predrag Dukanac14-Jul-05 21:15 
GeneralRe: Location of margins(?) changes during print Pin
Kyle Schultz7-Sep-05 12:10
Kyle Schultz7-Sep-05 12:10 
GeneralRe: Location of margins(?) changes during print Pin
Predrag Dukanac13-Sep-05 0:28
Predrag Dukanac13-Sep-05 0:28 
GeneralRe: Location of margins(?) changes during print Pin
Kyle Schultz13-Sep-05 5:31
Kyle Schultz13-Sep-05 5:31 
GeneralRe: Location of margins(?) changes during print Pin
Predrag Dukanac14-Sep-05 1:53
Predrag Dukanac14-Sep-05 1:53 
GeneralRe: Location of margins(?) changes during print Pin
Kyle Schultz14-Sep-05 6:41
Kyle Schultz14-Sep-05 6:41 
First off let me explain some of the things that I added to your program. I added the following variables:

public static bool PreviewMode = true;
public int NumberOfPagesInDocument=0;

These two variables have become very handy to me. PreviewMode just needs to be set to true before you preview in a PrintPreviewControl. The NumberOfPagesInDocument is calculated in the DaPrintDocument_PrintPage function. I also base the last page printed on the "ToPage" from the Preview or Print Control. Now to the good stuff.

PreviewMode by default is true, therefore if you are previewing a document you just have to setXml and then open your PrintPreviewControl. When you want to print, you then change this variable to false. Here is a brief sample of how it could be used (I am not doing it like this at this time, but it should explain how I am using it).

daReport.DaPrintDocument thePrintDoc = new daReport.DaPrintDocument();
PrintDialog printer = new PrintDialog();
DialogResult dlgResult;

printer.Document = thePrintDoc;
printer.AllowSelection=true;
dlgResult = printer.ShowDialog();

if( dlgResult == DialogResult.OK )
{
//we have to set this to false here, b/c if not then it will use the Preview Margins
//therefore by setting this to false, we calculate based on the rBounds rectangle
daReport.DaPrintDocument.PreviewMode=false;
thePrintDoc.Print();
}
else
{
string msg = "Would you like to preview this document?"
dlgResult = MessageBox.Show(msg,"Prompt",MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if( dlgResult == DialogResult.OK )
{
//set this back to true so that we calculate based on the theRegion rectangle
daReport.DaPrintDocument.PreviewMode=true;
PrintPreviewDialog previewer = new PrintPreviewDialog();
previewer.Document = thePrintDoc;
previewer.ShowDialog();
}
}

That is all I am doing to accomplish both a successful Preview and Print. I used a static boolean value b/c of how I need to handle my calls to my custom DLL. You could in theory change this to a non-static type and then just set it as a property of the document, if you so desired.

The NumberOfPagesInDocument Integer value is set in the DaPrintDocument_PrintPage after the function determines if there are more pages or not. This is done after the function checks to see if the page it is on, is the ToPage of the Document.

//this if statement allows the user to select what pages they want to print
//(granted they start at one)
//therefore a user with a 10 page document can now print pages 1-7 if they want.
if( this.PrinterSettings.ToPage == (int)systemValues["pageNumber"] )
morePages=false;

e.HasMorePages = morePages;

//set the number of pages in the PrintDocument
NumberOfPagesInDocument = (int)systemValues["pageNumber"];

The above can only be accomplished by allowing the user the ability to select pages in the PrintDialog.

PrintDialog pd = new PrintDialog();
pd.Document = thePrintDoc;
pd.AllowPrintToFile = false;
pd.AllowSelection = false;
pd.AllowSomePages = true;
pd.ShowNetwork = true;
pd.ShowDialog();


I am currently working on a way to get rid of the PrintPreviewDialog Control, b/c this control in .NET, well just plainly put, SUCKS. I hate it, it is hard to work with and has just become a real pain in my arse. Once I get this worked out (I am designing a custom control using a windows form, PrintPreviewControl, and misc buttons and features), I will see if I can get it worked into your daReport, however in the mean time I have emailed my updated code to you, so that you can see what I have done.

I hope this information helps you, and answers your question. Thanks again for creating such a kick @$$ designer.

Kyle Schultz
KS Design
"Technology infused with Imagination"
kyle@ksdinfusion.com

General0.6.0.3 nightly: FormatMask editor (alpha code) Pin
angus_grant7-Jul-05 19:46
angus_grant7-Jul-05 19:46 
GeneralRe: 0.6.0.3 nightly: FormatMask editor (alpha code) Pin
Anonymous19-Jul-05 23:52
Anonymous19-Jul-05 23:52 
GeneralRe: 0.6.0.3 nightly: FormatMask editor (alpha code) Pin
angus_grant20-Jul-05 14:24
angus_grant20-Jul-05 14:24 
GeneralSourceForge 0.6.0.2 Pin
angus_grant29-Jun-05 1:16
angus_grant29-Jun-05 1:16 
GeneralRe: SourceForge 0.6.0.2 Pin
Predrag Dukanac29-Jun-05 1:51
Predrag Dukanac29-Jun-05 1:51 
GeneralRe: SourceForge 0.6.0.2 Pin
Vetch29-Jun-05 4:01
Vetch29-Jun-05 4:01 
GeneralRe: SourceForge 0.6.0.2 Pin
angus_grant29-Jun-05 15:52
angus_grant29-Jun-05 15:52 
GeneralRe: SourceForge 0.6.0.2 Pin
Vetch29-Jun-05 21:10
Vetch29-Jun-05 21:10 
GeneralRe: SourceForge 0.6.0.2 Pin
angus_grant29-Jun-05 15:54
angus_grant29-Jun-05 15:54 
GeneralReport Header and Footer Pin
Yalcin Ozturk8-Jun-05 21:54
Yalcin Ozturk8-Jun-05 21:54 
GeneralRe: Report Header and Footer Pin
angus_grant29-Jun-05 1:10
angus_grant29-Jun-05 1:10 
GeneralRe: Report Header and Footer Pin
angus_grant20-Jul-05 20:17
angus_grant20-Jul-05 20:17 
General0.6.0.2 RC1 Pin
angus_grant6-Jun-05 13:35
angus_grant6-Jun-05 13:35 
GeneralSourceForge 0.6.0.2 beta Pin
angus_grant30-May-05 15:21
angus_grant30-May-05 15:21 
GeneralPrinting Over Network Pin
Syri27-May-05 11:37
Syri27-May-05 11:37 
GeneralRe: Printing Over Network Pin
Predrag Dukanac28-May-05 1:36
Predrag Dukanac28-May-05 1:36 
GeneralSourceForge Release 0.6.0.1 Pin
angus_grant23-May-05 18:17
angus_grant23-May-05 18:17 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.