使用VC++将Postscript文档发送到打印机

3
我有一个后记文件。如何使用Visual C++将其发送到打印机?这似乎应该很简单。

我一直在研究微软提供的GDI API和其他打印机文档。我可以直接发送GDI命令,并获取打印机的HDC,但我并没有找到如何直接发送PostScript命令的方法。对于支持PostScript的打印机,这应该是可行的,不是吗? - chowey
3个回答

7
如果打印机直接支持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;
}

太好了,这对我有用。一个更正 - 你执行了两次 EndDocPrinter,但我非常确定第一个不应该存在。 - chowey

1
这比你想象的更加复杂。如果是通过串行或USB端口连接的后置打印机,您可以打开设备并写入文件。同样,如果是连接到以太网网络的后置打印机,则可以连接到端口9100(telnet my.network.printer 9100 < pic.ps)(我可能没有正确记住端口号,可能需要嗅探或进行一些研究)并写入该文件。
但是,如果只是普通的打印机,则需要解释后置代码并将栅格化页面发送到打印机。
如果是组合的PCL / PS打印机,则可能需要添加PCL头以进入PS模式,具体取决于打印机设置(如果全部设置为“自动检测”,则无需担心此部分)。如果打印出了后置代码的位,可能还会有其他无用信息,而不是所需的输出,则会知道要执行此操作。
我很尴尬地说,我实际上不知道如何在Windows C ++中打开USB设备,但如果有帮助,DOS方式是使用lpt1:作为文件名(例如copy pic.ps lpt1:),这将使用该设备。
如果是共享打印机,你应该通过网络打印队列来打印,而不是直接连接打印机。

-1

并不难。你可以使用 LPD(行式打印机守护程序)协议与服务器通讯。该协议很简单,你可以阅读规范并亲自编写。

另一种方式是直接调用lpr命令。不过,这个命令在Windows 7 中默认是禁用的。搜索“Windows 7 lpr 命令”会告诉你如何启用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接