itextsharp добавить текст поверх изображения круга в ячейке таблицы

Мне нужна таблица с несколькими столбцами, где у меня есть разноцветные кружки в разных ячейках с номером в середине круга. Подобно макету ниже, но со всем централизованным и равным.

введите описание изображения здесь

Я пробовал следующее:

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

но я получаю что-то вроде этого. (Цвет еще не пробовал). Я не могу поместить изображение и текст в одно и то же место.

введите описание изображения здесь

Я также пробовал следить за этим сообщением:

iTextSharp - изображение с наложением текста

который объясняет, как поместить событие в ячейку, чтобы установить фоновое изображение ячейки, но мой кружок появляется на полпути вниз по странице.

Есть ли у кого-нибудь пример этой работы?


person Bex    schedule 21.01.2015    source источник


Ответы (1)


Есть много разных способов добиться желаемого.

На самом деле, я только что проголосовал за закрытие вопроса https://stackoverflow.com/questions/28066639/how-to-get-text-on-image-in-itext-using-java, потому что это дубликат Как добавить текст к изображению?

В вашем случае вам также может пригодиться документация. В Лучшие вопросы iText по StackOverflow есть несколько примеров, объясняющих, как использовать события ячейки, но ваше требование очень похоже на то, что было сделано в нескольких примерах из книги iText в действии - второе издание < / а>.

Вы можете использовать события ячейки для рисования фона ячейки, как показано в примерах Календаря: calendar.pdf, но ваше требование также может быть выполнено с помощью общего тега event: movie_years.pdf

Вы видите, как слово IMDB прекрасно вписывается в эллипс? Точно так же вы можете поместить число в круг.

С помощью этого кода можно нарисовать эллипс (превратить его в круг довольно просто):

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

С помощью этого фрагмента вы представляете это событие:

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

С помощью этого фрагмента вы помечаете Chunk общим тегом:

chunk.SetGenericTag("circle");
person Bruno Lowagie    schedule 21.01.2015
comment
Спасибо, это здорово! Теперь у меня есть мой номер в круге, но как мне выровнять все это по центру моего PdfPCell? - person Bex; 21.01.2015
comment
При работе в текстовом режиме: изменить выравнивание ячейки на Element.ALIGN_CENTER; при работе в композитном режиме: измените выравнивание Paragraph на Element.ALIGN_CENTER. Если вы сомневаетесь в текстовом или составном режиме, обратитесь к бесплатной электронной книге - person Bruno Lowagie; 21.01.2015