【问题标题】:Send print to windows spooler with Epson Thermal printer使用 Epson Thermal 打印机将打印件发送到 windows spooler
【发布时间】:2014-01-03 08:07:59
【问题描述】:

我有一个基于 c# visual studio 2012 构建的 POS 应用程序。

POS 解决方案基于从消费者到受益人的货币交易。我的 POS 解决方案为发生的每笔交易提供打印输出。我使用的是 EPSON TM-T81 热敏打印机。正在使用用于 c# 的 EPSON api。现在我将打印命令作为 RAW 数据直接发送到打印机。但我想使用 windows spooler 发送打印命令。

EPSON 提供的 api 只提供 RAW 打印的代码。有一个异步打印功能,但没有给出所需的结果。我的 c# 应用程序基于主服务器和几个执行货币交易的手持设备之间的套接字通信。为此,我正在使用异步套接字服务器。到这部分没有问题,但如果同时发生 2 笔交易,打印机只打印一张收据。我在两次打印之间放置了一个 sleep() 大约 2 秒,但这仍然不是方法,以后会引起问题。

我使用 c# 发送打印命令的代码:

m_Printer.PrintNormal(PrinterStation.Receipt, "\u001b|N" + "userID     : " + cardId + "\n");
m_Printer.PrintNormal(PrinterStation.Receipt, "\u001b|N" + "Member     : " + user_name + "\n");

我正在初始化打印机:

PosExplorer posExplorer = new PosExplorer();

DeviceInfo deviceInfo = null;

try
{
    deviceInfo = posExplorer.GetDevice(DeviceType.PosPrinter, strLogicalName);
    m_Printer = (PosPrinter)posExplorer.CreateInstance(deviceInfo);
}
catch (Exception)
{
}

//Register OutputCompleteEventHandler.
AddOutputComplete(m_Printer);

//Open the device
m_Printer.Open();

try
{
    //Get the exclusive control right for the opened device.
    //Then the device is disable from other application.
    m_Printer.Claim(1000);
    Console.WriteLine("Printer claimed");
}
catch (Exception e)
{
    Console.WriteLine("Printer Not claimed");
}

我想从直接 RAW 打印转变为在 c# 上使用 windows spooler。

我查看了 windows spooler api: Windows Spooler API 但不知道如何实现我的格式和打印机使用的一样。

如果能提供任何帮助,我将不胜感激。

【问题讨论】:

    标签: c# point-of-sale thermal-printer print-spooler-api


    【解决方案1】:

    使用 RAW 数据类型不是意味着数据没有被假脱机。它很可能是。要找出答案,请暂停打印机,打印一些内容,然后查看 \windows\system32\spool\printers。如果您在那里找到两个扩展名为 .SPL 和 .SHD 的文件,则表明数据正在假脱机。

    但如果 Epson API 直接与打印机通信并绕过假脱机程序,我不知道该 API 做了什么,因此无法告诉您如何复制它。为此,您需要打印机的技术手册。但是,假设打印机安装了打印驱动程序,您应该能够像使用任何其他打印机一样使用 Win32 API 或 .NET 进行打印。确定是否可以通过正常的 Windows 机制打印到此打印机的最简单方法是打开记事本,输入内容并打印。如果可行,那么您可以放弃 Espson API 并使用 Win32 或 .NET 进行打印。

    【讨论】:

    • 对不起,我的回复晚了,我出城去做其他工作了。我尝试连续发送两个打印作业,但只打印了一个。此外,如果由于某种原因,在发送命令时打印机处于关闭状态,则即使我打开打印机并重新连接,也不会进行打印。
    • C# 代码使用位于 `\program data\Microsoft\Point Of Service\Configuration` 中的 configuration.xml 文件来查找和发送打印。虽然打印机驱动程序已安装并且确实显示在打印机列表中,以便在记事本甚至浏览器上打印。我可以从控制面板中的“设备和打印机”将测试打印件发送到打印机。我想使用相同的打印命令,但来自我的 c# 代码
    • 听起来这台打印机的行为与其他打印机一样,因此您不需要 Epson API。您可以像使用任何其他打印机一样使用 .NET 进行打印。
    • 您可以使用WritePrinter 函数直接发送命令,但我不建议这样做。只需尝试以与任何随机打印机相同的方式打印即可。可以在网上找到 Win32 和 .NET 的示例。
    • 我实际上没有任何使用 .Net 打印的经验,除了使用 epson aapi...无论如何我都会尝试搜索...可能需要有效地缩小搜索范围。
    猜你喜欢
    • 2011-09-11
    • 2016-12-01
    • 2020-11-26
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 2012-01-21
    • 2013-07-01
    • 2021-08-14
    相关资源
    最近更新 更多