2009-09-01 6 views
12

मुझे एक समस्या है जहां मेरे पास एक टेबल (पीडीएफपीटेबल) है जो पृष्ठ की लंबाई से अधिक हो सकती है। मैंने एक टेबल को एक से अधिक पृष्ठों पर "विभाजित" करने का प्रयास करने की कोशिश की है, लेकिन iTextSharp इस क्षेत्र में बहुत खराब तरीके से प्रलेखित है। क्या किसी को पता है कि पृष्ठ पर मनमाने ढंग से वाई स्थिति चुनने के बिना इसे कैसे करना है और अगर यह वहां है तो इसे विभाजित करने के लिए कह रहा है?iTextSharp: स्प्लिटलेट/स्प्लिटरोज़?

मैंने SplitLate और SplitRows गुणों में देखा, लेकिन इन्हें क्या करने पर कोई दस्तावेज नहीं है। संपादित करें वे कुछ भी नहीं करते हैं।

धन्यवाद!

संपादित

मैं आधे में तालिका में कटौती करने के widthwise तालिका के रूप में हमेशा पृष्ठ की चौड़ाई फिट होगा देख रहा हूँ। यह कहना है कि मैं उन पंक्तियों को चाहता हूं जो इसके नीचे के अगले पृष्ठ तक विस्तारित करने के लिए लंबवत रूप से फिट न हों।

Public Sub BuildPrintableDocument 
    Dim doc As New Document(PageSize.LETTER, 0, 0, 0, BOTTOM_MARGIN) 
    Dim writer As PdfWriter = PdfWriter.GetInstance(doc, _ 
     New FileStream("invoice.pdf", FileMode.Create) 

    Dim footer As New HeaderFooter(New Phrase("www.columbussupply.com", _ 
     footerFont), False) 
    footer.Border = Rectangle.NO_BORDER 
    footer.Alignment = HeaderFooter.ALIGN_CENTER 
    doc.Footer = footer 

    doc.Open() 

.... 

Dim items As PdfPTable = NewItemTable() 
Dim count As Integer = 0 
    For Each oi As OrderItem In TheInvoice.Items 
     If oi.Status <> OrderItem.OrderItemStatus.Cancelled Then 
      Dim qty As New PdfPCell(New Phrase(oi.Quantity, mainFont)) 
      qty.HorizontalAlignment = Element.ALIGN_CENTER 
      qty.Padding = ITEMS_PADDING 

      '...instantiate 3 other cells here (removed for repetitiveness)' 

      items.AddCell(qty) 
      items.AddCell(desc) 
      items.AddCell(price) 
      items.AddCell(total) 
     End If 
    Next 

    items.WriteSelectedRows(0, -1, LEFT_MARGIN, GetItemsStartY, _ 
     writer.DirectContent) 
End Sub 


Protected Function NewItemTable() As PdfPTable 
    Dim items As PdfPTable = New PdfPTable(4) 
    Dim headers() As String = {"QTY", "DESCRIPTION", "PRICE", "TOTAL"} 

    For Each s As String In headers 
     Dim cell As New PdfPCell(New Phrase(s, mainFont)) 
     cell.HorizontalAlignment = Element.ALIGN_CENTER 
     items.AddCell(cell) 
    Next 

    items.TotalWidth = ITEMS_TOTAL_WIDTH 
    items.SetWidths(New Single() {QTY_COL_WIDTH, DESC_COL_WIDTH, _ 
     PRICE_COL_WIDTH, TOTALS_COL_WIDTH}) 
    Return items 
End Function 

उत्तर

3

जब मैं iTextSharp में तालिकाओं के साथ काम कर रहा था, मैं इस संसाधन उपयोगी पाया:

iTextSharp Tutorial - Chapter 5: Tables

अनुभाग हकदार देखें

EDIT2

यहाँ कुछ कोड है 'बड़ी टेबल'। ट्यूटोरियल में एक नमूना शामिल है; मुझे उम्मीद है कि आपने इसे पहले नहीं देखा है।

मुझे पृष्ठों में एक समस्या होने पर विभाजन तालिका याद नहीं है। हालांकि मुझे एक समस्या थी, हालांकि मैं पृष्ठों को फैलाने में सक्षम होने के लिए अलग-अलग पंक्तियां चाहता था। इसके लिए, मैंने को PdfPTable की संपत्ति को गलत पर सेट किया है।

संपादित करें
मैंने आपके कोड की जांच की और इसकी तुलना मेरी तुलना में की। मैंने देखा कि बड़ा अंतर यह था कि मैं PdfPTable.WriteSelectedRows() विधि का उपयोग कर अपने Document पर अपना PdfPTable जोड़ नहीं रहा हूं। इसके बजाय मैं Document की Add() विधि को कॉल करता हूं, जो सभी 0 सेटों के साथ मेरे PdfPTable में गुज़रता है। (बीटीडब्ल्यू हम अपने PdfPCells को इसी तरह से लोड करते हैं।) मुझे आश्चर्य है कि PdfPTableDocument पर WriteSelectedRows() के माध्यम से आपकी समस्या का कारण बन रहा है।

यदि आप HeaderFooter नहीं जोड़ते हैं तो आप यह भी देख सकते हैं कि आपका कोड काम करता है या नहीं।

+0

क्या इस प्रक्रिया में आपको कुछ विशेष स्थान रखना है? जैसा कि आप पंक्तियों को लिखने के बाद, पहले, कहां? – Jason

+0

क्षमा करें जेसन, मैंने आपके प्रश्न को गलत समझा। मैंने अपने रिजॉन्स को संपादित किया जो मुझे आशा है कि मदद करता है। –

+0

संपादन के लिए धन्यवाद ... हाँ, मैं उस ट्यूटोरियल 100x के माध्यम से रहा हूं और इसका कोई फायदा नहीं हुआ है। वह अध्याय सरल तालिकाओं का उपयोग करने के बारे में बात करता है, और मुझे पीडीएफपीटेबल का उपयोग करने की आवश्यकता है ताकि मैं इसे पूरी तरह से स्थापित कर सकूं। अभी टेबल जो मैंने अभी पेज के किनारे से सीधे चलाया है, जो बेकार है ....: \ – Jason

29

यदि आप पृष्ठों पर पंक्तियों के स्वचालित विभाजन चाहते हैं तो आपको Document.Add() का उपयोग करके दस्तावेज़ में तालिका जोड़नी चाहिए। फिर SplitLate और SplitRows अपेक्षित कार्य करेगा।

  1. SplitLate = true (डिफ़ॉल्ट) तालिका अगली पंक्ति उस पृष्ठ पर फिट करता है से पहले विभाजित किया जाएगा।
  2. SplitLate = false पंक्ति जो पृष्ठ पर पूरी तरह फिट नहीं है विभाजित किया जाएगा।
  3. जब SplitRows = true (डिफ़ॉल्ट) पंक्ति जो किसी पृष्ठ पर फिट नहीं होती है तो विभाजित हो जाएगी।
  4. जब SplitRows = false पंक्ति छोड़ी जाएगी।

तो

  • SplitLate && SplitRows: एक पंक्ति उस पृष्ठ पर फिट नहीं करता है अगले पृष्ठ पर शुरू कर दिया जाएगा और अंत में विभाजित करता है, तो यह उस पृष्ठ पर या तो फिट नहीं करता है।

  • SplitLate && !SplitRows: पृष्ठ पर फिट नहीं होने वाली एक पंक्ति अगले पृष्ठ पर शुरू की जाएगी और यदि यह उस पृष्ठ पर फिट नहीं है तो छोड़ा जाएगा।

  • !SplitLate && SplitRows: पृष्ठ पर फिट नहीं होने वाली एक पंक्ति को विभाजित किया जाएगा और अगले पृष्ठ पर जारी रखा जाएगा और अगले पृष्ठ के लिए भी बहुत बड़ा होगा।

  • !SplitLate && !SplitRows: मैं इस बारे में थोड़ा अनिश्चित हूं। लेकिन सूत्रों से ऐसा लगता है कि यह स्प्लिटलेट & & जैसा ही है! स्प्लिटरो: पृष्ठ पर फिट नहीं होने वाली एक पंक्ति अगले पृष्ठ पर शुरू की जाएगी और यदि यह उस पृष्ठ पर फिट नहीं है तो छोड़ा जाएगा।

लेकिन अपने प्रश्न के लिए के रूप में: Document.Add() केवल प्रयोग करने योग्य हो जाएगा तालिका बिल्कुल तैनात करने की जरूरत नहीं है, तो। लेकिन ऐसा लगता है कि ऐसा करने का कोई तरीका है हालांकि तालिका को ColumnText पर जोड़कर (यह वास्तव में ColumnText ऑब्जेक्ट है जो सभी तालिका विभाजन करता है) और फिर ColumnText को पूरी तरह से पोजिशन कर रहा है। मैंने अभी तक इसे नहीं देखा है, लेकिन जैसे ही मुझे थोड़ा और समय मिल जाएगा :)

