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

VB.NET中使用ESC/P控制打印机加粗时出现路径格式不支持错误求方案

问题根源

你犯了逻辑错误:SendFileToPrinter的第二个参数是要读取的文件路径,不是要打印的内容。你把ESC/P控制字符和文件路径拼接后,函数会把这个字符串当作文件路径去打开,而路径里包含了不可见的控制字符(ESC、\u0001、\0),系统无法识别这种非法路径,所以触发"路径格式不支持"的错误。

你的实际需求是给文件内容加上ESC/P加粗指令后打印,而非修改文件路径。

最优解决方案

直接调整流程:读取文件内容的字节数组,在前后拼接加粗开关的ESC/P二进制指令,然后调用底层的SendBytesToPrinter发送组合后的字节流——跳过SendFileToPrinter(它的设计只是单纯发送文件内容,无法插入控制指令)。

关键细节

  1. 修正ESC/P指令定义:ESC/P是二进制指令,不能用字符串字面量(比如"\u001B")定义,要直接用字节数组避免编码问题:
    • 加粗开启:{&H1B, &H45, &H01}(对应ESC E 1)
    • 加粗关闭:{&H1B, &H45, &H00}(对应ESC E 0)
  2. 读取文件字节:直接读取目标文件的二进制内容
  3. 拼接字节流:加粗开启指令 + 文件内容 + 加粗关闭指令
  4. 发送到打印机:调用SendBytesToPrinter发送组合后的字节数组
修改后的完整代码
' 定义ESC/P加粗控制指令的字节数组
Private ReadOnly BoldOnBytes As Byte() = {&H1B, &H45, &H01} ' ESC E 1:开启加粗
Private ReadOnly BoldOffBytes As Byte() = {&H1B, &H45, &H00} ' ESC E 0:关闭加粗

' 原有的SendBytesToPrinter底层函数(假设你已实现此函数)
Private Shared Function SendBytesToPrinter(ByVal szPrinterName As String, ByVal pBytes As IntPtr, ByVal dwCount As Integer) As Boolean
    ' 这里保留你原有的SendBytesToPrinter实现代码
End Function

' 新增:带加粗指令的打印文件函数
Public Shared Function PrintFileWithBold(ByVal printerName As String, ByVal filePath As String) As Boolean
    Try
        ' 1. 读取文件的二进制内容
        Dim fileBytes As Byte() = File.ReadAllBytes(filePath)
        
        ' 2. 拼接字节流:加粗开启 + 文件内容 + 加粗关闭
        Dim totalBytesLength As Integer = BoldOnBytes.Length + fileBytes.Length + BoldOffBytes.Length
        Dim printBytes(totalBytesLength - 1) As Byte
        
        Buffer.BlockCopy(BoldOnBytes, 0, printBytes, 0, BoldOnBytes.Length)
        Buffer.BlockCopy(fileBytes, 0, printBytes, BoldOnBytes.Length, fileBytes.Length)
        Buffer.BlockCopy(BoldOffBytes, 0, printBytes, BoldOnBytes.Length + fileBytes.Length, BoldOffBytes.Length)
        
        ' 3. 分配非托管内存并发送到打印机
        Dim pUnmanagedBytes As IntPtr = Marshal.AllocCoTaskMem(totalBytesLength)
        Marshal.Copy(printBytes, 0, pUnmanagedBytes, totalBytesLength)
        
        Dim success As Boolean = SendBytesToPrinter(printerName, pUnmanagedBytes, totalBytesLength)
        
        ' 释放内存
        Marshal.FreeCoTaskMem(pUnmanagedBytes)
        Return success
    Catch ex As Exception
        ' 处理异常(如文件不存在、打印机错误等)
        Console.WriteLine(ex.Message)
        Return False
    End Try
End Function

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim printer As String = "Generic / Text Only"
    ' 调用新的打印函数,直接传递文件路径
    PrintFileWithBold(printer, "C:\vDos\#LPT1.asc")
End Sub
额外说明
  • 若你的SendBytesToPrinter是调用Windows API的WritePrinter,请确保参数传递正确,这是底层打印的核心函数。
  • 用字节数组处理ESC/P指令可避免字符串编码(如UTF-8、ASCII)带来的错误,因为打印机只识别原始二进制指令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:27:27