20

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

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

テーブルを作成するための私のコードは次のとおりです。

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

誰でも助けることができますか?

4

6 に答える 6

25

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

テキスト モード複合モードを混在させています。

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

あなたの問題を解決する方法?

別の方法でセルに追加することにより、テキストモードで動作します。Phraseまたは、複合モードParagraphで作業し、配置を定義する を使用します。

テキスト モードに対する複合モードの利点は、同じセル内の異なる段落が異なる配置を持つことができるのに対し、テキスト モードでは配置が 1 つしかないことです。もう 1 つの利点は、テキストだけでなく、画像、リスト、表なども追加できることです。テキスト モードの利点は速度です。セルの内容を処理するための処理時間が短くなります。

于 2013-09-12T10:30:53.513 に答える
11
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;
}
于 2013-09-12T10:18:10.887 に答える
2

これが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);
于 2015-04-17T17:49:52.683 に答える
-1

おそらく、セルを追加するさまざまな方法を混在させているためでしょうか? セルオブジェクトを明示的に作成して、好きなようにマッサージしてから、すべてのセルに追加しようとしましたか?

あなたが試すことができるもう一つのことは、水平方向だけでなく垂直方向の配置を設定することです.

于 2013-06-18T19:22:12.417 に答える