Alignement droit du texte dans PdfPCell

j'ai une application C# qui génère une facture PDF. Dans cette facture est un tableau d'objets et de prix. Ceci est généré en utilisant un PdfPTable et PdfPCell.

je veux pouvoir aligner à droite la colonne des prix mais je ne peux pas le faire-le texte est toujours aligné à gauche dans la cellule.

Voici mon code pour créer la table:

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

quelqu'un Peut-il aider?

17
demandé sur colincameron 2012-11-28 18:56:27

4 réponses

je suis le développeur original d'iText, et le problème que vous rencontrez est expliqué dans mon livre.

Vous êtes de mélange texte et mode composite.

texte, vous créez le PdfPCell avec un Phrase comme paramètre du constructeur, et que vous définissez l'alignement au niveau de la cellule. Cependant, vous travaillez dans mode composite. Ce mode est déclenché dès que vous utilisez le addElement() méthode. mode composite, l'alignement défini au niveau de la cellule est ignoré (ce qui explique votre problème). Au lieu de cela, l'alignement des éléments séparés est utilisé.

comment résoudre votre problème?

travail texte en ajoutant votre Phrase à la cellule d'une manière différente. Ou de travailler dans mode composite et un Paragraph pour lequel vous définissez l'alignement.

le l'avantage de mode compositetexte est que des paragraphes différents dans une même cellule peuvent avoir des alignements différents, alors que vous ne pouvez avoir qu'un alignement dans texte. Un autre avantage est que vous pouvez ajouter plus que du texte: vous pouvez aussi ajouter des images, des listes, des tables,... Un avantage de l' texte est la vitesse: il faut moins de temps de traitement pour traiter le contenu d'une cellule.

22
répondu Bruno Lowagie 2014-12-01 10:53:42
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;
}
10
répondu 2013-09-12 10:18:10
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;
}

ceux-ci peuvent ensuite être appelé de la sorte:

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);
2
répondu B. Clay Shannon 2015-04-17 18:26:09

peut-être est-ce parce que vous mélangez les différentes façons d'ajouter les cellules? Avez-vous essayé de créer explicitement un objet cellulaire, en le massant comme vous le souhaitez puis en l'ajoutant pour chaque cellule?

une autre chose que vous pouvez essayer est de définir l'alignement vertical ainsi que l'horizontale.

-1
répondu aledford 2013-06-18 19:22:12