2016-09-09 3 views
1


J'ai besoin de dessiner un code à barres avec la police de code 128 en pdf, donc j'utilise la bibliothèque PdfSharp. Code-barres dans le dessin pdf comme ci-dessous:PdfSharp Barcode 128 dessin sur IIS fait des lacunes de symboles

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

Préparation des données pour les codes à barres:

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

     kod += (char)sumControl; 

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

et le contrôle de somme:

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

Font est embeded en pdf et le pdf est retourné à la page ASPX comme MemoryStream et purgé au navigateur:

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

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

Quand je dessine sur localhost (Windows 10, asp.net dev. serveur, lang. PL) il est drawed correctement:

[Correctly drawed barcode in pdf on localhost]]

mais quand je passe le code (WCF) à IIS Server avec Windows Server 2012R2, lang. Anglais installé la même police (code128.ttf), je reçois code à barres avec de grands écarts entre les personnages:

[Not correctly drawed barcode]

Que puis-je faire pour éliminer ce problème?

+0

Veuillez vérifier les erreurs de console? – Webruster

+0

Uniquement: Ressource interprétée comme document mais transférée avec le type MIME application/pdf: "http: // localhost: 59384/Warehouse/Buffer/PrintLabels.aspx". – Piotr

+0

Une erreur est visible lorsque l'application a été déplacée vers le serveur? – Webruster

Répondre

1

Je peux seulement vous aider en montrant mon code pour générer un code à barres (EAN 13) en utilisant PDFsharp qui fonctionne sur le développement et le serveur. Mais il utilise une police différente: ean13.ttf, alors peut-être que cela ne marchera pas pour vous.

 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

Merci, mais j'ai besoin de dessiner un numéro d'index comme ABB302MOEL, donc ean13 n'est pas suffisant. – Piotr

+0

Je sais, mais peut-être en spécifiant la page avec et la hauteur va résoudre votre problème. – VDWWD

+0

Je l'ai déjà fait: '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 = nouveau XTextFormatter (gfx); ' – Piotr