2016-09-26 9 views
5

सी # के लिए समाधान आप प्रश्न के संपादन-भाग में पा सकते हैं। ब्रूनो Lowagieसी # - itextSharp प्रत्येक पृष्ठ पर उप-योग

को विशेष धन्यवाद मैं सी # में iTextSharp के माध्यम से एक चालान बनाने के लिए कोशिश कर रहा हूँ। यह बहुत अच्छी तरह से काम करता है लेकिन मुझे हर पृष्ठ पर उप-योग मुद्रित करने का प्रयास करते समय समस्याएं मिलती हैं I

यहाँ उत्पादों के लिए तालिका बनाने के लिए उपयोग कर कोड im का एक हिस्सा है:

PdfPTable table = new PdfPTable(5); 
     table.WidthPercentage = 100; 
     float[] widths = new float[] { 10f, 30f, 120f, 30f, 30f }; 
     table.SetWidths(widths); 
     table.SkipLastFooter = true; 
     table.SpacingAfter = 10;      

     //Cells to Write Header & Footer 
     AddCell(table, "Pos.", PdfPCell.ALIGN_RIGHT, BORDER_LTB, 0); 
     AddCell(table, "Menge", PdfPCell.ALIGN_RIGHT, BORDER_TB); 
     AddCell(table, "Text", PdfPCell.ALIGN_LEFT, BORDER_TB); 
     AddCell(table, "Einzelpreis ", PdfPCell.ALIGN_RIGHT, BORDER_TB); 
     AddCell(table, "Summe", PdfPCell.ALIGN_RIGHT, BORDER_RTB); 

     AddCell(table, "SUBTOTAL", PdfPCell.ALIGN_LEFT, BORDER_LTB, 7, 4); 
     AddCell(table, "", PdfPCell.ALIGN_LEFT, BORDER_RTB); 

     table.HeaderRows = 2; 
     table.FooterRows = 1; 

     //Cells with positions of invoice 
     for (int i = 0; i < beleg.Einzel.Count; i++) 
     { 
      AddCell(table, beleg.Einzel[i].be_lfd_nr.ToString(), PdfPCell.ALIGN_LEFT, BORDER_LTB); 
      AddCell(table, beleg.Einzel[i].be_art_menge.ToString("N", _gbVars.NFI3D), PdfPCell.ALIGN_RIGHT, BORDER_TB); 
      AddCell(table, (beleg.Einzel[i].be_art_bez.ToString() + "\n" + beleg.Einzel[i].be_pos_text.ToString()).Trim(), PdfPCell.ALIGN_LEFT, BORDER_TB); 
      AddCell(table, beleg.Einzel[i].be_summe_preis.ToString("N", _gbVars.NFI2D), PdfPCell.ALIGN_RIGHT, BORDER_TB); 
      AddCell(table, beleg.Einzel[i].be_summe_netto.ToString("N", _gbVars.NFI2D), PdfPCell.ALIGN_RIGHT, BORDER_RTB); 
     } 

     table.SplitLate = false; 
     document.Add(table); 

Border_RTB और इतने पर मेरी बॉर्डर-शैलियाँ के लिए स्थिरांक हैं।

इस कोड उत्पन्न करता है एक मेज डायन इस तरह दिखता है:

+------------------------------------------+ 
| Pos | Menge | Text | Einzelpreis | Summe | 
+------------------------------------------+ 
| 1 | 2 | Text |  10.00 | 20.00 | 
+------------------------------------------+ 
| 2 | 1 | Text |  10.00 | 10.00 | 
+------------------------------------------+ 
| 3 | 4 | Text |  10.00 | 40.00 | 
+------------------------------------------+ 
| 4 | 2 | Text |  10.00 | 20.00 | 
+------------------------------------------+ 
|SUBTOTAL       |  | 
+------------------------------------------+ 

टेबल अगले पृष्ठ पर प्रवाह कर सकते हैं एक मैं पाद लेख पर हर पृष्ठ के उप-योग लिखने के लिए whant। घटना "ऑनएंडपेज" मेरी मदद नहीं करती है क्योंकि यह घटना पृष्ठ को तोड़ने वाली तालिका में "जानती" नहीं है।

क्या कोई मुझे बता सकता है कि मुझे प्रत्येक पृष्ठ पर उप-योग कैसे मिलता है? क्या कोई समाधान है कि मैं किसी पृष्ठ पर कुछ पीडीएफ-फाइल पर प्रिंट कैसे कर सकता हूं?

क्षमा करें अगर मेरा विवरण अच्छा नहीं है। मेरे अंग्रेजी के साथ समस्याएं हैं। : -/

संपादित करें:

