2016-09-09 2 views
1


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

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 разработчика. сервер, lang. PL) это правильно нарисовали:

[Correctly drawed barcode in pdf on localhost]]

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

[Not correctly drawed barcode]

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

+0

проверьте наличие ошибок в консоли. – Webruster

+0

Только: Ресурс интерпретируется как Документ, но передается с применением MIME-типа/pdf: «http: // localhost: 59384/Warehouse/Buffer/PrintLabels.aspx». – Piotr

+0

Ошибка отображается для приложения, перенесенного на сервер? – Webruster

ответ

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);  
      } 
     } 
+0

Спасибо, но мне нужно нарисовать индексный номер, например, ABB302MOEL, поэтому ean13 не подходит. – Piotr

+0

Я знаю, но, возможно, указание страницы с и высотой поможет решить вашу проблему. – VDWWD

+0

Я уже делаю это: 'PdfPage page = document.AddPage(); page.Width = XUnit.FromInch (2.76); page.Height = XUnit.FromInch (2.07); XGraphics gfx = XGraphics.FromPdfPage (страница); gfx.MFEH = PdfFontEmbedding. Всегда; gfx.MUH = PdfFontEncoding.Unicode; XTextFormatter tf = новый XTextFormatter (gfx); ' – Piotr

Смежные вопросы