2012-11-28 21 views
15

में सही संरेखित पाठ मेरे पास एक सी # एप्लिकेशन है जो पीडीएफ चालान उत्पन्न करता है। इस चालान में वस्तुओं और कीमतों की एक सारणी है। यह PdfPTable और PdfPCell एस का उपयोग करके उत्पन्न होता है।पीडीएफपीसेल

मैं मूल्य कॉलम को सही-संरेखित करने में सक्षम होना चाहता हूं लेकिन मैं ऐसा करने में सक्षम नहीं हूं - पाठ हमेशा सेल में बाएं-गठबंधन से बाहर आता है।

यहाँ तालिका बनाने के लिए मेरे कोड है:

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

किसी को भी मदद कर सकते हैं?

+2

मुझे एक ही समस्या से मुलाकात हुई है, और 'वाक्यांश' ऑब्जेक्ट के लिए कोई व्यावहारिक समाधान नहीं मिला है। सबसे अच्छा मैं सुझाव दे सकता हूं कि आप 'वाक्यांश' के बजाय 'पैराग्राफ' का उपयोग करते हैं और पैराग्राफ के लिए संरेखण सेट करते हैं। – Mihai

उत्तर

21

मैं iText के मूल निर्माता हूँ, और अपनी समस्या मेरी book से समझाया गया है।

आप टेक्स्ट मोड और समग्र मोड मिश्रण कर रहे हैं।

पाठ मोड में, आप निर्माता के पैरामीटर के रूप में एक Phrase साथ PdfPCell बनाते हैं, और आप सेल के स्तर पर संरेखण परिभाषित करते हैं। हालांकि, आप समग्र मोड में काम कर रहे हैं। जैसे ही आप addElement() विधि का उपयोग करते हैं, यह मोड ट्रिगर होता है। समग्र मोड में, सेल के स्तर पर परिभाषित संरेखण को अनदेखा किया जाता है (जो आपकी समस्या बताता है)। इसके बजाय, अलग-अलग तत्वों के संरेखण का उपयोग किया जाता है।

अपनी समस्या का समाधान कैसे करें?

या तो टेक्स्ट मोड में अपने Phrase को अलग-अलग तरीके से जोड़कर काम करें। या समग्र मोड में काम करें और Paragraph का उपयोग करें जिसके लिए आप संरेखण को परिभाषित करते हैं।

समग्र मोडसे अधिक पाठ मोड का लाभ एक ही सेल में अलग पैराग्राफ अलग संरेखण हो सकता है, जबकि आप केवल पाठ मोड में एक संरेखण हो सकता है। एक और फायदा यह है कि आप केवल टेक्स्ट से अधिक जोड़ सकते हैं: आप छवियों, सूचियों, तालिकाओं, ... को भी जोड़ सकते हैं ... टेक्स्ट मोड का एक लाभ गति है: सेल की सामग्री से निपटने में कम प्रोसेसिंग समय लगता है।

+1

धन्यवाद! अनुच्छेदों और कोशिकाओं के सही संयोजन के माध्यम से, मैंने यह काम करने में कामयाब रहा है। यह महीनों के लिए मुझे पागल कर रहा है! – colincameron

+1

"एक अलग तरीके से?" – quillbreaker

-6

बदलें इस:

pcell.HorizontalAlignment = PdfPCell.ALIGN_RIGHT; 
इस के लिए

:

pcell.HorizontalAlignment = Element.ALIGN_RIGHT; 
+4

दोनों के पास एक ही मूल्य है, 2. यह सिर्फ एक संख्या है। – Mihai

+4

इस उत्तर को बक्षीस प्राप्त नहीं होना चाहिए था, क्योंकि यह गलत है। @ मिहाई राज्यों के रूप में, इन दोनों के पास मूल्य 2 है, इसलिए इससे कोई फर्क नहीं पड़ता। – colincameron

+0

यह उत्तर वास्तव में गलत है। मैंने सही जवाब जोड़ा है। –

-1

शायद इसकी वजह से आप कोशिकाओं को जोड़ने के लिए अलग अलग तरीकों से मिश्रण कर रहे हैं? क्या आपने स्पष्ट रूप से एक सेल ऑब्जेक्ट बनाने की कोशिश की है, इसे मालिश करना है, फिर भी आप इसे हर सेल के लिए जोड़ना चाहते हैं?

एक और चीज जिसे आप कोशिश कर सकते हैं लंबवत संरेखण के साथ-साथ क्षैतिज सेट कर रहा है।

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

हां, यह एक संभावित समाधान है। अधिक विस्तृत स्पष्टीकरण के लिए मेरा उत्तर देखें। –

+0

उत्कृष्ट - मेरे लिए सही काम करता है। –

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