[feat:] initial version of DP-compatible running sheets (germany)

This commit is contained in:
2026-06-08 13:33:56 +02:00
parent e62861a25b
commit 1ce0e2de8d
+224 -52
View File
@@ -522,77 +522,249 @@ public class PdfBuilder
document.Info.Subject = "powered by logofclient"; document.Info.Subject = "powered by logofclient";
document.Info.Author = "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(); var page = document.AddPage();
page.Size = PageSize.A4; page.Size = PageSize.A4;
var gfx = XGraphics.FromPdfPage(page); var gfx = XGraphics.FromPdfPage(page);
var width = page.Width.Point-margin; double pageW = page.Width.Point;
var height = page.Height.Point-margin; double pageH = page.Height.Point;
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);
var boldfont = new XFont("Cantarell", 11, XFontStyleEx.Bold); double usableW = pageW - 2 * marginX;
var font = new XFont("Cantarell", 11, XFontStyleEx.Regular); double usableH = pageH - 2 * marginY;
var bigboldfont = new XFont("Cantarell", 35, XFontStyleEx.Bold); double tableH = (usableH - gapY) / 2.0;
// Versandinfo double top1 = marginY;
gfx.DrawString($"Versand {list.Name}", boldfont, XBrushes.Black, double top2 = marginY + tableH + gapY;
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 var fontLabel = new XFont("Arial", 6, XFontStyleEx.Bold);
gfx.DrawString($"powered by logofclient", font, XBrushes.Black, var fontText = new XFont("Arial", 6, XFontStyleEx.Regular);
new XRect(margin+5, height-55, width-margin, 25), XStringFormats.CenterLeft); var fontBig = new XFont("Arial", 30, XFontStyleEx.Bold);
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);
int firstIndex = pageIndex * 2;
DrawGermanyRunningSheet(
gfx,
marginX,
top1,
usableW,
tableH,
list,
grouped_nums[firstIndex],
grouped_nums,
fontLabel,
fontText,
fontBig
);
int total_frac = 0; if (firstIndex + 1 < grouped_nums.Count)
foreach (var item in grouped_nums)
{ {
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); 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) public void CreateInternationalRunningSheets(int setID, string path)
{ {
KasAddressList list = Settings._instance.addressSets.GetAddressSetByID(setID); KasAddressList list = Settings._instance.addressSets.GetAddressSetByID(setID);