iTextSharp - Adding Text with Chunks, Phrases and Paragraphs

4.6 (132 votes)

This is the third in a series of articles that looks at using the open source component, iTextSharp from within ASP.NET to generate PDFs. Just as HTML and ASP.NET provide containers for varying ampounts of textual content, iTextSharp offers the Chunk, Phrase and Paragraph classes. Before going on, if you would like to read earlier articles, they are:

Create PDFs in ASP.NET - getting started with iTextSharp
iTextSharp - Working with Fonts


A Chunk is the smallest significant piece of text that you can work with. It's ASP.NET equivalent is the <asp:Label>. As with the Label, you need to be careful how you use Chunks. The following snippet shows how to set the text of a Chunk, then write it to the PDF document 3 times:


string path = Server.MapPath("PDFs");

Rectangle r = new Rectangle(400, 300);

Document doc = new Document(r);

PdfWriter.GetInstance(doc, new FileStream(path + "/Blocks.pdf", FileMode.Create));


Chunk c1 = new Chunk("A chunk represents an isolated string. ");

for (int i = 1; i < 4; i++)





[Keep an eye on the following paragraph - we will come back to it]
The result can be seen below, which shows the text having been written to the document but it looks a mess. Chunks have no concept of how to force a new line when the length exceeds the available width in the document. Really, all they should be used for is to change or set the style of a word or phrase inline. You can of course force a newline using "\n" or Environment.NewLine, or even Chunk.NEWLINE as part of the string you give a chunk.


The chunk has a number of methods to allow you to do this, such as setUnderLine(), setBackGround(), and setTextRise(), as well as a number of constructors that permit you to set the font and its styles.


Chunk chunk = new Chunk("Setting the Font", FontFactory.GetFont("dax-black"));

chunk.SetUnderline(0.5f, -1.5f);




The Phrase is the next container in the hierarchy. A phrase is an array of chunks, and will force a newline when the length of its contents exceed the vertical margins of the document. The space between each line (actually the measurement taken between the baselines of each line, or "leading") is 1.5 times the font size. Since the default font-size was applied by iTextSharp (12pt), the code below will result in a leading of 16pt. You can set the leading or font as part of initiating a new phrase, as well as pass it a string or chunk to set its content through the phrase's various overloaded constructors. The following snippet shows how the earlier chunk is added to a phrase 3 times, and the result.


Phrase phrase = new Phrase();

for (int i = 1; i < 4; i++)







What we have seen so far is the very basic building blocks for text in PDFs. The object that you will use most often is a Paragraph, which is a sequence of Phrases and Chunks held together. Paragraphs derive from Phrase, so they autommatically fit text within the horizontal boundaries of the document, but they also force a new line for each paragraph (just as in any word processing application). The paragraph earlier in the Chunk section of this article is as good as any to experiment with. It has a number of sentences and some formatted inline text, so we can use that to build a paragraph from chunks and phrases:


string path = Server.MapPath("PDFs");

Rectangle r = new Rectangle(400, 300);

Document doc = new Document(r);




    PdfWriter.GetInstance(doc, new FileStream(path + "/Blocks2.pdf", FileMode.Create));



    string text = @"The result can be seen below, which shows the text

                  having been written to the document but it looks a

                  mess. Chunks have no concept of how to force a new

                   line when the length exceeds the available width in

                  the document. Really, all they should be used for is

                  to change or set the style of a word or phrase inline. ";

    text = text.Replace(Environment.NewLine, String.Empty).Replace("  ", String.Empty);

    Font brown = new Font(Font.COURIER, 9f, Font.NORMAL, new Color(163, 21, 21));

    Font lightblue = new Font(Font.COURIER, 9f, Font.NORMAL, new Color(43, 145, 175));

    Font courier = new Font(Font.COURIER, 9f);

    Font georgia = FontFactory.GetFont("georgia", 10f);

    georgia.Color = Color.GRAY;

    Chunk beginning = new Chunk(text, georgia);

    Phrase p1 = new Phrase(beginning);

    Chunk c1 = new Chunk("You can of course force a newline using \"", georgia);

    Chunk c2 = new Chunk(@"\n", brown);

    Chunk c3 = new Chunk("\" or ", georgia);

    Chunk c4 = new Chunk("Environment", lightblue);

    Chunk c5 = new Chunk(".NewLine", courier);

    Chunk c6 = new Chunk(", or even ", georgia);

    Chunk c7 = new Chunk("Chunk", lightblue);

    Chunk c8 = new Chunk(".NEWLINE", courier);

    Chunk c9 = new Chunk(" as part of the string you give a chunk.", georgia);

    Phrase p2 = new Phrase();










    Paragraph p = new Paragraph();





catch (DocumentException dex)


    throw (dex);


catch (IOException ioex)


    throw (ioex);







First, the result, then some notes about the code:


It didn't take long to start adding Exception handling to the code. Of course, you should always use try... catch when performing IO operations, and with iTextSharp Document objects, there is also a DocumentException object to manage. There is another source of exceptions that I found to be rather sneaky. When testing the code to generate the PDF file, I inadvertently transposed two arguments in the constructor for the font I called lightblue, in that I passed in the value Font.NORMAL before the size. This had the effect of setting the font size to 0, which is the value that the constant is set to. An exception is thrown when trying to call doc.Close(), and I have to shut down VS to release its hold on the document object.