यहाँ समाधान है। ब्रूनो के लिए विशेष धन्यवाद। उसने मुझे रास्ता दिखाया है। मेरे संस्करण में, सबटॉटल प्रत्येक पृष्ठ पर रीसेट नहीं होता है। मुझे लगता है कि यह समस्या के मेरे विवरण में एक गलतफहमी थी।

नई clases:

public class Totals 
    { 
     public double subtotal = 0; 
     public double total = 0; 
    } 


    public class SubTotalEvent : IPdfPCellEvent 
    { 
     Double price; 
     Totals totals; 
     bool printTotals = false;  //If we just whant to print out the Subtotal, this will be true. 
     bool CellWrittenOnce = false; //Bool to SUM price just once (if row flows to a second page) 

     public SubTotalEvent(Totals totals, double price) { 
      printTotals = false; 
      this.totals = totals; 
      this.price = price; 
     } 

     public SubTotalEvent(Totals totals) { 
      this.totals = totals; 
      printTotals = true; 
     } 

     public void CellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) { 
      if (printTotals) 
      { 
       PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS]; 
       ColumnText.ShowTextAligned(canvas, Element.ALIGN_LEFT, new Phrase(totals.subtotal.ToString()), position.GetLeft(0) + 2, position.GetBottom(0) + 2, 0); 
       return; 
      }  
      if (!CellWrittenOnce) { 
       totals.subtotal += price; 
       totals.total += price; 
      } 
      CellWrittenOnce = true; 
     } 
    } 

कोड तालिका बनाने के लिए:

PdfPTable table = new PdfPTable(5); 
     table.WidthPercentage = 100; 
     float[] widths = new float[] { 10f, 30f, 120f, 30f, 30f }; 
     table.SetWidths(widths); 
     table.SkipLastFooter = true; 
     table.SpacingAfter = 10;      

     AddCell(new PdfPCell(new Phrase("item"))); 
     AddCell(new PdfPCell(new Phrase("amount"))); 
     AddCell(new PdfPCell(new Phrase("text"))); 
     AddCell(new PdfPCell(new Phrase("price"))); 
     AddCell(new PdfPCell(new Phrase("sum"))); 

     Totals totals = new Totals(); 
     PdfPCell cel = new PdfPCell(new Phrase("Subtotal")); 
     cel.Colspan = 4; 
     table.AddCell(cel); 
     cel = new PdfPCell(); 
     cel.CellEvent = new SubTotalEvent(totals); 
     table.AddCell(cel); 


     table.HeaderRows = 2; 
     table.FooterRows = 1; 

     for (int i = 0; i < beleg.Einzel.Count; i++) 
     { 
      AddCell(new PdfPCell(new Phrase(i.toString()))); 
      AddCell(new PdfPCell(new Phrase("2"))); 
      AddCell(new PdfPCell(new Phrase("ItemText"))); 
      AddCell(new PdfPCell(new Phrase("10.00"))); 

      cell = new PdfPCell(new Phrase("20.00")); 
      cell.CellEvent = new SubTotalEvent(totals, 20.00); 
      table.AddCell(cell); 
     } 

     table.SplitLate = false; 
     document.Add(table); 
+2

आपको 'पीडीएफपीएजहेल्टरहेल्पर' कक्षा को लागू करने की आवश्यकता है। जब भी पृष्ठ बनाया जाता है तो आपका कार्यान्वयन निष्पादित होगा। इसे लागू करने के तरीके पर इस ट्यूटोरियल को देखें http://www.mazsoft.com/blog/post/2008/04/30/Code- नमूना-for-using-iTextSharp-PDF-library – Darren

+1

मैं 'PdfPageEventHelper' कक्षा को लागू करता हूं। लेकिन मैं सार्वजनिक ओवरराइड शून्य ऑनएंडपेज (पीडीएफवाइटर लेखक, दस्तावेज़ दस्तावेज़) में कहां से पता लगा सकता हूं, जहां मैं तालिका में हूं? तालिका इस बिंदु पर पहले से ही लिखी गई है। इस कार्यक्रम को 'दस्तावेज़' में जोड़ा जाता है। जोड़ें (तालिका); ' –

+0

कुछ समस्याएं आपकी समस्या के विवरण से तुरंत मुझे स्पष्ट नहीं हैं, इसलिए मुझे यकीन नहीं है कि मेरे पास अभी तक कोई जवाब है या नहीं। क्या निम्नलिखित धारणाएं सही हैं: 1. आपके चालान दस्तावेज़ में एक एकल, बड़ी तालिका होती है जो संभवतः एकाधिक पृष्ठों को फैल सकती है। 2. आपका चालान एक फॉर्म नहीं है, दस्तावेज़ बनाने के दौरान आपके पास सभी जानकारी तक पहुंच है। 3. आप वर्तमान पृष्ठ पर सभी उत्पादों के उप-योग को मुद्रित करना चाहते हैं + उस पृष्ठ के शीर्षलेख/पाद लेख में वर्तमान पृष्ठ तक उप-योगों का योग। –

