使用编程方式在Windows 8中打印Postscript文件

4
我在打印Postscript文件时遇到了一个奇怪的问题。我的设置如下:我有一台Windows 8 PC,在这台电脑上有一个C#应用程序“NetworkPrintTest.exe”,当执行它时,应该打开一个PDF文件,生成一个Postscript文件,并最终将其打印出来。但是它什么也没有做。我没有收到错误提示,但也无法打印。相同的程序在Windows 7上运行时没有错误,我甚至可以让打印机打印文件。如上所述,.ps文件在这两个操作系统上都成功生成,但打印失败。以下是应该打印文件的源代码。
public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, int dwCount, params string[] docName)
        {
            int dwWritten = 0;
            IntPtr hPrinter = new IntPtr(0);
            DOCINFOA di = new DOCINFOA();
            bool flag = false;
            di.pDocName = "print document";
            if (docName.Length > 0)
                di.pDocName = docName[0];
            di.pDataType = "RAW";
            if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
            {
                if (StartDocPrinter(hPrinter, 1, di))
                {
                    if (StartPagePrinter(hPrinter))
                    {
                        flag = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
                        EndPagePrinter(hPrinter);
                    }
                    EndDocPrinter(hPrinter);
                }
                ClosePrinter(hPrinter);
            }
            if (!flag)
            {
                Marshal.GetLastWin32Error();
            }
            return flag;
        }

        [StructLayout(LayoutKind.Sequential)]
        public class DOCINFOA
        {
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDocName;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pOutputFile;
            [MarshalAs(UnmanagedType.LPStr)]
            public string pDataType;
        }

我使用了一些DLL导入

    [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, SetLastError = true, ExactSpelling = true)]
    public static extern bool EndDocPrinter(IntPtr hPrinter);

[DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, SetLastError = true, ExactSpelling = true)]
    public static extern bool EndPagePrinter(IntPtr hPrinter);

[DllImport("gdi32.dll")]
    private static extern int GetDeviceCaps(IntPtr hdc, int capindex);

[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
    public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);

我发现GDI32.dll的版本不同,但目前还没有看到任何问题。
Windows 7 -> 6.1.7601.18275
Windows 8 -> 6.2.9200.16654
我的应用程序是用C#编写的,在.Net Framework 2.0中。
1个回答

4

从Windows Vista开始,对于使用XPS驱动程序的打印机,您需要使用数据类型“XPS_PASS”而不是“RAW”。


Tony,你救了我的一天。我一直在苦苦挖掘这个问题。当我将“RAW”替换为“XPS_PASS”时,它按预期工作了。 - fkucuk
1
我在 Nuget 上创建了一个解决方案,网址为 https://www.nuget.org/packages/RawPrint/。 - Tony Edgecombe
抱歉回复晚了。我会尽快测试并查看是否有效。到目前为止,非常感谢+1。 - Bongo

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