+0

हां। यह किया जा सकता है। स्रोतों में पीडीएफ डॉक्यूमेंट क्लास की AddPTable() विधि देखें। उम्मीद है की वो मदद करदे। इस उत्तर के लिए – asgerhallas

+0

धन्यवाद लेकिन मुझे अपनी टेबल को पूरी तरह से स्थापित करने की आवश्यकता है। और जैसा कि मैंने @jay riggs 'उत्तर के लिए अपनी आखिरी टिप्पणी में कहा है, अगर मैं किसी विशिष्ट संख्या पर उत्पादों की संख्या में कटौती नहीं करता हूं, तो मैं अपनी गणना तालिका को दो पृष्ठों पर विभाजित करने का जोखिम चलाता हूं। तो ... हाँ, वैसे भी धन्यवाद :) – Jason

+0

आपका अधिकार। मैं अब तक आपकी आखिरी टिप्पणी को समझ नहीं पाया :) ... लेकिन पूर्ण स्थिति के लिए, यह किया जा सकता है, केवल कॉलमटेक्स्ट का उपयोग करके दस्तावेज़ में पीडीएफपीटेबल जोड़ा गया है - जो आपको सभी स्वचालित टेबल देगा विभाजन और पूर्ण स्थिति। लेकिन अगर आपको जरूरत नहीं है, तो ... इसे सरल रखें :) – asgerhallas