Рисунок штрих-кода PdfSharp 128 в IIS создает пробелы в символах


Мне нужно нарисовать штрих-код шрифтом code 128 в формате pdf, поэтому я использую библиотеку PdfSharp. Штрих-код в формате PDF, как показано ниже:

XFont BarcodeFont = new XFont("Code 128", 40, XFontStyle.Regular);

tf.Alignment = XParagraphAlignment.Center;
XRect barecodeLabel = new XRect(new XPoint(leftMargin, rectanglesPadding), new XSize(page.Width - rightMargin, BarcodeFont.Height + 10));
tf.DrawString(PrepareBarcode(item.ItemNo_), BarcodeFont, XBrushes.Black, barecodeLabel, XStringFormats.TopLeft);
rectanglesPadding += barecodeLabel.Height - XUnit.FromPoint(5.0);

Подготовка данных для штрих-кода:

private string PrepareBarcode(string itemNo)
    {
        int sumControl = SumControl(itemNo);
        string kod = "";
        kod += (char)209;
        kod += itemNo;

        kod += (char)sumControl;

        kod += (char)211;
        return kod;
    }

и контроль суммы:

private int SumControl(string input)
        {
            int sum = 0;

            for (int i = 0; i < input.Length; i++)
            {
                if (input[i] != ' ')
                {
                    int znak = (int)input[i] - 32;
                    sum += (i + 1) * ((int)input[i] - 32);
                }
            }
            sum += 104;
            int rem = Convert.ToInt32(Decimal.Remainder(sum, 103));

            if (rem < 95)
                return rem + 32;
            else
                return rem + 105;
        }

Шрифт встраивается в pdf, а pdf возвращается на страницу aspx как MemoryStream и сбрасывается в браузер:

WCF:

MigraDoc.DocumentObjectModel.Document doc = new MigraDoc.DocumentObjectModel.Document();
                MigraDoc.Rendering.DocumentRenderer renderer = new DocumentRenderer(doc);
                MigraDoc.Rendering.PdfDocumentRenderer pdfRenderer = new MigraDoc.Rendering.PdfDocumentRenderer(true, PdfFontEmbedding.Always);
                pdfRenderer.PdfDocument = document;
                pdfRenderer.DocumentRenderer = renderer;
                using (MemoryStream ms = new MemoryStream())
                {
                    pdfRenderer.Save(ms, false);
                    byte[] buffer = new byte[ms.Length];
                    ms.Seek(0, SeekOrigin.Begin);
                    ms.Flush();
                    ms.Read(buffer, 0, (int)ms.Length);
                    return ms;
                }

И страница Aspx:

try
            {
                zebexService = new SERVICES.NAV.WAREHOUSE.ZEBEX.ZebexClient();
                zebexService.Open();
                var wampirUserId = HttpContext.Current.GetWampirID();
                System.IO.MemoryStream stream = zebexService.PrintBarcodeLabels(wampirUserId, itemToPrintList);
                zebexService.Close();

                HttpContext.Current.Response.Clear();
                HttpContext.Current.Response.ContentType = "application/pdf";
                HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
                HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=Druk etykiet:" + DateTime.Now.ToString("yy/mm/dd-hh:mm") + "_" + wampirUserId + ".pdf");

                HttpContext.Current.Response.BinaryWrite(stream.ToArray());
                HttpContext.Current.Response.Flush();
                stream.Close();
                HttpContext.Current.Response.End();
                Response.BinaryWrite(stream.ToArray());
                Response.Flush();
            }

Когда я рисую его на локальном хосте (windows 10, asp.net dev. server, lang. PL), он рисуется правильно:

[Правильно отрисованный штрих-код в pdf на локальном хосте]]

но когда я перемещаю код (WCF) на сервер IIS с Windows Server 2012R2, lang. Английский с установленным таким же шрифтом (code128.ttf), получаю штрихкод с большими промежутками между символами:

[Неправильно нарисованный штрих-код]

Что я могу сделать, чтобы устранить эту проблему?


person Piotr    schedule 09.09.2016    source источник
comment
пожалуйста, проверьте наличие ошибок консоли?   -  person The Blue Shirt Developer    schedule 09.09.2016
comment
Только: ресурс интерпретируется как документ, но передается с помощью приложения/pdf типа MIME: localhost:59384/Warehouse/Buffer /PrintLabels.aspx.   -  person Piotr    schedule 09.09.2016
comment
ошибка видна для приложения, перемещенного на сервер?   -  person The Blue Shirt Developer    schedule 09.09.2016
comment
Да, но это не помечено как ошибка. Просто информация.   -  person Piotr    schedule 09.09.2016


Ответы (1)


Я могу только помочь вам, показав мой код для создания штрих-кода (EAN 13) с использованием PDFsharp, который работает как при разработке, так и на сервере. Но там используется другой шрифт: ean13.ttf, так что, возможно, он вам не подойдет.

        using (PdfDocument document = new PdfDocument())
        {
            //create pdf header
            document.Info.Title = "My barcode";
            document.Info.Author = "Me";
            document.Info.Subject = "Barcode";
            document.Info.Keywords = "Barcode, Ean13";
            document.Info.CreationDate = DateTime.Now;

            //create new pdf page
            PdfPage page = document.AddPage();
            page.Width = XUnit.FromMillimeter(210);
            page.Height = XUnit.FromMillimeter(297);

            using (XGraphics gfx = XGraphics.FromPdfPage(page))
            {
                //make sure the font is embedded
                var options = new XPdfFontOptions(PdfFontEmbedding.Always);

                //declare a font for drawing in the PDF
                XFont fontEan = new XFont("Code EAN13", 75, XFontStyle.Regular, options);
                XTextFormatter tf = new XTextFormatter(gfx);

                //create the barcode from string
                gfx.DrawString(barcodeText, fontEan, XBrushes.Black, new XRect(15, 40, page.Width, page.Height), XStringFormat.TopLeft);     
            }
        }
person VDWWD    schedule 09.09.2016
comment
Спасибо, но мне нужно нарисовать порядковый номер, например, ABB302MOEL, поэтому ean13 не подходит. - person Piotr; 09.09.2016
comment
Я знаю, но, возможно, указание страницы и высоты решит вашу проблему. - person VDWWD; 09.09.2016
comment
Я уже сделал это: PdfPage page = document.AddPage(); page.Width = XUnit.FromInch(2.76); page.Height = XUnit.FromInch(2.07); XGraphics gfx = XGraphics.FromPdfPage(page); gfx.MFEH = PdfFontEmbedding.Always; gfx.MUH = PdfFontEncoding.Unicode; XTextFormatter tf = new XTextFormatter(gfx); - person Piotr; 09.09.2016