2012-11-28 14 views
15

Tôi có một ứng dụng C# tạo hóa đơn PDF. Trong hóa đơn này là một bảng các mặt hàng và giá cả. Điều này được tạo bằng cách sử dụng các số PdfPTablePdfPCell s.Căn chỉnh văn bản phù hợp trong PdfPCell

Tôi muốn có thể căn chỉnh đúng cột giá nhưng tôi dường như không thể - văn bản luôn xuất hiện căn trái trong ô.

Dưới đây là mã của tôi để tạo bảng:

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

bất cứ ai có thể giúp đỡ?

+2

Tôi đã gặp vấn đề tương tự và không tìm thấy giải pháp khả thi cho đối tượng 'Cụm từ '. Điều tốt nhất tôi có thể đề nghị là bạn sử dụng một 'Đoạn' thay vì' Cụm từ 'và đặt căn chỉnh cho chính Đoạn đó. – Mihai

Trả lời

21

Tôi là nhà phát triển ban đầu của iText và sự cố bạn đang gặp phải được giải thích trong số book của tôi.

Bạn đang trộn chế độ văn bảnchế độ tổng hợp.

Trong chế độ văn bản, bạn tạo PdfPCell với một Phrase như các tham số của các nhà xây dựng, và bạn xác định sự liên kết ở cấp độ tế bào. Tuy nhiên, bạn đang làm việc ở chế độ tổng hợp. Chế độ này được kích hoạt ngay sau khi bạn sử dụng phương thức addElement(). Trong chế độ tổng hợp, căn chỉnh được xác định ở cấp ô được bỏ qua (điều này giải thích vấn đề của bạn). Thay vào đó, việc căn chỉnh các phần tử riêng biệt được sử dụng.

Cách giải quyết sự cố của bạn?

Hoặc làm việc ở chế độ văn bản bằng cách thêm Phrase vào ô theo cách khác. Hoặc làm việc ở chế độ tổng hợp và sử dụng Paragraph mà bạn xác định căn chỉnh.

Ưu điểm của chế độ hỗn qua chế độ văn bản là đoạn khác nhau trong cùng một tế bào có thể có sự sắp xếp khác nhau, trong khi bạn chỉ có thể có một sự liên kết trong chế độ văn bản . Một ưu điểm khác là bạn có thể thêm nhiều hơn chỉ là văn bản: bạn cũng có thể thêm hình ảnh, danh sách, bảng, ... Lợi thế của chế độ văn bản là tốc độ: mất ít thời gian xử lý hơn để xử lý nội dung của ô.

+1

Cảm ơn bạn! Thông qua sự kết hợp đúng đắn giữa các đoạn văn và các ô, tôi đã xoay xở để làm việc này. Nó đã khiến tôi phát điên trong nhiều tháng! – colincameron

+1

"Theo cách khác?" – quillbreaker

-6

Thay đổi này:

pcell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT; 

Để này:

pcell.HorizontalAlignment = Element.ALIGN_RIGHT; 
+4

Cả hai đều có cùng giá trị, 2. Nó chỉ là một số. – Mihai

+4

Câu trả lời này không được nhận tiền thưởng vì nó không chính xác. Như tiểu bang @Mihai, cả hai đều có giá trị 2, do đó, điều này không có sự khác biệt. – colincameron

+0

Câu trả lời này thực sự là sai. Tôi đã thêm câu trả lời đúng. –

-1

lẽ của nó bởi vì bạn đang trộn những cách khác nhau để thêm các tế bào? Bạn đã thử một cách rõ ràng tạo ra một đối tượng di động, xoa bóp nó tuy nhiên bạn muốn sau đó thêm nó cho mỗi tế bào?

Một điều khác bạn có thể thử là đặt căn chỉnh theo chiều dọc cũng như chiều ngang.

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

Vâng, đó là một giải pháp khả thi. Xem câu trả lời của tôi cho một lời giải thích phức tạp hơn. –

+0

Tuyệt vời - công trình hoàn hảo cho tôi. –

2

Đây là nguồn gốc của tôi về câu trả lời user2660112 của - một phương pháp để trả lại một tế bào để chèn vào một bảng giáp và nền màu, và tương tự, nhưng không biên giới/nhiều màu:

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

Những sau đó có thể được gọi là như vậy:

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); 
Các vấn đề liên quan