2016-09-09 31 views
1


我需要在PDF中绘制代码128字体的条形码,所以我使用PdfSharp库。条码PDF图中象下面这样:PdfSharp在IIS上绘制条形码128使符号空白

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(); 
      } 

当我画到本地主机(窗口10,asp.net开发。服务器,语言。 PL)这是正确drawed:

[Correctly drawed barcode in pdf on localhost]]

,但是当我移动代码(WCF)到IIS服务器与Windows Server 2012R2,郎。英语安装了相同的字体(code128.ttf),我得到的条形码,字符之间较大的差距:

[Not correctly drawed barcode]

我能做些什么来解决这个问题?

+0

请检查是否有任何控制台错误? – Webruster

+0

仅限: 将资源解释为Document,但使用MIME类型application/pdf传输:“http:// localhost:59384/Warehouse/Buffer/PrintLabels.aspx”。 – Piotr

+0

将应用程序移至服务器时出现错误? – Webruster

回答

1

我只能通过使用PDFsharp来显示我的代码来生成条形码(EAN 13)来帮助您,该代码适用于开发和服务器。但它使用了不同的字体: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(page); gfx.MFEH = PdfFontEmbedding.Always; gfx.MUH = PdfFontEncoding.Unicode; XTextFormatter tf = new XTextFormatter(gfx);' – Piotr