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

PowerShell打印含~DG图像指令的ZPL标签输出空白问题求助

故障根因

Get-Content 配合 Out-Printer 的管道默认以文本模式处理内容,会自动执行编码转换、换行符标准化,打印驱动还可能额外追加页眉页脚、格式化控制字符:

  • 包含~DGR:TFORMer.GRF图形下载指令的ZPL文件内嵌二进制图形数据,文本模式读取时会替换、丢弃不符合当前编码规则的字节,导致实际发送的图形数据长度和~DG指令中声明的总字节数、单行字节数不匹配,打印机无法正常解析指令,最终输出空白标签。
  • 简单ZPL示例文件全部由可打印ASCII字符组成,文本处理逻辑不会修改有效内容,因此可以正常打印;记事本手动打印默认走原始字节直通通道,不会改动文件内容,因此也能正常输出。

解决方案

核心思路是放弃文本管道发送方式,直接将ZPL文件以原始二进制字节流的形式发送到打印机,跳过所有编码转换和驱动额外格式化步骤。

推荐方案:调用Windows原生打印API发送原始数据(全PowerShell版本兼容,稳定性最高)

直接替换原有打印命令为以下代码即可:

# 基础路径配置
$zplFile = Join-Path $folder ($labelname + '.txt')
$targetPrinter = "Generic / Text Only"

# 导入Windows原始打印接口
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public static class RawPrintHelper {
    [DllImport("winspool.drv", CharSet=CharSet.Unicode, SetLastError=true)]
    public static extern bool OpenPrinter(string pPrinterName, out IntPtr hPrinter, IntPtr pDefault);
    
    [DllImport("winspool.drv", SetLastError=true)]
    public static extern bool ClosePrinter(IntPtr hPrinter);
    
    [DllImport("winspool.drv", CharSet=CharSet.Unicode, SetLastError=true)]
    public static extern bool StartDocPrinter(IntPtr hPrinter, int Level, [In] ref DOCINFO pDocInfo);
    
    [DllImport("winspool.drv", SetLastError=true)]
    public static extern bool EndDocPrinter(IntPtr hPrinter);
    
    [DllImport("winspool.drv", SetLastError=true)]
    public static extern bool StartPagePrinter(IntPtr hPrinter);
    
    [DllImport("winspool.drv", SetLastError=true)]
    public static extern bool EndPagePrinter(IntPtr hPrinter);
    
    [DllImport("winspool.drv", SetLastError=true)]
    public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, int dwCount, out int dwWritten);

    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
    public struct DOCINFO {
        public int cbDocInfo;
        public string lpszDocName;
        public string lpszOutput;
        public string lpszDatatype;
        public int fwType;
    }
}
"@

# 无编码转换读取ZPL文件原始字节
$fileBytes = [System.IO.File]::ReadAllBytes($zplFile)
$hPrinter = [IntPtr]::Zero

# 发送数据到打印机
if ([RawPrintHelper]::OpenPrinter($targetPrinter, [ref]$hPrinter, [IntPtr]::Zero)) {
    try {
        $docInfo = New-Object RawPrintHelper+DOCINFO
        $docInfo.cbDocInfo = [System.Runtime.InteropServices.Marshal]::SizeOf($docInfo)
        $docInfo.lpszDocName = "ZPL Label Print"
        
        if ([RawPrintHelper]::StartDocPrinter($hPrinter, 1, [ref]$docInfo)) {
            [RawPrintHelper]::StartPagePrinter($hPrinter) | Out-Null
            $pUnmanagedBytes = [System.Runtime.InteropServices.Marshal]::AllocCoTaskMem($fileBytes.Length)
            [System.Runtime.InteropServices.Marshal]::Copy($fileBytes, 0, $pUnmanagedBytes, $fileBytes.Length)
            $bytesWritten = 0
            [RawPrintHelper]::WritePrinter($hPrinter, $pUnmanagedBytes, $fileBytes.Length, [ref]$bytesWritten) | Out-Null
            [System.Runtime.InteropServices.Marshal]::FreeCoTaskMem($pUnmanagedBytes)
            [RawPrintHelper]::EndPagePrinter($hPrinter) | Out-Null
            [RawPrintHelper]::EndDocPrinter($hPrinter) | Out-Null
        }
    }
    finally {
        [RawPrintHelper]::ClosePrinter($hPrinter)
    }
}

该方案和记事本打印的底层逻辑一致,不会对ZPL内容做任何修改,无论是纯文本指令还是内嵌二进制图形都可以完整传输到打印机,适配所有带内嵌资源的ZPL标签打印场景。

临时验证方案:强制字节读取(不推荐长期使用)

如果不想调用系统API,可以临时修改读取参数,强制按字节读取文件后输出,该方法在不同PowerShell版本、打印驱动环境下可能出现偶发字节丢失问题:

# PowerShell 5.x 版本
Get-Content -Path (Join-Path $folder ($labelname + '.txt')) -Encoding Byte -ReadCount 0 | ForEach-Object { [char]$_ } | Out-Printer -Name "Generic / Text Only"

# PowerShell 7+ 版本
Get-Content -Path (Join-Path $folder ($labelname + '.txt')) -AsByteStream -ReadCount 0 | ForEach-Object { [char]$_ } | Out-Printer -Name "Generic / Text Only"

额外注意事项

  • 提前确认"Generic / Text Only"驱动的端口配置正确,已绑定Zebra打印机对应的USB/网络TCP/IP端口,关闭驱动属性里的“启用高级打印功能”选项
  • 如果是网络Zebra打印机,也可以直接通过TCP客户端将原始字节流发送到打印机的9100端口,不需要依赖打印驱动,稳定性更高。

内容的提问来源于stack exchange,提问作者JWSE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:21:18