使用C#调用Labelary API加载Consolas.ttf生成PDF失败排查
问题:Labelary转换ZPL到PDF时自定义Consolas字体不生效
我尝试用Labelary Web Service把带Consolas.ttf字体的ZPL代码转成PDF,但生成的PDF里字体没生效,我的C#代码如下:
byte[] zpl = Encoding.UTF8.GetBytes($@"^xa^CI~DUR:consolas.TTF,44676,{Convert.ToBase64String(File.ReadAllBytes(@"C:\folderWithFonts\consolas.TTF"))} ^fo100,0^A@r,300,300,R:consolas.TTF^fdTESTSTRING^fs^xz"); var request = (HttpWebRequest)WebRequest.Create("http://api.labelary.com/v1/printers/8dpmm/labels/4.1x5.8/0/"); request.Method = "POST"; request.Accept = "application/pdf"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = zpl.Length; var requestStream = request.GetRequestStream(); requestStream.Write(zpl, 0, zpl.Length); requestStream.Close(); try { var response = (HttpWebResponse)request.GetResponse(); var responseStream = response.GetResponseStream(); var fileStream = File.Create(@"C:\folderWithResult\label.pdf"); responseStream.CopyTo(fileStream); responseStream.Close(); fileStream.Close(); } catch (WebException e) { Console.WriteLine("Error: {0}", e.Status); }
请问哪里操作错了?
解决方案
帮你排查了几个关键问题,应该是这些细节没处理到位导致字体不生效:
~DU命令的文件大小参数错误:
你现在写的固定值44676是错的,~DU命令里的文件大小参数需要是原始Consolas.ttf文件的字节长度,不是Base64编码后的长度,也不能随便填。你应该用File.ReadAllBytes(@"C:\folderWithFonts\consolas.TTF").Length来获取真实的文件大小。^CI命令缺少字符集参数:
你的ZPL里只写了^CI,但这个命令需要指定字符集编号才能正确解析文本。如果你的内容是UTF-8格式,改成^CI28来明确指定UTF-8字符集,避免字体渲染时的编码冲突。ZPL命令的格式细节优化:
检查DU命令后的多余空格,比如你代码里`~DUR:consolas.TTF,44676,{...}`后面有个空格,虽然不一定会报错,但保持命令紧凑能减少解析问题。另外要确保DU中定义的字体名R:consolas.TTF和^A@命令里引用的完全一致。
修正后的代码示例:
var fontBytes = File.ReadAllBytes(@"C:\folderWithFonts\consolas.TTF"); var fontBase64 = Convert.ToBase64String(fontBytes); var zplContent = $"^xa^CI28~DUR:consolas.TTF,{fontBytes.Length},{fontBase64}^fo100,0^A@r,300,300,R:consolas.TTF^fdTESTSTRING^fs^xz"; byte[] zpl = Encoding.UTF8.GetBytes(zplContent); var request = (HttpWebRequest)WebRequest.Create("http://api.labelary.com/v1/printers/8dpmm/labels/4.1x5.8/0/"); request.Method = "POST"; request.Accept = "application/pdf"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = zpl.Length; using (var requestStream = request.GetRequestStream()) { requestStream.Write(zpl, 0, zpl.Length); } try { using (var response = (HttpWebResponse)request.GetResponse()) using (var responseStream = response.GetResponseStream()) using (var fileStream = File.Create(@"C:\folderWithResult\label.pdf")) { responseStream.CopyTo(fileStream); } } catch (WebException e) { Console.WriteLine("Error: {0}", e.Status); }
另外建议你用using语句来管理流资源,避免手动关闭时可能出现的资源泄漏问题。修正后再调用API,应该就能正确渲染Consolas字体了。
内容的提问来源于stack exchange,提问作者V. Y.
相关产品推荐
相关产品推荐

