我有一个附言文件。如何使用 Visual C++ 将其发送到打印机?这似乎应该很简单。
3 回答
如果打印机直接支持 PostScript,您可以像这样假脱机原始打印作业:
HANDLE ph;
OpenPrinter(&ph, "Printer Name", NULL);
di1.pDatatype = IsV4Driver("Printer Name") ? "XPS_PASS" : "RAW";
di1.pDocName = "Raw print document";
di1.pOutputFile = NULL;
StartDocPrinter(ph, 1, (LPBYTE)&di1);
StartPagePrinter(ph);
WritePrinter(ph, buffer, dwRead, &dwWritten);
EndPagePrinter(ph);
EndDocPrinter(ph)
重复 WritePrinter,直到您已假脱机整个文件。
IsV4Driver() 检查版本 4 驱动程序,这在 Windows 8 和 Server 2012 中是必需的:
bool IsV4Driver(wchar_t* printerName)
{
HANDLE handle;
PRINTER_DEFAULTS defaults;
defaults.DesiredAccess = PRINTER_ACCESS_USE;
defaults.pDatatype = L"RAW";
defaults.pDevMode = NULL;
if (::OpenPrinter(printerName, &handle, &defaults) == 0)
{
return false;
}
DWORD version = GetVersion(handle);
ClosePrinter(handle);
return version == 4;
}
DWORD GetVersion(HANDLE handle)
{
DWORD needed;
GetPrinterDriver(handle, NULL, 2, NULL, 0, &needed);
std::vector<char> buffer(needed);
return ((DRIVER_INFO_2*) &buffer[0])->cVersion;
}
它比你想象的要复杂。如果它是postscript打印机,通过串行或 USB 端口连接,您可以打开设备并写入文件。同样,如果它是连接到以太网的 postscript 打印机,您可以连接到端口 9100 ( telnet my.network.printer 9100 < pic.ps
)(我可能没有正确记住端口号,可能需要嗅探或做一些研究)并写入文件。
但如果它只是任何旧打印机,那么您需要解释 postscript 代码并将光栅化页面发送到打印机。
如果是 PCL/PS 组合打印机,您可能需要添加 PCL 标头才能进入 PS 模式,具体取决于打印机设置(如果全部设置为“自动检测”,则无需担心这部分)。如果您打印出一些 postscript 代码(可能与其他 gobbeldegook 一起打印,而不是所需的输出),您就会知道这样做。
我很尴尬地说我实际上并不知道如何在 windows c++ 中打开一个 USB 设备,但如果它有帮助,DOS 方式是用作将使用该设备lpt1:
的文件名(如)。copy pic.ps lpt1:
如果是共享打印机,你真的应该通过网络打印队列,而不是直接到打印机。
这并不难。您可以使用 LPD(行式打印机守护程序)协议与服务器通信。协议很简单,你可以阅读规范并自己编写一个。
另一种方法是直接调用lpr
命令。但是,默认情况下,此命令在 Windows 7 中被禁用。搜索“lpr command windows 7”会告诉你如何启用它。