Search code examples
c#asp.netpdfitextdynamicpdf

Dynamic PDF Row Mockup


I have a small problem and the answer is probably really obvious and simple, but I guess I have failed in searching the internet for an answer, so once again I came to you guys.

I'm dynamically generating a PDF file in asp.net with c#, and right now I'm just making the base for it. One of the things it generates is a table in which a cart content should be revealed (yes I'm talking about an invoice) and I'm trying to give the table some mockup, but the mock up for the upper row will be different than the rest. (the header in which the columns are defined (Quantity, Title, Unit Price, Discount and Total)

Here's some code (it's the first time I did this so don't yell at me xD)

PdfPCell Quantity = new PdfPCell(new Phrase("Quantity"));
PdfPCell Title = new PdfPCell(new Phrase("Title"));
PdfPCell UniPr = new PdfPCell(new Phrase("Unit Price"));
PdfPCell Disc = new PdfPCell(new Phrase("Discount"));
PdfPCell Total = new PdfPCell(new Phrase("Total"));
PdfPCell[] cartheaderc = { Quantity, Title, UniPr, Disc, Total };
PdfPRow cartheader = new PdfPRow(cartheaderc);

So I've tried it this way and then say:

PdfPRow.BackgroundColor = new BaseColor(255,0,0);

Since that works for cells, I thought this might make sense, but apparently it didn't. I probably can do it when I take each cell apart, but there should be an easier way, right?

That's one problem, but sadly enough, I've got one more (although 10x more stupid and 10x easier). The color I want to use is #c5c5c5, but it doesn't want to recognize the color code.

Here is a list of the systems for ItextSharp I'm using (this is beside the standard systems from Visual Studio and SQLserver and no, I rather not want to add more systems if possible):

using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

Solution

  • You have two questions:

    1. You are using PdfPRow, but you're not supposed to do that. The PdfPRow class is for internal use only. You should work at the PdfPCell level. If you want to color complete rows, you can do so by using a PdfPTableEvent. See for instance the colored rows in alternating.pdf. They were colored in an AlternatingBackground table event.
    2. You have difficulties creating the color #c5c5c5. The hexadecimal value C5 equals 197, hence you want to create the following color object: new BaseColor(197, 197, 197);

    Your main mistake is that you create a PdfPRow by adding an array of PdfPCell objects. Where did you get inspiration to do so? If you find somebody who wrote such an example, please let me know and if he's near, I'll personally spank him ;-)

    Tables are created like this:

    PdfPTable table = new PdfPTable(5);
    PdfPCell Quantity = new PdfPCell(new Phrase("Quantity"));
    table.AddCell(Quantity);
    PdfPCell Title = new PdfPCell(new Phrase("Title"));
    table.AddCell(Title);
    PdfPCell UniPr = new PdfPCell(new Phrase("Unit Price"));
    table.AddCell(UniPr);
    PdfPCell Disc = new PdfPCell(new Phrase("Discount"));
    table.AddCell(Disc);
    PdfPCell Total = new PdfPCell(new Phrase("Total"));
    table.AddCell(Total);
    

    There is an even easier way to do this. This easier way also allows you to define the background color for every cell:

    PdfPTable table = new PdfPTable(5);
    table.DefaultCell.BackgroundColor = new BaseColor(197, 197, 197);
    table.AddCell("Quantity");
    table.AddCell("Title");
    table.AddCell("Unit Price");
    table.AddCell("Discount");
    table.AddCell("Total");
    

    The AddCell() method will wrap the strings inside a Phrase. Create a PdfPCell with this Phrase and apply all the properties you've defined for the DefaultCell to that cell. This way, you can make sure that all the cell have the same back ground color (or border, or...). Obviously, the properties of the DefaultCell will be ignored if you create PdfPCell instances yourself.