Click here to Skip to main content
15,879,095 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

 
Praisegreat article! Pin
Southmountain16-Mar-22 8:46
Southmountain16-Mar-22 8:46 
QuestionUnicode Font Support Pin
Vedareddy29-Aug-16 20:10
Vedareddy29-Aug-16 20:10 
QuestionIt can not support the Bitmap type column Datatable Pin
sssanton27-Apr-16 22:58
sssanton27-Apr-16 22:58 
QuestionGood work Pin
Tobb Technologies7-May-15 9:03
Tobb Technologies7-May-15 9:03 
QuestionPDF files not opening in the Windows 8 Metro PDF reader Pin
tanioskahi11-Oct-13 3:37
tanioskahi11-Oct-13 3:37 
AnswerRe: PDF files not opening in the Windows 8 Metro PDF reader Pin
infal2-Dec-13 4:36
infal2-Dec-13 4:36 
Hello,

this is known problem.

obviously here many bugs in the library, I have worked with this library since many years, wrote a lot of extensions and fixes, therefore I can't publish new code here. Moreover, I've asked the originator to work together, update code and post here, but sad to say, I get no answer and no support for problems.

First big problem, as many and me mentioned here, is bug in XREF-Table, many authors posted solution, all solutions are results in the same PDF-fix. Choose one of them.

Second big problem, nobody mentioned here, is if you set dokument header - at creation time the header will be created and added to object list and if You set a header, NEW header with new parameters will be created and added, not the old one will be updated. This results in bad object serialization at the time of SaveDocument(). The fix is really easy, if new header data should be set, the old object should be used!

Here ist the fix:

C#
/// <summary>
/// set Document Subject and Title.
/// </summary>
public void SetHeaders(string subject, string title, string author, string keywords)
{
    if (subject == null) throw new Exception("string Subject cannot be null.");
    if (title == null) throw new Exception("string Title cannot be null.");
    //Bug fix: creating duplicated header object!
    //this.Header = new PdfHeader(this, subject, title, author, keywords); // original code
    PdfHeader header = this.Header as PdfHeader;
    header.subject = subject;
    header.title = title;
    header.author = author;
    header.keywords = keywords;
}



After both fixes (maybe already only header-fix) this should (I can't guarantee this, I have my private version) be opened in the Windows 8 Metro PDF reader.

Cu,
Alex
GeneralRe: PDF files not opening in the Windows 8 Metro PDF reader Pin
infal2-Dec-13 4:40
infal2-Dec-13 4:40 
QuestionCan u Extend this to Read pdf Pin
pra2716-Jul-13 23:13
pra2716-Jul-13 23:13 
QuestionGios Pdf.NET.dll Pin
Strygor4-Sep-12 8:22
Strygor4-Sep-12 8:22 
AnswerRe: Gios Pdf.NET.dll Pin
Southmountain29-Jul-22 18:10
Southmountain29-Jul-22 18:10 
QuestionGios-PDF-NET-library Pin
manoj dot net developer30-Jul-12 1:16
manoj dot net developer30-Jul-12 1:16 
QuestionFont Support Pin
N Haque24-Jul-12 20:50
N Haque24-Jul-12 20:50 
QuestionSearch Document Pin
jibrownie1-Jul-12 8:03
jibrownie1-Jul-12 8:03 
QuestionWrong char after converting Pdf Pin
N Haque22-May-12 23:15
N Haque22-May-12 23:15 
GeneralMy vote of 5 Pin
Manoj Kumar Choubey9-Feb-12 2:24
professionalManoj Kumar Choubey9-Feb-12 2:24 
QuestionAdd images in the pdf table Pin
galvin verghese13-Oct-11 1:01
galvin verghese13-Oct-11 1:01 
BugSend("startxref\n" + startxref+"\n"); [modified] Pin
infal18-Sep-11 12:29
infal18-Sep-11 12:29 
QuestionWhere is V2.0? Pin
infal16-Sep-11 1:35
infal16-Sep-11 1:35 
SuggestionActualize and permanently update the code. Pin
infal15-Sep-11 1:26
infal15-Sep-11 1:26 
GeneralPage Numbers Pin
JayveeJavier10-Feb-11 16:20
JayveeJavier10-Feb-11 16:20 
GeneralRe: Page Numbers Pin
galvin verghese13-Oct-11 1:07
galvin verghese13-Oct-11 1:07 
QuestionCan I use this in web pages Pin
arpan31-Oct-10 21:20
arpan31-Oct-10 21:20 
AnswerRe: Can I use this in web pages Pin
galvin verghese2-Sep-11 23:26
galvin verghese2-Sep-11 23:26 
AnswerRe: Can I use this in web pages Pin
galvin verghese4-Sep-11 22:26
galvin verghese4-Sep-11 22:26 
GeneralMy vote of 3 Pin
scefiro8-Aug-10 17:42
scefiro8-Aug-10 17:42 

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.