使用 C# 在 Windows Server 2012 R2 中打印 PCL 文件

本文关键字:打印 PCL 文件 R2 2012 Windows Server 使用 | 更新日期: 2023-09-27 18:31:42

Windows

Server 2012 R2是否有一些特定的东西阻止使用以下方法打印PCL文件?

我使用我在网上找到的代码从下面的 url 生成一个 dll 文件(您可以向下滚动一点以查看 Abel 发布的答案)。如何在 c# 中打印 pcl 文件?

我使用了生成的库文件,并使用以下代码打印了文件

string fileName = definedPath + randomFileName.pcl
if(File.Exists(fileName))
{
    //PrintRaw is the name I gave to the dll file I generated 
    PrintRaw.RawFilePrint.SendFileToPrinter(installedPrinterName, fileName);
}

这段代码在普通的Windows操作系统上打印pcl文件,但是当我在Windows Server 2012 R2中尝试时,它没有打印。

我跟踪了打印作业,以检查C:''Windows''System32''spool''PRINTERS,在它消失之前,我确实在那里短暂地看到了打印作业,这是我所期望的。但在那之后什么也没发生,除了机器急剧减速。

这里有一些东西可能会有所帮助。1.代码不能使用同一个文件再次打印,因为它"被另一个进程使用"2.已安装所有打印机并使用正确的名称(字面意思是复制并粘贴名称)3. 代码从打印服务器和 Windows 7、8.1 和 10 上本地安装的打印机打印文件。

请帮忙!

使用 C# 在 Windows Server 2012 R2 中打印 PCL 文件

对于 Server 2012,最可能的解释是打印机使用的是版本 4 驱动程序,该驱动程序仅支持 XPS 文档的原始打印。

可以使用以下代码检测 v4 驱动程序:

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);
    if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER)
    {
        return -1;
    }
    std::vector<char> buffer(needed);
    if (::GetPrinterDriver(handle, NULL, 2, (LPBYTE) &buffer[0], needed, &needed) == 0)
    {
        return -1;
    }
    return ((DRIVER_INFO_2*) &buffer[0])->cVersion;
}

如果是 v4 驱动程序,则必须使用 XPS_PASS 数据类型绕过 XPS 驱动程序链,并将文件直接发送到打印机,如此 MSDN 示例中所示。