Rozwiązanie dla języka C#, które można znaleźć w części Edycja pytania. Specjalne podziękowania dla Bruno LowagieC# - itextSharp subtotal na każdej stronie
Próbuję utworzyć fakturę za pośrednictwem iTextSharp w języku C#. Działa bardzo dobrze, ale napotyka problemy, gdy próbuję wydrukować podsumowanie na każdej stronie.
Oto częścią im kodu używanego do tworzenia tabeli w odniesieniu do produktów:
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 i tak dalej są stałe dla moich border-style.
Ten kod generuje czarownicą tabela wygląda następująco:
+------------------------------------------+
| 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 | |
+------------------------------------------+
tabela może płynąć do następnej strony an i whant napisać podsumę każdej strony w stopce. Wydarzenie "OnEndPage" nie pomaga mi, ponieważ to wydarzenie nie "wie", gdzie w tabeli strona jest zepsuta.
Czy ktoś może mi powiedzieć, w jaki sposób otrzymuję podsumowanie na każdej stronie? Czy istnieje jakieś rozwiązanie, w jaki sposób mogę podsumować coś na stronie i wydrukować je w pliku pdf?
Przepraszam, jeśli mój opis nie jest tak dobry. Problemy z moim angielskim. : -/
EDIT:
Oto rozwiązanie. Specjalne podziękowania dla Bruno. Pokazał mi drogę. W mojej wersji suma częściowa NIE resetuje się na każdej stronie. Sądzę, że to był błąd w moim opisie problemu.
Nowe 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;
}
}
Code Aby utworzyć tabelę:
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);
Musisz zaimplementować klasę 'PdfPageEventHelper'. Twoja implementacja byłaby wykonywana za każdym razem, gdy strona zostanie utworzona. Zobacz ten samouczek, jak go zaimplementować http://www.mazsoft.com/blog/post/2008/04/30/Code-sample-for-using-iTextSharp-PDF-library – Darren
Implementuję klasę 'PdfPageEventHelper'. Ale jak mogę dowiedzieć się w "publicznych zastąpić nieważne OnEndPage (pisarz PdfWriter, Dokument doc)", gdzie jestem w tabeli? Tabela jest już napisana w tym miejscu. To wydarzenie jest wywoływane w 'document.Add (table);' –
Niektóre rzeczy nie są dla mnie natychmiast jasne z opisu problemu, więc nie jestem pewien, czy mam jeszcze odpowiedź. Czy następujące założenia są prawidłowe: 1. Dokument faktury składa się z pojedynczej, dużej tabeli, która może obejmować wiele stron. 2. Twoja faktura nie jest formularzem, masz dostęp do wszystkich informacji podczas generowania dokumentu. 3. Chcesz wydrukować sumę częściową składającą się ze wszystkich produktów na bieżącej stronie + sumę sum pośrednich do bieżącej strony w nagłówku/stopce tej strony. –