C # RSClientPrint ОЧЕНЬ большая катушка

#c# #networking #.net-3.5 #barcode #spooler

#c# #создание сетей #.net-3.5 #штрих-код #спулер

Вопрос:

Я использую ASP .Net 3.5 MVC1 с серверной частью DB2. Моя компания пытается распечатать штрих-коды из диалогового окна Microsoft SQL Server 2008 RSCLient Print GDI . Мы не можем сохранять файлы в формате PDF и печатать локально, потому что это для нашего физического приложения инвентаризации, а партнеры могут делать плохие вещи с локальными штрих-кодами (они такие же хорошие проверки), поэтому мы вынуждены печатать через HTTP и контролировать их печать. В каждом хранилище есть сервер печати, но веб-сервер расположен в корпоративном ИТ-офисе. Я считаю, что мне нужно использовать .jpeg, потому что .gif приведет к размытию строк в штрих-коде и не будет читаться сканирующим устройством.

Приложение отлично работает с несколькими сотнями тегов (около 5 страниц и около 5 минут на завершение печати), но для печати 2000 тегов (около 300 страниц, около 150 МБ) требуется 2 часа. Я запустил Wireshark в приложении, чтобы попытаться перехватить пакеты, приходящие туда и обратно, и передал информацию в сеть, и это был их ответ.

Информация об источнике назначения времени 36628 653.373235 HTTP [Окно TCP заполнено] Продолжение или трафик, отличный от HTTP 36630 654.245430 TCP [TCP ZeroWindowProbe] http > 35503 [ACK] Seq = 26291213 Ack = 3730 Win = 63137 Len = 1

Я отвлекся от предыстории. Мой вопрос в том, какой тип стратегии я могу использовать, чтобы ускорить катушку печати по HTTP. Должен ли я «отрезать» катушку печати на X страницах и повторно запустить остальные? Должен ли я изменить свой алгоритм печати? Каков был бы способ уменьшить размер моей катушки печати без потери качества .jpeg? Существует ли альтернатива RSClientPrint с открытым исходным кодом или коммерческая альтернатива, которая будет обрабатывать бизнес-логику, которая мне нужна?

Теперь о совершенстве кодирования! Если вам нужно что-нибудь еще, пожалуйста, дайте мне знать!

         [AcceptVerbs(HttpVerbs.Post)]
    [Authorization(Roles = Roles.NonInquiry)]
    public ActionResult ReprintLabels(int eventId, int areaCode, int lowerLabelNumber, int upperLabelNumber)
    {
        if (!_eventAreaService.IsAreaEditable(eventId, areaCode))
            return RedirectToAction("Index", new { eventId = eventId });

        var printContext = _eventAreaService.ReprintLabels(eventId, areaCode, lowerLabelNumber, upperLabelNumber);

        ActionResult result = RedirectToAction("Index", new { eventId = eventId });
        if (printContext != null)
        {
            var redirectUrl = Url.RouteUrl(new { controller = "EventArea", action = "Index", eventId = eventId });
            Session[PrintContextViewModel.SessionKey] = new PrintContextViewModel(printContext, redirectUrl);

            result = RedirectToAction("PrintLabels", "LabelPrint");
        }

        return resu<
    }

public InventoryAreaPrintContext ReprintLabels(int eventId, int areaCode, int lowerLabelBound, int upperLabelBound)
    {
        var user = _authentication.CurrentUser;

        if (user.IsInRole(Roles.CorporateInquiry) || user.IsInRole(Roles.StoreInquiry))
            throw new InvalidOperationException("User must be a non-inquiry role.");

        List<Fixture> fixturesToVoid = GetLabelsInRange(eventId, areaCode, lowerLabelBound, upperLabelBound).Where(f => f.StatusCode == FixtureStatus.Ready).ToList();

        if (fixturesToVoid.Count < 1) return null;

        // Void all old labels and tally the labels that to be recreated
        //      for each area involved.
        var voidFixturesByArea = new Dictionary<int, int>();
        foreach (var f in fixturesToVoid)
        {
            if (!voidFixturesByArea.ContainsKey(f.AreaCode))
                voidFixturesByArea[f.AreaCode] = 1;
            else
                voidFixturesByArea[f.AreaCode]  ;

            f.StatusCode = FixtureStatus.VoidReplace;
            _fixtureRepo.Update(f);
        }

        var storeEvent = _storeEventRepository.FindEvent(user.DefaultStore, eventId);
        var lastUsedLabel = storeEvent.LastUsedLabelNumber;
        var affectedAreas = new List<InventoryArea>();

        // Create new labels for the affected areas.
        foreach (var pair in voidFixturesByArea)
        {
            var area = _areaRepo.FindByKey(user.DefaultStore.GroupCode, user.DefaultStore.ID, eventId, pair.Key);
            var fixtures = _fixtureBuilder.AddFixtures(lastUsedLabel.Value, area, pair.Value);
            fixtures.ForEach(f => _fixtureRepo.Insert(f));

            area.Fixtures = fixtures;
            affectedAreas.Add(area);
        }

        // Update the store event counts.
        var numberOfLabels = fixturesToVoid.Count();

        storeEvent.LastUsedLabelNumber  = numberOfLabels;

        _storeEventRepository.Update(storeEvent);

        return new InventoryAreaPrintContext(_barcodeGenerator) { InventoryAreas = affectedAreas, StoreEvent = storeEvent, Store = user.DefaultStore };
    }

public class BarcodeGenerator : IBarcodeGenerator
{
    private readonly BarCodeImage.CodeSetEncoder _codeSetEncoder;

    public BarcodeGenerator(BarCodeImage.CodeSetEncoder codeSetEncoder)
    {
        _codeSetEncoder = codeSetEncoder;
    }

    public byte[] CreateBarcode(string barcodeText)
    {
        byte[] data;
        var generator = new BarCodeImage(barcodeText, _codeSetEncoder, true)
                            {
                                InsetText = false,
                                Font = new Font(
                                    FontFamily.GenericSansSerif,
                                    10,
                                    FontStyle.Regular,
                                    GraphicsUnit.Pixel)
                            };

        /** 
         * Keep the image dimensions at the same ratio as they will be displayed in the report.
         * Currently the report is set to a height to width ratio of 1/5 so we set the image
         * height to width at 1/5 as well. Otherwise the barcode will not scan properly.
         **/
        using (var image = generator.Render(50, 250))
        using (var ms = new MemoryStream())
        {
            image.Save(ms, ImageFormat.Jpeg);
            data = ms.GetBuffer();
        }

        return data;
    }
}
  

Ответ №1:

Что-то было подозрительно в отправке оболочки изображения в диспетчер очереди печати. В итоге я использовал класс iTextSharp barcode 128 и в основном создавал штрих-код из шрифта вместо изображения, затем для удобочитаемого текста я просто передал строку тега fixture моего объекта barcode и присвоил этому значению значение в моем отчете .RDLC. Если кому-то нужен какой-либо код, пожалуйста, не стесняйтесь писать мне в личку.