【问题标题】:Send Postscript Document to Printer using VC++使用 VC++ 将 Postscript 文档发送到打印机
【发布时间】:2013-07-04 23:59:41
【问题描述】:

我有一个附言文件。如何使用 Visual C++ 将其发送到打印机?这看起来应该很简单。

【问题讨论】:

  • 我一直在浏览 GDI API 和我可以从 Microsoft 看到的任何其他打印机文档。我可以直接发送 GDI 命令。我可以得到一台打印机 HDC。但我没有看到如何直接发送 postscript 命令。对于兼容 postscript 的打印机,这应该是可能的,不是吗?

标签: visual-c++ printing postscript


【解决方案1】:

如果打印机直接支持 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,但我很确定第一个不应该在那里。
【解决方案2】:

这比你想象的要复杂。如果是 postscript 打印机,通过串口或 USB 端口连接,您可以打开设备并写入文件。同样,如果它是连接到以太网网络的 postscript 打印机,您可以连接到端口 9100 (telnet my.network.printer 9100 &lt; pic.ps)(我可能没有正确调用端口号,可能需要嗅探或做一些研究)并写入文件。

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

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

我很尴尬地说我实际上不知道如何在 windows c++ 中打开 USB 设备,但如果有帮助,DOS 方法是使用 lpt1: 作为文件名(如 copy pic.ps lpt1:)会使用该设备。

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

【讨论】:

    【解决方案3】:

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

    另一种方法是直接调用lpr 命令。但是,默认情况下,此命令在 Windows 7 中被禁用。搜索“lpr command windows 7”会告诉你如何启用它。

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2015-03-14
      相关资源
      最近更新 更多