web-dev-qa-db-ja.com

PdfPCellでのテキストの右揃え

PDF請求書を生成するC#アプリケーションがあります。この請求書には、項目と価格の表があります。これは、PdfPTablePdfPCellsを使用して生成されます。

価格列を右揃えにしたいのですが、できません。テキストは常にセル内で左揃えになっています。

これが、テーブルを作成するための私のコードです。

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

誰か助けてもらえますか?

19
colincameron

私はiTextの元の開発者であり、あなたが経験している問題は私の book で説明されています。

テキストモードコンポジットモードを混合しています。

テキストモードでは、コンストラクターのパラメーターとしてPdfPCellを使用してPhraseを作成し、セルのレベルでの配置。ただし、複合モードで作業しています。このモードは、addElement()メソッドを使用するとすぐにトリガーされます。 コンポジットモードでは、セルのレベルで定義された配置は無視されます(これにより問題が説明されます)。代わりに、個別の要素の配置が使用されます。

あなたの問題を解決するには?

別の方法でセルにPhraseを追加して、テキストモードで作業します。または、コンポジットモードで作業し、アラインメントを定義するParagraphを使用します。

複合モードテキストモードよりも優れている点は、同じセルは異なる配置を持つことができますが、テキストモードでは1つの配置しか持てません。もう1つの利点は、テキストだけでなく、画像、リスト、テーブルなども追加できることです。テキストモードの利点は速度です:セルのコンテンツを処理するための処理時間が短縮されます。

23
Bruno Lowagie
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
user2660112

これが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);
2
B. Clay Shannon
cell.HorizontalAlignment = Element.ALIGN_RIGHT;
0
Carlos Ferreira