उत्तर

1

कृपया SubTotal उदाहरण पर एक नज़र डालें।

class SubTotalEvent implements PdfPCellEvent { 

    Double price; 
    Totals totals; 

    public SubTotalEvent(Totals totals, double price) { 
     this.totals = totals; 
     this.price = price; 
    } 

    public SubTotalEvent(Totals totals) { 
     this.totals = totals; 
     price = null; 
    } 

    @Override 
    public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) { 
     if (price == null) { 
      PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS]; 
      ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, 
        new Phrase(String.valueOf(totals.subtotal)), 
        position.getLeft() + 2, position.getBottom() + 2, 0); 
      totals.subtotal = 0; 
      return; 
     } 
     totals.subtotal += price; 
     totals.total += price; 
    } 

} 

हम परिभाषित किया है:

class Totals { 
    double subtotal = 0; 
    double total = 0; 
} 

फिर हम PdfPCellEvent इंटरफ़ेस है कि हम स्तंभ 5 पर प्रयोग करेंगे लागू:

पहले हम उप-योग और कुल का ट्रैक रखने के एक वर्ग बनाने दो रचनाकार: एक सामान्य सेल के लिए एक मूल्य युक्त। एक उपरोक्त युक्त एक पाद लेख सेल के लिए (इस मामले में हम मूल्य नहीं पारित करते हैं)।

public void createPdf(String dest) throws IOException, DocumentException { 

    Totals totals = new Totals(); 

    Document document = new Document(); 
    PdfWriter.getInstance(document, new FileOutputStream(dest)); 
    document.open(); 
    PdfPTable table = new PdfPTable(5); 
    table.setWidths(new int[]{1, 1, 1, 3, 3}); 
    // header 
    table.addCell("Pos"); 
    table.addCell("Menge"); 
    table.addCell("Text"); 
    table.addCell("Einzerpreis"); 
    table.addCell("Summe"); 
    // footer 
    PdfPCell cell = new PdfPCell(new Phrase("Subtotal")); 
    cell.setColspan(4); 
    table.addCell(cell); 
    cell = new PdfPCell(); 
    cell.setCellEvent(new SubTotalEvent(totals)); 
    table.addCell(cell); 
    // definitions 
    table.setHeaderRows(2); 
    table.setFooterRows(1); 
    // table body 
    for(int r = 0; r < 50;){ 
     table.addCell(String.valueOf(++r)); 
     table.addCell("1"); 
     table.addCell("text"); 
     table.addCell("10.0"); 
     cell = new PdfPCell(new Phrase("10.0")); 
     cell.setCellEvent(new SubTotalEvent(totals, 10)); 
     table.addCell(cell); 
    } 
    document.add(table); 
    // extra footer 
    table = new PdfPTable(5); 
    table.setWidths(new int[]{1, 1, 1, 3, 3}); 
    cell = new PdfPCell(new Phrase("Grand total")); 
    cell.setColspan(4); 
    table.addCell(cell); 
    table.addCell(String.valueOf(totals.total)); 
    document.add(table); 
    document.close(); 
} 

परिणाम इस तरह दिखता है:

enter image description here

पहले पृष्ठ पर, हम 46 शरीर पंक्तियों प्रत्येक राशि के साथ एक आइटम के लिए

यह है कि हम कैसे इस सेल घटना का उपयोग करें कीमत 10।पाद लेख में, हमारे पास 460 का उप-योग है। दूसरे पृष्ठ पर, हमारे पास प्रत्येक आइटम की कीमत 10 के साथ 4 बॉडी पंक्तियां होती है। पाद लेख में, हमारे पास 40 का उप-योग होता है। हमने एक अतिरिक्त पाद लेख की नकल करने के लिए एक अतिरिक्त तालिका जोड़ा ग्रैंड कुल के लिए: 500.

+0

हम लगभग वहाँ हैं! बहुत बहुत धन्यवाद! एक समस्या बाकी थी: यदि, उदाहरण के लिए, पंक्ति 46 में एक बड़ी ऊंचाई होगी और दो पृष्ठों पर बहती है, तो पृष्ठ पर आपके उदाहरण में उप-योग सही होगा। लेकिन पेज दो पर यह 50 होगा, 40 नहीं। लेकिन मैंने इसे अतिरिक्त बूल-वेरिएबल के साथ तय किया। सभी पाठकों के लिए: ब्रूनो लोवागी से ऊपर दिया गया कोड जावा-कोड है। सी # के लिए आपको अनुवाद करना होगा। लेकिन यह बहुत अच्छी तरह से काम करता है! बहुत बढ़िया। :-) –