Правый выравнивающий текст в PdfPCell

У меня есть приложение С#, которое генерирует счет-фактуру PDF. В этом счете есть таблица позиций и цен. Это генерируется с помощью PdfPTable и PdfPCell s.

Я хочу, чтобы иметь возможность выравнивать столбец справа, но я не могу это представить - текст всегда выставляется выравниванием по левому краю в ячейке.

Вот мой код для создания таблицы:

PdfPTable table = new PdfPTable(2);
table.TotalWidth = invoice.PageSize.Width;
float[] widths = { invoice.PageSize.Width - 70f, 70f };
table.SetWidths(widths);
table.AddCell(new Phrase("Item Name", tableHeadFont));
table.AddCell(new Phrase("Price", tableHeadFont));

SqlCommand cmdItems = new SqlCommand("SELECT...", con);

using (SqlDataReader rdrItems = cmdItems.ExecuteReader())
{
    while (rdrItems.Read())
    {
        table.AddCell(new Phrase(rdrItems["itemName"].ToString(), tableFont));
        double price = Convert.ToDouble(rdrItems["price"]);
        PdfPCell pcell = new PdfPCell();
        pcell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT;
        pcell.AddElement(new Phrase(price.ToString("0.00"), tableFont));
        table.AddCell(pcell);
    }
}

Может ли кто-нибудь помочь?

Ответы

Ответ 1

Я являюсь оригинальным разработчиком iText, и проблема, с которой вы столкнулись, объясняется в book.

Вы смешиваете текстовый режим и композитный режим.

В текстовом режиме вы создаете PdfPCell с Phrase в качестве параметра конструктора, и вы определяете выравнивание на уровне ячейки. Однако вы работаете в композитном режиме. Этот режим запускается, как только вы используете метод addElement(). В композитном режиме выравнивание, определенное на уровне ячейки, игнорируется (что объясняет вашу проблему). Вместо этого используется выравнивание отдельных элементов.

Как решить вашу проблему?

Либо работайте в текстовом режиме , добавив ваш Phrase в ячейку другим способом. Или работайте в композитном режиме и используйте Paragraph, для которого вы определяете выравнивание.

Преимущество композитного режима в текстовом режиме заключается в том, что разные абзацы в одной и той же ячейке могут иметь разные выравнивания, тогда как вы можете иметь только одно выравнивание в тексте режим. Другим преимуществом является то, что вы можете добавить больше, чем просто текст: вы также можете добавлять изображения, списки, таблицы,... Преимущество текстового режима - это скорость: для обработки содержимого требуется меньше времени на обработку ячейки.

Ответ 2

private static PdfPCell PhraseCell(Phrase phrase, int align)
{
    PdfPCell cell = new PdfPCell(phrase);
    cell.BorderColor = BaseColor.WHITE;
    // cell.VerticalAlignment = PdfCell.ALIGN_TOP;
    //cell.VerticalAlignment = align;
    cell.HorizontalAlignment = align;
    cell.PaddingBottom = 2f;
    cell.PaddingTop = 0f;
    return cell;
}

Ответ 3

Вот мой вывод user2660112 answer - один метод, чтобы вернуть ячейку для вставки в рамку с красным и фоновым цветом и аналогичное, но без полей/бесцветное множество:

private static PdfPCell GetCellForBorderedTable(Phrase phrase, int align, BaseColor color)
{
    PdfPCell cell = new PdfPCell(phrase);
    cell.HorizontalAlignment = align;
    cell.PaddingBottom = 2f;
    cell.PaddingTop = 0f;
    cell.BackgroundColor = color;
    cell.VerticalAlignment = PdfPCell.ALIGN_CENTER;
    return cell;
}

private static PdfPCell GetCellForBorderlessTable(Phrase phrase, int align)
{
    PdfPCell cell = new PdfPCell(phrase);
    cell.HorizontalAlignment = align;            
    cell.PaddingBottom = 2f;
    cell.PaddingTop = 0f;
    cell.BorderWidth = PdfPCell.NO_BORDER;
    cell.VerticalAlignment = PdfPCell.ALIGN_CENTER;
    return cell;
}

Затем их можно вызвать так:

Font timesRoman9Font = FontFactory.GetFont(FontFactory.TIMES_ROMAN, 9, BaseColor.BLACK);
Font timesRoman9BoldFont = FontFactory.GetFont(FontFactory.TIMES_BOLD, 9, BaseColor.BLACK);

Phrase phrasesec1Heading = new Phrase("Duckbills Unlimited", timesRoman9BoldFont);
PdfPCell cellSec1Heading = GetCellForBorderedTable(phrasesec1Heading, Element.ALIGN_LEFT, BaseColor.YELLOW);
tblHeadings.AddCell(cellSec1Heading);

Phrase phrasePoisonToe = new Phrase("Poison Toe Toxicity Level (Metric Richter Scale, adjusted for follicle hue)", timesRoman9Font);
PdfPCell cellPoisonToe = GetCellForBorderlessTable(phrasePoisonToe, Element.ALIGN_LEFT);
tblFirstRow.AddCell(cellPoisonToe);

Ответ 4

Возможно, это потому, что вы смешиваете разные способы добавления ячеек? Вы пытались явно создать объект ячейки, массируя его, но вы хотите добавить его для каждой ячейки?

Еще одна вещь, которую вы могли бы попробовать - установить вертикальное выравнивание, а также горизонтальное.

Ответ 5

Измените это:

pcell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT;

Для этого:

pcell.HorizontalAlignment = Element.ALIGN_RIGHT;