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, но вашето изискване може да бъде изпълнено и с помощта на общо събитие на етикет: 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