diff --git a/Tasks/PdfBuilder.cs b/Tasks/PdfBuilder.cs index 573f80e..0b2192c 100644 --- a/Tasks/PdfBuilder.cs +++ b/Tasks/PdfBuilder.cs @@ -522,76 +522,248 @@ public class PdfBuilder document.Info.Subject = "powered by logofclient"; document.Info.Author = "logofclient"; - int margin = 50; + var grouped_nums = GroupAddresses(setID).ToList(); - var grouped_nums = GroupAddresses(setID); + // Zwei Tabellen pro A4-Seite + int sheets = (grouped_nums.Count + 1) / 2; - foreach (var result in grouped_nums) + // Layout + double marginX = 20; + double marginY = 20; + double gapY = 12; + + for (int pageIndex = 0; pageIndex < sheets; pageIndex++) { var page = document.AddPage(); page.Size = PageSize.A4; - var gfx = XGraphics.FromPdfPage(page); - var width = page.Width.Point-margin; - var height = page.Height.Point-margin; - gfx.DrawLine(XPens.Black, margin, margin, margin, height); - gfx.DrawLine(XPens.Black, margin, margin, width, margin); - gfx.DrawLine(XPens.Black, width, margin, width, height); - gfx.DrawLine(XPens.Black, margin, height, width, height); + double pageW = page.Width.Point; + double pageH = page.Height.Point; - var boldfont = new XFont("Cantarell", 11, XFontStyleEx.Bold); - var font = new XFont("Cantarell", 11, XFontStyleEx.Regular); - var bigboldfont = new XFont("Cantarell", 35, XFontStyleEx.Bold); - - // Versandinfo - gfx.DrawString($"Versand {list.Name}", boldfont, XBrushes.Black, - new XRect(margin+5, margin, width-margin, 25), XStringFormats.CenterLeft); - gfx.DrawString($"Start: ", font, XBrushes.Black, - new XRect(margin+5, margin+25, width-margin, 25), XStringFormats.CenterLeft); - gfx.DrawString($"{result.Item3}", font, XBrushes.Black, - new XRect(margin+75, margin+25, width-margin, 25), XStringFormats.CenterLeft); - gfx.DrawString($"Ende: ", font, XBrushes.Black, - new XRect(margin+5, margin+40, width-margin, 25), XStringFormats.CenterLeft); - gfx.DrawString($"{result.Item4}", font, XBrushes.Black, - new XRect(margin+75, margin+40, width-margin, 25), XStringFormats.CenterLeft); - gfx.DrawString($"Kunde: ", font, XBrushes.Black, - new XRect(margin+5, margin+55, width-margin, 25), XStringFormats.CenterLeft); - gfx.DrawString($"{Customer.GetCustomerByID(list.owner_id).name}", font, XBrushes.Black, - new XRect(margin+75, margin+55, width-margin, 25), XStringFormats.CenterLeft); - gfx.DrawString($"Absender: ", font, XBrushes.Black, - new XRect(margin+5, margin+70, width-margin, 25), XStringFormats.CenterLeft); - gfx.DrawString($"{Customer.GetCustomerByID(list.owner_id).sender_address}", font, XBrushes.Black, - new XRect(margin+75, margin+70, width-margin, 25), XStringFormats.CenterLeft); - gfx.DrawString($"Anzahl: ", font, XBrushes.Black, - new XRect(margin+5, margin+85, width-margin, 25), XStringFormats.CenterLeft); - gfx.DrawString($"{result.Item5}", font, XBrushes.Black, - new XRect(margin+75, margin+85, width-margin, 25), XStringFormats.CenterLeft); - - // logofclient ad - gfx.DrawString($"powered by logofclient", font, XBrushes.Black, - new XRect(margin+5, height-55, width-margin, 25), XStringFormats.CenterLeft); - gfx.DrawString($"(c) 2026 MyPapertown", font, XBrushes.Black, - new XRect(margin+5, height-40, width-margin, 25), XStringFormats.CenterLeft); - gfx.DrawString($"mypapercloud.de/logof", font, XBrushes.Black, - new XRect(margin+5, height-25, width-margin, 25), XStringFormats.CenterLeft); + double usableW = pageW - 2 * marginX; + double usableH = pageH - 2 * marginY; + double tableH = (usableH - gapY) / 2.0; - - int total_frac = 0; - foreach (var item in grouped_nums) + double top1 = marginY; + double top2 = marginY + tableH + gapY; + + var fontLabel = new XFont("Arial", 6, XFontStyleEx.Bold); + var fontText = new XFont("Arial", 6, XFontStyleEx.Regular); + var fontBig = new XFont("Arial", 30, XFontStyleEx.Bold); + + int firstIndex = pageIndex * 2; + DrawGermanyRunningSheet( + gfx, + marginX, + top1, + usableW, + tableH, + list, + grouped_nums[firstIndex], + grouped_nums, + fontLabel, + fontText, + fontBig + ); + + if (firstIndex + 1 < grouped_nums.Count) { - if (item.Item2 == result.Item2) total_frac++; + DrawGermanyRunningSheet( + gfx, + marginX, + top2, + usableW, + tableH, + list, + grouped_nums[firstIndex + 1], + grouped_nums, + fontLabel, + fontText, + fontBig + ); } - - // group number - gfx.DrawString($"{result.Item2}", bigboldfont, XBrushes.Black, - new XRect(margin, margin, width-margin, (height-margin)/2), XStringFormats.Center); - gfx.DrawString($"Fraktion {result.Item1}/{total_frac}", font, XBrushes.Black, - new XRect(margin, margin, width-margin, (height-margin)/2 + 50), XStringFormats.Center); } - + document.Save(path); } + + private void DrawGermanyRunningSheet( + XGraphics gfx, + double x, + double y, + double w, + double h, + KasAddressList list, + dynamic result, + List<(int,string,string,string,int)> grouped_nums, + XFont fontLabel, + XFont fontText, + XFont fontBig) + { + double line = 1.0; + + string sender = Customer.GetCustomerByID(list.owner_id)?.sender_address ?? "[Absender]"; + string customerName = Customer.GetCustomerByID(list.owner_id)?.name ?? "[Kunde]"; + string start = result.Item3?.ToString() ?? "[Start]"; + string end = result.Item4?.ToString() ?? "[Ende]"; + string amount = result.Item5?.ToString() ?? "[Anzahl]"; + string groupNo = result.Item2?.ToString() ?? "[PLZ]"; + string fraction = result.Item1?.ToString() ?? "[Fraktion]"; + + int total_frac = 0; + foreach (var item in grouped_nums) + { + if (item.Item2 == result.Item2) total_frac++; + } + + // Outer border + gfx.DrawRectangle(XPens.Black, x, y, w, h); + + // Row heights + double r1 = h * 0.1; + double r2 = h * 0.1; + double r3 = h * 0.54; + double r4 = h * 0.30; + + // Main horizontal lines + gfx.DrawLine(XPens.Black, x, y + r1, x + w, y + r1); + gfx.DrawLine(XPens.Black, x, y + r1 + r2, x + w, y + r1 + r2); + gfx.DrawLine(XPens.Black, x, y + r1 + r2 + r3, x + w, y + r1 + r2 + r3); + + // Top row columns + double c1 = w * 0.39; + double c2 = w * 0.20; + double c3 = w * 0.26; + double c4 = w * 0.15; + + gfx.DrawLine(XPens.Black, x + c1, y, x + c1, y + r1); + gfx.DrawLine(XPens.Black, x + c1 + c2, y, x + c1 + c2, y + r1); + gfx.DrawLine(XPens.Black, x + c1 + c2 + c3, y, x + c1 + c2 + c3, y + r1); + + // Second row columns + gfx.DrawLine(XPens.Black, x + c1, y + r1, x + c1, y + r1 + r2); + gfx.DrawLine(XPens.Black, x + c1 + c2, y + r1, x + c1 + c2, y + r1 + r2); + gfx.DrawLine(XPens.Black, x + c1 + c2 + c3, y + r1, x + c1 + c2 + c3, y + r1 + r2); + + // Middle large area split + double midSplit = x + w * 0.55; + gfx.DrawLine(XPens.Black, midSplit, y + r1 + r2, midSplit, y + r1 + r2 + r3); + + // Bottom section split + double leftBottomW = w * 0.42; + gfx.DrawLine(XPens.Black, x + leftBottomW, y + r1 + r2 + r3, x + leftBottomW, y + h); + + // Bottom left rows + double blY1 = y + r1 + r2 + r3 + (r4 * 0.14); + double blY2 = y + r1 + r2 + r3 + (r4 * 0.28); + double blY3 = y + r1 + r2 + r3 + (r4 * 0.42); + double blY4 = y + r1 + r2 + r3 + (r4 * 0.56); + double blY5 = y + r1 + r2 + r3 + (r4 * 0.70); + + gfx.DrawLine(XPens.Black, x, blY1, x + leftBottomW, blY1); + gfx.DrawLine(XPens.Black, x, blY2, x + leftBottomW, blY2); + gfx.DrawLine(XPens.Black, x, blY3, x + leftBottomW, blY3); + gfx.DrawLine(XPens.Black, x, blY4, x + leftBottomW, blY4); + gfx.DrawLine(XPens.Black, x, blY5, x + leftBottomW, blY5); + + // Labels top row + gfx.DrawString("Absender:", fontLabel, XBrushes.Black, new XRect(x + 5, y + 4, c1 - 10, 14), XStringFormats.TopLeft); + gfx.DrawString("Kunden-Nr. Absender:", fontLabel, XBrushes.Black, new XRect(x + c1 + 5, y + 4, c2 - 10, 14), XStringFormats.TopLeft); + gfx.DrawString("ZKZ/Titel:", fontLabel, XBrushes.Black, new XRect(x + c1 + c2 + 5, y + 4, c3 - 10, 14), XStringFormats.TopLeft); + gfx.DrawString("Anzahl Sendungen:", fontLabel, XBrushes.Black, new XRect(x + c1 + c2 + c3 + 5, y + 4, c4 - 10, 14), XStringFormats.TopLeft); + + // Values top row + gfx.DrawString(sender, fontText, XBrushes.Black, new XRect(x + 5, y + 20, c1 - 10, r1 - 22), XStringFormats.TopLeft); + gfx.DrawString("[Kunden-Nr. Absender]", fontText, XBrushes.Black, new XRect(x + c1 + 5, y + 20, c2 - 10, r1 - 22), XStringFormats.TopLeft); + gfx.DrawString("[ZKZ/Titel]", fontText, XBrushes.Black, new XRect(x + c1 + c2 + 5, y + 20, c3 - 10, r1 - 22), XStringFormats.TopLeft); + gfx.DrawString(amount, fontText, XBrushes.Black, new XRect(x + c1 + c2 + c3 + 5, y + 20, c4 - 10, r1 - 22), XStringFormats.TopLeft); + + // Second row labels + gfx.DrawString("Einlieferer:", fontLabel, XBrushes.Black, new XRect(x + 5, y + r1 + 4, c1 - 10, 14), XStringFormats.TopLeft); + gfx.DrawString("Kunden-Nr. Einlieferer:", fontLabel, XBrushes.Black, new XRect(x + c1 + 5, y + r1 + 4, c2 - 10, 14), XStringFormats.TopLeft); + gfx.DrawString("Interne Vermerke:", fontLabel, XBrushes.Black, new XRect(x + c1 + c2 + 5, y + r1 + 4, c3 - 10, 14), XStringFormats.TopLeft); + gfx.DrawString("Laufzeit", fontLabel, XBrushes.Black, new XRect(x + c1 + c2 + c3 + 5, y + r1 + 4, c4 - 10, 14), XStringFormats.TopLeft); + + // Second row values + gfx.DrawString(customerName, fontText, XBrushes.Black, new XRect(x + 5, y + r1 + 20, c1 - 10, r2 - 22), XStringFormats.TopLeft); + gfx.DrawString("[Kunden-Nr. Einlieferer]", fontText, XBrushes.Black, new XRect(x + c1 + 5, y + r1 + 20, c2 - 10, r2 - 22), XStringFormats.TopLeft); + gfx.DrawString("[Interne Vermerke]", fontText, XBrushes.Black, new XRect(x + c1 + c2 + 5, y + r1 + 20, c3 - 10, r2 - 22), XStringFormats.TopLeft); + gfx.DrawString("[Laufzeit]", fontText, XBrushes.Black, new XRect(x + c1 + c2 + c3 + 5, y + r1 + 20, c4 - 10, r2 - 22), XStringFormats.TopLeft); + + // Middle area + gfx.DrawString(groupNo, fontBig, XBrushes.Black, + new XRect(x + 5, y + r1 + r2 + 5, w * 0.50 - 10, r3 - 10), + XStringFormats.Center); + + gfx.DrawString($"Fraktion {fraction}/{total_frac}", fontText, XBrushes.Black, + new XRect(x + 5, y + r1 + r2 + r3 - 18, w * 0.50 - 10, 14), + XStringFormats.CenterLeft); + + gfx.DrawString("Bereich für postalische Zwecke:", fontLabel, XBrushes.Black, + new XRect(midSplit + 5, y + r1 + r2 + 4, w - (midSplit - x) - 10, 14), + XStringFormats.TopLeft); + + // Bottom left labels + // Bottom left labels + gfx.DrawString("Einlieferungsdatum:", fontLabel, XBrushes.Black, + new XRect(x + 5, y + r1 + r2 + r3 + 4, leftBottomW - 10, 14), + XStringFormats.TopLeft); + + gfx.DrawString("AM-Auftragsnummer:", fontLabel, XBrushes.Black, + new XRect(x + 5, blY1 + 4, leftBottomW - 10, 14), + XStringFormats.TopLeft); + + gfx.DrawString("Bundgewicht:", fontLabel, XBrushes.Black, + new XRect(x + 5, blY2 + 4, leftBottomW - 10, 14), + XStringFormats.TopLeft); + + gfx.DrawString("Paletten-Nr.:", fontLabel, XBrushes.Black, + new XRect(x + 5, blY3 + 4, leftBottomW - 10, 14), + XStringFormats.TopLeft); + + gfx.DrawString("Bund-Nr./Bunde auf Palette:", fontLabel, XBrushes.Black, + new XRect(x + 5, blY4 + 4, leftBottomW - 10, 14), + XStringFormats.TopLeft); + + gfx.DrawString("Bund-Nr. von Gesamtanzahl:", fontLabel, XBrushes.Black, + new XRect(x + 5, blY5 + 4, leftBottomW - 10, 14), + XStringFormats.TopLeft); + + // Bottom placeholders rechts daneben, gleiche Zeile + double valueX = x + leftBottomW * 0.55; + double valueW = leftBottomW - (valueX - x) - 5; + + gfx.DrawString("[Einlieferungsdatum]", fontText, XBrushes.Black, + new XRect(valueX, y + r1 + r2 + r3 + 4, valueW, 14), + XStringFormats.TopRight); + + gfx.DrawString("[AM-Auftragsnummer]", fontText, XBrushes.Black, + new XRect(valueX, blY1 + 4, valueW, 14), + XStringFormats.TopRight); + + gfx.DrawString("[Bundgewicht]", fontText, XBrushes.Black, + new XRect(valueX, blY2 + 4, valueW, 14), + XStringFormats.TopRight); + + gfx.DrawString("[Paletten-Nr.]", fontText, XBrushes.Black, + new XRect(valueX, blY3 + 4, valueW, 14), + XStringFormats.TopRight); + + gfx.DrawString("[Bund-Nr./Bunde auf Palette]", fontText, XBrushes.Black, + new XRect(valueX, blY4 + 4, valueW, 14), + XStringFormats.TopRight); + + gfx.DrawString("[Bund-Nr. von Gesamtanzahl]", fontText, XBrushes.Black, + new XRect(valueX, blY5 + 4, valueW, 14), + XStringFormats.TopRight); + + + // Right bottom postal area label + gfx.DrawString("Bereich für postalische Zwecke:", fontLabel, XBrushes.Black, + new XRect(x + leftBottomW + 5, y + r1 + r2 + r3 + 4, w - leftBottomW - 10, 14), + XStringFormats.TopLeft); + } public void CreateInternationalRunningSheets(int setID, string path) {