iTextSharp - Adding Text with Chunks, Phrases and Paragraphs

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

Chunks

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));

doc.Open();

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

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

{

    doc.Add(c1);

}

 

[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);

 

""

Phrases

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++)

{

      phrase.Add(c1);

}

 

""

Paragraphs

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);

 

try

{

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

    doc.Open();

 

    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();

    p2.Add(c1);

    p2.Add(c2);

    p2.Add(c3);

    p2.Add(c4);

    p2.Add(c5);

    p2.Add(c6);

    p2.Add(c7);

    p2.Add(c8);

    p2.Add(c9);

    Paragraph p = new Paragraph();

    p.Add(p1);

    p.Add(p2);

    doc.Add(p);

}

catch (DocumentException dex)

{

    throw (dex);

}

catch (IOException ioex)

{

    throw (ioex);

}

finally

{

    doc.Close();

}

 

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: 320736

18 Comments

- Nameless

Excelente short but concise tutorial!

Thanks!

- 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.

Thanks,
Vijay

- Mike

@Vijay

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.

YOU ROCK!!!!!

- 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

Hi,
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

@Kokila,

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

@Harsha

You can turn your PDF into a form: http://www.4guysfromrolla.com/articles/030211-1.aspx

- osiris

Great tutorial, thank you guys

Recent Comments

Justin Kusuma 7/24/2015 3:38 AM
In response to Posting Data With jQuery AJAX In ASP.NET Razor Web Pages
Hi Mike, thanks much for sharing such an article :) Really help me a lot... further, I'd like to...

Michael Easterbrook 7/22/2015 5:35 PM
In response to Inline Razor Syntax Overview
I removed the @ symbols and I am still getting the same error. It only occurs when I have an "if" a...

Sujay 7/22/2015 1:36 PM
In response to ASP.NET MVC, Entity Framework, One-to-Many and Many-to-Many INSERTS
can you explain how to link two tables so that it forms many to many relationship?(Article and...

Max G 7/21/2015 9:29 PM
In response to Scheduled Tasks In ASP.NET With Quartz.Net
Hi, I've opted for this solution in one of my applications but i've found that the apppool is and I...

Michael Easterbrook 7/20/2015 4:31 PM
In response to Inline Razor Syntax Overview
When I have the following code: @foreach (var procRow in procRowDecade) { if (@procRow[3] +...

Shanice 7/18/2015 10:58 PM
In response to A Better Way To Export Gridviews To Excel
Hi. I'm working with mvc. I need to add the above code in the business logic layer, however the...

Matt 7/18/2015 6:29 PM
In response to Nested Layout Pages with Razor
Cheers sir, nice explanation :)...

Keshavan 7/17/2015 9:06 AM
In response to Scheduled Tasks In ASP.NET With Quartz.Net
Hi Mike, I have followed exactly as illustrated in blog, I get error "StdSchedulerFactory.cs" not...

Paul Thiel 7/16/2015 5:17 PM
In response to ASP.NET 5 By Numbers
Comments Below: "The new version of ASP.NET is called ASP.NET 5. It is a framework for developing...

saket singh 7/16/2015 8:42 AM
In response to Scheduled Tasks In ASP.NET With Quartz.Net
hi Mike, great tutorial on Quartz.net , but i have One Problem , Everything is working fine as as...