PDF請求書を生成するC#アプリケーションがあります。この請求書には、項目と価格の表があります。これは、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);
}
}
誰か助けてもらえますか?
私はiTextの元の開発者であり、あなたが経験している問題は私の book で説明されています。
テキストモードとコンポジットモードを混合しています。
テキストモードでは、コンストラクターのパラメーターとしてPdfPCell
を使用してPhrase
を作成し、セルのレベルでの配置。ただし、複合モードで作業しています。このモードは、addElement()
メソッドを使用するとすぐにトリガーされます。 コンポジットモードでは、セルのレベルで定義された配置は無視されます(これにより問題が説明されます)。代わりに、個別の要素の配置が使用されます。
あなたの問題を解決するには?
別の方法でセルにPhrase
を追加して、テキストモードで作業します。または、コンポジットモードで作業し、アラインメントを定義するParagraph
を使用します。
複合モードがテキストモードよりも優れている点は、同じセルは異なる配置を持つことができますが、テキストモードでは1つの配置しか持てません。もう1つの利点は、テキストだけでなく、画像、リスト、テーブルなども追加できることです。テキストモードの利点は速度です:セルのコンテンツを処理するための処理時間が短縮されます。
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;
}
これがuser2660112の答えの私の派生です-ボーダーと背景色のテーブルに挿入するためにセルを返す1つの方法、そして似ていますがボーダーレス/無色の種類:
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);
cell.HorizontalAlignment = Element.ALIGN_RIGHT;