Rechnung mit itextsharp drucken

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    Rechnung mit itextsharp drucken

    Hi,
    ich habe ein kleines Kassenprogramm. Tabellen: Verkäufer, Artikel. Artikel ist der Verkäufer untergeordnet.
    Ich möchte nun mit itextsharp eine Abrechnung für jeden Verkäufer drucken in der die verkauften Artikel aufgeführt sind.
    Ich habe einige Beispiele zu itextsharp durchgelesen aber ich glaub ich bin zu blöd dafür.
    Hat irgendjemand ein einfaches Tutorial wie ich die Einträge aus der Verkäufertabelle nebst dazugehörigen artikeln als PDF speichern kann?
    Danke Euch
    Grüße
    Micha
    "Hier könnte Ihre Werbung stehen..."
    Ich habe mich auch mal daran versucht, bin leider aber auch gescheitert.
    Die Doku kennst du? Vielleicht kannst du damit ja etwas anfangen.
    afterlogic.com/mailbee-net/docs-itextsharp/
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    @Akanel Danke Dir, das hab ich tatsächlich noch nicht gefunden....
    @Dksksm Danke Dir auch, das Tut hatte ich als erstes durch.
    funktioniert bei einer einfachen Datatable auch hervorragend.
    Nur ich bin zu blöd um das auf meine Anforderung umzubauen. ABER... ich bin auf nem Guten Weg, bin soweit das der Kopf und Fuß fertig sind und die Artikel des Verkäufers im Rumpf angezeigt werden, jetzt muss ich nur noch die Spalten filtern, eigen Spaltennamen vergeben und ne summe unten drunter bilden....
    Ich filtere erstmal die Spalten und melde mich dann wieder mit dem Code den ich bisher habe

    Danke Euch beiden...
    "Hier könnte Ihre Werbung stehen..."
    @Dksksm genauso hab ich es jetzt auch gemacht... bin leider unterwegs, reiche den Code aber nach.
    Mir fehlt jetzt nur noch die Zwischensumme, der Rabatt und die Gesamtsumme. Aber das krieg ich noch hin.
    "Hier könnte Ihre Werbung stehen..."
    Hi,
    so, bin ein großes Stück weiter.
    Dokument wird erstellt und sieht vorerst ganz gut aus.
    Problem habe ich noch, das eine Spalte in der ersten Tabelle Decimals aufweist, und die String.Format() nicht die Kommastellen mit nimmt.

    Hier mal die Codes dazu:
    Die Tabelle selektieren und eine neue befüllen (es werden nur 3 Spalten benötigt:

    C#-Quellcode

    1. public DataTable GetSellerArticleSold(int sellerID)
    2. {
    3. var query = from article in this
    4. where article.SellerID == sellerID && article.Sold == true
    5. select article;
    6. string[] cols = { "ArticleNo", "Matchcode", "Price" };
    7. DataTable dt = new DataView(query.CopyToDataTable()).ToTable(true, cols);
    8. dt.Columns[0].ColumnName = "Artikelnummer";
    9. dt.Columns[1].ColumnName = "Bezeichnung";
    10. dt.Columns[2].ColumnName = "Preis";
    11. return dt;
    12. }


    Die Verkäufertabelle durchgehen und für jeden Verkäufer eine Rechnung erstellen:

    C#-Quellcode

    1. private void btnExportTurnOver_Click(object sender, EventArgs e)
    2. {
    3. foreach (var item in dsCore.Seller)
    4. {
    5. ExportTurnOverPDF(dsCore.Article.GetSellerArticleSold(item.SellerID), @"Abrechnung\" + item.SellerNo + "_" + item.Name + ".pdf", item.Name, item.SellerNo.ToString(),item.TurnOver);
    6. }
    7. }


    Die PDF Methode:

    C#-Quellcode

    1. private void ExportTurnOverPDF(DataTable dt, String path, string sellerName, string sellerNo, decimal turnover)
    2. {
    3. Paragraph sep = new Paragraph(new Chunk(new iTextSharp.text.pdf.draw.LineSeparator(0.0F, 100.0F, BaseColor.BLACK, Element.ALIGN_LEFT, 1)));
    4. BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
    5. Chunk lBreak = new Chunk("\n");
    6. FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None);
    7. Document doc = new Document();
    8. doc.SetPageSize(PageSize.A4);
    9. PdfWriter prw = PdfWriter.GetInstance(doc, fs);
    10. doc.Open();
    11. //Kopfzeile
    12. Paragraph prgHeading = new Paragraph();
    13. Font fntHead = new Font(baseFont, 20, 1, BaseColor.GREEN);
    14. prgHeading.Alignment = Element.ALIGN_CENTER;
    15. prgHeading.Add(new Chunk("Abrechnung", fntHead));
    16. doc.Add(prgHeading);
    17. doc.Add(sep);
    18. //Kopfzeile 2 für Verkäufername und Nummer
    19. Paragraph prgAuthor = new Paragraph();
    20. Font fntAuthor = new Font(baseFont, 12, 1, BaseColor.BLUE);
    21. prgAuthor.Alignment = Element.ALIGN_CENTER;
    22. prgAuthor.Add(new Chunk($"Verkäufer: {sellerName} - ", fntAuthor));
    23. prgAuthor.Add(new Chunk($"VerkäuferNr.: {sellerNo}", fntAuthor));
    24. doc.Add(prgAuthor);
    25. doc.Add(sep);
    26. doc.Add(lBreak);
    27. //Tabelle definieren, Schriftart für Tabellenüberschrift
    28. PdfPTable pdfTbl = new PdfPTable(dt.Columns.Count);
    29. Font fntColHeader = new Font(baseFont, 10, 1, BaseColor.WHITE);
    30. //Tabelle befüllen
    31. foreach (DataColumn col in dt.Columns)
    32. {
    33. PdfPCell pdfCell = new PdfPCell();
    34. pdfCell.BackgroundColor = BaseColor.LIGHT_GRAY;
    35. pdfCell.Phrase = new Phrase(col.ColumnName, fntColHeader);
    36. pdfTbl.AddCell(pdfCell);
    37. }
    38. foreach (DataRow row in dt.Rows)
    39. {
    40. foreach (DataColumn col in dt.Columns)
    41. {
    42. if(col.ColumnName == "Preis")
    43. {
    44. //hier nimmt er zwar das € mit, aber die 2 Nachkommastellen ignoriert er
    45. pdfTbl.AddCell(new Phrase(String.Format("{0:C2} €",row[col.ColumnName].ToString())));
    46. }else
    47. {
    48. pdfTbl.AddCell(new Phrase(row[col.ColumnName].ToString()));
    49. }
    50. }
    51. }
    52. //Tabelle dem Dokument hinzufügen
    53. doc.Add(pdfTbl);
    54. doc.Add(lBreak);
    55. doc.Add(sep);
    56. doc.Add(lBreak);
    57. //weiter Tabelle für Summen
    58. PdfPTable pdfSumTbl = new PdfPTable(2);
    59. decimal prov = decimal.Multiply(turnover, Convert.ToDecimal(0.2));
    60. decimal totalSum = turnover - prov;
    61. pdfSumTbl.AddCell(new Phrase("Zwischensumme:"));
    62. pdfSumTbl.AddCell(new Phrase(turnover.ToString("c")));
    63. pdfSumTbl.AddCell(new Phrase("./. Provision:"));
    64. pdfSumTbl.AddCell(new Phrase(prov.ToString("c")));
    65. pdfSumTbl.AddCell(new Phrase("Endsumme:"));
    66. pdfSumTbl.AddCell(new Phrase(totalSum.ToString("c")));
    67. doc.Add(pdfSumTbl);
    68. //Dokument abschließen
    69. doc.Close();
    70. prw.Close();
    71. fs.Close();
    72. }


    Es gibt bestimmt einiges zu verbessern. Ich weis auch noch nicht genau, wie ich das besser Formatieren kann... Vielleicht ha jemand ncoh Ideen dazu.
    Danke Euch
    "Hier könnte Ihre Werbung stehen..."
    warum gibt GetSellerArticleSold() eine untypisierte DataTable zurück?
    Imo wäre zB einfach IEnumerable<ArticleRow> als RückgabeTyp viel günstiger.

    also einfach so:

    C#-Quellcode

    1. public IEnumerable<ArticleRow> GetSellerArticleSold(int sellerID)
    2. {
    3. return from article in this where article.SellerID == sellerID && article.Sold
    4. }


    Entsprechend typisiert dann acuh die Verarbeitung:

    C#-Quellcode

    1. //...
    2. foreach (ArticleRow art in articles)
    3. {
    4. pdfTbl.AddCell(new Phrase(art.ArtikelNo.ToString()));
    5. pdfTbl.AddCell(new Phrase(art.Matchcode));
    6. pdfTbl.AddCell(new Phrase(art.Price.ToString("c"))); // currency-Formatierung
    7. }
    8. //...
    Verdammt.... @ErfinderDesRades du wirst es nicht glauben, die gleiche Methode habe ich sogar zuerst verwendet, aber bekam zum verrecken die Tabellen nicht anständig gefüllt.... muss auch dazu sagen, das ich vorher mit ner for schleife da rum gefurwerkt habe...
    ich bau es nochmal um...
    achja.... der Hauptgrund waren die columHeaders... die sind in der Tabelle ja in englsich, sollen aber in deutsch ausgegeben werden, also muss ich die Tabellenheader wieder extra erstellen. Daher war das ja mit der befüllung einer neuen Tabelle mit lediglich den 3 benötigten Spalten...
    "Hier könnte Ihre Werbung stehen..."
    na dann halt so:

    C#-Quellcode

    1. foreach (var header in "ArtikelNummer Bezeichnung Preis".Split()) {
    2. PdfPCell pdfCell = new PdfPCell();
    3. pdfCell.BackgroundColor = BaseColor.LIGHT_GRAY;
    4. pdfCell.Phrase = new Phrase(header, fntColHeader);
    5. pdfTbl.AddCell(pdfCell);
    6. }
    7. foreach (var art in articles) {
    8. pdfTbl.AddCell(new Phrase(art.ArtikelNo.ToString()));
    9. pdfTbl.AddCell(new Phrase(art.Matchcode));
    10. pdfTbl.AddCell(new Phrase(art.Price.ToString("c"))); // currency-Formatierung
    11. }
    @ErfinderDesRades hab grad noch mal in meinen Code geschaut, ich hatte eine EnumerableRowCollection<ArticleRow> genommen,vielleicht deshalb die Problemchen. Muss mir morgen mal den Unterschied zu IEnumerable<ArticleRow> angucken...
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    Hat irgendjemand ein einfaches Tutorial wie ich die Einträge aus der Verkäufertabelle nebst dazugehörigen artikeln als PDF speichern kann?
    Da kann ich dir mein Reportviewer-Tutorial anbieten...
    Im Kapitel 5 (zusammengefasster Master- und Detailbericht) habe ich heute ein sehr rudimentäres Beispiel eingepflegt, wie man so etwas im Report leicht darstellen kann.
    Und mit DirectPrint kann man den Report dann in eine PDF-Datei druken und später ausdrucken...
    Ich glaube deine letzte Anfrage im Tut bezog sich auf dieses Problem?
    Hallo @VB1963,

    Ja, Danke Dir. Ich hab Deine Antwort im Tutorial gesehen und noch keine Zeit gehabt es auszuprobieren.
    Hab jetzt soviel Energie in dieses blöde iTextsharp gelegt und mein Problem erstmal beheben können.

    Aber... schön aussehen tuts noch nicht, deswegen kümmere ich mich jetzt doch noch einmal um den ReportViewer und guck mir dein Tut noch einmal in Ruhe an.
    Falls ich dann wieder auf Fragen stoße, schreib ich diese in den Tut Thread...
    Danke Dir, ich meld mich
    "Hier könnte Ihre Werbung stehen..."