So, exception handling starts to make its appearance, so that at least the document object is released. You will also notice that the font size values are now passed in with the f suffix following them. That explicitly tells the compiler that the value is to be treated as a float, and prevents the sort of mistake I experienced happening again.

The first block of text, which is @-quoted, or a verbatim string literal, needs to have all the whitespace and newlines removed from it, otherwise it will appear with them preserved in the resulting PDF. Other than that, each individually styled string is applied to its own Chunk object, and then added to a Phrase to ensure that lines are wrapped in the PDF. Finally both phrases are added to the single Paragraph object. It is also possible to set the alignment of the paragraph text, using the Paragraph.setAlignment() method. This accepts a string, with "Left", "Center", "Justify", and "Right" being valid values. The following shows the earlier example with p.setAlignment("Justify");


The Paragraph class has a number of other useful methods and properties for styling including:

Paragraph.FirstLineIndent  //allows you to apply a float value to indent the first line
Paragraph.IndentationLeft  //allows you to add space to the left hand side
Paragraph.IndentationRight //allows you to add space to the right hand side
Paragraph.setSpacingBefore //adds a specified amount of space above the paragraph
Paragraph.setSpacingAfter  //adds the specified amount of space after the paragraph

The next article will look at more text-based functionality, specifically in the area of lists.


Date Posted:
Last Updated:
Posted by:
Total Views to date: 363256


- Nameless

Excelente short but concise tutorial!


- Nameless 2

Hi, thanks for all the effort gone into these tutorials. I need to stamp existing PDFs with some text (and possibly and image), and it's occured to me that I can't use PdfWriter for this, as in all your examples a new PDF is being created.

I'm guessing it's PdfStamper that I need - perhaps you'll add a tutorial on that to your great series. I'm off to see if I can figure that one out now...

- Vijay

Hi Mike,

Thanks for such a wonderful site and detailed explanations.

I was wondering how to handle TAB character. I tried to use above chunk code but results is always a space.
Do i have to use columns or there is some other way around.


- Mike


As I understand it, Tabs are not supported in iTextSharp. The usual recommendation is to use Paragraph.IndentationLeft

- sky

Hi Mike, How to Positioning display text ?

- Eva

Thankx a lot for these articles!

- mohit

Good shot!!!!!!!!!!!!!!!

- Mle

Thank you for the tutorial, very clear and understandable

- Alex L.

Wow man. I'm a nub at this stuff and it just clicked with the earlier tutorials about adding a reference to the library and calling stuff from iTextsharp once I add the "Using" line. Also you example is clean / simple but effective letting me build on it.


- Igor

I am introducing myself to Pdf creation with Java and thanks to your tutorials (the one about tables saved me), I have reached nearly all the objectives I had with the document in only 6 hours.

Simply awesome!

Thanks a lot.

- Mark Wilson

I was wondering what the usual method is to place text at a particular location in a PDF. I have some pre-produced PDFs that will go to a printer and I need to insert some text info and an image.

Is it possible to specify where the text appears and the boundaries? Would you use the PDF form functionality for this?

Awesome series by the way.

- nirach

and what about tables ?
if i wanna include tables to the pdf file then how can i do this ?

- Mike

- Kokila

Can you please tell me how to insert text into a pdf on mouse click. that is wherever i click mouse i want a hardcoded text to be inserted/added into the document. Can you please send me the code for this?
Please help

- Mike


Simple answer is that you can't do that. PDF doesn't support that kind of interaction.

- Harsha

Hi, Can text area be created so that I can type text in the area in pdf document?
We have Add text in content editing,I want similiar functionality .Can it it be done.
Kindly help

- Mike


You can turn your PDF into a form:

- osiris

Great tutorial, thank you guys

- Aaditya

Great tutorial.

Can you please tell me how to change the color of existing string in pdf.


setting the string color while writing from DataTable to PDF in

Recent Comments

Jon 31/03/2016 21:36
In response to Exploring Prefix: A Free ASP.NET Profiling Tool
We had the exact same experience, finding multiple bugs in an application that we thought was pretty...

ranjith 31/03/2016 05:50
In response to A Better Way To Export Gridviews To Excel
Hello Mike. i am exporting from gridview, because i have some images in my gridview. but i am error...

Matt Watson 30/03/2016 22:19
In response to Exploring Prefix: A Free ASP.NET Profiling Tool
Glad you are loving it! Matt from Stackify...

Dmitry 28/03/2016 04:26
In response to Solved - The Microsoft.ACE.OLEDB.12.0 provider is not registered on the local machine
thank you about the VS 32-bit remark...

federico 26/03/2016 11:29
In response to Request.Form Is Empty When Posting To ASPX Page

Micheal 23/03/2016 00:58
In response to ASP.NET MVC 5 with EF 6 - Working With Files
Thanks for the code. its pretty straightforward. worked for me on my first trial. Perfect!...

Francisco 22/03/2016 20:35
In response to ASP.NET MVC 5 with EF 6 - Working With Files
The post is very good, thanks...

Nick Brown 22/03/2016 13:53
In response to Adding A View
Hi, Many thanks for this tutorial, it's helping me get started with MVC. In VB (VS 2013) I get late...

ferry mae 22/03/2016 13:04
In response to Send form content by email in ASP.NET
do i need to change this? message.To.Add(new MailAddress("")); message.CC.Add(new you...

Keith 22/03/2016 12:02
In response to Creating a Connection String and Working with SQL Server LocalDB
As always worst explanation, but this time you rocked with plagiarism too .. huhh.. copied from Rick...