You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:27:29