< Summary

Information
Class: Services.LabelServices.BarcodeLabelService
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/LabelServices/BarcodeLabelService.cs
Line coverage
100%
Covered lines: 78
Uncovered lines: 0
Coverable lines: 78
Total lines: 103
Line coverage: 100%
Branch coverage
75%
Covered branches: 9
Total branches: 12
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
GenerateLabelsPdf(...)75%1212100%
GenerateBarcodeImage(...)100%11100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/LabelServices/BarcodeLabelService.cs

#LineLine coverage
 1using QuestPDF.Fluent;
 2using QuestPDF.Infrastructure;
 3using SixLabors.ImageSharp.Formats.Png;
 4using SixLabors.ImageSharp.PixelFormats;
 5using ZXing;
 6using ZXing.Common;
 7using ISImage = SixLabors.ImageSharp.Image;
 8
 9namespace Services.LabelServices;
 10
 11public class BarcodeLabelService
 12{
 13    static BarcodeLabelService()
 14    {
 115        QuestPDF.Settings.License = LicenseType.Community;
 116    }
 17
 18    public byte[] GenerateLabelsPdf(IEnumerable<LabelRequest> labels)
 19    {
 420        var labelList = labels.ToList();
 21
 422        return Document.Create(container =>
 423        {
 1624            foreach (var label in labelList)
 425            {
 426                var barcodeValue = string.IsNullOrWhiteSpace(label.CleanedArticle)
 427                    ? "NOARTICLE"
 428                    : label.CleanedArticle;
 429
 430                var barcodeBytes = GenerateBarcodeImage(barcodeValue);
 431
 432                container.Page(page =>
 433                {
 434                    // 60 × 40 мм
 435                    page.Size(60, 40, Unit.Millimetre);
 436                    page.MarginHorizontal(2, Unit.Millimetre);
 437                    page.MarginTop(1, Unit.Millimetre);
 438                    page.MarginBottom(2, Unit.Millimetre);
 439
 440                    page.Content().Column(column =>
 441                    {
 442                        // Три колонки одинаковой ширины: [пусто] | [штрихкод по центру] | [x N]
 443                        // Левый и правый item одинаковы → штрихкод строго по центру
 444                        column.Item().Row(row =>
 445                        {
 446                            row.ConstantItem(10, Unit.Millimetre); // балансирующий спейсер
 447
 448                            row.RelativeItem()
 449                                .AlignCenter()
 450                                .Image(barcodeBytes)
 451                                .FitWidth();
 452
 453                            row.ConstantItem(10, Unit.Millimetre)
 454                                .AlignCenter()
 455                                .AlignMiddle()
 456                                .Text("x " + label.Quantity)
 457                                .Bold()
 458                                .FontSize(9);
 859                        });
 460
 461                        // Артикул — по центру
 462                        column.Item()
 463                            .AlignCenter()
 464                            .PaddingTop(1, Unit.Millimetre)
 465                            .Text(label.Article ?? string.Empty)
 466                            .Bold()
 467                            .FontSize(11);
 468
 469                        // Название товара — по центру
 470                        column.Item()
 471                            .AlignCenter()
 472                            .PaddingTop(1, Unit.Millimetre)
 473                            .Text(label.ProductName ?? string.Empty)
 474                            .FontSize(8)
 475                            .LineHeight(1.1f);
 876                    });
 877                });
 478            }
 879        }).GeneratePdf();
 80    }
 81
 82    private byte[] GenerateBarcodeImage(string text)
 83    {
 484        var writer = new BarcodeWriterPixelData
 485        {
 486            Format = BarcodeFormat.CODE_128,
 487            Options = new EncodingOptions
 488            {
 489                Width = 620,
 490                Height = 200,
 491                Margin = 0,
 492                PureBarcode = true
 493            }
 494        };
 95
 496        var pixelData = writer.Write(text);
 97
 498        using var image = ISImage.LoadPixelData<Bgra32>(pixelData.Pixels, pixelData.Width, pixelData.Height);
 499        using var ms = new MemoryStream();
 4100        image.Save(ms, new PngEncoder());
 4101        return ms.ToArray();
 4102    }
 103}