2012-11-28 26 views
15

Ho un'applicazione C# che genera una fattura PDF. In questa fattura è una tabella di articoli e prezzi. Questo viene generato utilizzando un PdfPTable e PdfPCell s.Testo di allineamento a destra in PdfPCell

Voglio essere in grado di allineare a destra la colonna del prezzo ma non riesco a essere in grado di - il testo esce sempre allineato a sinistra nella cella.

Ecco il mio codice per la creazione della tabella:

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

Qualcuno può aiutare?

+2

ho incontrato con lo stesso problema, e ha trovato nessuna soluzione praticabile per un oggetto 'Phrase'. Il meglio che posso suggerire è che si usi un 'Paragraph' invece di' Phrase' e ​​si imposta l'allineamento per il Paragrafo stesso. – Mihai

risposta

21

Sono lo sviluppatore originale di iText, e il problema si sta sperimentando è spiegato nel mio book.

Stai mescolando modalità testo e modalità composita.

In modalità testo, si crea il PdfPCell con un Phrase come parametro del costruttore, e si definisce l'allineamento a livello della cellula. Tuttavia, stai lavorando in modalità composita. Questa modalità viene attivata non appena si utilizza il metodo addElement(). Nella modalità composita , l'allineamento definito a livello della cella viene ignorato (il che spiega il problema). Invece, viene utilizzato l'allineamento degli elementi separati.

Come risolvere il tuo problema?

O lavorare nella modalità testo aggiungendo il proprio Phrase alla cella in un modo diverso. Oppure lavorare nella modalità composita e utilizzare uno Paragraph per il quale si definisce l'allineamento.

Il vantaggio di modalità composita sopra modalità testo è che i diversi paragrafi della stessa cella possono avere diversi allineamenti, che si può avere un solo allineamento nella modalità testo. Un altro vantaggio è che puoi aggiungere più di un semplice testo: puoi anche aggiungere immagini, elenchi, tabelle, ... Un vantaggio della modalità testo è la velocità: richiede meno tempo di elaborazione per gestire il contenuto di una cella.

+1

Grazie! Attraverso la giusta combinazione di paragrafi e celle, sono riuscito a farlo funzionare. Mi fa impazzire da mesi! – colincameron

+1

"In un modo diverso?" – quillbreaker

-6

Modifica questo:

pcell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT; 

A tal:

pcell.HorizontalAlignment = Element.ALIGN_RIGHT; 
+4

Entrambi hanno lo stesso valore, 2. È solo un numero. – Mihai

+4

Questa risposta non dovrebbe aver ricevuto il premio, poiché non è corretto. Come afferma @Mihai, entrambi hanno il valore 2, quindi non fa alcuna differenza. – colincameron

+0

Questa risposta è davvero sbagliata. Ho aggiunto la risposta corretta. –

-1

Forse è perché si stia mescolando i diversi modi per aggiungere le cellule? Hai provato a creare in modo esplicito un oggetto cella, massaggiandolo come vuoi, quindi aggiungendolo per ogni cella?

Un'altra cosa che si potrebbe provare è impostare l'allineamento verticale e orizzontale.

9
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; 
} 
+2

Sì, questa è una possibile soluzione. Vedi la mia risposta per una spiegazione più elaborata. –

+0

Eccellente - funziona perfettamente per me. –

2

Ecco il mio derivazione della risposta di user2660112 - un metodo per restituire una cella per l'inserimento in una tabella delimitato e lo sfondo di colore, e una simile, ma senza bordi/varietà incolore:

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

Questi possono poi essere chiamato in questo modo:

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