Imran Akram’s Blog

My experiences with life, ASP .NET, C# and VB .NET etc

Generating PDF document in .NET using iTextSharp Library

with 4 comments

well, it was just yesterday that I was looking into converting html to pdf programmatically in .NET 2.0. After some googling, I came up to the iTextSharp library at SourceForge.

Just built an application to test run this iTextSharp library. so here’s the code for the “Hello world” application.

private void HelloWorldPdf()
{
try
{
iTextSharp.text.Document oDoc = new iTextSharp.text.Document();
PdfWriter.GetInstance(oDoc, new FileStream(”HelloWorld.pdf”, FileMode.Create));
oDoc.Open();
oDoc.Add(new Paragraph(”Hello World!”));
oDoc.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}

It works!, Then I tried inserting an image in the pdf document and that worked too.

private void InsertImageinPDF()
{

//Already existing file
string pdfTemplate = “HelloWorld.pdf”;//@”C:\PDFFileSoftware\PdfGenerator_CS\PdfGenerator_CS\PdfGenerator\1_Form SS-4 (2007).pdf”;

//@”c:\Temp\PDF\fw4.pdf”;
string newFile = @”completed_fw4.pdf”;//c:\Temp\PDF\

PdfReader pdfReader = new PdfReader(pdfTemplate);
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(newFile, FileMode.Create));
AcroFields pdfFormFields = pdfStamper.AcroFields;

string chartLoc = string.Empty;

chartLoc = @”C:\Documents and Settings\Imran Akram\My Documents\My Pictures\TheDeparted.jpg”;//@”C:\Temp\PDF\IMG_3746.jpg”;//pplLogoSmall.jpg”;
iTextSharp.text.Image chartImg = iTextSharp.text.Image.GetInstance(chartLoc);

iTextSharp.text.pdf.PdfContentByte underContent;
iTextSharp.text.Rectangle rect;

try
{
Single X, Y; int pageCount = 0;

rect = pdfReader.GetPageSizeWithRotation(1);
if (chartImg.Width > rect.Width || chartImg.Height > rect.Height)
{

chartImg.ScaleToFit(rect.Width, rect.Height);

X = (rect.Width – chartImg.ScaledWidth) / 2;

Y = (rect.Height – chartImg.ScaledHeight) / 2;

}

else
{

X = (rect.Width – chartImg.Width) / 2;

Y = (rect.Height – chartImg.Height) / 2;

} chartImg.SetAbsolutePosition(X, Y);

pageCount = pdfReader.NumberOfPages;
for (int i = 1; i <= pageCount; i++)
{

underContent = pdfStamper.GetOverContent(i);//.GetUnderContent(i);

underContent.AddImage(chartImg);

}

pdfStamper.Close();

pdfReader.Close();

}
catch (Exception ex)
{
throw ex;

}

}

OKAY So far so good, but what about the thing I needed the most…. Rendering Html to pdf!! And guess what I was quite disappointed. The HtmlParser is just not strong enough. It gets mad even if it gets a br tag, your code has to be absolutely XHTML conformant or it will give u nothing. But for your interest, I’m giving you guys the code.

/// <summary>
/// Creates the PDF document with a given content at a given location.
/// </summary>
/// <param name=”strFilePath”>The file path to write the new PDF to.</param>
/// <param name=”strContent”>Content in HTML to write to the PDF.</param>
public static void CreatePDFDocument(String strFilePath, String strContent)
{
Document document = new Document(PageSize.A4, 80, 50, 30, 65);
try
{
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(strFilePath, FileMode.Create));
//XmlTextReader reader = new XmlTextReader(new StringReader(strContent));
//reader.WhitespaceHandling = System.Xml.WhitespaceHandling.None;
//HtmlParser.Parse(document, reader);
System.Xml.XmlTextReader _xmlr = new System.Xml.XmlTextReader(new StringReader(@”<html><body>This is my <bold>test</bold> string</body></html>”));

HtmlParser.Parse(document, _xmlr);
}
catch (Exception e)
{
throw e;
}
}

I gotta say,  the HtmlParser is really vulnerable. So, I decided to use ABCPdf instead. :)

4 Responses

Subscribe to comments with RSS.

  1. Hi Imran -
    Would you mind giving a newbie a hand?
    I’ve been trying to find a comprehensible iTextSharp example on the internet and yours looked very straightforward.
    Unfortunately I’m stumped with a basic problem.
    I add the iTextSharp.dll to my app. as a reference and put “using iTextSharp;” at the top.
    The first line in your example compiles fine:-
    iTextSharp.text.Document oDoc = new iTextSharp.text.Document();

    but then when I add in the next line:-
    PdfWriter.GetInstance(oDoc, new FileStream(”HelloWorld.pdf”, FileMode.Create));
    It complains that PdfWriter doesn’t exist.
    I’ve obviously missed something obvious. Can you tell me what it it?
    Best wishes
    Tony Reynolds (UK)

    Tony Reynolds

    November 28, 2008 at 10:39 am

  2. Hi Tony,

    Thanks for dropping by. Have you checked to see whether you’ve added the reference of iTextSharp dll in your project — yeah I understand, its a very basic fault, but I can’t find any other possible reason in my mind right now.

    All the best,
    Imran Akram

    imak47

    December 2, 2008 at 1:45 pm

  3. Imran -

    Thanks for the suggestion, but I had added the reference.
    I’m pleased to say that having worked on it a bit (I told you I was a newbie!) I’ve found the problem. With my version of MS NET or maybe because of some preferences I’ve got, you have to use the full pathname. So now for the failed line I have:-

    iTextSharp.text.pdf.PdfWriter.GetInstance(oDoc, new FileStream(”HelloWorld.pdf”, FileMode.Create));

    and it works fine.
    All the best and please keep up the helpful examples.

    Tony Reynolds

    Tony Reynolds

    December 10, 2008 at 9:25 am

  4. Imran,

    After looking through a bunch of other html2pdf options, I too finally decided on Supergoos ABCPdf , now I ran into a couple problems..dont know if you have encountered them yet because this only happens when you you are going from a html string (not page) to pdf. When i tried to use relative paths in my src tags, it would either throw an execption, or not display the image. After some looking into the manual and reading some forums, I found out that one of the only options was to use the old outdated? I think BASE tag. If you found a work around for this, please tell me.

    Thanks
    -Doug

    doug

    December 15, 2008 at 7:43 pm


Leave a Reply