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 的原始开发者,您遇到的问题在我的书中进行了解释。

您正在混合text modecomposition mode

文本模式中,您PdfPCell使用 aPhrase作为构造函数的参数创建 ,并在单元格级别定义对齐方式。但是,您正在合成模式下工作。只要您使用该addElement()方法,就会触发此模式。在复合模式下,在单元格级别定义的对齐将被忽略(这解释了您的问题)。相反,使用了单独元素的对齐方式。

如何解决您的问题?

通过以不同的方式将您添加到单元格中,可以在文本模式下工作。Phrase或者在复合模式下工作并使用Paragraph您为其定义对齐方式的 a。

复合模式相对于文本模式的优势在于,同一单元格中的不同段落可以有不同的对齐方式,而在文本模式下只能有一种对齐方式。另一个优点是您可以添加的不仅仅是文本:您还可以添加图像、列表、表格……文本模式的一个优点是速度:处理单元格内容所需的处理时间更少。

于 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 答案的推导 - 一种返回单元格以插入带边框和背景色的表格的方法,以及类似但无边框/无色的品种:

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 回答
0

我最终在这里搜索了 PdfPCell 中的 java 右对齐文本。因此,如果您使用的是 java,请使用给定的代码段来实现正确的对齐。

private PdfPCell getParagraphWithRightAlignCell(Paragraph paragraph) {

 PdfPCell cell = new PdfPCell(paragraph);
 cell.setBorderColor( BaseColor.WHITE);
 cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
 return cell;

}   

getParagraphWithRightAlignCell 通过paragraph
谢谢_

于 2021-02-07T19:10:19.350 回答
-1

也许是因为你混合了不同的方式来添加细胞?您是否尝试过显式创建一个单元格对象,根据需要对其进行按摩,然后为每个单元格添加它?

您可以尝试的另一件事是设置垂直对齐和水平对齐。

于 2013-06-18T19:22:12.417 回答
-1
cell.HorizontalAlignment = Element.ALIGN_RIGHT;
于 2020-03-05T23:08:17.857 回答