在 IIS 上绘制的 PdfSharp Barcode 128 使符号间隙
Posted
技术标签:
【中文标题】在 IIS 上绘制的 PdfSharp Barcode 128 使符号间隙【英文标题】:PdfSharp Barcode 128 drawing on IIS makes symbols gaps 【发布时间】:2017-01-17 04:26:04 【问题描述】:我需要在 pdf 中使用 code 128 字体绘制条形码,所以我使用的是 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作为MemoryStream返回到aspx页面并刷新到浏览器:
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();
当我在 localhost (windows 10, asp.net dev. server, lang. PL) 上绘制它时,它被正确绘制:
但是当我使用 Windows Server 2012R2 将代码 (WCF) 移动到 IIS 服务器时,lang.安装相同字体的英文(code128.ttf),我得到的条形码字符之间有很大的差距:
我可以做些什么来消除这个问题?
【问题讨论】:
请检查任何控制台错误? 仅限:资源解释为文档,但使用 MIME 类型应用程序/pdf 传输:“localhost:59384/Warehouse/Buffer/PrintLabels.aspx”。 移动到服务器的应用程序出现错误? 是的,但它没有被标记为错误。只是信息。 【参考方案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);
【讨论】:
谢谢,但是我需要像ABB302MOEL这样绘制索引号,所以ean13不够用。 我知道,但也许指定页面和高度可以解决您的问题。 我已经这样做了: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);
以上是关于在 IIS 上绘制的 PdfSharp Barcode 128 使符号间隙的主要内容,如果未能解决你的问题,请参考以下文章