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

时间:2013-06-13 03:44:26

标签: visual-c++ printing postscript

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

这比你怀疑的要复杂得多。如果是通过串口或USB端口连接的 postscript 打印机,则只需打开设备并写入文件即可。同样,如果它是连接到以太网的postscript打印机,你可以连接到端口9100(telnet my.network.printer 9100 < pic.ps)(我可能没有正确回忆端口号,可能需要嗅探或做一些研究)并写入文件

但如果它只是旧打印机,那么你需要解释postscript代码并将光栅化页面发送到打印机。

如果是PCL / PS组合打印机,您可能需要添加PCL标题才能进入PS模式,具体取决于打印机设置(如果全部设置为“自动检测”,请不要担心此部分)。如果您打印出一些postscript代码,可能还有其他gobbeldegook,而不是所需的输出,你就会知道这样做。

我很尴尬地说我实际上并不知道如何在windows c ++中打开一个usb设备,但是如果它有帮助,那么DOS的方式是使用lpt1:作为文件名(如{{1}哪个会使用该设备。

如果它是共享打印机,你真的应该通过网络打印队列,而不是直接到打印机。

答案 2 :(得分:0)

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

另一种方法是直接调用lpr命令。但是,默认情况下,在Windows 7中禁用此命令。搜索&#34; lpr命令窗口7&#34;会告诉你如何启用它。