给热敏打印机转义码
Gebe Thermalprinter Escapecodes
我使用的是 Gebe 热敏打印机 (GeBE-COMPACT Plus GPT-4672),但遇到以下问题:
打印机(与大多数已知的热敏打印机一样)使用一组独特的转义命令来使用其功能。我正在编写一个将打印作业发送到打印机的 .Net 应用程序,它工作正常,但之后,我需要发送一个 Escape 序列来剪切和释放纸张。该公司发布了一个测试应用程序,它接受一个命令并将其发送到打印机。然而,函数本身卡在一个我无法访问也无法使用的 dll 文件中,因为最终目标系统不支持发布的 dll,所以我正在尝试创建一个解决方法。打印机通过 USB 连接。
裁纸指令如下(直译):C<0d>。在 < 和 ESC 之间不添加 space 的情况下将这一行准确地插入到测试程序中,效果很好。我已经使用 MSDN 页面上提供的代码将原始文本发送到打印机。然而,通过我的方法发送这行文本只是让它将这些行打印到纸上,除了 Escape。我试过将序列转换为十六进制,但没有成功。我试过将文本作为二进制数据发送,也没有用。感觉它只看到了 Escape Sign 而忽略了字符串的其余部分。有谁知道如何解决这个问题?在过去的几个小时里,我一直在来回转换,并使用了将近 12 英尺的纸,因为它根本行不通。
编辑:
根据要求,源代码:
切纸按钮的功能:
private void BCut_Click(object sender, EventArgs e)
{
String output = "<ESC>C<0d>";
RawPrinterHelper.SendStringToPrinter("Gebe_Drucker", output);
}
调用 sendbytestoprinter 函数的“SendStringToPrinter”函数的代码:
public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
{
Int32 dwError = 0, dwWritten = 0;
IntPtr hPrinter = new IntPtr(0);
DOCINFOA di = new DOCINFOA();
bool bSuccess = false; // Assume failure unless you specifically succeed.
di.pDocName = "My C#.NET RAW Document";
di.pDataType = "RAW";
// Open the printer.
if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
{
// Start a document.
if (StartDocPrinter(hPrinter, 1, di))
{
// Start a page.
if (StartPagePrinter(hPrinter))
{
// Write your bytes.
bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
EndPagePrinter(hPrinter);
}
EndDocPrinter(hPrinter);
}
ClosePrinter(hPrinter);
}
// If you did not succeed, GetLastError may give more information
// about why not.
if (bSuccess == false)
{
dwError = Marshal.GetLastWin32Error();
}
return bSuccess;
}
public static bool SendStringToPrinter(string szPrinterName, string szString)
{
IntPtr pBytes;
Int32 dwCount;
// How many characters are in the string?
dwCount = szString.Length;
// Assume that the printer is expecting ANSI text, and then convert
// the string to ANSI text.
MessageBox.Show(szString);
pBytes = Marshal.StringToCoTaskMemAnsi(szString);
// Send the converted ANSI string to the printer.
SendBytesToPrinter(szPrinterName, pBytes, dwCount);
Marshal.FreeCoTaskMem(pBytes);
return true;
}
就是这样。希望对您有所帮助。
您不能只将“C<0d>”写成字符串 - 和 <0d> 是特殊代码。 < ESC> 用于二进制 27,<0d> 用于二进制 0。您必须构造字符串,例如这样(十六进制编码):
字符串输出 = "\u001BC\u0000";
我使用的是 Gebe 热敏打印机 (GeBE-COMPACT Plus GPT-4672),但遇到以下问题:
打印机(与大多数已知的热敏打印机一样)使用一组独特的转义命令来使用其功能。我正在编写一个将打印作业发送到打印机的 .Net 应用程序,它工作正常,但之后,我需要发送一个 Escape 序列来剪切和释放纸张。该公司发布了一个测试应用程序,它接受一个命令并将其发送到打印机。然而,函数本身卡在一个我无法访问也无法使用的 dll 文件中,因为最终目标系统不支持发布的 dll,所以我正在尝试创建一个解决方法。打印机通过 USB 连接。
裁纸指令如下(直译):
编辑:
根据要求,源代码:
切纸按钮的功能:
private void BCut_Click(object sender, EventArgs e)
{
String output = "<ESC>C<0d>";
RawPrinterHelper.SendStringToPrinter("Gebe_Drucker", output);
}
调用 sendbytestoprinter 函数的“SendStringToPrinter”函数的代码:
public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
{
Int32 dwError = 0, dwWritten = 0;
IntPtr hPrinter = new IntPtr(0);
DOCINFOA di = new DOCINFOA();
bool bSuccess = false; // Assume failure unless you specifically succeed.
di.pDocName = "My C#.NET RAW Document";
di.pDataType = "RAW";
// Open the printer.
if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
{
// Start a document.
if (StartDocPrinter(hPrinter, 1, di))
{
// Start a page.
if (StartPagePrinter(hPrinter))
{
// Write your bytes.
bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
EndPagePrinter(hPrinter);
}
EndDocPrinter(hPrinter);
}
ClosePrinter(hPrinter);
}
// If you did not succeed, GetLastError may give more information
// about why not.
if (bSuccess == false)
{
dwError = Marshal.GetLastWin32Error();
}
return bSuccess;
}
public static bool SendStringToPrinter(string szPrinterName, string szString)
{
IntPtr pBytes;
Int32 dwCount;
// How many characters are in the string?
dwCount = szString.Length;
// Assume that the printer is expecting ANSI text, and then convert
// the string to ANSI text.
MessageBox.Show(szString);
pBytes = Marshal.StringToCoTaskMemAnsi(szString);
// Send the converted ANSI string to the printer.
SendBytesToPrinter(szPrinterName, pBytes, dwCount);
Marshal.FreeCoTaskMem(pBytes);
return true;
}
就是这样。希望对您有所帮助。
您不能只将“