2

I need to have a table with multiple columns where I have different coloured circles in different cells with a number in the middle of the circle. Similar to the mockup below but with everything centralized and equal.

enter image description here

I have tried the following:

     PdfContentByte canvas = writer.DirectContent;
                PdfTemplate template = canvas.CreateTemplate(40, 40);
                template.SetLineWidth(1f);
                template.Circle(15f, 15f, 15);
                template.Stroke();

                iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(template);
                img.Alignment = iTextSharp.text.Image.UNDERLYING | iTextSharp.text.Image.ALIGN_CENTER;
                Phrase imgPhrase = new Paragraph(new Chunk(img, 1f, 1f));


 PdfPCell meAnswerCell = new PdfPCell();
            meAnswerCell.Colspan = 1;

            meAnswerCell.BorderWidthBottom = 0;
            meAnswerCell.HorizontalAlignment = Element.ALIGN_CENTER;
            string meAnswerText = "1;
            Phrase phrase = new Phrase(meAnswerText, questionFont);

            Paragraph para = new Paragraph();

            para.Add(imgPhrase);
            para.Add(phrase);
            para.Alignment = Element.ALIGN_CENTER;
            meAnswerCell.AddElement(para);

            answersTable.AddCell(meAnswerCell);

but I end up with something like this. (I haven't tried setting the colour yet). I cannot get the image and the text to sit in the same place.

enter image description here

I have also tried following this post:

iTextSharp - Text overlapping image

which explains how to put an event on the cell to set the background image of the cell but my circle appears half way down the page.

Has anyone go an example of this working?

Community
  • 1
  • 1
Bex
  • 4,898
  • 11
  • 50
  • 87

1 Answers1

0

There are many different ways to achieve what you want.

Actually, I just voted to close a question https://stackoverflow.com/questions/28066639/how-to-get-text-on-image-in-itext-using-java because it was a duplicate of How to add text to an image?

In your case, you may also benefit from the documentation. There are some examples in The Best iText Questions on StackOverflow that explain how to use cell events, but your requirement is very similar to what was done in a couple of examples from the book iText in Action - Second Edition.

You could use cell events to draw the background of a cell, as shown in the Calendar examples: calendar.pdf, but your requirement can also be met using a generic tag event: movie_years.pdf

Do you see how the word IMDB nicely fits inside an ellipse? You could fit a number inside a circle in the exact same way.

With this code, one draws an ellipse (changing it into a circle is fairly easy):

class GenericTags : PdfPageEventHelper {
  public override void OnGenericTag(
    PdfWriter writer, Document pdfDocument, Rectangle rect, String text) {
    PdfContentByte content = writer.DirectContentUnder, rect);
    content.SaveState();
    content.SetRGBColorFill(0x00, 0x00, 0xFF);
    content.Ellipse(
      rect.Left - 3f, rect.Bottom - 5f,
      rect.Right + 3f, rect.Top + 3f
    );
    content.Fill();
    content.RestoreState();
  }
}

With this snippet, you introduce this event:

GenericTags gevent = new GenericTags();
writer.PageEvent = gevent;

With this snippet, you mark a Chunk with the generic tag:

chunk.SetGenericTag("circle");
Community
  • 1
  • 1
Bruno Lowagie
  • 75,994
  • 9
  • 109
  • 165
  • Thank you this is great! I now have my number in my circle, but how do I align the whole thing into the center of my PdfPCell? – Bex Jan 21 '15 at 13:59
  • When working in text mode: change the alignment of the cell to `Element.ALIGN_CENTER`; when working in composite mode: change the alignment of the `Paragraph` to `Element.ALIGN_CENTER`. When in doubt about text or composite mode, consult the [free ebook](https://leanpub.com/itext_so) – Bruno Lowagie Jan 21 '15 at 15:57