Click here to Skip to main content
15,888,351 members
Articles / Programming Languages / C#
Article

Gios PDF .NET library

Rate me:
Please Sign up or sign in to vote.
4.89/5 (157 votes)
18 Apr 2005LGPL32 min read 2.2M   13.1K   558   358
A .NET library for generating impressive PDF reports.

Image 1

Introduction

This article describes how to use the Gios Pdf.NET open source library, a complete object-oriented .NET library for generating impressive reports with few lines of code.

Background

I started writing this library because I really couldn’t find a good C# library for exporting my reports. When you open a PDF document with Notepad to find out if it’s possible to edit it… well… you change your mind!

...But if you download the PDF format specifications from Adobe’s official site… you can demystify everything!

In this article, it’s not my intention to teach “how to write a clone of my library” but “how to use it” … By the way, if you want to try to write your own library… try it: it’s not impossible and it's a good (and difficult!) exercise!

Using the code

Start instantiating the document with a new PdfDocument object. Remember to set the document format. In this case we specify width and height in centimeters. Document format is provided by the PdfDocumentFormat class:

C#
PdfDocument myPdfDocument = 
  new PdfDocument(PdfDocumentFormat.InCentimeters(21,29.7));

Now we create a table of 100 lines, 6 columns and 4 points of padding:

C#
PdfTable myPdfTable = 
  myPdfDocument.NewTable(new Font("Verdana",12),200,6,4);

Importing data from the datatables... (also column names for the headers!):

C#
myPdfTable.ImportDataTable(Table);

Set the format for correct date-time representation:

C#
myPdfTable.Columns[2].SetContentFormat("{0:dd/MM/yyyy}");

Now we set our Graphic Design: Colors and Borders...

C#
myPdfTable.HeadersRow.SetColors(Color.White,Color.Navy);
myPdfTable.SetColors(Color.Black,Color.White,Color.Gainsboro);
myPdfTable.SetBorders(Color.Black,1,BorderType.CompleteGrid);

With just one method, we can set the proportional width of the columns. It's a "percentage like" assignment, but the sum can be different from 100.

C#
myPdfTable.SetColumnsWidth(new int[]{5,25,16,20,20,15});

You can also set colors for a range of cells, in this case, a row:

C#
myPdfTable.Rows[7].SetColors(Color.Black,Color.LightGreen);

Now we set some alignment... for the whole table and then, for a column:

C#
myPdfTable.SetContentAlignment(ContentAlignment.MiddleCenter);                      
myPdfTable.Columns[1].SetContentAlignment(ContentAlignment.MiddleLeft);

This is the most important feature of the library: each page generated by the table can be managed in all the details:

C#
while (!myPdfTable.AllTablePagesCreated)
{
    // we create a new page to put the generation of the new TablePage:

    PdfPage newPdfPage=myPdfDocument.NewPage();
    PdfTablePage newPdfTablePage = 
      myPdfTable.CreateTablePage(new PdfArea(myPdfDocument,48,120,500,670));

    // we also put a Label 
 
    PdfTextArea pta=new PdfTextArea(new Font("Verdana",26, FontStyle.Bold), 
      Color.Red, new PdfArea(myPdfDocument,0,20,595,120), 
      ContentAlignment.MiddleCenter,"Contact List");

    // nice thing: we can put all the objects
    // in the following lines, so we can have
    // a great control of layer sequence... 

    newPdfPage.Add(newPdfTablePage);
    newPdfPage.Add(pta);

    // Now we create a loop for serching for people born in 1968. If we find
    // one, we will draw a circle over
    // the birthday cell. This is possible using the
    // the CellArea, that is the Area occupied by a rasterized Cell.
 
    for (int index=newPdfTablePage.FirstRow;index<=newPdfTablePage.LastRow;index++)
       if (((DateTime)myPdfTable.Rows[index][2].Content).Year==1968)
       {
          PdfCircle pc=newPdfTablePage.CellArea(index,2).InnerCircle(Color.Blue,2);
          pc.StrokeWidth=3.5;
          newPdfPage.Add(pc);
       }

    // we save each generated page before start rendering the next.
    newPdfPage.SaveToDocument();

}

At last... remember to save the document!

C#
myPdfDocument.SaveToFile("Example1.pdf");

And this is the result:

Image 2

Remember, you can also output the PDF to a generic Stream. These are the lines for a Web Response:

C#
Response.ClearHeaders();
Response.AppendHeader("Content-disposition", 
   string.Format("attachment;filename={0}","Report.pdf"));
Response.ContentType="application/pdf"; 
myPdfDocument.SaveToStream(Response.OutputStream);
Response.End();

History

  • April 18, 2005 - Initial release.

License

This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License (LGPLv3)


Written By
Web Developer
Italy Italy
Freelance software ASPNET / C# Software Developer

I live in Torino, Italy

my homepage is: http://www.paologios.com

Comments and Discussions

 
GeneralMono Version Pin
gaulive26-Oct-06 4:23
gaulive26-Oct-06 4:23 
AnswerRe: Mono Version Pin
vhrc993-Apr-08 13:25
vhrc993-Apr-08 13:25 
GeneralRe: Mono Version Pin
Paolo Gios3-Apr-08 21:04
Paolo Gios3-Apr-08 21:04 
GeneralSmall bug in PdfTextArea.OverFlowText Pin
__alias29-Sep-06 2:51
__alias29-Sep-06 2:51 
JokeRe: Small bug in PdfTextArea.OverFlowText Pin
StiGMaTa_Dev29-Sep-06 2:57
StiGMaTa_Dev29-Sep-06 2:57 
QuestionCell [24,0] does not belong to the TablePage. Pin
species168829-Aug-06 20:16
species168829-Aug-06 20:16 
QuestionRe: Cell [24,0] does not belong to the TablePage. Pin
species168829-Aug-06 21:57
species168829-Aug-06 21:57 
GeneralPDF page displying only latest entered data.. Pin
VaibhavJ28-Jul-06 8:11
VaibhavJ28-Jul-06 8:11 
Hi all,

Problem I am facing >>

I am facing a serious problem while adding pages dynamically and writing them as and when required by putting them inside arraylist. I have followed somewhat similar procedure of using ArrayList to modify pages as mentioned in the forum. Just writing about the problem in short.

Process I am following >>

I want to create a PDF document where I have to add pages dynamically.
I have created three rectangles of equal sizes on page and then I am inserting data into it by specifying exact X-Y coordinates. Just like a table with three columns.

1. First I am filling up data to rectangle 1. If the data exceeds the page limit, I add a new page.

2. I am maintaining the same rectangles structure for all pages.
Then I continue writing text to this page by specifying X-Y coordinates.
After this I have added the page to an ArrayList.
So, for the first column (i.e Rectangle 1), I repeat above process for adding pages if required. Here, I have maintained "intCurrentPageNo" variable to keep track of the current page I am working with.

3. Now I have to fill up data to 2nd column (Rectangle 2). As 1st page has a lot of space available for 2nd column I have straightway set intCurrentPage to 1. We add data to this and then put it back to ArrayList. If the data excceds more than one page I need 2nd page. Here I check for whether there is already 2nd page available or not. I look for the already added page into ArrayList. Here, I will get 2nd page by manipulating "intCurrentPageNo" variable.

4. So, I am able to write to this 2nd page and then I again add it to the ArrayList.

5. But it is showing only the last added data. The previous data was lost somehow.

What can be the problem ? I guess it is impossible to write to any page after you save that page.

I am really stuck here Sleepy | :zzz:

Any help on this issue is greatly appreciated. I would like to know if I can use any other method.

Thanks in advance. Thanks for reading. Good day.

Thanks & regards,
Vaibhav (India)





GeneralRe: PDF page displying only latest entered data.. Pin
VaibhavJ29-Jul-06 0:33
VaibhavJ29-Jul-06 0:33 
GeneralSaveToStream NotSupportedException Pin
species168821-Jul-06 16:51
species168821-Jul-06 16:51 
GeneralRe: SaveToStream NotSupportedException Pin
grisetma8-Aug-06 9:10
grisetma8-Aug-06 9:10 
GeneralRe: SaveToStream NotSupportedException Pin
species168829-Aug-06 20:17
species168829-Aug-06 20:17 
QuestionHow to print ? Pin
Lions_italy21-Jul-06 0:08
Lions_italy21-Jul-06 0:08 
QuestionIndex was outside the bounds of the array. Pin
andrermagalhaes18-Jul-06 11:28
andrermagalhaes18-Jul-06 11:28 
Questionhow to do this??? [modified] Pin
binhminhtn17-Jul-06 21:17
binhminhtn17-Jul-06 21:17 
AnswerRe: how to do this??? Pin
Ri Qen-Sin17-Sep-06 13:44
Ri Qen-Sin17-Sep-06 13:44 
QuestionFrench or German Characters [modified] Pin
ashasikand28-Jun-06 3:33
ashasikand28-Jun-06 3:33 
AnswerRe: French or German Characters Pin
DeliaZgz17-Jan-07 7:07
DeliaZgz17-Jan-07 7:07 
GeneralRe: French or German Characters and any other (non unicode) code page Pin
Domagoj Peharda12-Jun-08 17:08
Domagoj Peharda12-Jun-08 17:08 
GeneralRe: French or German Characters and any other (non unicode) code page [modified] Pin
Dragan T.4-Jul-08 4:23
Dragan T.4-Jul-08 4:23 
GeneralRe: French or German Characters and any other (non unicode) code page Pin
turbomedo10-Oct-08 3:35
turbomedo10-Oct-08 3:35 
GeneralProblem using RowSpan Pin
davide c.26-Jun-06 5:00
davide c.26-Jun-06 5:00 
GeneralRe: Problem using RowSpan Pin
Balavardhan10-Sep-08 21:14
Balavardhan10-Sep-08 21:14 
GeneralPDF to RTF Pin
David Boland9-Jun-06 3:58
David Boland9-Jun-06 3:58 
QuestionColumn Width Pin
Nayana K16-May-06 3:40
Nayana K16-May-06 3:40 

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.